天勤量化TqSdk行情获取完全上手指南:从安装到实盘策略一条路走通
期货量化开发最烦人的环节是什么?不是策略写不出来,而是卡在"数据拿不到、环境跑不通"这两步上。天勤量化TqSdk(TianQin SDK)就是为破解这个痛点而生的 Python 开源量化交易开发包:几行代码就能订阅到国内五大期货交易所的实时行情,历史数据、策略回测、模拟盘、实盘交易全都打包在内。本文不绕弯子,直接带你按 5 个步骤走完全程——装好环境、拿到行情、存下数据、跑通策略、避开坑点,让"从零到实盘"变成一条看得见的路。
一、先搞清楚:TqSdk 到底能替你省下哪些功夫
在你动手写代码之前,先用一分钟看看这套开发包的边界,避免后面走弯路。
它解决的核心问题
- 🚀 接入成本低:不需要自己对接交易所接口,一个
TqApi对象就完成了行情与交易通道的封装 - 📊 全品种覆盖:上期所(SHFE)、大商所(DCE)、郑商所(CZCE)、中金所(CFFEX)、能源中心(INE)、广期所(GFEX)以及沪深股市均可订阅
- 💾 内存数据库机制:行情、K线、账户、持仓等数据全部保存在内存对象中,每次
wait_update()后直接读取,无中间数据库的访问延迟 - 🔧 一套 API 贯穿全程:行情订阅、历史数据、回测、模拟盘、实盘共用同一套接口风格,学习一次到处复用
- 🆓 完全免费:开源项目,安装即用,配合快期免费账户即可获得行情与模拟交易能力
需要说明的是,TqSdk 是"通道 + 数据"型工具,它不替你写策略。双均线、网格、套利这些逻辑需要你自己实现,但底层的数据搬运、下单、持仓管理这些脏活累活它全包了。
二、三步搭好环境:版本、安装、账户
整个过程没有隐藏步骤,照做即可。
第一步:确认 Python 版本
打开终端,执行:
python --version
TqSdk 要求 Python 3.9 及以上。如果你版本过低,请先升级到 3.9+ 再继续。Windows 7 及以上、macOS、Linux 系统均可正常使用。
第二步:安装 TqSdk
pip install tqsdk -U
网络慢的话,用清华镜像加速:
pip install tqsdk -U -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host=pypi.tuna.tsinghua.edu.cn
装完后可以验证一下版本号,确认装的是最新的:
import tqsdk
print(tqsdk.__version__)
第三步:注册一个快期账户
访问天勤量化官网完成账户注册。这个账户是连接行情服务器的"通行证",后续所有代码里的 TqAuth("你的账户", "你的密码") 都要用到它。注册不收费,先用模拟功能完全够学。
💡 小贴士:如果只是体验行情,也可以先用模拟账户跑通流程,再考虑实盘,后面的章节会专门讲这两者的区别。
三、5 分钟跑通第一段行情代码
环境就绪后,先跑通一个最简示例,把"实时行情"四个字变成屏幕上滚动的数字。
from tqsdk import TqApi, TqAuth
# 创建 API 实例,传入快期账户完成认证
api = TqApi(auth=TqAuth("你的快期账户", "账户密码"))
# 订阅单个合约的盘口行情
quote = api.get_quote("SHFE.rb2610")
while True:
api.wait_update()
print(f"{quote.datetime} 最新价: {quote.last_price}")
逐行解释一下这段代码在做什么:
TqApi(auth=TqAuth(...)):建立与天勤服务器的连接,认证信息从这里进去。首次连接时会下载合约基础信息,所以第一次运行可能稍慢,属正常现象。api.get_quote("SHFE.rb2610"):订阅螺纹钢 2610 合约。合约代码格式统一为交易所.品种合约,比如DCE.i2609是大商所铁矿石、CFFEX.IF2406是中金所沪深300股指期货。api.wait_update():阻塞等待数据更新,每次返回后,quote对象里就是最新的盘口快照。这是 TqSdk 事件驱动模型的核心——所有数据都必须等wait_update()返回后再读取。
⚠️ 常见坑:在还没有收到第一个行情包之前,
quote里的数字是nan或0。不要在wait_update()之前就读取并计算行情,否则你会拿到一堆空值。
运行后你会看到类似下面的输出(控制台会不断刷新):
2026-08-13 14:02:11.500 最新价: 3123.0
2026-08-13 14:02:11.900 最新价: 3124.0
...
按下 Ctrl+C 即可结束程序。
四、把行情数据真正用起来:字段、批量订阅与 K 线
能打印最新价只是起点。这一节把行情对象里最有用的字段、批量监控方法和 K 线序列一次讲透。
4.1 行情对象里都有什么
通过 get_quote() 拿到的对象,常用字段如下:
| 字段 | 含义 |
|---|---|
datetime | 最新行情时间 |
last_price | 最新成交价 |
volume | 累计成交量 |
open_interest | 持仓量 |
bid_price1 / ask_price1 | 买一价 / 卖一价 |
bid_volume1 / ask_volume1 | 买一量 / 卖一量 |
upper_limit / lower_limit | 当日涨跌停价 |
其中 bid_price1、ask_price1 是判断盘口深度最直接的指标,很多简单的做市与盘口策略就基于这两个字段。
4.2 一次性监控多个合约
真实交易中很少只盯一个合约。用 get_quote_list() 批量订阅,一个循环搞定所有品种:
from tqsdk import TqApi, TqAuth
api = TqApi(auth=TqAuth("你的快期账户", "账户密码"))
# 订阅一组相关合约
symbols = ["SHFE.rb2610", "SHFE.rb2701", "DCE.i2609"]
quotes = api.get_quote_list(symbols)
while True:
api.wait_update()
for sym, q in zip(symbols, quotes):
print(f"{sym}: {q.last_price}")
💡 小贴士:能批量就批量。多个
get_quote()最终也会合并成一次订阅请求,但用get_quote_list()写出来的代码结构更清晰,也方便后续统一处理。
4.3 拿 K 线:序列数据怎么读
行情之外,get_kline_serial() 用于获取连续的 K 线数据,它返回的是一个 K 线序列对象,支持 duration_seconds 指定周期(如 60 代表 1 分钟线),data_length 指定保留根数:
from tqsdk import TqApi, TqAuth
api = TqApi(auth=TqAuth("你的快期账户", "账户密码"))
klines = api.get_kline_serial("DCE.i2609", duration_seconds=60, data_length=200)
while True:
api.wait_update()
# 检查最后一根K线是否发生更新
if api.is_changing(klines.iloc[-1]["datetime"]):
last = klines.iloc[-1]
print(f"最新一分钟K线 开:{last['open']} 高:{last['high']} 低:{last['low']} 收:{last['close']}")
这里用到了 api.is_changing()——它用来判断某个字段在本次 wait_update() 中是否真的变化了,是避免重复处理同一根 K 线的关键手法。
上图是天勤量化终端的策略编辑界面,左侧是策略文件列表,右侧是代码编辑区,配合 TqSdk 使用可以边写边看行情反馈。
五、从"看数据"升级到"自动交易":一个价差策略实战
行情到手后,下一步就是让程序替你做决策和下单。TqSdk 的下单核心是 TargetPosTask(目标持仓任务):你只管告诉它"我想要多少手",它负责把实际的买卖动作拆解执行完毕,省去了手写委托管理的心智负担。
下面这个例子演示一个经典的"同品种跨月价差"策略:当近月比远月贵太多时,做空近月、做多远月;价差回落后再把仓位清掉。
from tqsdk import TqApi, TqAuth, TargetPosTask
api = TqApi(auth=TqAuth("你的快期账户", "账户密码"))
# 订阅两个合约的行情
q_near = api.get_quote("SHFE.rb2610")
q_far = api.get_quote("SHFE.rb2701")
# 为两个合约分别创建目标持仓任务
pos_near = TargetPosTask(api, "SHFE.rb2610")
pos_far = TargetPosTask(api, "SHFE.rb2701")
while True:
api.wait_update()
spread = q_near.last_price - q_far.last_price
if spread > 250:
# 价差过高:空近月、多远月
pos_near.set_target_volume(-1)
pos_far.set_target_volume(1)
print("价差偏大,入场:空近月多远月")
elif spread < 200:
# 价差回到正常区间:清仓
pos_near.set_target_volume(0)
pos_far.set_target_volume(0)
print("价差回归,清仓离场")
这段代码的运作逻辑:
TargetPosTask会在后台持续跟踪你的实际持仓,把它调整到set_target_volume()指定的目标值。传正数代表做多,负数代表做空,0 代表平仓。- 策略不手动下单、不手动撤单,持仓管理全部交给任务对象,天然适合做"目标持仓型"策略。
⚠️ 注意:上述示例中所有交易都发生在你的账户里。新手请务必先使用 模拟盘账户 跑策略,确认逻辑无误后再接触实盘。TqApi 未传
account参数时默认使用内置模拟账户,这是最稳妥的练手方式。
上图是运行策略时交易图表的效果,可以看到 K 线图上标注了开仓信号与成交价("买开 1 手@47920"),信号对应的开平仓一目了然。
六、让程序更抗造:错误处理与性能优化
行情程序通常要挂机运行数小时甚至数天,这一节的三点建议能让你的程序更稳定。
1. 用 try/except 包住核心循环
TqSdk 自身带有断线重连能力,但你的业务代码仍需做好异常兜底,避免单次错误导致整个程序退出:
import time
from tqsdk import TqApi, TqAuth
def connect_with_retry(user, pwd, max_try=3):
"""带重试的建连函数:网络波动时自动重试"""
for attempt in range(1, max_try + 1):
try:
api = TqApi(auth=TqAuth(user, pwd))
print("连接成功")
return api
except Exception as e:
print(f"第 {attempt} 次连接失败: {e}")
time.sleep(5)
raise RuntimeError("多次连接失败,请检查网络与账户配置")
2. 别在循环里做重活
wait_update() 返回的频率很高,循环体内应只做轻量计算和打印。需要把数据落盘时,攒够一批再写入文件,减少磁盘 I/O 次数。下面是一个"攒 100 条写一次"的落盘模式:
import json
from datetime import datetime
class TickLogger:
"""行情记录器:批量写盘,避免高频IO"""
def __init__(self, path="ticks.jsonl"):
self.path = path
self.buffer = []
def push(self, quote):
item = {
"time": datetime.now().isoformat(),
"price": quote.last_price,
"volume": quote.volume,
}
self.buffer.append(item)
if len(self.buffer) >= 100:
self.flush()
def flush(self):
with open(self.path, "a", encoding="utf-8") as f:
for it in self.buffer:
f.write(json.dumps(it, ensure_ascii=False) + "\n")
self.buffer.clear()
3. 善用 is_changing() 过滤无效更新
订阅多个合约后,wait_update() 每次返回都可能只有其中一两个合约有变化。用 api.is_changing(quote) 判断后再处理,既能避免重复计算,也能让日志更干净。
七、新手最常问的 5 个问题
Q1:合约代码到底怎么写?
统一格式为 交易所.品种合约。上期所螺纹钢是 SHFE.rb2610,大商所铁矿石是 DCE.i2609,郑商所甲醇是 CZCE.MA609,中金所沪深300股指是 CFFEX.IF2406。注意品种代码要区分大小写,郑商所的品种字母一般是大写。
Q2:行情延迟大概多少?
TqSdk 走的是交易所实时行情通道,延迟在毫秒级别。对绝大多数日线、分钟级策略来说完全够用;对超高频策略,还需要结合自己的网络环境实测评估。
Q3:历史数据怎么拿?
支持两种方式:一是用 get_kline_serial() 拉取任意周期的历史 K 线;二是用数据下载工具批量导出一段时间内的历史 Tick 与 K 线,用于本地研究。项目的 tqsdk/demo/ 目录下有现成示例脚本可以参考。
Q4:模拟盘和实盘怎么切换?
关键在于 TqApi 的 account 参数。不传 account 时默认是内置模拟账户 TqSim,此时下单不会产生真实成交;传入 TqKq 类实例则使用快期模拟交易服务器;接入期货公司真实账户时使用 TqAccount 并填好期货公司、账号与密码。务必按"内置模拟 → 快期模拟 → 实盘"的顺序递进测试。
Q5:回测怎么跑?
给 TqApi 传入 TqBacktest(start_dt, end_dt) 对象即可进入回测模式,策略代码几乎不用改,就能在指定时间段内用历史行情重放策略表现。回测结束后可直接查看账户收益、回撤等统计结果。
上图是一次双均线策略回测的输出:左侧是成交记录日志,右侧是账户资金与回撤统计,这是验证策略是否值得实盘的第一道关卡。
八、下一步该做什么
到这里,你已经跑通了 TqSdk 的完整主线。建议按下面的顺序继续深入:
- 照着写一遍最小行情示例,确认账户、安装、字段读取都没问题。
- 把批量监控和 K 线示例跑起来,把数据存成文件,做一次简单的价格趋势分析。
- 在模拟盘上运行价差策略,观察
TargetPosTask的持仓调整过程,理解目标持仓模型的运作方式。 - 学习回测,把策略放回历史行情里检验,回测通过后再考虑模拟盘实盘化。
更多资料可以直接从项目里挖:入门文档见 doc/quickstart.rst,API 详解见 tqsdk/api.py(get_quote、get_quote_list、get_kline_serial、wait_update 都在里面),大量可直接运行的示例策略在 tqsdk/demo/tutorial/ 和 tqsdk/demo/example/ 目录下。社区方面,天勤量化官方文档站、用户交流群和知乎专栏都有活跃讨论,遇到具体报错时,把报错信息复制到文档站里搜索,绝大多数问题都有现成解答。
量化交易没有捷径,但有正确工具的人起步更快。先让第一段行情数据在你的屏幕上滚起来,再一步步走到实盘——祝你在量化这条路上跑得稳、走得更远。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考






