期货程序化交易这个圈子,选平台这件事几乎每隔一段时间就会被拿出来重新讨论一遍。我见过太多人在这上面反复横跳:今天觉得这个平台回测快,明天又听说那个平台实盘稳,折腾几个月下来策略没跑通几套,倒是把两边的坑都踩了个遍。天勤量化(TqSdk)和TB开拓者(TradeBlazer)这两个名字,只要你在国内做期货程序化,基本绕不开。前者是Python生态里比较活跃的一套量化框架,后者是深耕多年的老牌图表化策略平台,两者的设计哲学、使用门槛、适用人群差异非常大。这篇东西不打算给你一个"谁更好"的结论,那种结论没有意义,我只想把两个平台在实际使用中的真实差异摊开讲清楚,包括我在回测、实盘对接、策略迁移、数据处理这些环节里踩过的具体坑,让你看完之后能自己判断哪个更适合你手上的活。
1. 两个平台到底在解决什么层面的问题
很多人一上来就对比"哪个功能多",这个思路本身就偏了。天勤量化和TB开拓者压根不是同一类工具,它们解决的问题层次不一样,搞清楚这一点,后面的选择才有依据。
1.1 天勤量化的定位:把行情和交易接口封装成Python库
天勤量化的本质是一套Python SDK,核心价值在于它把期货公司的行情通道和交易通道做了统一封装。你写Python代码,调用它的API拿K线、下单、查持仓,底层帮你处理了行情订阅、断线重连、交易指令的路由这些脏活。它的策略逻辑完全由你自己用Python写,框架只提供数据接口和交易接口,不限制你的策略结构。
这种设计的好处是自由度极高。你想用什么数据结构、想怎么组织回测循环、想接什么第三方库(numpy、pandas、sklearn甚至深度学习框架),全都随你。坏处也很明显:回测引擎、绩效统计、参数优化这些功能,要么你自己写,要么用它的回测模块但接受它的约束。它更像是一块积木,而不是一个装修好的房子。
1.2 TB开拓者的定位:图表化策略开发与全流程管理
TB开拓者走的是另一条路。它提供了一套完整的策略开发环境,策略用它的TB语言(类Pascal语法)写在图表上,回测、参数优化、绩效报告、实盘交易都在同一个界面里完成。你打开软件,加载品种K线,把策略挂上去,回测结果和资金曲线直接画出来,参数优化有内置的遗传算法模块,实盘交易有专门的头寸管理和信号执行机制。
它的核心优势是"闭环"。从写策略到看回测到上实盘,不需要你操心数据从哪来、订单怎么发、持仓怎么同步,平台全包了。代价是策略必须按它的语法和结构来写,想接外部数据源或者做特别复杂的自定义计算,会比较别扭。
1.3 一张表看清两者的能力边界
| 维度 | 天勤量化 | TB开拓者 |
|---|---|---|
| 策略语言 | Python | TB语言(类Pascal) |
| 回测引擎 | 自带基础回测,可自建 | 内置完整回测与优化 |
| 数据获取 | API调用,需自行管理 | 平台内置,自动加载 |
| 实盘对接 | 需配置期货公司通道 | 内置交易接口,配置账户即可 |
| 绩效分析 | 基础统计,深度分析需自写 | 内置完整绩效报告 |
| 参数优化 | 需自行实现或借助第三方 | 内置遗传算法优化 |
| 扩展性 | 极强,可接任意Python库 | 有限,受限于平台框架 |
| 上手门槛 | 需要Python基础 | 需要理解TB语言和图表逻辑 |
这张表不是让你数谁的优势项多,而是让你看清:如果你需要的是"灵活拼装",天勤更合适;如果你需要的是"开箱即用的完整工作流",TB更省心。我见过有Python基础的人硬上TB,结果被TB语言的语法和图表逻辑折磨得够呛;也见过完全不懂编程的人想用天勤,光是环境配置和数据接口就卡了一周。
2. 环境搭建与第一行策略代码的真实体验
环境搭建这个环节最能体现两个平台的设计取向。我分别在不同机器上装过这两个平台,过程差异很大,值得细说。
2.1 天勤量化的安装与账户配置
天勤的安装本身不复杂,pip装包就行:
pip install tqsdk但装完之后才是真正的开始。你需要一个天勤的账户(免费版有功能和品种限制),然后在代码里初始化API:
from tqsdk import TqApi, TqAuth api = TqApi(auth=TqAuth("你的账户", "你的密码")) klines = api.get_kline_serial("SHFE.rb2401", 60)这里第一个坑就来了:get_kline_serial返回的是一个持续更新的DataFrame,它不是一次性快照,而是会随着行情推送不断变化。很多人第一次用的时候,在循环里反复调用这个函数,结果发现数据重复或者逻辑错乱。正确做法是在循环外拿一次引用,循环内用api.wait_update()等待更新,然后读这个引用里的最新值。
第二个坑是账户权限。免费账户能拿的品种和K线数量有限,做回测的时候如果历史数据长度不够,策略逻辑根本跑不出有意义的结论。我建议一开始就明确自己要交易的品种,确认账户权限覆盖到了再往下走,不然写到一半发现数据拿不到,很打击积极性。
实盘交易还需要配置期货公司的交易通道,这一步涉及账户绑定和资金账户授权,不同期货公司的流程略有差异,但核心就是拿到交易账号和授权信息后填进TqAuth或者对应的交易配置里。这里要注意,模拟交易和实盘交易的配置是分开的,别把模拟环境的配置直接搬到实盘上。
2.2 TB开拓者的安装与策略挂载
TB的安装是传统的客户端安装包,装完打开就是一个完整的交易软件界面。它的上手路径是:打开软件,登录账户,加载品种图表,然后新建策略。
TB语言写策略的结构大致是这样:
Params Numeric Length(20); Vars NumericSeries MA1; Begin MA1 = Average(Close, Length); If(CrossOver(Close, MA1)) { Buy(1, Close); } If(CrossUnder(Close, MA1)) { Sell(1, Close); } End这段代码对写过Pascal或者老式结构化语言的人很友好,但对纯Python背景的人来说,NumericSeries这种类型声明、Begin/End块、CrossOver这种内置函数,都需要重新适应。TB的图表逻辑是"策略挂在图表上,每根K线走一遍逻辑",这个思维模型和Python里自己写回测循环是两回事。
TB的第一个坑在于图表数据的加载。它默认加载的K线数量有限,如果你的策略需要很长的历史数据做指标计算(比如200日均线),要手动调整图表加载的K线根数,否则指标前期全是无效值。这个设置在图表属性里,不显眼,但影响很大。
第二个坑是策略的"信号执行"机制。TB里策略产生的信号和实际下单之间有一个"信号确认"的环节,涉及K线收盘确认还是实时触发,这个设置直接决定了回测和实盘的差异。默认配置下,回测用的是K线收盘价确认信号,但实盘如果设成实时触发,两者结果会对不上。这个细节后面讲回测差异的时候还会展开。
2.3 两种上手路径的取舍
从环境搭建的体验来看,天勤的门槛在"编程能力和环境管理",TB的门槛在"语言学习和平台逻辑理解"。如果你已经有Python基础,天勤的起步会顺很多,因为pip装包、写脚本、调试这一套你本来就熟。如果你没有编程基础但愿意学一套专用语言,TB的图形化界面和内置功能会让你少操很多心。
我的实际体会是:天勤适合"我有一堆想法想快速用代码验证"的人,TB适合"我想按部就班把一套策略从回测做到实盘"的人。这不是能力高低的问题,是工作方式匹配度的问题。
3. 回测环节的差异:自由度与一致性的博弈
回测是程序化交易的核心环节,两个平台在这上面的差异最能说明它们的设计哲学。我拿同一个简单的双均线策略在两个平台上分别跑了一遍,结果和过程中的体验差异很典型。
3.1 天勤回测:自己掌控每一个细节
天勤的回测需要你自己组织循环。它的TqApi在回测模式下(用TqBacktest)会按时间推进行情,你的策略逻辑写在while api.wait_update()的循环里。大致结构:
from tqsdk import TqApi, TqAuth, TqBacktest from datetime import date api = TqApi(backtest=TqBacktest(start_dt=date(2023,1,1), end_dt=date(2023,12,31)), auth=TqAuth("账户", "密码")) klines = api.get_kline_serial("SHFE.rb2401", 60) while True: api.wait_update() if api.is_changing(klines.iloc[-1], "datetime"): # 在这里写你的策略逻辑 close = klines.close.iloc[-1] # 计算均线、判断信号、下单这种模式的好处是你完全知道每一根K线发生了什么,手续费、滑点、成交价都可以自己控制。比如你想模拟"信号出现后下一根K线开盘价成交",就自己在逻辑里处理;想加滑点,就在成交价上加减。回测的透明度极高。
坏处是,绩效统计、资金曲线、最大回撤这些,要么自己算,要么用它的TqSim配合自己写的统计。它提供了一些基础的回测报告功能,但深度分析(比如分年度收益、不同市况下的表现)需要你自己补。我一开始觉得这很麻烦,后来发现这反而是好事——你自己算的指标,你清楚每一个数字怎么来的,不会出现"平台说年化30%但我不知道它怎么算的"这种情况。
天勤回测的一个关键坑是时间推进的粒度。wait_update是按行情推送推进的,如果你的K线周期是60分钟,但行情推送是逐笔的,那么循环会执行很多次,你需要用is_changing判断K线是否更新,只在K线更新时执行策略逻辑。这个判断写错了,策略会在同一根K线上重复触发,回测结果完全失真。我见过有人因为这个bug,回测出来交易次数是正常值的几十倍。
3.2 TB回测:一键出结果但要知道它怎么算的
TB的回测是点一下按钮的事。策略挂在图表上,设置好回测区间和初始资金,点"回测",资金曲线、交易明细、绩效报告全出来了。这个体验确实顺畅,尤其对不想折腾统计代码的人来说。
但顺畅的背后有几个必须搞清楚的点。第一是成交价假设。TB默认的信号成交价是信号K线的收盘价或者下一根K线的开盘价,这个在回测设置里可以选,但很多人不看,直接用默认值。如果你的策略是收盘价触发信号,但实际交易中你不可能在收盘那一刻精确成交,那么回测结果就会偏乐观。我一般会把成交价设成下一根K线开盘价,这样更接近实盘。
第二是手续费和滑点。TB的回测设置里有手续费和滑点的配置项,默认值往往偏低。不同品种的手续费差异很大,螺纹钢和黄金的手续费结构完全不同,滑点也跟品种流动性和你的下单量有关。这些参数不设对,回测出来的收益曲线就是假的。我的习惯是按品种逐个设置,手续费参考期货公司实际收取标准,滑点按保守估计给。
第三是信号确认机制。前面提过,TB有"K线收盘确认"和"实时触发"两种模式。回测默认用收盘确认,但如果你实盘用实时触发,两者会有差异。更麻烦的是,TB的回测引擎在信号确认上的处理和实盘执行引擎不完全一致,某些边界情况(比如信号出现在K线最后一秒)会有偏差。这个不是bug,是设计上的取舍,但你得知道它的存在。
3.3 回测结果对不上的排查思路
如果你在两个平台上跑同一个策略,结果差异很大,别急着怀疑平台有问题,按这个顺序排查:
- 数据区间和周期是否一致:两个平台的历史数据起点可能不同,K线周期对齐方式也可能有差异(比如60分钟K线是从整点开始还是从开盘时间开始算)。
- 成交价假设是否一致:一个用收盘价成交,一个用下一根开盘价成交,结果必然不同。
- 手续费和滑点设置是否一致:这是最常见的差异来源。
- 信号确认机制是否一致:收盘确认和实时触发的结果差异可能很大。
- 复权处理是否一致:期货连续合约的换月处理,两个平台的做法可能不同。
我实际对比过,把上面五项对齐之后,同一个双均线策略在两个平台上的回测结果能接近到可接受的范围,剩下的差异主要来自数据源的细微不同和成交撮合的细节。这个排查过程本身就是对策略理解的一次深化,比单纯看一个收益率数字有价值得多。
4. 实盘对接:从回测到真金白银的那道坎
回测跑得再漂亮,实盘对不上就是白搭。两个平台在实盘对接上的差异,直接决定了你从"研究"到"交易"的过渡顺不顺。
4.1 天勤实盘的通道配置与状态管理
天勤的实盘需要配置交易通道。你需要在代码里指定交易账户,然后通过API下单。核心是TqApi初始化时传入交易相关的配置,下单用api.insert_order:
order = api.insert_order(symbol="SHFE.rb2401", direction="BUY", offset="OPEN", volume=1, limit_price=3800)天勤实盘的关键在于状态管理。因为你是自己写代码,持仓、挂单、成交这些状态需要你自己维护和查询。它提供了api.get_position、api.get_order这些接口,但你得自己处理"下单后等成交""部分成交怎么办""撤单重发"这些逻辑。这对编程能力要求高,但控制力也强。
一个常见的坑是断线重连后的状态同步。网络波动导致连接断开再重连后,你的本地状态可能和服务器不一致。天勤的API在重连后会重新推送状态,但你的策略逻辑如果没处理好,可能会重复下单或者漏掉持仓。我的做法是在每次重连后强制同步一次持仓和挂单,确认状态一致再继续交易。
另一个坑是交易时段和行情时段的差异。期货有夜盘,不同品种的交易时间不同,天勤的行情推送和交易通道在非交易时段的行为需要你提前测试。我建议在实盘前用模拟账户把整个交易日的流程跑一遍,包括开盘、盘中、收盘、夜盘,确认每个环节的状态都对。
4.2 TB实盘的信号执行与头寸管理
TB的实盘相对省心,因为平台帮你管了大部分状态。策略挂在图表上,信号产生后平台负责发单、管理头寸、处理成交回报。你需要在软件里配置好交易账户,然后启动策略的实盘运行。
但省心不等于没有坑。TB实盘的第一个关键是信号执行模式要和回测一致。前面说过,回测用收盘确认,实盘如果设成实时触发,结果会对不上。我一般把实盘也设成收盘确认,虽然会错过一些盘中机会,但保证了回测和实盘的一致性,这个取舍我觉得值。
第二个关键是头寸管理。TB有自动头寸管理和手动干预两种模式。自动模式下,策略信号直接对应头寸变化;手动模式下,你可以干预。听起来手动更灵活,但实际使用中,手动干预容易导致策略状态和实际持仓不一致,后面很难对齐。我的建议是除非特殊情况,否则用自动模式,让策略完全控制头寸。
第三个坑是多策略多品种的冲突。如果你在同一个账户上跑多个策略,不同策略可能对同一品种产生相反方向的信号,TB的头寸管理在这种情况下的处理逻辑需要你提前搞清楚。我见过有人两个策略一个做多一个做空同一品种,结果净头寸为零但手续费照付,还以为是策略失效。
4.3 实盘前的检查清单
不管用哪个平台,实盘前这几项必须过一遍:
- 模拟账户完整跑通一个交易日,包括开平仓、撤单、部分成交场景
- 确认手续费和滑点设置和实际一致
- 确认信号执行模式和回测一致
- 确认断线重连后的状态同步逻辑正确
- 确认极端行情(涨跌停、流动性枯竭)下的行为符合预期
- 小资金实盘验证至少两周,再考虑加大资金
这个清单看着简单,但每一项背后都可能有坑。我自己的习惯是把清单打印出来,每过一项打个勾,全部打完才上实盘。这个笨办法救过我好几次。
5. 策略迁移与长期维护的现实考量
选平台不是一锤子买卖,策略写出来之后要维护、要迭代、要迁移,这些长期成本往往被低估。
5.1 从天勤迁移到TB,或者反过来
如果你在天勤上用Python写了一套策略,想迁到TB,基本等于重写。TB语言和Python的语法差异大,数据结构、循环方式、内置函数都不同,策略逻辑可以照搬,但代码得一行行重写。反过来,从TB迁到天勤,同样要重写,而且TB里一些平台内置的功能(比如某些技术指标的计算、信号确认机制)在天勤里要自己实现。
这个迁移成本在做平台选择时就要考虑进去。如果你预计策略会长期迭代、可能需要换平台,那么策略逻辑和平台接口的耦合度越低越好。天勤在这方面有优势,因为Python代码本身是独立的,你甚至可以把策略核心逻辑写成纯函数,平台接口只做数据输入和订单输出,这样换平台时核心逻辑不用动。TB的策略和平台绑定较深,迁移成本更高。
5.2 版本更新带来的兼容性问题
两个平台都会更新版本,更新可能带来API变化或者行为变化。天勤的Python包更新后,某些接口的参数或返回值可能变,你的代码需要跟着改。TB的客户端更新后,策略的编译行为或者回测引擎可能有调整,老策略需要重新验证。
我的做法是:锁定一个验证过的版本,不轻易升级,升级前先在模拟环境把现有策略全部回测一遍,确认结果没有意外变化再切到实盘。这个习惯让我避免了好几次因为版本更新导致的策略行为异常。
5.3 社区与文档的支撑力度
天勤的文档相对完整,API参考和示例代码都有,社区里Python量化相关的讨论也多,遇到问题搜一下往往能找到思路。TB的文档偏传统,很多细节要靠实践摸索,但它的用户群体里老手多,一些经验性的东西在论坛里能挖到。
这个差异在实际使用中影响不小。天勤遇到问题,你大概率能通过文档或者搜索解决;TB遇到问题,有时候得靠自己在软件里试或者问有经验的人。这不是说哪个更好,而是你要知道自己遇到问题时能从哪里获得帮助。
6. 我的选择逻辑和给你的建议
说了这么多,回到最实际的问题:你该选哪个。我的判断逻辑是这样的。
如果你有Python基础,策略想法多、迭代快,需要接外部数据或者做复杂的自定义计算,天勤更合适。它的自由度能让你把想法快速变成可回测的代码,代价是回测统计和实盘状态管理要自己多操心。
如果你没有编程基础或者不想在代码上花太多精力,希望有一套完整的从回测到实盘的流程,TB更合适。它的闭环体验能让你专注于策略逻辑本身,代价是灵活性和扩展性受限。
如果你两边都想用,也不是不行。我见过有人用天勤做策略研究和快速验证,验证通过的策略再用TB重写做实盘管理。这个组合利用了天勤的灵活性和TB的闭环性,但迁移成本要自己承担。
最后分享一个我踩过的坑:不要在两个平台之间反复横跳。我早期有过一段时间,今天觉得这个好就用这个,明天听说那个稳就换那个,结果两边的策略都没跑透,时间全花在适应平台上了。选定一个,把它用透,把策略跑通,比什么都重要。平台只是工具,策略逻辑和风险管理才是真正决定成败的东西。