期货量化一进程多账户:天勤 TqMultiAccount 用法边界

期货量化一进程多账户:天勤 TqMultiAccount 用法边界

前言

国内期货量化里,常见部署是:用 Python + 天勤 TqSdk 写一条趋势策略,订阅螺纹钢 5 分钟 K 线,均线信号出来后TargetPosTask调仓。有时同一套信号要分到两个期货公司账户执行(资金隔离、合规报备),或者一边TqSim模拟、一边TqAccount小额实盘对照。开两个 Python 进程各跑各的,行情订阅和信号计算重复,配置和日志也难对齐。

天勤提供TqMultiAccount:一个TqApi同时挂多个TqAccountTqSimTqKq等,单进程内写策略、共享行情。代价是多账户模式下,get_positionget_accountinsert_orderTargetPosTask都必须显式传account参数,漏传会报错或悄悄读错户。下面说明构造方式、适用边界和迁移注意点。

一、构造方式

multiaccount.py

fromtqsdkimportTqApi,TqAuth,TqAccount,TqSim,TqMultiAccount,TargetPosTask acc_real=TqAccount("H某期货","123456","pwd")acc_sim=TqSim()api=TqApi(TqMultiAccount([acc_real,acc_sim]),auth=TqAuth("快期账户","pwd"))

未指定账户列表时默认为[TqSim()]

二、必须带 account 的 API

文档强调多账户模式下:

  • get_position(symbol, account=...)
  • get_account(account=...)
  • insert_order(..., account=...)
  • TargetPosTask(api, symbol, ..., account=...)

示例:

task_a=TargetPosTask(api,"SHFE.rb2510",account=acc_sim)task_b=TargetPosTask(api,"SHFE.rb2510",account=acc_real)task_a.set_target_volume(2)task_b.set_target_volume(0)# 实盘暂不下

三、适用场景与边界

适合:

  • 同一信号多账户复制执行(注意合规与报备)。
  • 模拟与实盘并行验证。
  • 跨期货公司分散品种。

不适合:

  • 两账户完全独立策略、订阅差异大,却硬塞单进程——订阅并集仍大,CPU 高,故障域耦合。
  • 需要进程级隔离的风控(一账户崩拖累另一账户)。

实盘账户数量受快期账户权限限制,以官网说明为准。

四、日志与对账

每笔日志写account_id或期货公司名;get_order可能混合多账户委托,筛选时按 order 所属 account 字段(以 objs 为准)分类。日终分别导出acc_real.get_account()acc_sim.get_account()

五、与单账户代码迁移

从单TqAccount迁到TqMultiAccount,全局搜索get_positionTargetPosTaskinsert_order,补account=参数。单例TargetPosTask的 key 含 account id,同 symbol 不同户可各有一个 task。

六、风控按账户隔离

每个 account 独立维护emergencyrisk_ratio阈值。A 账户触发停机不应自动平 B 账户,除非策略明确如此设计。读get_account(account=acc_x)分别判断。

七、信号复制与手数缩放

同源信号可复制到两户,但手数可按权益比例缩放:

bal_a=acc_a.get_account().balance bal_b=acc_b.get_account().balance lots_b=int(raw_lots*bal_b/bal_a)

缩放后仍要检查available与保证金。

八、故障域

单进程多账户意味着一个未捕获异常可能两户都停。关键账户可考虑独立进程 + 独立TqApi,多账户只适合关联度高的部署。

总结

一进程多账户靠天勤TqMultiAccount把多个 tradeable 绑进同一个TqApi,适合同源信号多路执行或模拟实盘对照。关键是所有交易与查询 API 显式传accountTargetPosTask也要分账户创建。账户间策略差异大或要硬隔离时,仍应用多进程,而不是强行多账户。

FAQ

1)行情订阅共用吗?

是,同一 Api 订阅一次行情,多账户共享。

2)能否一个账户只读不下?

可以,只建 task 但不set_target_volume非零。

3)TqKq 和 TqAccount 混用?

文档示例支持,注意 auth 一致。

4)漏传 account 报什么错?

多账户模式下TargetPosTask构造会要求指定 account。


本文基于天勤 TqSdk 公开 API 整理,不构成投资建议。