【深度学习量化交易7】miniQMT快速上手教程案例集——使用xtQuant进行历史数据下载篇

news2024/12/14 5:29:47
我是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: 等比后复权,保持价格变动比例的后复权

注意事项:

  1. 复权设置只对K线数据有效,对tick等其他周期数据无效
  2. 在同一个分析系统中应该统一使用相同的复权方式
  3. 复权会影响绝对价格,但不会影响相对涨跌幅
  4. 获取数据前需要先下载对应的历史数据和除权数据

5. 使用建议

(1)数据下载

  • 单只股票下载使用download_history_data
  • 批量下载或需要进度显示时使用download_history_data2

(2)数据查询

  • 获取多只股票基础行情时使用get_market_data
  • 获取特殊数据(如周线、ETF申赎等)时使用get_market_data_ex
  • miniQMT未运行时可使用get_local_data应急

三、注意事项

  1. 使用前确保miniQMT已启动并正常运行
  2. 获取数据前需要先下载对应的历史数据
  3. 订阅数据时注意控制订阅数量,建议单次不超过50只股票
  4. 对于静态数据(如板块、财务数据等),无需频繁下载更新

以上就是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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2259131.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

相差不超过k的最多数,最长公共子序列(一),排序子序列,体操队形,青蛙过河

相差不超过k的最多数 链接:相差不超过k的最多数 来源:牛客网 题目描述: 给定一个数组,选择一些数,要求选择的数中任意两数差的绝对值不超过 𝑘 。问最多能选择多少个数? 输入描述: 第一行输入两个正整…

解决navicat 导出excel数字为科学计数法问题

一、原因分析 用程序导出的csv文件,当字段中有比较长的数字字段存在时,在用excel软件查看csv文件时就会变成科学技术法的表现形式。 其实这个问题跟用什么语言导出csv文件没有关系。Excel显示数字时,如果数字大于12位,它会自动转化…

C++3--内联函数、auto

1.内联函数 1.1概念 以inline修饰的函数叫做内联函数,编译时C编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序的效率 如果在上述函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函…

AES 与 SM4 加密算法:深度解析与对比

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…

视频怎么转音频mp3?5种视频转音频的方法

在视频剪辑时,将视频中的音频提取出来并转换为MP3格式已成为许多人的需求。无论是为了制作音乐播放列表、剪辑音频片段,还是为了在其他设备上更方便地播放,将视频转换为音频MP3都显得尤为重要。下面将介绍五种实用的方法,帮助你轻…

Maven学习(传统Jar包管理、Maven依赖管理(导入坐标)、快速下载指定jar包)

目录 一、传统Jar包管理。 (1)基本介绍。 (2)传统的Jar包导入方法。 1、手动寻找Jar包。并放置到指定目录下。 2、使用IDEA的库管理功能。 3、配置环境变量。 (3)传统的Jar包管理缺点。 二、Maven。 &#…

【机器学习】分类器

在机器学习(Machine Learning,ML)中,分类器泛指算法或模型,用于将输入数据分为不同的类别或标签。分类器是监督学习的一部分,它依据已知的数据集中的特征和标签进行训练,并根据这些学习到的知识对新的未标记数据进行分…

uni-app在image上绘制点位并回显

在 Uni-app 中绘制多边形可以通过使用 Canvas API 来实现。Uni-app 是一个使用 Vue.js 开发所有前端应用的框架,同时支持编译为 H5、小程序等多个平台。由于 Canvas 是 H5 和小程序中都支持的 API,所以通过 Canvas 绘制多边形是一个比较通用的方法。 1.…

【机器学习与数据挖掘实战】案例01:基于支持向量回归的市财政收入分析

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈机器学习与数据挖掘实战 ⌋ ⌋ ⌋ 机器学习是人工智能的一个分支,专注于让计算机系统通过数据学习和改进。它利用统计和计算方法,使模型能够从数据中自动提取特征并做出预测或决策。数据挖掘则是从大型数…

Spire.PDF for .NET【页面设置】演示:向 PDF 文档添加页码

在 PDF 文档中添加页码不仅实用,而且美观,因为它提供了类似于专业出版材料的精美外观。无论您处理的是小说、报告还是任何其他类型的长文档的数字副本,添加页码都可以显著提高其可读性和实用性。在本文中,您将学习如何使用Spire.P…

【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数(三)

目录 ARC规则 概要 所有权修饰符 __strong修饰符 __weak修饰符 __unsafe_unretained修饰符 __autoreleasing修饰符 ARC规则 概要 “引用计数式内存管理”的本质部分在ARC中并没有改变,ARC只是自动地帮助我们处理“引用计数”的相关部分。 在编译单位上可以…

An error happened while trying to locate the file on the Hub and we cannot f

An error happened while trying to locate the file on the Hub and we cannot find the requested files in the local cache. Please check your connection and try again or make sure your Internet connection is on. 关于上述comfy ui使用control net预处理器的报错问…

angular19-官方教程学习

周日了解到angular已经更新到19了,想按官方教程学习一遍,工欲善其事必先利其器,先更新工具: 安装新版版本 卸载老的nodejs 20.10.0,安装最新的LTS版本 https://nodejs.org 最新LTS版本已经是22.12.0 C:\Program File…

计算机毕业设计Python+Vue.js游戏推荐系统 Steam游戏推荐系统 Django Flask 游 戏可视化 游戏数据分析 游戏大数据 爬虫 机

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

上海亚商投顾:创业板指震荡调整 机器人概念股再度爆发

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指昨日冲高回落,深成指、创业板指盘中跌超1%,尾盘跌幅有所收窄。机器人概念股逆势爆…

粘贴可运行:Java调用大模型(LLM) 流式Flux stream 输出;基于spring ai alibaba

在Java中,使用Spring AI Alibaba框架调用国产大模型通义千问,实现流式输出,是一种高效的方式。通过Spring AI Alibaba,开发者可以轻松地集成通义千问模型,并利用其流式处理能力,实时获取模型生成的文本。这…

【CSS in Depth 2 精译_070】11.3 利用 OKLCH 颜色值来处理 CSS 中的颜色问题(下):从页面其他颜色衍生出新颜色

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第四部分 视觉增强技术 ✔️【第 11 章 颜色与对比】 ✔️ 11.1 通过对比进行交流 11.1.1 模式的建立11.1.2 还原设计稿 11.2 颜色的定义 11.2.1 色域与色彩空间11.2.2 CSS 颜色表示法 11.2.2.1 RGB…

Ajax--实现检测用户名是否存在功能

目录 (一)什么是Ajax (二)同步交互与异步交互 (三)AJAX常见应用情景 (四)AJAX的优缺点 (五)使用jQuery实现AJAX 1.使用JQuery中的ajax方法实现步骤&#xf…

【PSINS】以速度和位置作为观测量(即6维观测量)的组合导航滤波,EKF实现,提供可直接运行的MATLAB代码

原有的代码是以位置作为观测量的,这里提供位置+速度,共6维的观测量,状态量还是15维不变 文章目录 源代码运行结果PS源代码 源代码如下: % 【PSINS】位置与速度为观测的153,EKF。从速度观测的EKF153改进而来 % 2024-12-11/Ver1:位置与速度为观测量% 清空工作空间,清除命…

探索云原生安全解决方案的未来

我们是否充分意识到云端所面临的网络安全威胁? 在当今互联互通的世界中,维护安全的环境至关重要。云的出现扩大了潜在威胁的范围,因为它催生了机器身份(称为非人类身份 (NHI))及其秘密。随着组织越来越多地转向云原生…