行情接口TqApi
行情数据是策略的原料。TqSdk 提供三个核心函数获取不同粒度的行情:get_quote(实时盘口)、get_kline_serial(K 线序列)、get_tick_serial(Tick 序列)。它们返回的都是动态引用对象,随 wait_update() 自动更新。
get_quote:实时盘口行情
获取一个合约的实时盘口行情,包括最新价、买卖五档等:
from tqsdk import TqApi, TqAuth
api = TqApi(auth=TqAuth("快期账户", "账户密码"))
quote = api.get_quote("SHFE.rb2410")
while True:
api.wait_update()
if api.is_changing(quote, "last_price"):
print(quote.datetime, quote.last_price, quote.bid_price1, quote.ask_price1)
Quote 常用字段
| 字段 | 含义 |
|---|---|
last_price | 最新价(未收到时为 NaN) |
bid_price1 ~ bid_price5 | 买一到买五价 |
ask_price1 ~ ask_price5 | 卖一到卖五价 |
bid_volume1 ~ 5 / ask_volume1 ~ 5 | 买卖五档量 |
open / high / low / close | 开高低收 |
volume | 成交量 |
open_interest | 持仓量 |
pre_settlement / pre_close | 昨结算 / 昨收盘 |
upper_limit / lower_limit | 涨停 / 跌停价 |
price_tick | 最小变动价位 |
volume_multiple | 合约乘数 |
NaN 陷阱:数据未到位时,
last_price等字段为NaN。比较前必须用math.isnan()检查,否则结果不可预测。
get_kline_serial:K 线序列
请求指定合约和周期的 K 线序列,返回 pandas DataFrame:
# 1 分钟线,默认 200 根
klines = api.get_kline_serial("SHFE.rb2410", 60)
# 日线,取 500 根
klines = api.get_kline_serial("SHFE.rb2410", 86400, data_length=500)
while True:
api.wait_update()
if api.is_changing(klines.iloc[-1], "datetime"):
print("收盘价:", klines.close.iloc[-1])
参数说明
| 参数 | 含义 |
|---|---|
symbol | 合约代码,如 "SHFE.rb2410" |
duration_seconds | K 线周期(秒):60 = 1 分钟,3600 = 1 小时,86400 = 日线 |
data_length | 序列长度,默认 200,最大 10000 |
日线以上的周期必须是
86400的整数倍,最大 28 天。
DataFrame 列
| 列名 | 含义 |
|---|---|
datetime | K 线起点时间(纳秒时间戳) |
open / high / low / close | 开高低收 |
volume | 成交量 |
open_oi / close_oi | 起始 / 结束持仓量 |
时间戳转换用 tqsdk.tafunc.time_to_datetime() 或 datetime.fromtimestamp(ns / 1e9)。
多合约 K 线对齐
传入合约列表,可以获取按时间对齐的多合约 K 线——非常适合价差分析:
# 期权和标的对齐
klines = api.get_kline_serial(["DCE.m2501-C-3000", "DCE.m2501"], 86400, 30)
# 标的收盘价在 klines.close,期权收盘价在 klines.close1
spread = klines.close1 - klines.close
副合约字段名在原字段后加数字后缀:open1、close1、high2 等。
注意:不要修改或重命名返回的 DataFrame 列名,否则数据不会更新。
get_tick_serial:Tick 序列
获取 Tick 级别数据,精度比 K 线更高:
serial = api.get_tick_serial("SHFE.rb2410", 200)
while True:
api.wait_update()
print(serial.iloc[-1].last_price, serial.iloc[-1].bid_price1, serial.iloc[-1].ask_price1)
Tick 数据包含每笔成交的最新价、买卖一档、当日均量等,适合高频或对冲策略。
其他常用查询函数
| 函数 | 含义 |
|---|---|
get_quote_list(symbols) | 批量获取多个合约的盘口行情 |
get_trading_status(symbol) | 获取合约交易状态(集合竞价/连续交易) |
query_symbol_info(symbol) | 查询合约信息(乘数、保证金等) |
query_quotes(...) | 按条件搜索合约 |
get_trading_calendar(start, end) | 获取交易日历 |
is_serial_ready:判断数据是否到位
订阅大量数据时,首次可能需要等待。用 is_serial_ready() 判断是否接收完毕:
klines = api.get_kline_serial("SHFE.rb2410", 60, data_length=3000)
while True:
api.wait_update()
if api.is_serial_ready(klines):
print("数据已到位,共", len(klines), "根")
break
小结
get_quote()拿实时盘口,get_kline_serial()拿 K 线,get_tick_serial()拿 Tick。- 所有返回都是动态引用,随
wait_update()自动更新。 - 用
is_changing()判断数据变化,用is_serial_ready()判断首次到位。 - 注意 NaN 陷阱和 DataFrame 列名不可修改。
接下来学习怎么下单交易: 交易接口与下单。