前几篇简单介绍和测试的文章,使我们了解到miniQMT包含了xtdata(行情模块)+xttrade(实盘接口)两大模块。那么今天我们就利用miniQMT下载一下历史数据试试看。
首先啥都不说了,翠花,上代码:
import pandas as pd
from xtquant import xtdata
def onProgress(data):
print(data)
xtdata.download_history_data2(stock_list=["688348.SH"],period='tick',start_time='20010101',end_time='',callback=onProgress)
data=xtdata.get_local_data()
print(data)
# df=pd.DataFrame(data['688348.SH'])
上面这段代码,关键在于第七行 download_history_data2函数,这是用于批量下载历史数据的。例如上面的相关参数指定的是下载 688348.SH这个票,从20010101这天开始的所有tick数据。
callback顾名思义是回调函数,可以直接赋值为None,也可以指定函数,例如上面的onProgress,需要注意用法,在调用时不需要添加参数。
执行期间可以看到该语句顺利执行,并不断打印输出data的相关信息。需要注意,上述程序执行期间需要启动miniQMT,否则直接报错。
通过回调函数打印data信息,可以看到具体的下载进展情况。下载完成之后,可以在qmt安装目录下的 \userdata_mini\datadir\SH\0中看到多了一个 688348目录,该目录下包含了很多个日期为文件名的文件。但是这些文件无法直接打开使用。因此需要调用xtquant提供的相关函数进行解析。这就执行到了第9行,第10行打印输出。但是此处输出发现是None,也就是没有数据,这怎么可能呢,明明目录下已经有数据了啊。
这可咋办,纠结之下,还是进入源代码级别看看问题在哪里吧,那就直接到xtquant的源代码来看一下,直接打开python安装目录下的Lib\site-packages\xtquant目录下,找到并打开 xtdata.py,找到get_local_data函数,发现直接了当的就一句话:
return None
My God。这是什么操作。啥都不处理直接返回None?逗我玩吗?在这个函数的return语句之前随意写入一句print语句,重新执行,的确能够打印该语句的参数,这说明这个函数的确被调用了,也的确是得偿所愿的返回了None。
笔者所用的是官网提供的最新版本 20230301版,同时在列的还有20220817和20220221两个版本,那么就接下来看看20220817版本是否也一样呢?可以看到该版本里面的get_local_data函数是有完整实现的。但是直接覆盖原有版本的话也会出错,因为python版本的不同,会调用不同的pyd库。
最终解决方案是放弃get_local_data函数,改用 get_market_data函数,该函数可以完成解析历史数据的功能。