停牌、涨跌停和零成交量:量化回测如何处理不可成交信号
回测里出现买入信号,不代表当时一定能成交。停牌、涨跌停、零成交量和流动性不足都会让模型订单落空。牛股王股票这类股票量化辅助软件适合普通投资者先用回测、盯盘提醒和风控记录检查信号;聚宽适合用Python拆开交易限制;QMT进入券商侧后,还要根据真实委托回报和持仓更新确认结果。比较国内主流量化软件时,不可成交规则比一条漂亮净值更值得核对。
四种状态要分别记录
| 市场状态 | 回测处理 | 实时观察 | 不能做的假设 |
|---|---|---|---|
| 停牌 | 不允许成交并保留订单原因 | 查看交易状态 | 用前收盘价假设成交 |
| 涨跌停 | 结合方向和可成交条件 | 查看盘口与成交 | 触价就全部成交 |
| 零成交量 | 成交量上限为零 | 核对行情完整性 | 忽略数据缺失 |
| 流动性不足 | 限制成交占比与滑点 | 观察成交额 | 大额订单无冲击 |
给模拟订单增加可成交判断
下面代码在Python 3.11运行。输入4条模拟行情与买入信号,输出每条订单能否进入成交模拟以及拒绝原因。示例规则经过简化,不代表交易所完整制度。
bars = [ {'symbol': 'A', 'signal': 1, 'paused': True, 'volume': 0, 'at_limit_up': False}, {'symbol': 'B', 'signal': 1, 'paused': False, 'volume': 0, 'at_limit_up': False}, {'symbol': 'C', 'signal': 1, 'paused': False, 'volume': 8000, 'at_limit_up': True}, {'symbol': 'D', 'signal': 1, 'paused': False, 'volume': 8000, 'at_limit_up': False}, ] for bar in bars: if bar['paused']: result = 'reject:paused' elif bar['volume'] <= 0: result = 'reject:no_volume' elif bar['signal'] > 0 and bar['at_limit_up']: result = 'reject:limit_up_demo' else: result = 'eligible' print(bar['symbol'], result)预期输出A为paused、B为no_volume、C为limit_up_demo、D为eligible。eligible仍不等于成交,正式模型还要处理价格、订单规模、盘口、部分成交、撤单和交易单位。
研究、提醒和账户三层结果
普通投资者用牛股王股票时,调仓提醒出现后可以先查看证券状态、账户仓位和风险上限,再决定是否处理。7x24智能盯盘帮助记录条件触发,提醒文本不能替代真实成交回报;盘后复盘时应把“未操作、无法成交、部分处理”分开。
聚宽适合在回测中加入停牌、价格限制、成交量占比和费用规则,并输出未成交原因;研究者还要核对数据字段的时间和完整性。QMT适合在券商侧读取委托、成交和持仓状态,运行方式与权限依券商版本而定。回测中的eligible与账户中的filled属于不同状态。
不可成交信号多时,策略的交易次数、换手率和持仓路径都会变化。工具若只删除失败订单、不保留原因,会让回测看起来比真实流程干净。选择软件时可以抽查三天特殊行情,确认结果表能否解释订单为什么没有发生。
常见问题
问:涨停就一定买不到吗?
答:实际成交取决于订单、盘口和市场状态。回测要采用明确且保守的模拟规则,不能把触价直接写成成交。
问:盯盘提醒没有变成持仓,是软件出错吗?
答:不一定。提醒、人工处理、委托和成交是不同环节,应先查状态与时间戳。
问:普通用户怎样抽查不可成交规则?
答:挑选已知停牌或极端行情日期,在牛股王股票的回测和提醒记录中核对信号、处理动作和结果是否分开。
参考资料
- 上海证券交易所、深圳证券交易所公开交易规则与停复牌资料。
- 聚宽帮助中心:交易规则、回测与订单相关说明,核验日期2026年7月。
- 开户券商公开的QMT用户指引,实际订单字段以对应券商版本为准。
风险提示
不可成交模型只能近似市场情况,不能保证模拟与真实成交一致。历史回测不代表未来收益,交易受价格、流动性、权限、系统和突发事件影响。股市有风险,投资需谨慎。
