如何把 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 的三分之一。配合按标的/日期分区,就能构建高效、可增量更新的本地行情库。

参考

相关推荐
专注仿真15 分钟前
知识问答大模型-rag算法详解
人工智能·python·控制算法
染指111042 分钟前
158.Agent-LangGraph-子图(共享状态和不共享状态模式)
开发语言·人工智能·python·ui·agent·agents
云和数据.ChenGuang2 小时前
Python 常见特殊方法详解:__new__、__init__、__del__、__str__、__repr__ 与 __getattribute__
开发语言·人工智能·python·1024程序员节
xyouyuweizhu3 小时前
字节流与字符流:Java IO 的两条主线该怎么选
java·开发语言·python
迪菲赫尔曼3 小时前
【基础篇 04】第一次使用终端:命令在哪里输入,电脑现在又“站”在哪里?
python·yolo·目标检测
qianbo_insist3 小时前
# 在 Qwen3.5-2B 上把 GDN-1 无损换成 GDN-2:一次完整的架构手术实验(负结果)
人工智能·pytorch·python·架构
专注仿真4 小时前
Agentic RAG算法详解
人工智能·python·大模型训练·控制算法
学习论之费曼学习法5 小时前
无人值守AI内容矩阵实战(8):标题 A/B 实验的 6 个工程实现细节,隔日对比与自动判胜
人工智能·python·算法·矩阵·自动化·a/b测试·内容矩阵
东哥16885 小时前
我用 DeepSeek 做了 4 个零依赖的赚钱小工具,全部开源
python·开源·deepseek
Carl_奕然5 小时前
【机器视觉】最强算法之:3D高斯泼溅(3D Gaussian Splatting)
人工智能·python·算法·目标检测·计算机视觉·3d