数据存储:从CSV到Parquet的进化
我的掌握程度:
先掌握这个答案
存储阶梯:①CSV:人类可读、通用,适合小数据与交换——性能差(全文件扫描、类型丢失);②Parquet:列式+压缩+类型保留,pandas读写快10-100倍、体积小3-10倍——研究数据主力;③SQLite/DuckDB:单文件数据库,支持SQL查询(只读需要的行)——中间层;④ClickHouse/云存储:TB级。列式原理:按列物理存储,读收盘价只碰收盘价的磁盘块。
先读结论,再核对下方使用边界;数字例题为教学情景,涉及实际行情与规则时请核对原始来源。
从理解到使用
本阶段实战方法 · 把行情数字变成可比较的收益
看股票、基金或策略业绩时,先对齐本金、起止日期、现金流与费用。
- 选一个固定区间,记录期初价值、期末价值、分红、出入金和交易费用。
- 没有中途出入金时,用(期末价值+已取出分红-期初价值-费用)÷期初价值计算收益;有出入金时先区分时间加权与资金加权。
- 用相同区间的基准作比较,同时记录最大亏损;不要单凭一次盈利评价能力。
使用边界
- 不同期限的收益不可直接排名;年化只是换算,不是未来收益承诺。
- 模拟价格不是实时行情。普通股票交易手数、T+1和费用应按具体市场规则核对。
不懂的术语:IC(信息系数)
背景 · 从一个困惑说起
s-018:TB级行情压垮CSV。个人研究虽到不了TB,但全市场日线十年(百万行级)也足以让CSV的读写速度成为日常折磨——每次打开等一分钟,改个因子等十分钟。
由此产生的问题
CSV/Parquet/SQLite各适合什么场景?列式存储为什么快?标准的数据目录结构怎么组织?
核心概念
存储阶梯:①CSV:人类可读、通用,适合小数据与交换——性能差(全文件扫描、类型丢失);②Parquet:列式+压缩+类型保留,pandas读写快10-100倍、体积小3-10倍——研究数据主力;③SQLite/DuckDB:单文件数据库,支持SQL查询(只读需要的行)——中间层;④ClickHouse/云存储:TB级。列式原理:按列物理存储,读收盘价只碰收盘价的磁盘块。
为什么需要它
①迭代速度=研究产出:因子研究一天跑几十次数据加载,快10倍=每天多几小时研究时间;②类型安全:CSV的股票代码'000001'读入变整数1(前导零消失,经典事故),Parquet保留类型;③版本管理:parquet二进制不适合git,但配「数据快照日期」目录可以固定版本可复现。
实际应用场景
标准目录:data/raw/(原始下载)、data/clean/(清洗后parquet)、data/meta/(日历、成分、行业);命名带快照日期(clean_20240601.parquet)保证实验可复现。
与之前知识的联系
q-061的缓存函数已用parquet(前瞻性铺垫)。数据车间的仓储问题解决后,最后一题是本组的毕业典礼:完整的数据流水线作业。
⚠ 常见误解
- 我的数据量小用不着Parquet:百万行的CSV读起来已经痛了;工具切换成本半小时,收益终身
- 数据库一定比文件好:单机研究场景「parquet+pandas」常常优于数据库(无服务、零运维、够快)
- 数据放一个文件夹就行:无快照管理的目录三个月后自己都说不清哪份数据可信
🛠 本题实践任务
把q-061缓存的3只股票CSV(或直接下载的数据)转存为parquet,对比文件大小与读取时间;故意用pd.read_csv不加dtype读一次,观察'000001'类代码发生了什么。
💡 提示(先自己想5分钟再看)
pip install pyarrow;读取时间可用 %%time 或 time.time() 差值。
✅ 验收标准
三组对比数字(体积/速度/类型)+一次「前导零消失」事故复现。你会永远记住dtype和parquet。
在你的浏览器内运行。首次需联网下载 Python;支持标准库和 Pyodide 提供的 NumPy、pandas 等包。行情抓取、系统文件访问和部分第三方库请在本地环境运行。输出自检仅比对结果关键词,不代替逻辑审查。
Python · 独立工作线程 · 执行限时10秒
🤖 AI导师
导师会先检查你的前置知识(数据源、数据量),再用案例、公式和代码帮助理解。此功能需要先启用服务。