一、前言
在量化交易中,K线数据是最常用的数据类型。无论是计算技术指标(如均线、MACD、布林带),还是进行策略回测,都离不开K线数据。
本文将详细介绍如何使用**天勤量化(TqSdk)**获取期货K线数据,包括:
- 获取不同周期的K线(1分钟、5分钟、日线等)
- 实时更新K线数据
- 判断新K线生成
- 使用pandas处理K线数据
二、K线数据基础
2.1 什么是K线?
K线(也叫蜡烛图)是一种常用的价格图表,每根K线包含四个价格:
| 字段 | 英文 | 说明 |
|---|---|---|
| 开盘价 | open | K线起始价格 |
| 最高价 | high | K线期间最高价 |
| 最低价 | low | K线期间最低价 |
| 收盘价 | close | K线结束价格 |
2.2 K线周期
常见的K线周期:
| 周期 | 秒数 | 说明 |
|---|---|---|
| 1分钟 | 60 | 短线交易常用 |
| 5分钟 | 300 | 日内交易常用 |
| 15分钟 | 900 | 波段交易常用 |
| 1小时 | 3600 | 中线交易常用 |
| 日线 | 86400 | 趋势分析常用 |
三、获取K线数据(完整代码)
3.1 获取1分钟K线
#!/usr/bin/env python# -*- coding: utf-8 -*-""" 功能:获取期货K线数据 说明:本代码仅供学习参考 """fromtqsdkimportTqApi,TqAuth# 创建API实例api=TqApi(auth=TqAuth("你的快期账户","你的密码"))# 获取螺纹钢2501合约的1分钟K线,最近200根klines=api.get_kline_serial("SHFE.rb2501",duration_seconds=60,data_length=200)# 打印K线数据类型print(f"数据类型:{type(klines)}")print(f"K线数量:{len(klines)}")print("-"*60)# 打印最后5根K线print("最近5根K线:")print(klines.tail())# 关闭APIapi.close()运行结果示例:
数据类型: <class 'pandas.core.frame.DataFrame'> K线数量: 200 ------------------------------------------------------------ 最近5根K线: datetime open high low close volume 195 2025-01-15 14:55:00+08:00 3350.0 3352.0 3348.0 3351.0 1520 196 2025-01-15 14:56:00+08:00 3351.0 3353.0 3350.0 3352.0 1380 197 2025-01-15 14:57:00+08:00 3352.0 3354.0 3351.0 3353.0 1450 198 2025-01-15 14:58:00+08:00 3353.0 3355.0 3352.0 3354.0 1620 199 2025-01-15 14:59:00+08:00 3354.0 3356.0 3353.0 3355.0 15803.2 代码解析
klines=api.get_kline_serial("SHFE.rb2501",duration_seconds=60,data_length=200)| 参数 | 说明 |
|---|---|
"SHFE.rb2501" | 合约代码 |
duration_seconds=60 | K线周期(秒),60秒=1分钟线 |
data_length=200 | 获取K线数量 |
常用周期设置:
| 周期 | duration_seconds |
|---|---|
| 10秒线 | 10 |
| 1分钟线 | 60 |
| 5分钟线 | 300 |
| 15分钟线 | 900 |
| 30分钟线 | 1800 |
| 1小时线 | 3600 |
| 日线 | 86400 (即246060) |
3.3 获取日线数据
fromtqsdkimportTqApi,TqAuth api=TqApi(auth=TqAuth("你的快期账户","你的密码"))# 获取螺纹钢日线,最近60个交易日klines=api.get_kline_serial("SHFE.rb2501",duration_seconds=24*60*60,data_length=60)print("最近5个交易日的日K线:")print(klines[["datetime","open","high","low","close","volume"]].tail())api.close()四、K线数据字段说明
TqSdk返回的K线数据是一个pandas DataFrame,包含以下字段:
| 字段 | 说明 |
|---|---|
datetime | K线起始时间(纳秒时间戳) |
open | 开盘价 |
high | 最高价 |
low | 最低价 |
close | 收盘价 |
volume | 成交量 |
open_oi | 起始持仓量 |
close_oi | 结束持仓量 |
五、实时更新K线(进阶)
在实际应用中,我们通常需要实时获取K线更新。TqSdk的K线数据会自动更新,我们只需要用wait_update()等待数据刷新即可。
5.1 实时打印最新K线
#!/usr/bin/env python# -*- coding: utf-8 -*-""" 功能:实时监控K线数据 说明:程序会持续运行,按Ctrl+C停止 """fromtqsdkimportTqApi,TqAuthimportdatetime api=TqApi(auth=TqAuth("你的快期账户","你的密码"))# 获取10秒K线klines=api.get_kline_serial("SHFE.rb2501",duration_seconds=10)print("开始监控K线,按Ctrl+C停止...")print("-"*70)whileTrue:api.wait_update()# 判断K线收盘价是否变化ifapi.is_changing(klines.iloc[-1],"close"):# 获取最后一根K线last_kline=klines.iloc[-1]# 转换时间戳为可读格式kline_time=datetime.datetime.fromtimestamp(last_kline["datetime"]/1e9)print(f"时间:{kline_time}| 开:{last_kline['open']:.1f}| "f"高:{last_kline['high']:.1f}| 低:{last_kline['low']:.1f}| "f"收:{last_kline['close']:.1f}| 量:{last_kline['volume']}")5.2 判断新K线生成
当一根新K线开始时,可能需要执行某些操作(如计算指标、发出信号)。可以通过判断K线时间是否变化来检测新K线:
fromtqsdkimportTqApi,TqAuthimportdatetime api=TqApi(auth=TqAuth("你的快期账户","你的密码"))# 获取1分钟K线klines=api.get_kline_serial("SHFE.rb2501",duration_seconds=60)print("监控新K线生成...")whileTrue:api.wait_update()# 判断是否产生新K线(通过datetime字段变化判断)ifapi.is_changing(klines.iloc[-1],"datetime"):kline_time=datetime.datetime.fromtimestamp(klines.iloc[-1]["datetime"]/1e9)print(f">>> 新K线生成!时间:{kline_time}")# 在这里可以添加你的策略逻辑# 例如:计算均线、判断信号等六、使用pandas处理K线
TqSdk返回的K线数据是pandas DataFrame,可以直接使用pandas的各种功能:
6.1 计算简单移动平均线
fromtqsdkimportTqApi,TqAuth api=TqApi(auth=TqAuth("你的快期账户","你的密码"))klines=api.get_kline_serial("SHFE.rb2501",duration_seconds=60,data_length=100)# 等待数据准备好api.wait_update()# 计算5周期和20周期移动平均线klines["ma5"]=klines["close"].rolling(5).mean()klines["ma20"]=klines["close"].rolling(20).mean()# 打印最后5行print(klines[["datetime","close","ma5","ma20"]].tail())api.close()6.2 计算涨跌幅
# 计算涨跌幅(相对于前一根K线)klines["change"]=klines["close"].pct_change()*100# 打印print(klines[["datetime","close","change"]].tail())七、获取Tick数据(补充)
除了K线,TqSdk还支持获取Tick级别的数据(逐笔成交):
fromtqsdkimportTqApi,TqAuth api=TqApi(auth=TqAuth("你的快期账户","你的密码"))# 获取Tick数据ticks=api.get_tick_serial("SHFE.rb2501")# 等待数据准备好api.wait_update()print("Tick数据示例:")print(ticks.tail())api.close()八、总结
本文介绍了如何使用TqSdk获取期货K线数据,要点回顾:
| 功能 | 代码 |
|---|---|
| 获取K线 | api.get_kline_serial(合约, 周期, 数量) |
| 等待更新 | api.wait_update() |
| 判断变化 | api.is_changing(klines.iloc[-1], "字段名") |
| 获取Tick | api.get_tick_serial(合约) |
K线周期参数(duration_seconds):
- 1分钟 = 60
- 5分钟 = 300
- 日线 = 86400
TqSdk的数据全部存储在内存中,访问速度快,而且会自动更新,非常适合开发量化交易策略。
免责声明:本文仅供学习交流使用,不构成任何投资建议。期货交易有风险,入市需谨慎。
更多资源:
- 天勤量化官网:https://www.shinnytech.com
- GitHub开源地址:https://github.com/shinnytech/tqsdk-python
- 官方文档:https://doc.shinnytech.com/tqsdk/latest