天勤量化TqSdk行情获取完全上手指南:从安装到实盘策略一条路走通

天勤量化TqSdk行情获取完全上手指南:从安装到实盘策略一条路走通

【免费下载链接】tqsdk-python 天勤量化开发包, 期货量化, 实时行情/历史数据/实盘交易 【免费下载链接】tqsdk-python 项目地址: https://gitcode.com/gh_mirrors/tq/tqsdk-python

期货量化开发最烦人的环节是什么?不是策略写不出来,而是卡在"数据拿不到、环境跑不通"这两步上。天勤量化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 里的数字是 nan0。不要在 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_price1ask_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 参数时默认使用内置模拟账户,这是最稳妥的练手方式。

TqSdk 交易图表:K线、成交量与买卖信号标注

上图是运行策略时交易图表的效果,可以看到 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:模拟盘和实盘怎么切换?

关键在于 TqApiaccount 参数。不传 account 时默认是内置模拟账户 TqSim,此时下单不会产生真实成交;传入 TqKq 类实例则使用快期模拟交易服务器;接入期货公司真实账户时使用 TqAccount 并填好期货公司、账号与密码。务必按"内置模拟 → 快期模拟 → 实盘"的顺序递进测试。

Q5:回测怎么跑?

TqApi 传入 TqBacktest(start_dt, end_dt) 对象即可进入回测模式,策略代码几乎不用改,就能在指定时间段内用历史行情重放策略表现。回测结束后可直接查看账户收益、回撤等统计结果。

TqSdk 策略回测界面:日志、账户资金与回撤统计

上图是一次双均线策略回测的输出:左侧是成交记录日志,右侧是账户资金与回撤统计,这是验证策略是否值得实盘的第一道关卡。

八、下一步该做什么

到这里,你已经跑通了 TqSdk 的完整主线。建议按下面的顺序继续深入:

  1. 照着写一遍最小行情示例,确认账户、安装、字段读取都没问题。
  2. 把批量监控和 K 线示例跑起来,把数据存成文件,做一次简单的价格趋势分析。
  3. 在模拟盘上运行价差策略,观察 TargetPosTask 的持仓调整过程,理解目标持仓模型的运作方式。
  4. 学习回测,把策略放回历史行情里检验,回测通过后再考虑模拟盘实盘化。

更多资料可以直接从项目里挖:入门文档见 doc/quickstart.rst,API 详解见 tqsdk/api.pyget_quoteget_quote_listget_kline_serialwait_update 都在里面),大量可直接运行的示例策略在 tqsdk/demo/tutorial/tqsdk/demo/example/ 目录下。社区方面,天勤量化官方文档站、用户交流群和知乎专栏都有活跃讨论,遇到具体报错时,把报错信息复制到文档站里搜索,绝大多数问题都有现成解答。

量化交易没有捷径,但有正确工具的人起步更快。先让第一段行情数据在你的屏幕上滚起来,再一步步走到实盘——祝你在量化这条路上跑得稳、走得更远。

【免费下载链接】tqsdk-python 天勤量化开发包, 期货量化, 实时行情/历史数据/实盘交易 【免费下载链接】tqsdk-python 项目地址: https://gitcode.com/gh_mirrors/tq/tqsdk-python

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值