历史数据获取

我是Mr.看海,由于我开发的看海量化交易系统是基于miniQMT的行情和交易接口,所以在此我将miniQMT的使用教程采用案例集的形式进行讲解,该手册会不断完善和丰富,为做miniQMT的开发的朋友提供便利。
需要注意的是,本手册仅作为官方手册的辅助教程,最权威的接口请以官方说明文档为准:
官方手册请点击这里


1.历史数据获取的运行逻辑与演示案例

xtdata模块中,获取历史数据分为两个步骤,即历史数据缓存和历史数据查询。也就是说,要先将历史数据缓存到本地,此时他们被存储在miniQMT安装目录下的userdata_mini文件夹中,数据格式为二进制,此时是不易读取处理这些数据的,需要通过”查询历史数据”的步骤才能真正得到数据。

还有一点比较让人挠头的是,xtdata模块开发过程中相关函数功能的迭代,使得有多个函数可以实现历史数据下载和查询,这些函数在功能上存在一定的相似性,但又有细微的差别,因此,在实际使用过程中,需要根据具体需求选择合适的函数。

1.1 历史数据获取的两个步骤

第一步:缓存历史数据

  • 使用download_history_data()函数或download_history_data2()函数(区别稍后讲解)
  • 从服务器下载数据并缓存到本地数据库,此时并不能查看到数据
  • 支持增量下载(incrementally=True)和全量下载
  • 必须先下载,才能查询历史数据

第二步:查询历史数据

  • 使用get_market_data()函数或get_market_data_ex()函数(区别稍后讲解)
  • 从本地数据库读取已下载的数据,此时可以查看到数据
  • 支持多股票、多字段、多周期查询
  • 可以设置复权方式(dividend_type)

1.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"])  # 只打印收盘价数据

运行结果如下:

平安银行日线数据:
           20240102  20240103  20240104  20240105  20240108  ...  20240226  20240227  20240228  20240229  20240301
000001.SZ      9.21       9.2      9.11      9.27      9.15  ...     10.53      10.5     10.49     10.59     10.49

1.3 数据下载函数的对比

在数据下载阶段,我们可以使用download_history_data()或download_history_data2()函数。

主要区别:

  • download_history_data:单只股票下载,同步执行
  • download_history_data2:支持批量下载,可监控下载进度,异步执行
from xtquant import xtdata
import time

# 单只股票下载
print("开始下载单只股票...")
xtdata.download_history_data(
    stock_code="000001.SZ",
    period="1d",
    start_time="20240101"
)
print("单只股票下载完成")

# 批量下载,支持进度回调
def on_progress(data):
    print(f"已完成:{data['finished']}/{data['total']} - {data['message']}")

seq = xtdata.download_history_data2(
    stock_list=["000001.SZ", "600000.SH"],
    period="1d",
    start_time="20240101",
    callback=on_progress
)
print("批量下载完成")

运行结果:

单只股票下载完成
批量下载完成
已完成:1/2 - 600000.SH
已完成:2/2 - 000001.SZ

1.4 数据查询函数的对比

1.4.1 get_market_data与get_market_data_ex的对比

主要区别:

  1. 数据类型支持:
  • get_market_data:主要用于基础K线数据
  • get_market_data_ex:支持更多数据类型(ETF申赎、期货主力合约、高级周期等)
    1. 返回格式:
  • get_market_data:返回dict,key为字段名,value为DataFrame

  • get_market_data_ex:直接返回DataFrame,列名为字段名

    1. 使用场景:
  • get_market_data:适合获取多只股票的少量字段

  • get_market_data_ex:适合获取单只股票的多个字段

需要注意,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"
)

1.4.2 get_market_data与get_local_data的对比

查询函数有get_market_data、get_market_data_ex和get_local_data三个,他们的区别如下。
主要区别:

  1. 数据获取方式:
  • get_market_data:通过miniQMT服务获取数据,需要miniQMT运行
  • get_local_data:直接读取本地文件,不依赖miniQMT服务
    1. 使用限制:
  • 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"
)

1.5 使用建议

  1. 数据下载:
  • 单只股票下载使用download_history_data
  • 批量下载或需要进度显示时使用download_history_data2
    1. 数据查询:
  • 获取多只股票基础行情时使用get_market_data

  • 获取特殊数据(如周线、ETF申赎等)时使用get_market_data_ex
  • miniQMT未运行时可使用get_local_data应急

2.注意事项

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

以上就是XtQuant行情模块的主要功能和使用方法。通过这些案例,您可以快速上手使用xtdata获取各类行情数据。每个案例都是独立可行的完整代码,您可以直接复制使用并根据需要修改参数。

3.附录:关于复权

3.1 什么是复权

上市公司的部分公司行动(如分红派息、配股等)会对股票价格产生影响,使得K线图上的价格出现断层(如下图)。因此,就需要使用复权来处理股票价格的变化。
图片

复权,是把股票历史价格和成交量,根据本次除权信息进行调整。目的是为了保证历史价格和最新价格之间的连续性,避免因为公司分红派息等操作造成的股价断层。

整体上复权方式可分为:前复权、不复权和后复权。

3.2 不同复权方式的介绍

3.2.1 前复权

介绍:前复权就是以目前股价为基准,保持现有价位不变,缩减以前价格,使图形吻合,保持股价走势的连续性。简单说就是把除权前的价格按现在的价格换算过来,复权后现在价格不变,以前的价格减少。

举例来说,假设A股票10元/股,因除权等原因变成5元/股,在当日股价没有涨跌的情况下,选择前复权后,当天与前一天的股价都是5元/股,之前的股价都会按照一定比例缩小。

作用:采用前复权历史股价就可以更加准确地反映出股票的涨跌幅和收益情况。

3.2.2 不复权

介绍:不复权是指在股票交易中,不考虑除权、除息等事件对股价的影响,直接以当天的实际交易价格作为收盘价进行计算。这样做会导致历史数据的断层,无法准确反映出股票的真实涨跌幅和收益情况。

例如,如果一只股票在某个日期发生了除权或除息事件,假设这个事件使得股价下跌10%,那么不复权的情况下,历史数据将会按照该事件当天的实际价格进行计算,而不会考虑到除权除息事件带来的影响。

作用:采用不复权,K线图能真实反映股价历史的除权信息。

3.2.3 后复权

介绍:后复权是指在K线图上以除权前的价格为基准来测算除权后股票的市场成本价。简单说就是把除权后的价格按以前的价格换算过来,复权后以前的价格不变,现在的价格增加。

举例来说,假设A股票10元/股,因除权等原因变成5元/股,在当日股价没有涨跌的情况下,选择后复权后,当天与前一天的股价都是10元/股,之后的股价都会按照一定比例放大。

作用:采用后复权能够看出股票真实价值的增加及持股者的真实收益率。
以上关于复权的说明来源见这里。

4.附录-函数说明

4.1获取行情数据

get_market_data(field_list=[], stock_list=[], period='1d', start_time='', end_time='', count=-1, dividend_type='none', fill_data=True)
  • 释义
  • 从缓存获取行情数据,是主动获取行情的主要接口
  • 参数
  • field_list – list 数据字段列表,传空则为全部字段
  • stock_list – list 合约代码列表
  • period – string 周期
  • start_time – string 起始时间
  • end_time – string 结束时间
  • count – int 数据个数
  • 默认参数,大于等于0时,若指定了start_time,end_time,此时以end_time为基准向前取count条;若start_time,end_time缺省,默认取本地数据最新的count条数据;若start_time,end_time,count都缺省时,默认取本地全部数据
  • dividend_type – string 除权方式
  • fill_data – bool 是否向后填充空缺数据
  • 返回
  • period为1m 5m 1d等K线周期时
    — 返回dict { field1 : value1, field2 : value2, … }
    — field1, field2, … :数据字段
  • value1, value2, … :pd.DataFrame 数据集,index为stock_list,columns为time_list
    — 各字段对应的DataFrame维度相同、索引相同
  • period为tick分笔周期时
    — 返回dict { stock1 : value1, stock2 : value2, … }
    — stock1, stock2, … :合约代码
    — value1, value2, … :np.ndarray 数据集,按数据时间戳time增序排列
  • 备注
  • 获取lv2数据时需要数据终端有lv2数据权限
  • 时间范围为闭区间

获取本地行情数据

get_local_data(field_list=[], stock_list=[], period='1d', start_time='', end_time='', count=-1,
               dividend_type='none', fill_data=True, data_dir=data_dir)
  • 释义
  • 从本地数据文件获取行情数据,用于快速批量获取历史部分的行情数据
  • 参数
  • field_list – list 数据字段列表,传空则为全部字段
  • stock_list – list 合约代码列表
  • period – string 周期
  • start_time – string 起始时间
  • end_time – string 结束时间
  • count – int 数据个数
  • dividend_type – string 除权方式
  • fill_data – bool 是否向后填充空缺数据
  • data_dir – string MiniQmt配套路径的userdata_mini路径,用于直接读取数据文件。默认情况下xtdata会通过连接向MiniQmt直接获取此路径,无需额外设置。如果需要调整,可以将数据路径作为data_dir传入,也可以直接修改xtdata.data_dir以改变默认值
  • 返回
  • period为1m 5m 1dK线周期时
    • 返回dict { field1 : value1, field2 : value2, … }
    • field1, field2, … :数据字段
    • value1, value2, … :pd.DataFrame 数据集,index为stock_list,columns为time_list
    • 各字段对应的DataFrame维度相同、索引相同
  • period为tick分笔周期时
    • 返回dict { stock1 : value1, stock2 : value2, … }
    • stock1, stock2, … :合约代码
    • value1, value2, … :np.ndarray 数据集,按数据时间戳time增序排列
  • 备注
  • 仅用于获取level1数据

获取全推数据

get_full_tick(code_list)

  • 释义
  • 获取全推数据
  • 参数
  • code_list – 代码列表,支持传入市场代码或合约代码两种方式
  • 传入市场代码代表订阅全市场,示例:[‘SH’, ‘SZ’]
  • 传入合约代码代表订阅指定的合约,示例:[‘600000.SH’, ‘000001.SZ’]
  • 返回
  • dict 数据集 { stock1 : data1, stock2 : data2, … }
  • 备注

下载历史行情数据

download_history_data(stock_code, period, start_time='', end_time='', incrementally = None)
  • 释义
  • 补充历史行情数据
  • 参数
  • stock_code – string 合约代码
  • period – string 周期
  • start_time – string 起始时间
  • end_time – string 结束时间
  • incrementally – 是否增量下载
  • bool – 是否增量下载
  • None – 使用start_time控制,start_time为空则增量下载
  • 返回
  • 备注
  • 同步执行,补充数据完成后返回
download_history_data2(stock_list, period, start_time='', end_time='', callback=None,incrementally = None)

  • 释义

  • 补充历史行情数据,批量版本

  • 参数

  • stock_list – list 合约列表

  • period – string 周期

  • start_time – string 起始时间

  • end_time – string 结束时间

  • callback – func 回调函数

    • 参数为进度信息dict
    • total – 总下载个数
    • finished – 已完成个数
    • stockcode – 本地下载完成的合约代码
    • message – 本次信息
 def on_progress(data):
    print(data)
    # {'finished': 1, 'total': 50, 'stockcode': '000001.SZ', 'message': ''}
  • 返回

  • 备注

  • 同步执行,补充数据完成后返回

  • 有任务完成时通过回调函数返回进度信息

订阅单股行情

subscribe_quote(stock_code, period='1d', start_time='', end_time='', count=0, callback=None)
  • 释义

  • 订阅单股的行情数据,返回订阅号

  • 数据推送从callback返回,数据类型和period指定的周期对应
  • 数据范围代表请求的历史部分的数据范围,数据返回后会进入缓存,用于保证数据连续,通常情况仅订阅数据时传count = 0即可
  • 参数

  • stock_code – string 合约代码

  • period – string 周期

  • start_time – string 起始时间

  • end_time – string 结束时间

  • count – int 数据个数

  • callback – 数据推送回调

— 回调定义形式为on_data(datas),回调参数datas格式为 { stock_code : [data1, data2, …] }

- def on_data(datas):
-     for stock_code in datas:
-           print(stock_code, datas[stock_code])
  • 返回

  • 订阅号,订阅成功返回大于0,失败返回-1

  • 备注

  • 单股订阅数量不宜过多,详见 接口概述-请求限制

订阅全推行情

subscribe_whole_quote(code_list, callback=None)

  • 释义

  • 订阅全推行情数据,返回订阅号

  • 数据推送从callback返回,数据类型为分笔数据
  • 参数

  • code_list – 代码列表,支持传入市场代码或合约代码两种方式

    • 传入市场代码代表订阅全市场,示例:[‘SH’, ‘SZ’]
    • 传入合约代码代表订阅指定的合约,示例:[‘600000.SH’, ‘000001.SZ’]
  • callback – 数据推送回调

— 回调定义形式为on_data(datas),回调参数datas格式为 { stock1 : data1, stock2 : data2, … }

  • def on_data(datas):
  • for stock_code in datas:
  • print(stock_code, datas[stock_code])
  • 返回

  • 订阅号,订阅成功返回大于0,失败返回-1

  • 备注

  • 订阅后会首先返回当前最新的全推数据

  • 反订阅行情数据

unsubscribe_quote(seq)

  • 释义
  • 反订阅行情数据
  • 参数
  • seq – 订阅时返回的订阅号
  • 返回
  • 备注

开通miniQMT

如果你还没有开通miniQMT,可以点击此处开通,低费率、低门槛,欢迎咨询。

开发日志

我正在紧锣密鼓地开发系统,完善功能,点击此处了解最新进展。

风险提示

投资有风险,开户需谨慎。本系统仅为投资者提供量化交易相关的数据处理与分析工具,不构成任何投资建议。 请您在审慎思考后作出选择。特别声明:本系统对您与券商之间的交易、合作不承担任何法律责任。 市场有风险,投资需谨慎。

© 2024 看海量化交易系统 版权所有

官网:www.khsci.com/khQuant