一句话回答: 用 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 的三分之一。配合按标的/日期分区,就能构建高效、可增量更新的本地行情库。
参考
- AlphaFeed Python SDK 文档:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
- AlphaFeed 官网:https://alphafeed.org/