期货量化临期合约还能不能做:程序化到期禁开与强平写法

前言

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

天勤量化里,合约信息随行情一起更新。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 更新。

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

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

  • ROLL_DAYS:剩余天数大于此值才允许开新仓;例如 5 表示最后交易日前 5 天起禁止加仓。
  • FORCE_CLOSE_DAYS:剩余天数小于等于此值必须 set_target_volume(0);例如 2。
python 复制代码
def allow_open(q, today, roll_days):
    days_left = calc_days_to_expire(q, today)  # 团队按 expire_datetime 实现
    return days_left > roll_days

pos = api.get_position(symbol)
if not allow_open(q, today, ROLL_DAYS):
    target = min(signal_target, pos.pos)  # 不允许净仓比当前更「多」或更「空」

if calc_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 日志即可。

风险提示

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

相关推荐
量化君也2 小时前
快速入门量化交易都要学些什么?
大数据·人工智能·python·算法·金融
吴卫斌2 小时前
行业ETF轮动策略实战(二):精选候选池——打造你的赛道武器库
大数据·python·股票·量化交易
Tbisnic2 小时前
AI大模型学习 第十天:让程序“指挥”大模型 —— 从对话到工具调用
人工智能·python·ai·大模型·react·cot·提示词工程
伊布拉西莫2 小时前
Flask 请求生命周期
后端·python·flask
站大爷IP2 小时前
那天,我的Python函数死活改不了全局变量
python
右耳朵猫AI2 小时前
Python周刊2026W22 | Django 6.1 Alpha 1发布、Nuitka 4.1发布、PEP 831终稿、PEP 808已接受
开发语言·python·django
Wonderful U2 小时前
Python+Django实战|美食菜谱分享与食材采购一体化系统:食谱发布收藏、图文教程、食材商城、购物车、订单管理、美食点评、智能食谱推荐
python·django·美食
下午写HelloWorld2 小时前
【概念与应用】轻量级加密算法LEA、动态脱敏算法DDA、零知识证明ZKP和优化协同交互协议OCIP
算法·区块链·密码学·安全架构·零知识证明