量化人必看|miniQMT踩坑记:回测太慢?一招教你把行情数据“搬回家”!

今天继续分享miniQMT系列文章。

关于行情处理的Python代码在文章最后面,不愿意看的可以直接拉到最后。

这篇文章主要聊的是行情数据下载。很多朋友可能会问:既然 xtquant 已经提供了在线获取行情的接口,为什么还要自己费劲把数据下载到本地?🤔

原因很简单------为了后面的策略回测更高效!如果每次回测都临时从 xtquant 拉数据,不仅慢,还会严重拖累回测的效率。把行情先存到本地,相当于提前把食材备好,后面炒菜(回测)的时候就能快很多啦。


直接从xtquant获取行情之前我们需要先调用download_history_data (下载单个股票行情)或者download_history_data2 (下载多个股票行情)把行情下载到本地,然后通过get_market_data_ex 来获取对应的行情数据。

行情目前支持"1m","5m","15m","30m","60m","1d", "1w", "1mon", "1q", "1y","tick"等周期。

聊一聊踩到的坑

从 xtquant 拿行情,速度很慢,一开始用了多线程,发现代码运行一半就直接卡死了,后来没办法改成了单线程,每次批量下载500个股票的数据,基本上能在10分钟以内把日线行情下载到本地了。

接下来是重点了

行情相关接口我封装了8个方法

  • get_kline_oneline_multi 直接从xtquant拉取多个股票的行情,返回Dataframe格式数据,有一个stock的列,里面是股票代码

  • get_kline_oneline 直接从xtquant拉取1个股票的行情,返回Dataframe格式数据,有一个stock的列,里面是股票代码

  • down_all_kline_to_feather 把全部行情数据下载到本地,并保存成一个feather格式的文件

  • down_all_kline_to_parquet 把全部行情数据下载到本地,并保存成一个parquet格式的文件

  • get_kline_from_feather_multi 从本地feather文件读取多个股票的行情

  • get_kline_from_feather 从本地feather文件读取单个股票的行情

  • get_kline_from_parquet_multi 从本地parquet文件读取多个股票的行情

  • get_kline_from_parquet 从本地parquet文件读取单个股票的行情


行情数据保存成 Feather 还是 Parquet?怎么选?

很多刚入门量化的小伙伴都会问我: 「行情数据保存的时候,用 feather 好还是 parquet 好?差别大吗?」

1. 这两种格式是干什么的?

无论是 feather 还是 parquet ,本质都是 数据存储格式,它们的作用就是:

把 Pandas 的 DataFrame 快速保存到硬盘

相比 csv,这两种格式有两个明显优点:

  1. 读写速度快很多
  2. 保留数据类型(时间、浮点数、字符串等),不需要额外解析

2. 什么时候用 feather?

特点:

  • 读写速度特别快
  • 没有压缩,文件大一点
  • 代码特别简单

适合:

  • 数据量不大(几百 MB 到 1GB 以内)
  • 回测、研究主要在本地单机进行
  • 每次回测只需要一次性把数据全读进内存

如果你电脑空间够,追求快,选 feather 就对了。


3. 什么时候用 parquet?

特点:

  • 自带压缩,文件体积小
  • 支持按列读取、分块处理,扩展性更强
  • 读取速度比 feather 慢一点点(一般慢 10%--30%)

适合:

  • 数据量很大(几个 GB 甚至几十 GB)
  • 做长期数据存储或者在云端、集群环境里使用
  • 未来有增量处理、按列查询等需求

如果你的数据很大,存储空间宝贵,选 parquet 更合适。


4. 实战经验

我自己的经验是这样:

  • 本地回测:先存 parquet(节省空间),需要回测的时候,提前转成 feather,加载速度快很多。
  • 长期数据仓库:统一用 parquet 格式存储。

parquet 可以看成是"压缩版的长期存储", feather 更像是"临时高速缓存"。


5. 代码对比

保存:

python 复制代码
# 保存 feather
df.to_feather("a_stock_kline_1d.feather")

# 保存 parquet
df.to_parquet("a_stock_kline_1d.parquet", engine="pyarrow", compression="snappy")

读取:

python 复制代码
# 读取 feather
df = pd.read_feather("a_stock_kline_1d.feather")

# 读取 parquet
df = pd.read_parquet("a_stock_kline_1d.parquet", engine="pyarrow")

6. 最后给新手的建议

  • 数据小:优先 feather,快!

  • 数据大:优先 parquet,省空间!

  • 如果你还不确定,保存 parquet,反正随时可以转成 feather:

    python 复制代码
    pd.read_parquet("xxx.parquet").to_feather("xxx.feather")

源码

相关推荐
高级程序源6 小时前
django校园寻物通失物招领平台32261-计算机课程设计、毕业设计
vue.js·python·mysql·小程序·django·flask·课程设计
WeiXin_DZbishe6 小时前
基于springboot宠物领养系统-计算机毕设 附源码【课程设计】94217
vue.js·spring boot·python·django·php·课程设计
kimnoic6 小时前
Python数据库学习心得:SQLite、MySQL、PostgreSQL优缺点
开发语言·python
snhna6 小时前
向量数据库深度实战:从 HNSW 到 pgvector、Milvus 选型与 RAG 落地
数据库·人工智能·python·postgresql·milvus
架构技术专栏6 小时前
Agent 工具调用:从工具声明到执行反馈
前端·人工智能·后端
别动我齐刘海7 小时前
C++ 工程化学习
java·linux·前端·c++·学习·机器学习·机器人
必须得开心呀7 小时前
python编写带界面的软件,需要安装哪些插件
开发语言·python
Wx-bishekaifayuan7 小时前
express皖美特色农产品网售系统53118-计算机课程设计、毕业设计
人工智能·spring boot·后端·python·课程设计·express·旅游
青少儿编程课堂8 小时前
迪杰斯特拉(Dijkstra)算法:单源最短路与赛场路线规划
c++·python·算法·bfs·信息学竞赛
志尊宝8 小时前
Vue3 零基础每日笔记(071):暗黑模式与主题切换——CSS 变量 + Element Plus 暗黑方案
前端·css·笔记·vue·html·前端开发·软件开发