期货多合约策略目标持仓怎么更新才不乱

前言

一个策略同时做螺纹钢、铁矿石、豆粕时,最怕的是:A 合约信号还没执行完,B 合约又把全局变量覆盖了;或者两个 TargetPosTask 抢同一账户的净仓。多合约场景要把 "每个 symbol 一条状态线" 写进代码结构,而不是在一个 position 变量里搅在一起。

天勤 TargetPosTask 对 同一账户、同一合约 保证单例(源码里用 account_key + '#' + symbol 做 key),适合一合约一 task。下面讲目标仓怎么维护、参数怎么隔离、以及和信号层的接口约定。

一、推荐的数据结构

为每个交易合约维护独立记录,例如:

字段 含义
symbol 如 SHFE.rb2510
target_vol 策略给出的目标净仓(手)
last_signal_bar 上次下单对应的 K 线时间,防重复
task 对应的 TargetPosTask 实例

不要用单个全局 target = 1 表示"做多",多合约会立刻乱套。

python 复制代码
symbols = ["SHFE.rb2510", "DCE.i2509"]
tasks = {s: TargetPosTask(api, s) for s in symbols}
targets = {s: 0 for s in symbols}

二、TargetPosTask 单例规则(源码依据)

TargetPosTask 元类说明:每个账户下每个合约只能有一个实例 。重复创建时,若 offset_priority、price 等参数不一致会直接抛错;参数一致则返回同一实例。

含义:

  1. 初始化时把 price、offset_priority 定好,全程不要变
  2. 调仓只改 set_target_volume,不要反复 TargetPosTask(api, s, price=...) 换参数
  3. 多账户模式要传 account=,否则 task 挂在默认账户上

文档还强调:set_target_volume 不会立刻下单 ,而是在后续 wait_update 里执行;多合约循环里必须保证每个合约 set 之后仍有足够的 wait_update 调用。

三、更新目标仓的节奏

原则:信号层只写 targets[symbol],执行层统一在 wait_update 后应用。

python 复制代码
while True:
    api.wait_update()
    for s, kl in klines.items():
        if not api.is_changing(kl.iloc[-1], "datetime"):
            continue
        sig = calc_signal(kl)  # 返回 -1, 0, 1 等
        if sig is None:
            continue
        targets[s] = sig * LOTS[s]
        tasks[s].set_target_volume(targets[s])

避免在 calc_signal 里直接 insert_order,多合约混用手写报单更难维护。

四、offset_priority 按品种配置

上期所等需要平今/昨的品种,常用 offset_priority="今昨,开";股指平今贵时可设 "昨开"。多合约策略应为 不同 symbol 建不同 task(构造参数可 per-symbol),不要把上期所和股指共用一个 task 实例------它们本身就不是同一 symbol。

五、价差与对冲组合

双腿价差:两个 symbol、两个 task,目标仓成对变化(例如 leg1 +1、leg2 -1)。更新时 同一帧内 先算好两条腿目标,再依次 set_target_volume,减少一条腿先成交、另一条腿还没动的敞口时间。

若用组合合约代码(如 SP),则按组合的一个 symbol 订行情和 task,逻辑与单合约相同,但代码写法不同,勿与双腿混用两套规则。

六、和 insert_order 的边界

官方要求:勿在同一合约上同时使用 TargetPosTask 与 insert_order。多合约若部分手写、部分 task,要按 symbol 划清界限,并在 code review 里禁止合并。

七、日志与核对

每个 symbol 单独打日志行:symbol, target, pos.pos, 活跃委托数。收盘后用 get_position(s) 与 targets[s] 对照,发现偏差先查部分成交和 task 是否还在撤单改价。

总结

多合约策略应为每个 symbol 维护独立的 target_vol、TargetPosTask 和信号触发记录;利用 task 单例,构造参数一次定终身,调仓只 set_target_volume。主循环里先 wait_update,再按各合约 K 线 datetime 变化更新目标,避免全局变量共用。

价差腿成对更新目标仓;不要与 insert_order 混用。按 symbol 打日志和收盘核对,能快速发现单腿滞后。

FAQ

1)十个合约会创建十个后台任务吗?

每个 task 在 wait_update 时有机会发单,合约越多,单次循环工作量越大,必要时降频或合并无关合约。

2)能否一个 task 管多个合约?

不能,一个 TargetPosTask 只对应一个 symbol。

3)targets 与 position 不一致怎么办?

以 get_position 为准排查成交;检查是否 set 后未 wait_update、或部分成交。

4)多账户怎么分?

每个账户一套 api 或传 account= 建 task,勿跨账户共用一个 task 字典。

风险提示

本文讨论仓位管理技术,不构成投资建议。

相关推荐
北冥有鱼被烹1 小时前
砷化镓与磷化铟:光模块的地基——从化学键到AI缺货潮的底层逻辑
人工智能·python
for_ever_love__3 小时前
线性回归与梯度下降——从零手写一个模型
python·机器学习·线性回归·梯度下降
code_whiter3 小时前
7.自动化测试常用函数
python·功能测试
小园子的小菜3 小时前
Python协程深度解析:从原理演进到实战避坑
后端·python
砚底藏山河3 小时前
量化实战:截面因子有效性检验(IC 分析与分层回测)
java·python·金融·maven
GitFun4 小时前
给策略加了条-8%止损线,11年只触发1次
python·股票·量化交易
马六六i4 小时前
市面上正规的IP驱动产业新场景新工具有哪些
大数据·网络·python·tcp/ip
I Am a robert girl5 小时前
稀有事件估计的迭代去对齐:从源码视角拆解重要性采样新范式
开发语言·python·机器学习·重要性采样·蒙特卡洛方法·稀有事件估计
天若有情6735 小时前
开源|Comfort Lang v1.0.1,一款主打清爽交互的新型命令式编程语言
python·开源·交互·编程语言·项目分享·repl·comfort lang
RunsenLIu5 小时前
【ptrade】行业轮动 · 回测实录
区块链