一、前言
在实际量化交易中,我们经常需要同时监控多个期货合约。比如:
- 同时监控螺纹钢和铁矿石(相关品种联动)
- 同时监控同一品种的不同月份合约(跨期套利)
- 构建多品种组合策略
本文将介绍如何使用**天勤量化(TqSdk)**同时订阅多个期货合约数据。
二、为什么选择天勤量化(TqSdk)
在众多期货量化工具中,**天勤量化(TqSdk)**是目前国内最受欢迎的开源期货量化框架之一。本文使用TqSdk获取多合约数据,主要基于以下优势:
| 特点 | 说明 |
|---|---|
| 完全免费 | 开源免费,无需付费即可获取实时行情 |
| 多合约支持 | 可同时订阅多个合约,数据统一管理 |
| 数据同步 | 支持多合约数据对比、价差计算 |
| 上手简单 | 几行Python代码即可实现多合约监控 |
| 套利友好 | 非常适合开发跨品种、跨期套利策略 |
安装方法:
pipinstalltqsdk快期账户:使用TqSdk需要注册快期账户(免费),访问 https://www.shinnytech.com 注册。
三、同时订阅多合约(完整代码)
2.1 基础示例
#!/usr/bin/env python# -*- coding: utf-8 -*-""" 功能:同时订阅多个期货合约 说明:本代码仅供学习参考 """fromtqsdkimportTqApi,TqAuth# 创建API实例api=TqApi(auth=TqAuth("你的快期账户","你的密码"))# 同时订阅多个合约的行情quote_rb=api.get_quote("SHFE.rb2501")# 螺纹钢quote_hc=api.get_quote("SHFE.hc2501")# 热卷quote_i=api.get_quote("DCE.i2501")# 铁矿石# 等待数据就绪api.wait_update()# 打印各合约最新价格print("="*50)print("多合约行情数据")print("="*50)print(f"螺纹钢(rb2501):{quote_rb.last_price}")print(f"热卷(hc2501):{quote_hc.last_price}")print(f"铁矿石(i2501):{quote_i.last_price}")api.close()2.2 使用列表批量订阅
当需要订阅大量合约时,可以使用列表和循环:
fromtqsdkimportTqApi,TqAuth api=TqApi(auth=TqAuth("你的快期账户","你的密码"))# 定义要订阅的合约列表symbols=["SHFE.rb2501",# 螺纹钢"SHFE.hc2501",# 热卷"DCE.i2501",# 铁矿石"DCE.j2501",# 焦炭"DCE.jm2501",# 焦煤]# 批量订阅,存入字典quotes={}forsymbolinsymbols:quotes[symbol]=api.get_quote(symbol)# 等待数据api.wait_update()# 打印所有合约价格print("合约代码\t\t最新价\t\t涨跌幅")print("-"*50)forsymbol,quoteinquotes.items():# 计算涨跌幅ifquote.pre_closeandquote.pre_close!=0:change=(quote.last_price-quote.pre_close)/quote.pre_close*100else:change=0print(f"{symbol}\t{quote.last_price}\t\t{change:.2f}%")api.close()四、实时监控多合约
3.1 持续监控价格变化
fromtqsdkimportTqApi,TqAuthimportdatetime api=TqApi(auth=TqAuth("你的快期账户","你的密码"))# 订阅黑色系主要品种quote_rb=api.get_quote("SHFE.rb2501")quote_i=api.get_quote("DCE.i2501")quote_j=api.get_quote("DCE.j2501")print("开始监控黑色系品种,按Ctrl+C停止...")print("-"*60)whileTrue:api.wait_update()# 检测任一合约价格变化updated=Falseifapi.is_changing(quote_rb,"last_price"):updated=Trueifapi.is_changing(quote_i,"last_price"):updated=Trueifapi.is_changing(quote_j,"last_price"):updated=Trueifupdated:now=datetime.datetime.now().strftime("%H:%M:%S")print(f"[{now}] 螺纹:{quote_rb.last_price:.0f}| "f"铁矿:{quote_i.last_price:.1f}| "f"焦炭:{quote_j.last_price:.1f}")五、同时获取多合约K线
4.1 获取多个合约的K线数据
fromtqsdkimportTqApi,TqAuth api=TqApi(auth=TqAuth("你的快期账户","你的密码"))# 同时获取两个合约的5分钟K线klines_rb=api.get_kline_serial("SHFE.rb2501",300,100)klines_hc=api.get_kline_serial("SHFE.hc2501",300,100)api.wait_update()print("螺纹钢最近3根K线:")print(klines_rb[["datetime","close"]].tail(3))print()print("热卷最近3根K线:")print(klines_hc[["datetime","close"]].tail(3))api.close()4.2 计算价差(跨品种套利基础)
fromtqsdkimportTqApi,TqAuth api=TqApi(auth=TqAuth("你的快期账户","你的密码"))# 获取螺纹钢和热卷的行情quote_rb=api.get_quote("SHFE.rb2501")quote_hc=api.get_quote("SHFE.hc2501")print("螺纹钢-热卷 价差监控")print("-"*40)whileTrue:api.wait_update()ifapi.is_changing(quote_rb)orapi.is_changing(quote_hc):# 计算价差spread=quote_rb.last_price-quote_hc.last_priceprint(f"螺纹:{quote_rb.last_price:.0f}- 热卷:{quote_hc.last_price:.0f}= 价差:{spread:.0f}")六、跨期合约对比
同时订阅同一品种的不同月份合约:
fromtqsdkimportTqApi,TqAuth api=TqApi(auth=TqAuth("你的快期账户","你的密码"))# 订阅螺纹钢不同月份合约quote_01=api.get_quote("SHFE.rb2501")# 近月quote_05=api.get_quote("SHFE.rb2505")# 远月api.wait_update()print("螺纹钢跨期价差分析")print("="*40)print(f"rb2501 (近月):{quote_01.last_price}")print(f"rb2505 (远月):{quote_05.last_price}")print(f"跨期价差:{quote_05.last_price-quote_01.last_price}")api.close()七、注意事项
| 事项 | 说明 |
|---|---|
| 订阅数量 | TqSdk免费版有合约订阅数量限制 |
| 数据同步 | 不同合约的数据更新时间可能不同步 |
| 内存占用 | 订阅过多合约会增加内存占用 |
| 网络延迟 | 合约越多,数据推送量越大 |
八、总结
| 功能 | 代码 |
|---|---|
| 订阅单个合约 | api.get_quote("SHFE.rb2501") |
| 订阅多个合约 | 多次调用get_quote,分别存储 |
| 批量订阅 | 使用循环 + 字典存储 |
| 检测变化 | api.is_changing(quote, "last_price") |
同时订阅多合约是构建套利策略、组合策略的基础,掌握这一技能后可以开发更复杂的交易系统。
免责声明:本文仅供学习交流使用,不构成任何投资建议。期货交易有风险,入市需谨慎。
更多资源:
- 天勤量化官网:https://www.shinnytech.com
- GitHub开源地址:https://github.com/shinnytech/tqsdk-python
- 官方文档:https://doc.shinnytech.com/tqsdk/latest