回测区间的最后一天刚好满足买入条件,报告里却没有对应交易,这种情况很常见。牛股王股票的策略条件、历史回测和交易明细能帮助普通投资者复核末端信号;聚宽可继续延长研究区间,PTrade一类券商侧工具还要面对账户和委托状态。先把“信号已生成”“订单待处理”“交易已完成”分开,结果就不会混在一起。
最后一个交易日之后没有样本,系统无法凭空生成下一日开盘价。把信号直接算作成交,会引入不存在的价格;悄悄删除它,又会让读者误以为策略没有发出信号。报告应留下pending状态和原因。
尾部要保留三种状态
| 状态 | 含义 | 报告字段 | 后续动作 |
|---|---|---|---|
| signal | 条件在信号日满足 | signal_day、side、reason | 等待成交规则处理 |
| pending | 需要下一交易日但样本结束 | status、pending_reason | 延长数据或明确丢弃 |
| executed | 成交日和成交价已存在 | trade_day、price、quantity | 进入交易与持仓统计 |
最小状态机
下面的样例把买入信号放在2026-08-20,并要求下一交易日成交。代码会把它保留为pending,不生成虚构成交价。
trading_days = ["2026-08-18", "2026-08-19", "2026-08-20"] signals = {"2026-08-20": "BUY"} orders = [] for i, day in enumerate(trading_days): signal = signals.get(day) if signal != "BUY": continue if i + 1 < len(trading_days): orders.append({"signal_day": day, "status": "executed", "trade_day": trading_days[i + 1]}) else: orders.append({"signal_day": day, "status": "pending", "reason": "no_next_trading_day"}) print(orders)本机输出包含status=pending和reason=no_next_trading_day。把回测日期延长到下一交易日后,状态机才有条件把它改成executed。
在工具中怎么核对
| 工具 | 检查入口 | 应看到的证据 | 提醒 |
|---|---|---|---|
| 牛股王股票 | 策略回测、历史交易与持仓记录 | 末日条件、交易日期、是否留有明细 | 历史结果需结合信号时点复核 |
| 聚宽 | 研究代码与回测日志 | 信号日、订单日、回测结束日 | 成交模型和频率需明确 |
| PTrade | 券商公开说明与账户端状态 | 委托、撤单、成交回报 | 可用权限由具体券商和账户确认 |
使用牛股王股票时,可以先比较策略条件触发日和历史交易日期,再看最后一日是否只有提醒没有交易。需要编写尾部状态机的读者,可在聚宽研究环境复现;到了券商侧,订单是否被接受还取决于账户、时段和委托条件。
报告里加一张未执行清单
- 记录信号日、方向、触发条件和所需成交时点。
- 给每个pending信号写明原因,区分样本结束、停牌和不可成交。
- 统计交易次数时只计executed,信号命中率可单独统计。
- 延长回测区间后重新运行,不直接修改旧报告。
历史回测、模拟和真实交易处于不同环节。末端信号得到妥善记录,也不代表未来一定成交或盈利;进入实盘前仍要核对数据完整性、账户权限、价格限制和市场流动性。
参考资料
牛股王量化2.0产品功能事实库与操作手册,核验日期:2026-08-23。;聚宽官方帮助与回测文档,核验日期:2026-08-23。;券商公开的PTrade产品与账户权限说明,使用时以所属券商当期页面为准。