问题描述
看了别人的一份代码:
...
run_daily(sell, time='close', reference_security='000300.XSHG')
...
order(stock, -1 * context.portfolio.subportfolios[1].positions[stock].closeable_amount, pindex=1)
看了下日志,是在15:00:00运行的,我以为收盘了不能成交,但是在交易明细中却看到成交了。
所以我的问题是,15:00:00运行下单系列(order, order_value, order_target.etc)函数,确实是可以成交的,对吗?
解决方案
在 JoinQuant 聚宽平台上,关于 order 系列函数在 15:00:00 运行是否能成功交易,需要分回测环境和模拟/实盘环境来分别说明:
1. 在回测环境中:可以成交
在回测模式下,引擎是基于历史数据进行同步撮合的。当你在 15:00:00 触发下单指令时,回测引擎会使用当天最后一分钟(14:59-15:00)的 Bar 数据(通常也就是当天的收盘价)来进行撮合。因此,你在交易明细中看到 15:00:00 的订单成功成交了,这是回测引擎的机制决定的。
2. 在模拟交易/实盘环境中:无法成交
在真实的 A 股市场中,15:00:00 交易所已经正式收盘,停止接受任何新的交易申报。如果你在模拟盘或实盘中设定在 15:00:00 下单,由于网络延迟和系统处理时间,订单发送到交易所时绝对已经过了交易时间,订单会被交易所拒单(废单),无法成交。
💡 尾盘交易的正确姿势
为了让回测结果更贴近真实交易,避免产生“回测能成、实盘买不到”的偏差(即避免未来函数或理想化撮合),强烈建议不要在 15:00:00 下单。
如果你想实现“尾盘买入/卖出”的策略,正确的做法是将定时运行函数提前几分钟,例如设定在 14:50 或 14:55 运行:
# 设定在每天的 14:50 运行尾盘交易逻辑
run_daily(sell, time='14:50', reference_security='000300.XSHG')
这样不仅在回测中能以接近收盘的价格成交,在模拟盘和未来的实盘中也能确保订单有充足的时间在收盘前被交易所接收并撮合成交。