| name | tqsdk |
| description | TianQin SDK (tqsdk) - Python量化交易框架,用于期货/期权/股票交易策略开发、回测与实盘交易 |
TqSdk 开发指南
TqSdk 是由信易科技开发的开源 Python 量化交易库,基于快期交易及行情服务器体系,支持期货、期权、股票的行情获取、策略开发、回测与实盘交易。
何时使用本技能
当用户需要以下内容时触发:
- 使用 TqSdk 编写量化交易策略
- 获取期货/期权/股票实时行情、K线、Tick 数据
- 进行策略回测(支持 Tick 级和 K 线级)
- 配置实盘交易、模拟交易账户
- 使用 TargetPosTask 进行目标持仓交易
- 使用技术指标(ta/tafunc)进行策略分析
- 使用算法交易模块(TWAP/VWAP)
- 调试 TqSdk 异步编程模型相关问题
安装
pip install tqsdk -U
pip install tqsdk -U -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host=pypi.tuna.tsinghua.edu.cn
环境要求: Python 3, Windows 7+ / macOS / Linux
注意: TqSdk 使用 asyncio,部分 IDE(如 Spyder)不支持。推荐使用 VS Code、Cursor、Trae 等支持 asyncio 的 IDE。
核心概念
编程模型
TqSdk 使用单线程异步模型,核心循环为:
from tqsdk import TqApi, TqAuth
api = TqApi(auth=TqAuth("快期账户", "账户密码"))
quote = api.get_quote("SHFE.rb2401")
klines = api.get_kline_serial("SHFE.rb2401", 60)
while True:
api.wait_update()
if api.is_changing(quote):
print(f"最新价: {quote.last_price}")
if api.is_changing(klines):
print(f"最新K线收盘价: {klines.close.iloc[-1]}")
api.close()
关键要点:
get_quote()、get_kline_serial() 等返回的是引用对象,值在 wait_update() 时自动更新
- 每个引用对象只需调用一次获取函数
wait_update() 是阻塞函数,收到数据包才返回
is_changing() 判断指定对象在最近一次 wait_update 中是否被更新
合约代码格式
格式:交易所代码.合约代码(大小写敏感)
"SHFE.cu2401"
"DCE.m2401"
"CZCE.SR401"
"CFFEX.IF2401"
"INE.sc2401"
"GFEX.si2401"
"DCE.m2401-C-3500"
"SHFE.au2404C480"
"CFFEX.IO2402-C-4000"
"KQ.m@CFFEX.IF"
"KQ.i@SHFE.bu"
"KQD.m@CBOT.ZS"
"CZCE.SPD SR401&SR403"
"DCE.SP a2409&a2501"
"SSE.600000"
"SZSE.000001"
账户类型
模拟交易(免费)
from tqsdk import TqApi, TqAuth
api = TqApi(auth=TqAuth("快期账户", "账户密码"))
from tqsdk import TqSim
api = TqApi(TqSim(init_balance=100000), auth=TqAuth("快期账户", "账户密码"))
快期模拟交易(持久化)
from tqsdk import TqApi, TqKq, TqAuth
api = TqApi(TqKq(), auth=TqAuth("快期账户", "账户密码"))
实盘交易(专业版)
from tqsdk import TqApi, TqAccount, TqAuth
api = TqApi(TqAccount("H海通期货", "账号", "密码"), auth=TqAuth("快期账户", "账户密码"))
直连 CTP
from tqsdk import TqApi, TqCtp, TqAuth
api = TqApi(TqCtp("tcp://180.168.xxx:41205", "tcp://180.168.xxx:41205", "账号", "密码"),
auth=TqAuth("快期账户", "账户密码"))
多账户
from tqsdk import TqApi, TqMultiAccount, TqAccount, TqSim, TqAuth
api = TqApi(TqMultiAccount([TqAccount("H海通期货", "账号1", "密码1"), TqSim()]),
auth=TqAuth("快期账户", "账户密码"))
行情数据
实时行情
quote = api.get_quote("SHFE.cu2401")
K线数据
klines = api.get_kline_serial("SHFE.cu2401", 60)
klines = api.get_kline_serial("SHFE.cu2401", 60*60)
klines = api.get_kline_serial("SHFE.cu2401", 60*60*24)
klines = api.get_kline_serial("SHFE.cu2401", 10)
print(klines.close.iloc[-1])
ma = klines.close.rolling(20).mean()
print(klines.close.iloc[-3:])
while True:
api.wait_update()
if api.is_changing(klines.iloc[-1], "datetime"):
print("新K线产生")
Tick 数据
ticks = api.get_tick_serial("SHFE.cu2401")
交易操作
下单/撤单
order = api.insert_order("SHFE.rb2401", "BUY", "OPEN", volume=3, limit_price=4000)
order = api.insert_order("SHFE.rb2401", "BUY", "OPEN", volume=3)
while order.status != "FINISHED":
api.wait_update()
api.cancel_order(order)
账户与持仓查询
account = api.get_account()
print(account.balance)
print(account.available)
position = api.get_position("SHFE.rb2401")
print(position.pos_long)
print(position.pos_short)
TargetPosTask 目标持仓
自动管理下单撤单,调整到目标仓位:
from tqsdk import TqApi, TqAuth, TargetPosTask
api = TqApi(auth=TqAuth("快期账户", "账户密码"))
target_pos = TargetPosTask(api, "SHFE.rb2401")
target_pos.set_target_volume(5)
target_pos.set_target_volume(-3)
target_pos.set_target_volume(0)
target_pos = TargetPosTask(api, "SHFE.rb2401", price="PASSIVE")
target_pos = TargetPosTask(api, "SHFE.rb2401", price="ACTIVE")
target_pos.cancel()
while not target_pos.is_finished():
api.wait_update()
策略回测
from datetime import date
from tqsdk import TqApi, TqAuth, TqSim, TqBacktest, BacktestFinished
acc = TqSim(init_balance=1000000)
try:
api = TqApi(acc,
backtest=TqBacktest(start_dt=date(2023, 1, 1), end_dt=date(2023, 12, 31)),
auth=TqAuth("快期账户", "账户密码"))
quote = api.get_quote("SHFE.rb2401")
klines = api.get_kline_serial("SHFE.rb2401", 60*60*24)
target_pos = TargetPosTask(api, "SHFE.rb2401")
while True:
api.wait_update()
if api.is_changing(klines.iloc[-1], "datetime"):
ma5 = klines.close.iloc[-6:-1].mean()
if quote.last_price > ma5:
target_pos.set_target_volume(1)
else:
target_pos.set_target_volume(-1)
except BacktestFinished:
print(acc.trade_log)
print(acc.tqsdk_stat)
api.close()
回测规则:
- 撮合规则:对价成交,不会部分成交
- 报单后立即做成交判定
- 支持 Tick 级和 K 线级回测
- 支持股票回测(需使用
TqSimStock)
- 主连合约不能直接交易,需用
quote.underlying_symbol 获取标的
技术指标
内置指标 (tqsdk.ta)
from tqsdk.ta import MA, MACD, RSI, BOLL, ATR, KDJ
klines = api.get_kline_serial("SHFE.rb2401", 60*60*24)
ma = MA(klines, 20)
macd = MACD(klines, 12, 26, 9)
boll = BOLL(klines, 20, 2)
rsi = RSI(klines, 14)
kdj = KDJ(klines, 9, 3, 3)
atr = ATR(klines, 14)
序列计算函数 (tqsdk.tafunc)
from tqsdk import tafunc
ema = tafunc.ema(klines.close, 20)
std = tafunc.std(klines.close, 20)
highest = tafunc.highest(klines.high, 20)
lowest = tafunc.lowest(klines.low, 20)
算法交易
TWAP 算法
from tqsdk import TqApi
from tqsdk.algorithm import Twap
api = TqApi(auth="快期账户,用户密码")
target_twap = Twap(api, "SHFE.rb2401", "BUY", "OPEN",
volume=500, duration=300,
min_volume_each_order=10,
max_volume_each_order=25)
while True:
api.wait_update()
if target_twap.is_finished():
break
api.close()
VWAP + TargetPosScheduler
from tqsdk import TqApi, TargetPosScheduler
from tqsdk.algorithm import vwap_table
api = TqApi(auth="快期账户,用户密码")
time_table = vwap_table(api, "CZCE.MA401", target_pos=-100, duration=600)
scheduler = TargetPosScheduler(api, "CZCE.MA401", time_table)
while not scheduler.is_finished():
api.wait_update()
api.close()
图形化界面 (Web GUI)
from tqsdk import TqApi, TqAuth
api = TqApi(auth=TqAuth("快期账户", "账户密码"), web_gui=True)
api = TqApi(auth=TqAuth("快期账户", "账户密码"), web_gui=":9876")
启动后在浏览器访问显示的地址,可以查看 K 线图、持仓、委托单等信息。
高级特性
多策略运行
每个策略是独立进程,可以同时运行多个策略互不影响:
api = TqApi(TqAccount("期货公司", "账号", "密码"), auth=TqAuth("快期账户", "密码"))
api = TqApi(TqAccount("期货公司", "账号", "密码"), auth=TqAuth("快期账户", "密码"))
无人值守运行
import logging
from contextlib import closing
logging.basicConfig(filename='strategy.log', level=logging.INFO)
with closing(TqApi(TqAccount("期货公司", "账号", "密码"),
auth=TqAuth("快期账户", "密码"))) as api:
pass
钉钉消息推送
import requests
from json import dumps
def send_msg(content):
webhook = "你的钉钉webhook地址"
msg = {"msgtype": "text", "text": {"content": f"天勤量化\n{content}"}}
requests.post(webhook, data=dumps(msg),
headers={"content-type": "application/json;charset=utf-8"})
模拟交易自定义手续费/保证金
sim = TqSim()
api = TqApi(sim, auth=TqAuth("快期账户", "账户密码"))
sim.set_commission("SHFE.cu2401", 50)
sim.set_margin("SHFE.cu2401", 26000)
常见策略模式
套利策略(价差交易)
q_near = api.get_quote("SHFE.rb2401")
q_far = api.get_quote("SHFE.rb2405")
t_near = TargetPosTask(api, "SHFE.rb2401")
t_far = TargetPosTask(api, "SHFE.rb2405")
while True:
api.wait_update()
spread = q_near.last_price - q_far.last_price
if spread > 250:
t_near.set_target_volume(-1)
t_far.set_target_volume(1)
elif spread < 200:
t_near.set_target_volume(0)
t_far.set_target_volume(0)
均线策略
klines = api.get_kline_serial("SHFE.rb2401", 60*15, data_length=200)
target_pos = TargetPosTask(api, "SHFE.rb2401")
while True:
api.wait_update()
if api.is_changing(klines.iloc[-1], "datetime"):
ma5 = klines.close.iloc[-6:-1].mean()
ma20 = klines.close.iloc[-21:-1].mean()
if ma5 > ma20:
target_pos.set_target_volume(1)
else:
target_pos.set_target_volume(-1)
核心 API 速查
| 函数 | 说明 |
|---|
TqApi(account, auth, backtest, web_gui) | 创建 API 实例 |
api.get_quote(symbol) | 获取实时行情 |
api.get_kline_serial(symbol, duration, data_length) | 获取K线序列 |
api.get_tick_serial(symbol, data_length) | 获取Tick序列 |
api.insert_order(symbol, direction, offset, volume, limit_price) | 下单 |
api.cancel_order(order) | 撤单 |
api.get_account() | 获取账户资金 |
api.get_position(symbol) | 获取持仓 |
api.get_order(order_id) | 获取委托单 |
api.get_trade(trade_id) | 获取成交记录 |
api.wait_update(deadline) | 等待数据更新 |
api.is_changing(obj, key) | 判断对象是否更新 |
api.close() | 关闭连接 |
TargetPosTask(api, symbol, price) | 创建目标持仓任务 |
target_pos.set_target_volume(volume) | 设置目标持仓 |
参考文件
本技能包含以下详细参考文档(位于 references/ 目录):
入门
- getting_started.md - TqSdk 介绍、安装、十分钟快速入门
使用教程
- usage_1_策略程序回测.md - 策略回测、合约行情、历史数据、TqSdk整体结构
- usage_2_tqsdk_与_vnpy_有哪些差别.md - 与vn.py/CTP对比、交易辅助工具
- usage_3_批量回测_参数搜索及其它.md - 批量回测、策略程序结构、TqBacktest
- usage_4_在_trae_中高效学习和使用_tqsdk.md - Trae集成、账户与交易、期权基本使用
- usage_5_在_cursor_中高效学习和使用_tqsdk_p1/p2.md - Cursor集成、快期账户、多策略手册
- usage_6_策略程序图形化界面.md - Web GUI 界面
API 参考
- api_ref_1_*.md - 算法模块(TWAP)、TargetPosTask高级功能、无人值守运行
- api_ref_2_*.md - TqSim模拟交易、TqMultiAccount多账户、紧急停止方案
- api_ref_3_*.md - tafunc序列计算函数
- api_ref_4_*.md - 业务对象(objs)、TqRohon、TqJees
- api_ref_5_*.md - 交易策略示例
- api_ref_6_*.md - TqSdk专业版
- api_ref_7_*.md - ta技术指标计算函数
- api_ref_8_*.md - TqCtp直连CTP、TqZq、TqYida
- api_ref_9_*.md - TqApi框架及核心业务(完整API文档)
- api_ref_10_*.md - 版本变更记录
- api_ref_11_*.md - 时间维度目标持仓、GUI库协作
- api_ref_12_*.md - lib业务工具库、DataDownloader、高级委托
- api_ref_13_*.md - risk_rule风控模块、TqKq、算法模块示例
- api_ref_14_*.md - EDB数据服务+Coze自然语言投研
策略示例(约50个完整策略,来自 shinnytech.com)
趋势策略 (15个):
- strategies_trend_a_p1~p4.md - TRIX、分形趋势、CMO动量、涡旋指标、Hull均线、Keltner通道、Qstick、Aroon
- strategies_trend_b_p1.md - 动量排名、量价趋势(VPT)
- strategies_trend_b_p2.md - Aberration布林带、菲阿里四价、自动扶梯
- strategies_trend_b_p3.md - Dual Thrust、R-Breaker
套利策略 (15个):
- strategies_arbitrage_p1~p5.md - 热卷-不锈钢、玻璃-纯碱、白糖-淀粉、PTA产业链、生猪饲料、焦煤-焦炭、MTO甲醇制烯烃、铜铝比价、大豆压榨、裂解价差、股指跨期、Box期权、多期限套利、钢厂利润、多油脂套利
均值回归与其他策略 (15个):
- strategies_other_p1~p5.md - 卡尔曼滤波配对、距离法配对、Pivot Point、CCI、RSI超买超卖、Z-Score、均值回归、冰山委托、盘口算法、POV成交量比例、随机森林预测、ATR波动率、海龟交易法、VWAP算法、网格交易
需要详细信息时,请查阅对应的参考文件。
资源链接