TqSdk(天勤量化SDK)
TqSdk 是信易科技开发的开源Python期货/期权量化交易SDK。通过统一的异步API提供实时行情、历史数据、回测和实盘交易功能。
文档:https://doc.shinnytech.com/tqsdk/latest/
免费版提供延时行情(15分钟延迟),专业版支持实时数据。
安装
bash
pip install tqsdk
快速入门
python
from tqsdk import TqApi, TqAuth, TqBacktest
from datetime import date
实盘模式(免费账户提供延时行情)
api = TqApi(auth=TqAuth(your
username, yourpassword))
获取实时行情
quote = api.get_quote(SHFE.cu2401) # 上海铜期货
print(f最新价: {quote.last_price}, 成交量: {quote.volume})
获取K线数据
klines = api.get
klineserial(SHFE.cu2401, duration_seconds=60) # 1分钟K线
print(klines.tail())
关闭API
api.close()
代码格式
交易所.合约
| 交易所 | 代码 | 示例 |
|---|
| 上海期货交易所 | SHFE | SHFE.cu2401(铜) |
| 大连商品交易所 |
DCE | DCE.m2405(豆粕) |
| 郑州商品交易所 | CZCE | CZCE.CF405(棉花) |
| 中国金融期货交易所 | CFFEX | CFFEX.IF2401(沪深300期货) |
| 上海国际能源交易中心 | INE | INE.sc2407(原油) |
| 广州期货交易所 | GFEX | GFEX.si2407(工业硅) |
| 上交所期权 | SSE | SSE.10004816(50ETF期权) |
| 深交所期权 | SZSE | SZSE.90000001(300ETF期权) |
行情数据
实时行情
python
from tqsdk import TqApi, TqAuth
api = TqApi(auth=TqAuth(user, pass))
quote = api.get_quote(CFFEX.IF2401)
关键字段:
quote.last_price — 最新价
quote.bid_price1 — 买一价
quote.ask_price1 — 卖一价
quote.bid_volume1 — 买一量
quote.ask_volume1 — 卖一量
quote.highest — 日最高价
quote.lowest — 日最低价
quote.open — 开盘价
quote.close — 昨收价
quote.volume — 总成交量
quote.amount — 总成交额
quote.open_interest — 持仓量
quote.upper_limit — 涨停价
quote.lower_limit — 跌停价
quote.pre_settlement — 昨结算价
quote.settlement — 今结算价
等待行情更新
while True:
api.wait_update()
if api.is
changing(quote, lastprice):
print(f价格更新: {quote.last_price})
K线数据
python
获取K线序列(返回pandas DataFrame)
klines = api.get
klineserial(
SHFE.cu2401,
duration_seconds=60, # K线周期:60=1分钟, 300=5分钟, 3600=1小时, 86400=日线
data_length=200 # 获取K线数量
)
列:datetime, open, high, low, close, volume, openoi, closeoi
多周期
klines
1m = api.getkline_serial(SHFE.cu2401, 60)
klines
5m = api.getkline_serial(SHFE.cu2401, 300)
klines
1d = api.getkline_serial(SHFE.cu2401, 86400)
Tick数据
python
ticks = api.gettickserial(SHFE.cu2401, data_length=500)
列:datetime, lastprice, highest, lowest, bidprice1, ask_price1,
bidvolume1, askvolume1, volume, amount, open_interest
交易
下单
python
from tqsdk import TqApi, TqAuth
api = TqApi(auth=TqAuth(user, pass))
限价单 — 买入开仓2手
order = api.insert_order(
symbol=SHFE.cu2401,
direction=BUY, # BUY 或 SELL
offset=OPEN, # OPEN, CLOSE, CLOSETODAY
volume=2, # 手数
limit_price=68000.0 # 限价(市价单设为None)
)
市价单(FAK — 即成剩撤)
order = api.insert_order(
symbol=SHFE.cu2401,
direction=BUY,
offset=OPEN,
volume=2
)
撤单
api.cancel_order(order)
检查委托状态
while True:
api.wait_update()
if order.status == FINISHED:
print(f订单完成: 成交={order.volume
orign - order.volumeleft})
break
持仓与账户
python
获取账户信息
account = api.get_account()
account.balance — 账户余额
account.available — 可用资金
account.margin — 已用保证金
account.float_profit — 浮动盈亏
account.position_profit — 持仓盈亏
account.commission — 今日手续费
获取持仓
position = api.get_position(SHFE.cu2401)
position.pos_long — 多头持仓量
position.pos_short — 空头持仓量
position.poslongtoday — 今多仓
position.floatprofitlong — 多头浮动盈亏
position.floatprofitshort — 空头浮动盈亏
position.openpricelong — 多头平均开仓价
position.openpriceshort — 空头平均开仓价
回测
python
from tqsdk import TqApi, TqAuth, TqBacktest, TqSim
from datetime import date
创建回测API
api = TqApi(
backtest=TqBacktest(
start_dt=date(2024, 1, 1),
end_dt=date(2024, 6, 30)
),
account=TqSim(init_balance=1000000), # 模拟账户,初始资金100万
auth=TqAuth(user, pass)
)
策略逻辑(同一套代码适用于实盘和回测)
klines = api.get
klineserial(CFFEX.IF2401, 60 * 60) # 1小时K线
position = api.get_position(CFFEX.IF2401)
while True:
api.wait_update()
if api.is_changing(klines.iloc[-1], close):
ma5 = klines[close].iloc[-5:].mean()
ma20 = klines[close].iloc[-20:].mean()
if ma5 > ma20 and position.pos_long == 0:
api.insert_order(CFFEX.IF2401, BUY, OPEN, 1, klines.iloc[-1][close])
elif ma5 < ma20 and position.pos_long > 0:
api.insert_order(CFFEX.IF2401, SELL, CLOSE, 1, klines.iloc[-1][close])
api.close()
进阶示例
双合约价差交易
python
from tqsdk import TqApi, TqAuth
api = TqApi(auth=TqAuth(user, pass))
quotenear = api.getquote(SHFE.rb2401) # 近月螺纹钢
quotefar = api.getquote(SHFE.rb2405) # 远月螺纹钢
posnear = api.getposition(SHFE.rb2401)
posfar = api.getposition(SHFE.rb2405)
SPREAD_OPEN = 100 # 开仓价差阈值
SPREAD_CLOSE = 20 # 平仓价差阈值
while True:
api.wait_update()
spread = quote