期货量化临期合约还能不能做:程序化到期禁开与强平写法
2026/6/10 23:10:25 网站建设 项目流程

前言

期货具体月份合约不是永久有效的:每个合约有最后交易日,之后不能再交易。个人投资者做商品期货时,往往不能持仓进入交割月,或必须在到期前若干交易日平仓,否则期货公司会强平或拒单。程序化策略如果只写「有信号就开仓」,不判断「这个月份还剩几天到期」,可能在到期前一周仍发出买入指令,表现为拒单,或在流动性极差时平不出去。

天勤量化里,合约信息随行情一起更新。get_quote("SHFE.rb2510")wait_update()后可读到与到期相关的字段(以你本地objs.py和文档为准,常见有expire_datetime等)。策略应在发单前多一层「交割规则过滤」,与交易时段过滤、涨跌停过滤并列,而不是事后靠last_msg才知道不能做了。

一、名词对照:为什么临近交割是单独一层规则

名称含义和 K 线 datetime 过滤的区别
最后交易日合约可交易的最后一天datetime 只管「这一刻是否在交易时段」,不管「这个月份是否还该做」
expire_datetime天勤 quote 上与到期相关的时间字段用来算「还剩多少天」
get_quote合约行情对象到期字段在这里读
set_target_volume设置目标净仓禁开时应不允许比当前pos更激进的加仓
get_position().pos净持仓手数强平时目标是 0
禁开只允许平、不允许开新仓方向到期前 N 日常用
强平到期前 M 日必须清零M 通常小于 N

交易所规则、期货公司规则、策略规则三层叠加:交易所说能不能持仓,期货公司说保证金和权限,策略说团队愿不愿意在临期月份交易。

二、程序里怎么判断「还能不能开」

启动时先打印一次各交易合约的到期相关字段,确认模拟盘与实盘字段一致、会随wait_update更新。

q=api.get_quote("SHFE.rb2510")api.wait_update()# expire_datetime 等为行情服务写入,格式以本地文档为准

建议实现两个阈值(写进 config):

  • ROLL_DAYS:剩余天数大于此值才允许开新仓;例如 5 表示最后交易日前 5 天起禁止加仓。
  • FORCE_CLOSE_DAYS:剩余天数小于等于此值必须set_target_volume(0);例如 2。
defallow_open(q,today,roll_days):days_left=calc_days_to_expire(q,today)# 团队按 expire_datetime 实现returndays_left>roll_days pos=api.get_position(symbol)ifnotallow_open(q,today,ROLL_DAYS):target=min(signal_target,pos.pos)# 不允许净仓比当前更「多」或更「空」ifcalc_days_to_expire(q,today)<=FORCE_CLOSE_DAYS:task.set_target_volume(0)

calc_days_to_expire需你们按天勤返回的时间格式和北京时间统一实现,不要手写「如果是 5 月就怎样」的魔法数字。

三、与换月、TargetPosTask 的关系

临期月份往往是旧主力。正常流程应通过主连underlying_symbol提前把执行切到远月并完成移仓;到期规则是最后一道闸:即使移仓失败,也不能在不可交割的月份继续加仓。顺序上:先移仓到远月,再在临期月上只平不开。

TargetPosTaskset_target_volume后要靠wait_update才真正发单;禁开逻辑应写在set_target_volume之前,而不是发出去再等拒单。

四、回测为什么要写同样逻辑

TqBacktest回测具体月时,历史会跨过合约到期日。若回测不写到期禁开,回测曲线会在到期日仍开仓,与实盘完全脱节。主连回测不直接暴露这个问题,但实盘落地到具体月时必须补上。

总结

临近交割月还能不能交易,不能靠交易员记忆,而要在程序里用 quote 上的到期信息和净持仓pos做禁开与强平。天勤不提供单独的「交割日历 API」替代交易所规则,但get_quote在每次wait_update后会给合约对象,足够支撑「剩余天数」判断。把阈值写进配置、在换月与到期交叉周用模拟盘验证,策略就不会在流动性枯竭的月份里硬扛到最后几天,也不会在拒单堆叠里才发现月份已经不能做了。

FAQ

1)股指、国债也有同样问题吗?

金融期货规则与商品不同,最后交易日和持仓限制要单独查交易所公告,阈值单独配置。

2)到期日当天还能挂单吗?

多数团队提前FORCE_CLOSE_DAYS清零,不赌最后一天流动性。

3)expire_datetime 读出来不对?

对照快期客户端同一合约信息;确认已wait_update且 symbol 没写错。

4)如何用 TqSim 试到期规则?

TqSim订阅一个远月合约,把ROLL_DAYS设很大,观察allow_open日志即可。

风险提示

以上内容用于交割规则程序参考,不构成投资建议。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询