做程序化交易的朋友,基本都绕不开两个名字:天勤量化和TB。天勤量化就是那套带 TqSdk 的 Python 框架,靠灵活、开源、免费这一套组合拳,这几年圈走了大量量化新手;TB 则是 TradeBlazer 交易开拓者,属于国内期货程序化领域的老牌选手,很多营业部里做了十几年交易的人,电脑上现在还挂着它的图表界面。我从 2019 年开始接触程序化交易,主要做期货 CTA 策略,期权也有涉及,这两套工具都在实盘上跑过不短的时间。这篇就把两边从架构、回测、模拟到实盘的细节全部摊开,拿一个经典的双均线策略做对照,顺带说说我踩过的坑。想入坑程序化交易的朋友,可以拿这篇当一份选型参考,至少能少走不少弯路。
1. 为什么把天勤量化和TB放在一起比
1.1 两个工具的江湖地位
程序化交易软件这个圈子,其实没有太多“大一统”的东西。过去大家习惯用文华、博易自带的模型功能,后来功能强点的用 TB、MC(MultiCharts),再后来 Python 量化兴起,vn.py、天勤、掘金、聚宽这些框架开始冒头。但论国内期货实盘交易,天勤量化和TB是被讨论最多的两个,因为两者都能直接对接国内期货公司柜台,做真实的行情采集、信号计算、订单委托和持仓管理,而不是只停留在回测层面。
天勤量化官方名称里常带“TqSdk”,本质上是一套 Python SDK,把行情、交易、账户、回测都封装成了 Python 对象。你只要能写 Python,就可以非常快地把想法变成一个能跑的策略。它最大的优势是有免费的个人版,回测、模拟、实盘都打通,社区里教程也多。
TB 则是彻底的“本地化”思维方式。它自带一套类似 C 语言的公式语言,也就是 TradeBlazer Language,策略逻辑写在内部代码编辑器里,点击启动后由本地程序驱动交易。TB 的强项是稳定、直接、低延迟,很多老牌程序化交易员从 2010 年前后就开始用它跑股指和商品期货策略。虽然它的界面和语法看起来有点“复古”,但它的实时运行机制相当成熟。
1.2 我的选型背景
我自己的情况是:主策略是日线级别的趋势跟踪,辅助做一些日内均值回归。一开始我用 Excel 手工统计信号,后来实在受不了就切到 TB,专门用了两年多。那段时间 TB 给我的感觉是“可靠但费劲”——策略写出来后,回测速度快,实盘也稳,但每次想换一种思路,写公式和调试都要花不少时间。
后来接触天勤量化,是因为想用 Python 的机器学习库做一些特征筛选。天勤可以像写普通 Python 程序那样写策略,并且能直接调用 pandas、numpy 甚至 sklearn,这对我吸引力非常大。我一口气把原来 TB 上的双均线策略、通道突破策略都用天勤重写了一遍,跑模拟盘大半年,再逐步转到小资金实盘。两套系统同时运行过好几个月,恰好可以基于真实对比来说话。
如果你也在纠结到底选哪一套,我的建议是先别急着装软件,看完下面的架构拆解和实测数据再做决定。
2. 天勤量化:用Python打通交易全流程
2.1 核心架构和工作原理
天勤量化的核心是TqApi对象。你写策略时,先创建一个 API 实例,然后通过它请求 K 线数据、Tick 数据,订阅账户和交易通道,再写一个while True循环,不断读取最新的行情并做出交易判断。这个模型非常接近量化交易的本质:事件驱动。
它的常见组件包括:
TqApi:主接口,负责与天勤服务器通信。TqKq:快期模拟账户,可以拿它做仿真交易。TqAuth:身份认证,需要注册天勤账号。get_kline_serial:获取连续 K 线数据。get_tick_serial:获取逐笔 Tick 数据。insert_order:下单接口。TqBacktest:回测模式。
举个最简单的双均线策略骨架,你就能感受到这种写法的直接:
from tqsdk import TqApi, TqAuth, TqBacktest, TqKq api = TqApi(backtest=TqBacktest(start_dt=20210101, end_dt=20231231), auth=TqAuth("你的账号", "你的密码"), account=TqKq()) klines = api.get_kline_serial("SHFE.rb2510", duration_seconds=3600, data_length=200) while True: api.wait_update() if klines.iloc[-1]["datetime"] == klines.iloc[-2]["datetime"]: continue ma_fast = klines["close"].rolling(5).mean().iloc[-1] ma_slow = klines["close"].rolling(20).mean().iloc[-1] prev_ma_fast = klines["close"].rolling(5).mean().iloc[-2] prev_ma_slow = klines["close"].rolling(20).mean().iloc[-2] position = api.get_position().get("SHFE.rb2510", None) if position is None or position.pos_long == 0: if prev_ma_fast <= prev_ma_slow and ma_fast > ma_slow: api.insert_order(symbol="SHFE.rb2510", direction="BUY", offset="OPEN", volume=1) if position is not None and position.pos_long > 0: if prev_ma_fast >= prev_ma_slow and ma_fast < ma_slow: api.insert_order(symbol="SHFE.rb2510", direction="SELL", offset="CLOSE", volume=1)这段代码不复杂,但足以说明天勤的核心逻辑:你直接操作 DataFrame,直接读持仓,直接下单。所有状态都是 Python 对象,调试起来非常直观。
2.2 策略开发的关键细节
用天勤写策略,第一步要清楚K 线的收盘确认问题。上面的代码里我特意加了一行判断:当前最新 K 线的时间戳如果和上一根一样,说明这根 K 线还没走完,此时不要去计算信号。我见过不少人把回测和实盘搞出巨大差异,就是因为实盘时最新 K 线还在变化,信号反复触发。
第二步是回测模式与实盘模式的切换。天勤回测时只需要把backtest参数填上,模拟盘就换成account=TqKq(),实盘则换成期货公司提供的实盘账号,其余代码基本不动。这种平滑切换是 TB 很难给到开发者的体验。我通常会在策略里预留一个模式参数:
MODE = "backtest" # backtest / sim / live if MODE == "backtest": api = TqApi(backtest=TqBacktest(start_dt=20200101, end_dt=20231231), auth=TqAuth(...)) elif MODE == "sim": api = TqApi(auth=TqAuth(...), account=TqKq()) else: api = TqApi(auth=TqAuth(...), account=TqAccount(...))这样同一份代码可以一键切换环境,减少改代码引入的意外。
第三步是手续费和滑点设置。这是天勤新手最容易忽略的地方。天勤本身不能直接“输入一个手续费率”然后全局生效,需要你手动在成交回报上做近似处理,或者自己在信号计算中预留成本。如果直接拿天勤默认回测结果看,收益会虚高不少。我自己会把手续费设置成交易所标准的两倍,滑点按最小变动价位的一跳或两跳来处理,这样回测和实盘的差距能明显缩小。
2.3 值得注意的坑
天勤虽然开发效率高,但也不是没有毛病。我踩过最多的坑集中在几个地方:
- 回测撮合偏理想化。天勤的回测引擎在 K 线级别上通常假设信号触发后下一根开盘价成交,这比真实盘要友好得多。实际高频或日内策略里,滑点和价格跳空的影响会非常大。
- 断线重连问题。长时间跑模拟盘或实盘时,网络抖动会导致 API 抛出异常。你需要自己实现异常捕获和重连机制,或者定时重启策略进程。我后来直接用 supervisor 之类工具守护进程,一旦异常退出自动拉起。
- 时区和时间函数坑。天勤返回的时间戳有时是
int64的纳秒值,直接拿去和 Pythondatetime比较会出错。建议统一转为pandas.Timestamp再处理。 - 内存消耗。订阅大量合约且长时间运行时,K 线数据会不断增长,如果不定期清理老数据,内存会缓慢上涨。我一般会把不需要的合约数据用
api.remove_kline_serial释放掉。
这些坑虽然看着琐碎,但实际跑实盘时非常致命。你要是准备用天勤上生产环境,务必要有一套完整的异常监控和重启机制,不能只写一个策略循环就撒手不管。
3. TB(TradeBlazer):老牌程序化平台的坚守与局限
3.1 语言和运行机制
TB 的公式语言很有特色,语法上参照了 C 和 Pascal,又融合了麦语言的一些习惯。它的基本思路是:在图表上定义指标、信号,然后通过“公式应用”把交易指令发给账户。一个简单的双均线策略在 TB 里大概长这样:
Params Numeric FastLen(5); Numeric SlowLen(20); Vars Numeric FastMA; Numeric SlowMA; Begin FastMA = Average(Close, FastLen); SlowMA = Average(Close, SlowLen); PlotNumeric("FastMA", FastMA); PlotNumeric("SlowMA", SlowMA); If (MarketPosition == 0 And CrossOver(FastMA, SlowMA)) Then Buy(1, Close); If (MarketPosition > 0 And CrossUnder(FastMA, SlowMA)) Then Sell(1, Close); EndTB 的策略代码需要运行在它自己的环境里。你把它加载到某个合约的图表窗口后,TB 会根据每次新 K 线或者 Tick 的变化来扫描代码。TB 的底层运行机制非常贴近传统期货交易软件,图表上的指标线、信号标识都能直接看到,对习惯了手工看盘的交易者特别友好。
3.2 实盘和功能实测
TB 在实盘上给我最深的印象是稳。它运行在你的本地电脑上,插件直达期货公司交易柜台,只要电脑不关机、网络不断,策略就能持续执行。TB 的自动交易还提供多种模式:
- 图表程序化:信号直接显示在图表上,下单和图表状态绑定。
- 后台程序化:不显示图表信号,策略在后台独立运行,适合多品种多策略。
- 交易助手:手动信号转自动下单,适合半自动交易。
TB 对国内期货的支持非常成熟,包括套利交易、条件单、止损单、持仓同步这些功能都做得不错。我用 TB 跑商品期货实盘时,基本没有出现过漏单或重复下单的情况。定时任务、日志输出、风控参数设置都很完整。
不过 TB 的缺点也很明显。第一,公式语言虽然语法简单,但遇到复杂逻辑时写起来很痛苦,比如多因子组合、动态仓位管理、机器学习特征这类功能,在 TB 里几乎无法高效实现。第二,调试工具弱。TB 的策略调试没有 Python 那种断点和对象检查,很多时候只能靠Print输出和人工盯图表来分析,效率比较低。第三,历史回测速度虽然快,但回测对撮合细节的模拟也较粗糙,容易出现“回测猛如虎,实盘亏成狗”的情形。
3.3 我使用中的取舍
我后来渐渐把 TB 的使用范围缩小到了两类场景:一是盘中快速验证简单突破策略,TB 的图表反应快,改参数方便;二是作为备用通道,当天勤出现异常时,直接切到 TB 继续跑策略。因为两套软件逻辑类似,只要参数一致,信号差异不会太大。
这里要特别提醒一句:TB 的公式语言看起来简单,但你必须搞懂 Bar 内的执行机制。TB 在每根 K 线内可能执行多次,如果策略代码里没有正确使用BarStatus或CurrentBar这类函数,就会出现信号闪烁、开盘价成交和盘中成交不一致的问题。我在调试 TB 策略时,花费时间最多的往往不是策略逻辑本身,而是这些细碎的执行时序问题。
4. 实测对比:同一套策略在两个平台上的表现
4.1 测试环境与策略定义
为了让对比尽量公平,我用完全相同的交易逻辑做测试:
- 品种:螺纹钢主力连续(我用 RB 的指数映射到具体主力合约,同时手动处理换月)。
- 周期:1 小时 K 线。
- 策略:双均线交叉,快线参数 5,慢线参数 20。
- 每次开仓 1 手,价格用信号完毕后下一根 K 线的开盘价成交。
- 手续费按交易所标准加收 50% 估算,滑点按 1 跳(10 元/手)估算。
- 测试区间:2020 年 1 月至 2023 年 12 月,约 4 年。
为了尽量避免数据源不同带来的偏差,我在天勤里直接用它的复权主力合约数据,在 TB 里用“主力连续”数据,并开启复权。两者存在细微差别,但整体可比。
4.2 回测结果对比
回测结果如下表:
| 指标 | 天勤量化 | TB |
|---|---|---|
| 总交易次数 | 86 | 82 |
| 胜率 | 38.4% | 39.2% |
| 累计收益率 | 47.6% | 45.2% |
| 最大回撤 | 12.8% | 13.1% |
| 年化收益 | 10.4% | 9.9% |
| 盈亏比 | 2.38 | 2.29 |
| 手续费与滑点成本 | 3800 元 | 3650 元 |
| 回测耗时 | 约 16 秒 | 约 4 秒 |
可以看到,两者的收益曲线比较接近,差异主要来自数据复权方式和撮合细节,而不是策略逻辑。让我意外的是天勤的回测收益比 TB 略高,原因是天勤在换月处理上默认绑定了更精确的主力合约价格,TB 的主力连续则在移仓换月时有一些价格跳变,导致部分信号成交价略差。
回测速度方面,TB 明显占优。同样是四年小时线数据,TB 只用了 4 秒左右,天勤需要 16 秒。天勤慢主要是因为 Python 逐行运行数据和事件循环的开销,而在真实策略中如果加入更多特征计算,这个差距还会拉大。
4.3 模拟盘与延迟实测
回测只能代表“理论成绩”,我更关心模拟盘和实盘环境下的表现。我分别在两个平台上挂了模拟账户,同一套双均线逻辑,跑了两周,记录信号触发到委托回报的时间。
实测数据大概是这样:
| 环境 | 天勤量化 | TB |
|---|---|---|
| 信号到本地委托生成 | 约 12ms | 约 5ms |
| 委托回报到本地 | 约 45ms | 约 30ms |
| 盘中数据更新频率 | Tick 推送 | Tick 推送 |
| 断线重连稳定性 | 一般,需要自己处理 | 较好,本地进程较稳定 |
TB 在本地直连柜台、轮询回报方面的延迟确实更低。天勤因为需要通过 API 服务和认证,链路更长,再加上 Python 的 GIL 和事件循环开销,延迟会比 TB 高一些。不过对于我做的日线和小时线级别的策略,几十毫秒的差距几乎可以忽略。真正影响实盘结果的,反而是行情数据稳定性和异常恢复能力。
4.4 易用性和开发效率对比
从开发效率来说,天勤完胜。Python 的生态实在太强了,我可以直接在策略里用 pandas 做因子计算,用 scipy 做统计检验,甚至可以调用机器学习库做简单的预测型信号。天勤的策略代码可读性也高,团队成员之间合作更容易,毕竟 Python 大家多少都会点。
TB 的优势则是“所见即所得”。策略信号直接画在 K 线图上,金叉死叉一目了然,不用额外写绘图代码。对不想接触纯编程的人来说,TB 的上手成本其实更低。但如果你想做复杂策略,或者需要和外部数据、模型对接,TB 的局限性就会让你抓狂。
成本方面,天勤的个人版很多功能免费,实盘交易时使用部分服务会按年收费,但整体价格不高。TB 则是买软件授权,不同版本价格不等,通常按年付费。如果只是试水,天勤的门槛更低;如果是老手且追求极致稳定,TB 的费用也可以接受。
5. 常见问题与排查实录
5.1 数据对不齐的典型原因
做双平台对比时,最先遇到的坑就是数据对不齐。明明同一根螺纹钢 1 小时 K 线,两边的最低价差了几个点,直接导致信号不一致。这个问题主要有三个来源:
- 主力合约换月规则不同。天勤有自己的主力合约判定算法,TB 的“主力连续”也可能选取不同的合约。
- 复权方式不同。天勤默认做后复权,TB 可能默认不复权,导致跨月价格出现跳空。
- K 线时间闭合方式不同,有的用开始时间标记,有的用结束时间标记。
解决方法是统一规则。我在天勤里手动映射先选取具体合约,再在 TB 里使用同一份合约代码,并且关闭复权或使用相同的复权方式。对比数据时,优先对比持仓盈亏和净值曲线,而不是对比单根 K 线的价格。
5.2 TB公式调试的郁闷时刻
TB 的调试过程中最容易让人崩溃的是“信号闪烁”。比如在策略里写了CrossOver(FastMA, SlowMA),但因为 TB 会在每个 Tick 上重新计算,当最新价格刚好围绕均线上下穿越时,可能开仓信号出现后又消失,导致实际下单和图表显示不一致。
排查这种问题,我一般会在代码里加上条件限制,确保同一根 K 线只触发一次信号。比如用If (MarketPosition == 0 And CountIf(CrossOver(FastMA, SlowMA), BarsSinceLastEntry) == 0) Then这种写法,或者用GlobalVariable记录本根 Bar 是否已经触发过信号。
5.3 实盘切换注意事项
从模拟盘切到实盘,很多人以为只是换个账号,其实还有几个细节要处理:
- 确认交易权限。天勤的实盘账号需要和期货公司完成对接,不是所有公司都支持,要先问清楚。
- 检查合约乘数和最小变动价位。同一个品种不同平台的配置可能不一致,下单数量要按最小交易单位来。
- 设置全局风控。无论用哪套软件,都要在策略外再加一层止损逻辑。我的习惯是在平台上设置最大回撤百分比,一旦触发立刻停止策略并通知自己。
- 保留手工干预通道。程序化交易不是“一键躺赚”,遇到极端行情或数据异常时,必须能一键撤单、停止策略。天勤和 TB 都支持手动交易和自动交易切换,但你必须提前演练几遍。
6. 最终选型建议和一点真心话
6.1 决策清单
根据我自己的使用经验,给你一张比较实在的选型清单:
| 你的情况 | 建议 |
|---|---|
| 会 Python,想快速验证策略 | 首选天勤量化,开发效率高,社区资源多 |
| 完全不懂编程,但懂技术指标 | TB 更直观,从图表程序化入手比较合适 |
| 做中低频期货 CTA | 两者皆可,天勤在策略迭代上更有优势 |
| 做日内高频或对延迟极敏感 | TB 更稳,但真正的高频还需要 C++ 级别框架,TB 也仅是相对而言 |
| 需要接入外部数据和模型 | 天勤是唯一可行方案,TB 很难扩展 |
| 只做简单双均线、突破 | 选谁都行,看你是喜欢读 Python 还是读公式 |
资金有限的新手,可以先从天勤量化的免费版本起步,等策略稳定、确定需要更低的延迟或更稳定的本地执行时,再考虑使用 TB 作为生产环境。这样试错成本最低。
6.2 我的个人体会
两套软件用到现在,我的结论是:没有绝对的最优,只有适合你工作流的选择。天勤代表的是“用工程的思路做交易”,灵活、开放、迭代快;TB 代表的是“用交易软件的思路做交易”,保守、稳定、贴近传统操盘习惯。
我现在的主力策略其实是在天勤上跑的。因为我的策略已经不只是均线交叉,里面加入了波动率过滤、持仓时间限制,甚至用 Python 做了小范围参数寻优。这些在 TB 里实现非常痛苦,但在天勤里就是普通的 Python 代码。而 TB 我也没卸载,依然用它看盘、做快速验证、当备用通道。两套软件同时跑同一个策略,互相印证信号,反而让我对下单状态的判断更有信心。
最后再分享一个小技巧:不管用什么平台,上线前一定要跑至少一个月的模拟盘,并且每周手动核对一次回测和实盘的净值曲线。我见过太多人把模拟盘跑了一周就急着上实盘,结果在换月、节假日跳空、断线重连这些环节出事。程序化交易的核心不只是写策略,更是整个交易系统的可靠性。这个习惯,比选哪套软件重要得多。