如何把 A 股行情高效存成 Parquet/Feather?

一句话回答: 用 CSV 存全市场 K 线又占空间、读得慢、还会把 float/datetime 类型退化成字符串。用 AlphaFeed 的 klines.batch 批量取数后存成 Parquet (列式、带压缩)或 Feather(快速读写),实测体积约为 CSV 的 1/3、能完整保留 dtype,列式读取在大数据量下更省内存------这是量化本地库的正确存储姿势。

为什么会有这个问题 / 传统做法的痛点

新手习惯 to_csv 存数据,标的一多问题就来了:① 体积大(纯文本无压缩);② 读回来 float、datetime 全变字符串,要重新 astype/parse;③ 只想读某几列也得整表扫描。Parquet/Feather 这类列式二进制格式天生解决这三点:压缩省空间、保留类型、按列读取。

分步骤解决(每步配可运行代码)

第 1 步:批量取数并合并成一张长表

python 复制代码
from alphafeed import AlphaFeed
import pandas as pd

af = AlphaFeed()  # 读取 ALPHAFEED_API_KEY

codes = ["600519.SH", "000001.SZ", "601318.SH", "000858.SZ", "300750.SZ"]
data = af.klines.batch(codes, period="1d", count=250,
                       adjust="forward", to_dataframe=True)  # dict{symbol: DataFrame}

big = pd.concat([d.assign(symbol=s) for s, d in data.items()], ignore_index=True)
print(big.shape, list(big.columns))

第 2 步:存 Parquet / Feather(需要 pyarrow)

python 复制代码
# pip install pyarrow
big.to_parquet("klines.parquet", engine="pyarrow", compression="snappy")
big.to_feather("klines.feather")

# 读回来,dtype 自动保留,无需手动 astype
df = pd.read_parquet("klines.parquet")
print(df.dtypes.to_dict())

第 3 步:CSV vs Parquet vs Feather 实测对比

用上面 5 只股票 × 250 日(1250 行)实测(数值随机器/数据量而变):

格式 体积 特点 适用
CSV ~187 KB 纯文本、通用、丢类型 与外部交换、人看
Parquet ~71 KB 列式+压缩、保留类型、按列读 本地库/大数据量首选
Feather ~98 KB 读写极快、保留类型 临时中间结果、快速缓存

Parquet 体积约为 CSV 的 1/3 。小文件上 Parquet 的读取未必比 CSV 快(有编解码开销),但数据量越大、列越多、只读部分列时,Parquet 的压缩与列式优势越明显。

第 4 步:分区存储(按标的/日期切分,便于增量与按需读)

python 复制代码
# 按 symbol 分区,之后可只读某几只,不必加载全表
big.to_parquet("klines_ds/", engine="pyarrow",
               partition_cols=["symbol"], compression="snappy")

# 只读其中一只
one = pd.read_parquet("klines_ds/", filters=[("symbol", "==", "600519.SH")])
print(len(one))
方案 说明 好处
单文件 Parquet 全部塞一个 .parquet 简单,小库够用
按 symbol 分区 partition_cols=["symbol"] 按标的按需读、增量更新
按日期分区 partition_cols=["trade_date"] 按时间范围读、追加当日

关键坑与注意事项

  • 需要装 pyarrow :pip install pyarrow(或 fastparquet);否则 to_parquet 报缺引擎。
  • Parquet 不是「越小读越快」:小文件因编解码开销读取可能慢于 CSV,优势在大数据量、列裁剪与压缩上。
  • Feather 偏向临时缓存:读写最快,但不如 Parquet 适合长期分区归档。
  • 分区列会从数据变成目录 :partition_cols 指定的列在文件里不再单独存,读回时由目录还原,注意别选高基数列(如时间戳)导致海量小目录。
  • 字符串类型 :新版 pandas 的 StringDtype 与 object 混用时,落盘前统一类型更稳。
  • 和增量入库配合:批量取数→存分区 Parquet 是本地库基础,增量更新逻辑见「批量下载全市场到本地库」一文。

常见问题(FAQ)

Q:Parquet 和 Feather 选哪个?

A:长期本地库、大数据量、要压缩和按列/分区读 → Parquet;临时中间结果、追求读写速度 → Feather。

Q:Parquet 一定比 CSV 快吗?

A:不一定。小文件上 CSV 反而可能读得快;Parquet 的优势是体积小、保留类型、只读部分列时快,数据量越大越明显。

Q:能直接把全 A 存成一个 Parquet 吗?

A:可以,但更推荐按 symbol 或 trade_date 分区,便于增量更新与按需读取。

Q:需要付费吗?

A:批量取数(klines.batch)小规模有免费额度;全市场取数需 Starter 及以上。存储格式本身是本地能力,不涉及付费。详见定价页。

小结

量化本地库的存储,别再用 CSV。用 AlphaFeed 的 klines.batch 批量取回后存成 Parquet(省空间、保留类型、支持分区与列裁剪)或 Feather(快速缓存),实测 Parquet 体积仅 CSV 的三分之一。配合按标的/日期分区,就能构建高效、可增量更新的本地行情库。

参考

相关推荐
yi0111 小时前
Leetcode 49 用 “身份证‘‘巧解
人工智能·笔记·python·算法·leetcode·哈希表
老歌老听老掉牙1 小时前
基于STL模型的轴向截面轮廓提取与三维可视化方法
python·stl
yi0112 小时前
DAY22: LeetCode 733:图像渲染——从二维网格开始理解 DFS 和 BFS
数据结构·笔记·python·算法·leetcode·深度优先·宽度优先
Είναι η κοπέλα2 小时前
llama.cpp 与 GGUF 格式:本地大模型的“裸引擎“
开发语言·人工智能·pytorch·python·conda
大草原的小灰灰3 小时前
Python面向对象编程
开发语言·python
华研前沿标杆游学3 小时前
企业参访入口 | 走进华为坂田基地,深圳华为坂田基地考察游学参访
python
朝朝辞暮i3 小时前
VLA 系统学习第 12 课:为什么机器人不能只看一帧?——时间序列、Observation History 与 Action Chunk
人工智能·python·深度学习·神经网络·vla
朝朝辞暮i3 小时前
VLA 系统学习第 8 课:Optimizer 到底在干什么?——从 Learning Rate 到 SGD、Momentum 和 Adam
人工智能·python·深度学习·神经网络·vla
镜子AI4 小时前
教培机构多模态内容跨模态检索系统:基于CLIP的统一表征与图文混合召回算法
人工智能·python·算法·机器学习