前言
资金有限时,很多团队想在一个期货资金账户上同时跑多套策略:A 做螺纹钢趋势,B 做铁矿石均值回归,C 做日内波段。国内期货交易所按合约记净持仓,账户里螺纹的 3 手就是 3 手,不会自动贴上"属于策略 A 还是 B"的标签。若两套逻辑共改同一 symbol 的目标仓,或各起一个进程各连同一 TqAccount,就会出现 A 刚平、B 又开,或重复报单、拒单、持仓对不上。
天勤 TqSdk 在单 TqApi、单资金账户下,每个具体合约通常只应有一个 TargetPosTask 实例管理净仓(官方约定:同一 symbol 重复创建 task 会报错)。多策略隔离的不是交易所账户,而是策略逻辑边界和"谁有权对哪个 symbol 调用 set_target_volume"。下面说明品种隔离、同品种汇总、多进程禁忌,以及 TqMultiAccount 到底解决什么问题。
一、先弄清几个容易混淆的名词
| 名词 | 指什么 | 多策略场景 |
|---|---|---|
| TqApi | 天勤主连接对象,变量常写作 api | 单账户单进程通常一个实例 |
| TqAccount | 期货公司实盘资金账户连接方式 | 两进程各连同一账号会冲突 |
| TargetPosTask | 把某 symbol 净仓调到目标值的工具 | 每 symbol 单例 |
| set_target_volume(n) | 设置目标净仓为 n 手 | 多策略对同 symbol 必须先合并 n |
| TqMultiAccount | 天勤多资金账户并列模式 | 是不同资金户,不是同户自动分仓 |
| strategy_id | 团队自定的策略编号,写进日志 | 对账与拒单率分策略统计 |
| get_position | 柜台持仓真相 | 汇总层也要以它核对 |
二、隔离方式对比(怎么选)
| 方式 | 做法 | 适用 |
|---|---|---|
| 品种隔离 | 策略 A 只交易 rb 列表,B 只交易 i 列表 | 最常见、最容易落地 |
| 手数预算 | 每策略有 max_lots,汇总后再 set | 同品种多策略 |
| 进程隔离 + 中央汇总 | 各策略出信号,主机进程合并 | 复杂,要防竞态 |
| 多资金账户 | 期货公司分账户或子账户 | 最干净,成本高 |
很多初学者以为 TqMultiAccount 能在"一个资金户里自动分仓",实际它是多个不同 TqAccount 并列给同一个 TqApi,适合真的有两个资金账号,不适合"一个账号两套逻辑"。
三、品种隔离(推荐第一步)
配置文件写死归属,code review 禁止跨品种 set:
python
# 策略 A 配置:SYMBOLS_A = ["SHFE.rb2510"]
task_rb = TargetPosTask(api, "SHFE.rb2510")
# 策略 B 配置:SYMBOLS_B = ["DCE.i2509"]
task_i = TargetPosTask(api, "DCE.i2509")
主循环里各策略模块只操作自己列表内的 task。账户级 risk_ratio 超阈值时,上层统一对所有 symbol set_target_volume(0)(见组合风控、emergency 专题)。
四、同品种多策略:必须加汇总层
若策略 A 和 B 都对 SHFE.rb2510 有意见,不能各创建一个 task,也不能各 set 一次。应设汇总模块:
python
sig_a = strategy_a_target() # 例如 +2
sig_b = strategy_b_target() # 例如 -1
raw = sig_a + sig_b
target_rb = clamp(raw, -MAX_LOTS, MAX_LOTS)
task_rb.set_target_volume(target_rb)
log(strategy_id="merged", sig_a=sig_a, sig_b=sig_b, target=target_rb)
clamp 限制在账户与风控允许范围内。汇总函数单独文件 + 单元测试,避免某策略改信号时忘了上限。
两策略信号相反时,净仓可能为 0,这是设计结果;若业务上要有优先级(A 覆盖 B),在汇总规则里写死,不要隐式竞争。
五、报单、日志与风控
- 日志每条带
strategy_id,get_trade对账时按时间段与 symbol 归属。 - 拒单率、无成交监控分策略统计,便于发现某一腿报单过频。
- 天勤
TqRiskRule系列(如报单频率限制)挂在TqApi层,对全账户生效,多策略共享额度,要统一规划。
六、切勿多进程抢同一 TqAccount
两个 Python 进程各 TqApi(TqAccount(...)) 登录同一资金账号,报单、持仓查询会互相干扰,极易重复开仓或撤单冲突。要么单进程多策略(推荐),要么多资金账户,要么一进程一账户。
七、回测要与实盘同一汇总逻辑
TqBacktest 里若回测"策略 A alone",实盘却 A+B 汇总,曲线会对不上。回测阶段就应使用与实盘相同的 merge_targets(),或明确标注"回测仅单策略"。
总结
一个账户跑多策略并非不能做,前提是先把"谁能改哪个仓、同品种如何合并、冲突时谁优先"这三件事写清楚。天勤的设计使得同一 symbol 下通常只应由唯一的任务或唯一的汇总结果负责最终 set_target_volume,因此多策略需要一个汇总层把各自信号合成目标仓位。TqMultiAccount 解决的是不同资金账户并列的问题,不会在同一资金户下自动完成分仓隔离,所以更不能让多个进程抢同一个账户。把 OWNER 映射、汇总公式、以及冲突暂停规则都固化到文档与代码里,多个策略才能形成协同增益,而不是互相干扰。
FAQ
1)task 能指定 account 吗?
多账户模式下构造 task 时可指定 account;单账户默认操作全户净仓。
2)人工在 APP 改某一品种?
只同步该 symbol 的 target,见人工对账专题。
3)子策略崩溃,主进程还在?
子策略应用线程/进程间队列,崩溃不应留下半拉子 set;或全在一个进程里 try/except 隔离。
4)回测多策略资金共用?
TqSim 一个模拟户,汇总逻辑与实盘一致即可。
风险提示
以上内容用于架构设计参考,不构成投资建议。