前言
资金有限时,很多团队想在一个期货资金账户上同时跑多套策略: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:
# 策略 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超阈值时,上层统一对所有 symbolset_target_volume(0)(见组合风控、emergency 专题)。
四、同品种多策略:必须加汇总层
若策略 A 和 B 都对SHFE.rb2510有意见,不能各创建一个 task,也不能各 set 一次。应设汇总模块:
sig_a=strategy_a_target()# 例如 +2sig_b=strategy_b_target()# 例如 -1raw=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 一个模拟户,汇总逻辑与实盘一致即可。
风险提示
以上内容用于架构设计参考,不构成投资建议。