多品种组合与TBPY
单品种策略跑通后,下一步通常是多品种组合(分散风险)和用 Python 开发(借助生态库)。 本章介绍 TBQuant 的多数据源写法和 TBPY(Python 接口)的基本用法,作为进阶起点。
多数据源(多品种)
一个策略可以同时订阅多个品种的数据源(Data0、Data1、Data2……),用 Range 遍历各图层:
Vars
Series<Numeric> maVal;
Events
OnBar(ArrayRef<Integer> indexs)
{
Integer id;
Range[id = 0 : DataCount - 1] // 遍历所有数据源
{
maVal = AverageFC(Close, 20); // 每个品种都算 20 周期均线
// 用 Data0 的信号决定 Data1 的下单……
}
}
DataCount是数据源总数,Range[0:DataCount-1]遍历每个图层。Symbol在 Range 内指向当前图层的合约代码,可据此区分品种做不同逻辑。- 跨周期策略也用多数据源:Data0 设大周期、Data1 设小周期,大周期定向、小周期择时。
多品种组合的好处是分散——不同品种涨跌不同步,组合后整体回撤往往比单品种小。
组合回测与投资分析
- 在策略研究里加载多个品种的同一策略,可以做组合回测,看整体资金曲线。
- 菜单 账户 → 投资分析:对策略交易记录做绩效分析,也支持导入外部交易记录、或只给一条净值曲线就出报告。
- 关注组合层面的净利润、最大回撤、夏普等,而不仅看单品种。
TBPY:Python 接口
TBPY 让你用 Python 写策略、调行情、下单,享受 pandas/numpy 等生态。它作为客户端的扩展运行,
通过 tbpy 模块与 TBQuant 平台通信。
安装
- 需要 Python 3.12(推荐用 Anaconda)。
- 创建 conda 虚拟环境后,用 pip 安装官方提供的
tbpywheel 包:
conda create -n py312 python=3.12
conda activate py312
pip install --force-reinstall tbpy-x.x.x.x-py3-none-any.whl
初始化与运行
import tbpy
tbpy.init(key="tbquant") # 必须最先调用,连接 TBQuant 平台
# ... 写策略类、订阅数据 ...
tbpy.exe() # 开始运行策略
tbpy.exit() # 结束
init 返回 True 表示连接成功,False 时用 tbpy.get_last_err() 查原因。
事件回调(与 TB 语言对应)
TBPY 用类方法实现事件回调,和 TB 语言的 OnInit/OnBar/OnTick/OnOrder/OnFill 一一对应:
| TB 语言事件 | TBPY 回调 |
|---|---|
OnInit | on_init(self, context) |
OnBar | on_bar(self, context, bars, symbol, flag) |
OnTick | on_tick(self, context, tick) |
OnPosition | on_position(self, context, position) |
OnOrder | on_order(self, context, order) |
OnFill | on_fill(self, context, fill) |
OnTimer | on_timer(self, context, timer_id, interval_millsecs) |
订阅数据与下单
class MyStrategy:
def on_init(self, context):
# 订阅 Bar 和 Tick
context.subscribe_bar(symbol='rb000.SHFE', frequency='1m')
context.subscribe_tick(symbol='rb000.SHFE')
def on_bar(self, context, bars, symbol, flag):
for bar in bars:
print(symbol, bar.close)
# 取账户下单
account = tbpy.get_account(account_id='085489')
account.buy(symbol='rb000.SHFE', volume=1, price=4000)
tbpy.exe()
查询历史数据
# 取最近 10 根 1 分钟 Bar
data = tbpy.get_history_n(symbol='rb000.SHFE', frequency='1m', count=10,
flag=tbpy.QuoteFlag.RolloverBackWard)
# 返回 dict{field: ndarray},可直接喂给 numpy/pandas
get_history_n 返回的字段含 open/close/high/low/volume/position/time 等,
配合 numpy/pandas 做因子计算、机器学习都很方便。
TB 语言 vs TBPY 怎么选
| 维度 | TB 语言(策略) | TBPY(Python) |
|---|---|---|
| 上手 | 类 C++/Pascal,门槛中等 | 会 Python 即可 |
| 生态 | 平台内置函数库 | pandas/numpy/sklearn 等全套 |
| 适合 | 标准事件驱动策略、回测实盘 | 数据分析、因子研究、机器学习策略 |
| 性能 | 原生编译,较快 | 依赖 Python,注意效率 |
两者可以互补:用 TBPY 做研究和因子计算,用 TB 语言策略做实盘执行。
小结
多品种用多数据源 + Range 遍历,组合回测看整体绩效;TBPY 让你用 Python 写策略、调行情、下单,
事件回调和 TB 语言一一对应,并能借力 Python 生态做因子研究与机器学习。到本章,TBQuant 从语法、函数、
回测、优化到组合与 TBPY 形成完整闭环。
下一步
回到 TBQuant 总览 查阅其他章节,或对比其他平台: 通达信 / 文华财经 / 天勤 tqsdk。