我是Mr.看海,我在尝试用信号处理的知识积累和思考方式做量化交易,应用深度学习和AI实现股票自动交易,目的是实现财务自由~
目前我正在开发基于miniQMT的量化交易系统。
在前几篇的文章中讲到,我正在开发的看海量化交易系统,底层是使用miniQMT的Python接口实现的数据获取和交易执行。作为系统开发的基础,在此我将系统梳理一下miniQMT的Python接口库XtQuant,并以案例集的形式对常用功能进行演示和讲解。当然最权威的教程还是XtQuant的官方文档,本文是作为一个易用快查手册,方便我自己查阅,同时也为做相关研究的朋友提供一个参考。
我会将系统的教程案例集做成一个系列并集结成册,需要查看完整教程的朋友可以关注我的公众号:看海的城堡。我正在开发的基于miniQMT的量化交易系统,也欢迎大家关注和使用。
一、基本概念介绍
1.miniQMT、XtQuant和xtdata的关系
miniQMT是一个量化交易终端软件。它作为本地服务器运行,负责与交易所建立连接,接收和存储行情数据,并提供数据下载和交易接口。
XtQuant是miniQMT的Python接口库,作为Python程序与miniQMT之间的桥梁。它通过TCP连接与本地miniQMT服务通信,包含行情(xtdata)和交易(xttrader)两个主要模块。
xtdata是XtQuant中专门用于获取行情数据的模块。它提供了获取各类行情数据的API接口,本质是向miniQMT发送数据请求并处理返回结果。它既支持查询历史数据,也支持订阅实时行情。
2.xtdata模块能实现的主要功能
xtdata模块作为行情数据获取的核心模块,提供了全面的数据服务功能。
- 在历史数据方面,它不仅支持获取各种周期(日线、分钟线、周线等)的K线数据,还能获取分笔成交的tick数据,并且提供了前复权、后复权等多种复权方式。
- 对于实时行情,xtdata提供了两种订阅模式:可以针对单只股票订阅特定周期的数据,也可以订阅全市场的tick数据。此外,它还支持Level2深度行情数据的获取(需要单独开通权限),为高频交易提供了数据基础。
- 在基本面数据方面,xtdata提供了完整的财务数据查询功能,包括资产负债表、利润表、现金流量表等财务报表,以及主要的财务指标数据。同时,它还提供了股票列表、交易日历、除权除息等基础信息的查询接口。
- 对于指数投资者来说,xtdata提供了指数成分股、成分股权重、指数行情等数据的获取功能。在板块数据方面,支持查询行业分类、概念板块、地域板块等多维度的分类数据。
- ETF基金投资者可以通过xtdata获取ETF的申赎清单、成分股信息和净值数据。对于期货和期权交易者,xtdata也提供了主力合约、期权链、商品期权等衍生品数据的查询功能。
这篇文章我将着重介绍其中的历史数据获取功能,其他功能我将在后续系列文章中介绍。
二、历史数据获取的运行逻辑与演示案例
xtdata模块中,获取历史数据分为两个步骤,即历史数据缓存和历史数据查询。也就是说,要先将历史数据缓存到本地,此时他们被存储在miniQMT安装目录下的userdata_mini文件夹中,数据格式为二进制,此时是不易读取处理这些数据的,需要通过"查询历史数据"的步骤才能真正得到数据。
还有一点比较让人挠头的是,xtdata模块开发过程中相关函数功能的迭代,使得有多个函数可以实现历史数据下载和查询,这些函数在功能上存在一定的相似性,但又有细微的差别,因此,在实际使用过程中,需要根据具体需求选择合适的函数。
1. 历史数据获取的两个步骤
第一步:缓存历史数据
- 使用download_history_data()函数或download_history_data2()函数(区别稍后讲解)
- 从服务器下载数据并缓存到本地数据库,此时并不能查看到数据
- 支持增量下载(incrementally=True)和全量下载
- 必须先下载,才能查询历史数据
第二步:查询历史数据
- 使用get_market_data()函数或get_market_data_ex()函数或get_local_data()函数(区别稍后讲解)
- 从本地数据库读取已下载的数据,此时可以查看到数据
- 支持多股票、多字段、多周期查询
- 可以设置复权方式(dividend_type)
2. 基本的历史数据获取流程
下面通过一个简单的案例来演示这两个步骤:
from xtquant import xtdata
# 1.下载数据
xtdata.download_history_data(
stock_code="000001.SZ", # 股票代码
period="1d", # 日线数据
start_time="20240101", # 起始日期
end_time="20240301" # 结束日期
)
# 2.查询数据
data = xtdata.get_market_data(
field_list=["time", "close"], # 需要的字段
stock_list=["000001.SZ"], # 股票代码
period="1d", # 日线数据
start_time="20240101", # 起始日期
end_time="20240301" # 结束日期
)
# 3.打印结果
print("平安银行日线数据:")
print(data["close"]) # 只打印收盘价数据
运行结果如下:
以上是一个最典型的应用案例,不过实际使用中,会发现有几个功能类似的函数可以替换使用,下边讲解他们的区别和特点。
3. 数据下载函数的对比
在数据下载阶段,我们可以使用download_history_data()或download_history_data2()函数。运行完这步,数据就会存到我们的电脑中了。
主要区别:
- download_history_data:单只股票下载,同步执行
- download_history_data2:支持批量下载,可监控下载进度,异步执行
from xtquant import xtdata
# 使用download_history_data下载单只股票
xtdata.download_history_data(
stock_code="000001.SZ",
period="1d",
start_time="20240101"
)
# 使用download_history_data2批量下载
def on_progress(data):
print(f"已完成:{data['finished']}/{data['total']} - {data['message']}")
xtdata.download_history_data2(
stock_list=["000001.SZ", "600000.SH"], # 支持多只股票
period="1d",
start_time="20240101",
callback=on_progress # 支持进度回调
)
运行结果:
4. 数据查询函数的对比
4.1 get_market_data与get_market_data_ex的对比
(1)数据类型支持:
- get_market_data:主要用于基础K线数据
- get_market_data_ex:支持更多数据类型(ETF申赎、期货主力合约、高级周期等)
(2)返回格式:
- get_market_data:返回dict,key为字段名,value为DataFrame
- get_market_data_ex:直接返回DataFrame,列名为字段名
需要注意,get_market_data_ex部分高级功能可能需要开通研投版。
下面是具体的使用示例:
from xtquant import xtdata
# 下载历史数据
xtdata.download_history_data2(
stock_list=["000001.SZ", "600000.SH"], # 支持多只股票
period="1d",
start_time="20240101",
)
# 示例1:使用get_market_data获取多只股票的收盘价
data1 = xtdata.get_market_data(
field_list=["time", "close"],
stock_list=["000001.SZ", "600000.SH"],
period="1d",
start_time="20240101"
)
# 示例2:使用get_market_data_ex获取多个指标
data2 = xtdata.get_market_data_ex(
field_list=["time", "volume", "amount", "vwap"],
stock_list=["000001.SZ"], # 适合单只股票多字段
period="1d", #
start_time="20240101"
)
4.2 get_market_data与get_local_data的对比
(1)数据获取方式
- get_market_data:通过miniQMT服务获取数据,需要miniQMT运行
- get_local_data:直接读取本地文件,不依赖miniQMT服务
(2)使用限制
- get_market_data:需要miniQMT在线,但功能更完整
- get_local_data:可离线使用,但只能获取已下载的数据
下面是具体的使用示例:
from xtquant import xtdata
# 先下载数据到本地
xtdata.download_history_data(
stock_code="000001.SZ",
period="1d",
start_time="20240101"
)
# 示例1:通过miniQMT服务获取数据
data1 = xtdata.get_market_data(
field_list=["time", "close"],
stock_list=["000001.SZ"],
period="1d",
start_time="20240101"
)
# 示例2:直接从本地文件读取数据
data2 = xtdata.get_local_data(
field_list=["time", "close"],
stock_list=["000001.SZ"],
period="1d",
start_time="20240101"
)
4.3 复权设置说明
在使用 get_market_data() 和 get_market_data_ex() 函数查询K线数据时,可以通过 dividend_type 参数设置复权方式(关于复权的更详细概念见文末附录):
复权参数(dividend_type)可选值说明:
- none: 不复权,返回原始价格
- front: 前复权,以当前价格为基准调整历史价格
- back: 后复权,以历史价格为基准调整现有价格
- front_ratio: 等比前复权,保持价格变动比例的前复权
- back_ratio: 等比后复权,保持价格变动比例的后复权
注意事项:
- 复权设置只对K线数据有效,对tick等其他周期数据无效
- 在同一个分析系统中应该统一使用相同的复权方式
- 复权会影响绝对价格,但不会影响相对涨跌幅
- 获取数据前需要先下载对应的历史数据和除权数据
5. 使用建议
(1)数据下载
- 单只股票下载使用download_history_data
- 批量下载或需要进度显示时使用download_history_data2
(2)数据查询
- 获取多只股票基础行情时使用get_market_data
- 获取特殊数据(如周线、ETF申赎等)时使用get_market_data_ex
- miniQMT未运行时可使用get_local_data应急
三、注意事项
- 使用前确保miniQMT已启动并正常运行
- 获取数据前需要先下载对应的历史数据
- 订阅数据时注意控制订阅数量,建议单次不超过50只股票
- 对于静态数据(如板块、财务数据等),无需频繁下载更新
以上就是XtQuant行情模块的主要功能和使用方法。通过这些案例,您可以快速上手使用xtdata获取各类行情数据。每个案例都是独立可行的完整代码,您可以直接复制使用并根据需要修改参数。
附录1:安装与环境配置
1. 启动并登录miniQMT
以上提到的所有功能,都需要miniQMT的运行支持。miniQMT是迅投科技开发的量化交易终端软件,在很多券商都可以开通。之前的文章介绍过miniQMT的开通方式,大家可以翻阅:Mr.看海:如何轻松开通miniQMT,开启量化交易大门
2. 安装xtquant
xtquant库可以通过pip直接安装:
pip install xtquant
3. 环境要求
- Python版本: 3.7-3.11
- 常用依赖库: numpy, pandas
- 操作系统: Windows (目前仅支持Windows系统)
附录2:关于复权
1.什么是复权
上市公司的部分公司行动(如分红派息、配股等)会对股票价格产生影响,使得K线图上的价格出现断层(如下图)。因此,就需要使用复权来处理股票价格的变化。
复权,是把股票历史价格和成交量,根据本次除权信息进行调整。目的是为了保证历史价格和最新价格之间的连续性,避免因为公司分红派息等操作造成的股价断层。
整体上复权方式可分为:前复权、不复权和后复权。
2. 不同复权方式的介绍
1. 前复权
介绍:前复权就是以目前股价为基准,保持现有价位不变,缩减以前价格,使图形吻合,保持股价走势的连续性。简单说就是把除权前的价格按现在的价格换算过来,复权后现在价格不变,以前的价格减少。
举例来说,假设A股票10元/股,因除权等原因变成5元/股,在当日股价没有涨跌的情况下,选择前复权后,当天与前一天的股价都是5元/股,之前的股价都会按照一定比例缩小。
作用:采用前复权历史股价就可以更加准确地反映出股票的涨跌幅和收益情况。
2. 不复权
介绍:不复权是指在股票交易中,不考虑除权、除息等事件对股价的影响,直接以当天的实际交易价格作为收盘价进行计算。这样做会导致历史数据的断层,无法准确反映出股票的真实涨跌幅和收益情况。
例如,如果一只股票在某个日期发生了除权或除息事件,假设这个事件使得股价下跌10%,那么不复权的情况下,历史数据将会按照该事件当天的实际价格进行计算,而不会考虑到除权除息事件带来的影响。
作用:采用不复权,K线图能真实反映股价历史的除权信息。
3. 后复权
介绍:后复权是指在K线图上以除权前的价格为基准来测算除权后股票的市场成本价。简单说就是把除权后的价格按以前的价格换算过来,复权后以前的价格不变,现在的价格增加。
举例来说,假设A股票10元/股,因除权等原因变成5元/股,在当日股价没有涨跌的情况下,选择后复权后,当天与前一天的股价都是10元/股,之后的股价都会按照一定比例放大。
作用:采用后复权能够看出股票真实价值的增加及持股者的真实收益率。
关于看海量化交易系统
关于上边提到的我正在开发的基于miniQMT的量化交易系统,目前已经开放数据下载、可视化、数据清洗模块,有需要的朋友可以关注公众号“看海的城堡”获取。
目前平台更新的进展大致如下:
2024.10.11 完成历史数据下载模块初步版本。
2024.10.12 GUI界面更新了打开QMT终端和指示灯功能 数据可视化界面解决了部分bug
2024.11.08 1.将数据下载和数据清洗模块合并为GUI.py文件 2.加入了报错日志保存的功能 3.读取股票列表的函数文件,加入了支持各种编码模式。
2024.11.15 1.基本完成数据下载和数据清洗模块 2.完成软件界面可根据显示器分辨率自动调整大小,并保持界面居中
2024.11.16 完善重复数据清理的逻辑,需进行时间戳与数据双重验证,以判定是否为重复数据。
2024.11.17 1.添加了数据可视化模块 2.在平台主界面新增了工具栏,可通过工具栏打开可视化模块。3.重新整理了data文件夹,使其更具结构化 4.修正了1d数据下载可能存在的bug 5.修正底层下载数据的函数,对于下载1d数据,不再下载time列
2024.11.18 美化了界面,优化了软件界面布局,丰富了文件信息内容(增加了市场分部、周期类型、日期范围),图例解析为中文显示,日内数据休市时间使用灰色区域显示。
2024.11.20 在可视化模块中加入了重载文件夹数据功能。
2024.11.22 增加了设置界面,添加了icon图标。
2024.11.26 添加splash加载界面,显示程序加载进度。
2024.11.28 实现程序打包为exe安装包,并支持中文安装界面。
2024.11.29 发布第一个稳定版本V1.0.0
2024.12.01 发布V1.1.6,完善日志管理。
2024.12.02 发布V1.1.8,优化激活管理和界面日志记录,修复激活提示重复显示问题。改进状态指示器逻辑,避免重复记录相同状态。
2024.12.02 发布V1.2.0,更新股票列表获取和保存功能,添加成分股支持;优化日志记录,增强错误处理机制;修复界面关闭时的线程管理问题;改进设置对话框,添加股票列表管理功能。此提交提升了用户体验和系统稳定性。
2024.12.02 发布V1.2.1,内置了对沪深A股、深证A股、上证A股、创业板、科创板、中证500成分股、沪深300成分股、上证50成分股的股票列表,以及常用指数的列表。设置界面新增了对上述股票列表的更新功能。
2024.12.05 发布稳定版本V1.2.3,修复了多个界面和功能问题,提升了用户体验和系统稳定性。
相关文章
【深度学习量化交易1】一个金融小白尝试量化交易的设想、畅享和遐想
【深度学习量化交易2】财务自由第一步,三个多月的尝试,找到了最合适我的量化交易路径
【深度学习量化交易3】为了轻松免费地下载股票历史数据,我开发完成了可视化的数据下载模块
【深度学习量化交易4】 量化交易历史数据清洗——为后续分析扫清障碍
【深度学习量化交易5】 量化交易历史数据可视化模块
【深度学习量化交易6】优化改造基于miniQMT的量化交易软件,已开放下载~(已完成数据下载、数据清洗、可视化模块)
参考材料:
http://www.futuhk.com/hans/support