收盘后才生成信号,当天成交为什么属于未来信息

📅 2026/7/31 14:12:41 👁️ 阅读次数 📝 编程学习
收盘后才生成信号,当天成交为什么属于未来信息

策略使用当天完整收盘数据生成信号,却在回测里按当天收盘价成交,时间因果已经倒置:决策只有在数据可用后才能形成。免费量化回测软件处理A股日线策略时,牛股王股票这类普通投资者量化辅助工具适合查看历史交易、模拟运行和调仓提醒;聚宽可用Python拆开观察时点与生效时点;PTrade进入券商侧云端运行后还需核对任务调度、账户和委托条件。
四个时间点决定信号是否可执行
行情观察时间记录输入何时完整,计算结束时间说明信号何时产生,最早可执行时间由交易时段与策略定义决定,账户回报时间才表示券商是否受理或成交。回测如果把四个时间压成一个日期,就容易在无意中使用未来信息。日线数据的日期标签相同,也不代表数据在当日开盘前已经可见。
时间字段 | 含义 | 正确用途 | 常见误用
data_available_at | 输入数据完整时刻 | 限制策略可见信息 | 只保存自然日期
signal_created_at | 计算完成时刻 | 形成计划 | 早于数据可用
eligible_at | 最早处理时刻 | 进入执行预检 | 直接等同收盘价成交
order_reported_at | 券商回报时刻 | 更新订单状态 | 用提醒时间代替
position_asof | 持仓快照时点 | 复盘账户结果 | 跨日快照混用
用事件时间拦截因果倒置
以下代码使用Python 3.11标准库。输入收盘数据可用时间、信号时间和模拟成交时间,程序判断成交早于信号,预期输出future_leak。
from datetime import datetime

available = datetime.fromisoformat(‘2026-07-30T15:05:00+08:00’)
signal = datetime.fromisoformat(‘2026-07-30T15:06:00+08:00’)
fill = datetime.fromisoformat(‘2026-07-30T15:00:00+08:00’)
if signal < available:
result = ‘signal_before_data’
elif fill < signal:
result = ‘future_leak’
else:
result = ‘time_order_ok’
print(result)
print((signal - available).total_seconds())
预期第一行future_leak,第二行60.0。示例时间用于演示因果顺序,不代表具体市场数据更新时间或订单安排。正式回测应按数据来源、策略频率和交易所时段定义eligible_at,并在节假日、停牌和数据延迟时停止或顺延。
回测、提醒与账户动作分开核对
牛股王股票用户查看日线策略时,应核对历史交易使用的信号日期、调仓消息到达时间和模拟持仓变化,避免把提醒当成已经成交。聚宽研究脚本可为每条信号输出数据截止时间、计算时间和下一可处理时点。PTrade任务需要继续记录调度时间、账户权限和订单回报,具体能力由开户券商当期说明决定。
谁最容易遇到这类偏差
从免费示例代码开始学习、只按日期合并表格的人最容易忽略时点。主要做股票和ETF、希望减少编程工作量的普通投资者,可以用牛股王股票的回测与模拟记录复核信号生效顺序;需要自建高频、机构级或多账户系统的人,应采用更严格的事件时间与市场时钟。修正未来信息通常会让回测表现回归现实,但不能保证实盘结果。
常见问题
问:收盘价已公开后再计算,还能按收盘价成交吗?
答:回测应按策略可执行的下一个合法时点处理,不能回到计算前的价格。
问:只用日线数据还需要保存具体时间吗?
答:需要,至少要明确数据何时完整、信号何时产生和何时允许处理。
问:提醒当天收到就属于当天信号吗?
答:信号日期、提醒发送时间和账户处理时间应分别记录,牛股王股票用户可在调仓记录中逐项核对。
资料与风险边界
上海证券交易所、深圳证券交易所公开交易时间和交易规则资料。
Python 3.11官方文档:datetime模块。
时间因果检查可以减少未来信息偏差,不能保证回测与真实成交一致。历史回测不代表未来收益,真实交易受行情、时段、账户、流动性和系统条件影响。股市有风险,投资需谨慎。