期货长假后开盘跳空:量化策略信号要不要重新算
前言春节、国庆等长假国内期货休市多日外盘或政策消息在休市期间积累节后首日往往跳空开盘。程序化策略若在节前最后一根 5 分钟 K 线上算了「做多」并缓存在变量bias里节后若仍用旧 bias 直接set_target_volume可能在极端价位开仓若一律清空 bias 又可能错过合法的趋势延续。问题本质是休市期间 K 线的datetime不推进但市场信息已经变了。天勤里K 线时间存在表列datetime里由行情服务按业务规则写入不是本机time.time()。get_kline_serial返回的表在wait_update()后更新is_changing(kl.iloc[-1], datetime)为真表示来了新一根 bar。长假后第一根 bar 的open与节前close可能差很多程序要有「节后分支」不能和平时同一套缓存逻辑。一、名词对照名称含义长假场景下会怎样datetimeK 线业务时间休市不推进节后突然跳iloc[-1]最后一行常是未收盘 bar判断新 bar 用is_changing(..., datetime)iloc[-2]倒数第二行已收盘 bar信号常在此计算避免用未收盘数据bias策略自缓存的多空允许方向节前值可能过期set_target_volume目标净仓节后首笔下单前应收窄get_position柜台持仓节前持仓节后仍继承quote.trading_time合约交易时段结构集合竞价阶段是否交易要团队定跳空开盘价远离节前收盘价触发过滤或刷新信号二、休市期间内存里有什么状态休市中节后开盘K 线 datetime不更新新 bar 出现bias 缓存保持节前若不清算则沿用真实持仓pos.pos不变继承需get_position读长假前若无人值守很多团队选择减仓或停机若仍运行节后首日必须有专门逻辑。三、三种常见处理方式方式做法适合强制刷新节后首根datetime变时用iloc[-2]重算信号信号依赖最新 K 线开盘暂停节后 N 分钟内禁止加仓防集合竞价噪声跳空过滤开盘相对节前收盘超阈值则只平不开保守趋势策略bias{long:False,short:False}last_closeNonewhileTrue:api.wait_update()ifapi.is_changing(kl.iloc[-1],datetime):barkl.iloc[-2]bias[long]bar.closema.iloc[-2]bias[short]bar.closema.iloc[-2]iflast_closeisnotNone:gapabs(bar.open-last_close)ifgapGAP_LIMIT:state[gap_day]Truelast_closebar.closeifstate.get(gap_day)andnotallow_after_holiday():continueGAP_LIMIT可按品种用 tick 数或百分比allow_after_holiday可实现为「节后 30 分钟不允许新开仓」等。四、与交易时段、持仓继承节后仍要用 quote 上交易时段信息过滤避免在集合竞价用 tick 逻辑误触发。节前已有持仓时刷新 bias 不等于自动平仓新信号反向时由TargetPosTask调仓若启用跳空过滤可能只允许减仓。进程重启后先用get_position同步目标再谈节后信号。五、回测一致TqBacktest跨长假的历史 K 线包含跳空回测若每天重算而实盘用旧缓存会对不上。三环境应统一节后规则并用含春节的历史段回放验证。总结长假休市后的跳空考验的是策略有没有处理「时间断层」天勤里datetime在休市不动、节后一动就是一根缺口 bar旧的bias缓存可能已经不再代表市场。节后首根有效 bar 应主动重算信号并用开盘暂停或跳空阈值限制加仓持仓则以get_position为准与节前衔接。把节后规则写进配置文件从日志里也能看出「节后第一天为何观望」而不是误以为程序坏了。FAQ1节前要不要强制平仓团队风控决定常见做法是节前减仓。2bias 写在文件里节后首日以 K 线重算覆盖勿盲目读旧 state。3有夜盘的品种节后周一注意首根 bar 来自夜盘还是日盘按品种写规则。4gap 阈值怎么定用历史长假后首日统计几档写入 config 再模拟。风险提示以上内容用于节后开盘处理参考不构成投资建议。