量化QMT开户实操指南!QMT策略回测慢?我把CSV换成这俩格式,速度直接起飞
发布时间:13小时前阅读:21
你说到“从本地 CSV 批量加载历史 K 线”这个场景,其实踩过坑的人都知道:直接用 pd.read_csv 一个个读、再在 QMT 里循环处理,回测时那种“等得人发慌”的感觉太熟悉了。数据本身就在硬盘上,按理说应该很快才对,但速度就是上不去。
下面这套思路,是我觉得比较实在、能真正把加载耗時压下来的做法。不整那些虚的,从“格式、结构、用法”三个角度拆开说。
第一步:别让 CSV 继续当“载体”了
CSV 的好处是通用、肉眼能看,但代价是每读一次都要解析字符串、转换类型。如果你的本地历史 K 线是用 CSV 存的,批量加载时,光是把那些逗号分隔的数字转成 float、把时间字符串转成 datetime,就能吃掉大半时间。
更实在的做法是:一次性把 CSV 转成二进制格式。
这里有两个选择,看你的数据量和习惯:
Feather 是读写最快的,基本就是直接把 DataFrame 的内存布局扔到硬盘上,读回来几乎零解析成本。缺点是文件大一些,适合几百 MB 到 1GB 级别的数据。
Parquet 带压缩,体积小很多,读起来比 Feather 稍慢一点(大概慢 10% 到 30%),但支持按列读取、分块处理,数据量大了以后扩展性更好。
我自己的习惯是:长期存储用 Parquet,回测前如果追求极致速度,转成 Feather 读。转格式的代码就一行:
df.to_feather(“xxx.feather”)
或者
df.to_parquet(“xxx.parquet”)
读的时候也一样,pd.read_feather 或 pd.read_parquet,省掉了 CSV 解析那一步,批量加载的速度提升是肉眼可见的。
第二步:别在回测循环里“按需读文件”
很多人容易犯的一个错是:在 handlebar 或者回测主循环里,每次需要数据了才去 pd.read_csv 或者查一次 DataFrame。这样做的开销不在“读”本身,而在反复的磁盘 I/O 和索引查找。
正确的姿势是:在策略初始化阶段,一次性把整个回测区间需要的所有 K 线拉进内存。
QMT 本身的设计逻辑也是这样:get_market_data_ex 用 subscribe=False 读的是本地历史数据,速度极快,因为它底层走的是 QMT 自己的缓存机制,不是每次去解 CSV。
如果你已经有一堆 CSV 文件,可以这样做:
在 __init__ 或者 initialize 里,根据回测的品种列表和时间范围,一次性把所有需要的 CSV 读成一个大的 DataFrame 或者字典。比如以股票代码为 key,DataFrame 为 value 存到一个 context.data_cache 里。后续回测过程中,直接从这个内存字典取切片,不碰硬盘。
第三步:控制加载的“粒度”,别一次性吃太多
批量加载不等于“把所有股票、所有年份的数据全塞进内存”。内存不够的时候,系统会开始用交换分区,反而更慢。
比较平衡的做法是按需分段:
回测如果只覆盖 2020 年到 2023 年,就不要去读 2015 年的数据。如果策略只交易几只股票,就不要加载全市场。QMT 的 download_history_data2 支持批量下载多只股票,但下载到本地是一回事,回测时读多少是另一回事。
另外,日线数据和分钟线数据对内存的压力完全不是一个量级。分钟线一天 240 条,一只股票一年就是 6 万条,全市场全加载是几十 GB 级别。所以回测时,尽量只在需要的时候加载需要的部分,或者提前在数据预处理阶段就按品种、按时间段切好。
第四步:如果还想再快,考虑 DuckDB 或类似方案
如果数据量确实很大,而且你不想每次都手动管理一堆 CSV 文件,可以考虑把 CSV 导入 DuckDB。它是一个嵌入式的列式数据库,读 CSV 的速度比 pandas 快很多,而且可以直接用 SQL 查询、按条件过滤。
有个开源项目 pyrust-bt 的数据层设计就是这样的逻辑:优先从 DuckDB 读,缺失的数据再通过 QMT 的 xtdata 下载补齐并写回数据库,形成“免维护”的数据供给链。这比纯 CSV 方案要省心得多,回测时的数据读取速度也稳定。
不过这个方案需要多写一些胶水代码,适合数据工程需求比较重的场景。如果只是几十只股票、几年的日线,前面那几步(转 Feather/Parquet + 初始化时全量加载)就已经够用了。
总结一下
从 CSV 批量加载提速,核心就三件事:
别让 CSV 拖后腿——转成 Feather 或 Parquet,省掉每次解析的开销。
别在循环里读文件——初始化时一次性加载进内存,回测时只做内存切片。
别贪多——按回测实际需要的品种和时间范围加载,控制内存压力。
这三步走完,回测启动的等待时间通常会从“泡杯茶回来还没好”变成“几秒钟就进去了”。数据量特别大的话,再考虑上 DuckDB 那类方案。
温馨提示:投资有风险,选择需谨慎。
-
看不懂K线总踩坑?国泰海通形态大师,自动抓买卖信号不用猜
2026-09-14 18:18
-
选行业总踩坑?华泰证券【行业透视】:一键看清景气度,选赛道不迷茫
2026-09-14 18:18
-
长城证券网上开户流程详解:手机开户步骤与官方入口
2026-09-14 18:18


问一问

+微信
分享该文章
