miniQMT下载历史行情数据太慢怎么办?一招提速10倍!

身边很多做量化的朋友,现在基本都在用 QMT 或者 miniQMT。为了方便做回测,大家都会习惯把全市场的股票历史行情数据下载到本地。可问题来了------每次要更新全部数据,动辄十几分钟起步,等得人直抓狂 🤯。所以经常有人来问我:花姐,有没有更快的下载办法?答案当然是------有的!

众所周知,想要获取某个股票的数据需要先调用xtdata.download_history_data接口把数据下载到QMT本地,然后才可以通过xtdata.get_local_data获取到最新的数据,但问题来了,股票数量少还好,一旦股票数量多了那耗时可想而知。

所以怎么提速

很多同学第一反应会想到用 多线程 来提速,但花姐已经帮大家踩过坑了------多线程下载历史行情的速度,和单线程基本没啥区别,几乎等于白忙活。

于是我换了个思路,试了下 多进程 。结果一试惊喜满满 🎉!还是以增量下载为例:之前单线程跑一遍要花 10多分钟 ,用多进程优化后,整个流程缩短到 100多秒 就能搞定,提速效果不要太明显。

提速思路

1、获取股票列表 我通过以下方法获取到全部的股票列表:

python 复制代码
sector = "沪深A股"
stock_code_list = xtdata.get_stock_list_in_sector(sector)

2、股票列表分组

我把股票500个一组,分成了N组

python 复制代码
size = 500 # 每组股票数量
stock_groups = []
for i in range(0, len(stock_pool), size):
    group = stock_pool[i : i + size]  # 从 i 开始切 size 个
    stock_groups.append(group)

3、多进程下载

起初我尝试这样写:

python 复制代码
xtdata.download_history_data2(stock_group, period=period, incrementally=True)

在进程里批量下载一组股票,但是第一组下完以后就卡死了,找了很多办法也没搞定,于是改成了下面这个方法:循环下载分组里的股票,结果还真成了。

python 复制代码
for stock_code in stock_group:
    xtdata.download_history_data(stock_code=stock_code, period=period,incrementally=True)

这是多进程的示例代码:

python 复制代码
process_list = []
i = 1
for stock_group in stock_groups:
    print(f"开始下载第{i}组股票,包含{len(stock_group)}只股票")
    p = Process(target=download_stock_group_increment, args=(stock_group, period))
    p.start()
    process_list.append(p)
    i += 1
    
for i, p in enumerate(process_list):
    print(f"等待第{i+1}组股票下载完成...")
    p.join()
    print(f"第{i+1}组股票下载完成")

注意事项

初次使用miniQMT下载数据的时候不要用增量更新,要下载指定时间内的行情,不然容易出问题,这里的start_time可以写成19900101,这样就把上市以来所有的行情都下载到本地了:

python 复制代码
xtdata.download_history_data(stock_code=stock_code, period=period, start_time=start_time, end_time=end_time)

后面就可以用增量下载数据了,代码如下:

python 复制代码
xtdata.download_history_data(stock_code=stock_code, period=period,incrementally=True)

完整的代码已经放知识星球了,需要的自取。

相关推荐
盟接之桥几秒前
盟接之桥--说制造:从“找缝隙”到“一万米深”——庖丁解牛式的制造业精进之道
大数据·前端·数据库·人工智能·物联网·制造
Algebraaaaa1 分钟前
为什么线程阻塞要用.join而不是.wait
java·c++·python
巴拉巴拉~~2 分钟前
Flutter 通用滑块组件 CommonSliderWidget:单值 / 范围 + 刻度 + 标签 + 样式自定义
开发语言·前端·javascript
起风了___14 分钟前
Python 批量发邮件脚本:Excel 名单 + Jinja2 模板,带日志与防限流,163 邮箱实测可用
python·程序员
Mr.朱鹏21 分钟前
大模型入门学习路径(Java开发者版)下
java·python·学习·微服务·langchain·大模型·llm
韭菜炒大葱26 分钟前
现代前端开发工程化:Vue3 + Vite 带你从 0 到 1 搭建 Vue3 项目🚀
前端·vue.js·vite
weixin_4215850127 分钟前
PYTHON中的索引操作
python
栀秋66634 分钟前
面试常考的最长递增子序列(LIS),到底该怎么想、怎么写?
前端·javascript·算法
Melrose36 分钟前
Flutter - 使用Jaspr来构建SEO友好网站
前端·flutter
有点笨的蛋38 分钟前
Vue3 项目:宠物照片变身冰球运动员的 AI 应用
前端·vue.js