金融数据获取:量化交易的“原材料”
做量化交易,说白了就是和数据打交道。你策略再牛,模型再炫,没有数据就是巧妇难为无米之炊。我个人习惯把数据获取比作“做饭前的买菜”——菜买不好,后面全白搭。
这一章,咱们就聊聊怎么把“菜”买对、买全、存好。
数据源的选择:Tushare vs AkShare
国内做量化,绕不开两个库:Tushare 和 AkShare。我两个都用过,说说我的真实感受。
| 对比项 | Tushare | AkShare |
|---|---|---|
| 数据质量 | 高,经过校验 | 较高,部分数据来自公开接口 |
| 使用门槛 | 需要注册、积分、Token | 相对简单,pip安装即可 |
| 数据范围 | 股票、基金、期货、宏观等 | 股票、基金、期货、外汇、另类数据 |
| 频率支持 | 日线、分钟线、Tick | 日线、分钟线(部分) |
| 稳定性 | 高,有付费保障 | 中等,依赖源站稳定性 |
| 社区活跃度 | 高,文档完善 | 极高,更新频繁 |
我的建议:刚开始学,用AkShare就够了。免费、上手快。等你要做实盘了,再考虑Tushare的付费服务。我在项目中遇到过AkShare某个接口突然改字段名的情况,所以生产环境一定要加数据校验。
数据频率:日线 vs 分钟线
你想想看,不同策略对数据频率的要求完全不一样。
- 日线数据:适合中长线策略、因子研究、回测验证。数据量小,处理快。
- 分钟线数据:适合高频策略、日内交易。数据量大,存储和读取都是挑战。
为什么会这样?因为一分钟的数据量,可能是日线的240倍。我曾经为了存一年的1分钟线数据,硬盘直接爆了。嗯,这里要注意,别小看数据量。
核心原则:策略需要什么频率,就获取什么频率。不要贪多,数据不是越多越好,够用就行。
数据存储:CSV vs HDF5
数据拿到了,存哪里?这是个老生常谈的问题。
| 存储方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| CSV | 人类可读、通用性强、简单 | 读写慢、占用空间大、无压缩 | 小数据量、临时分析、调试 |
| HDF5 | 读写快、支持压缩、支持大数据 | 二进制格式、需要专用库 | 大数据量、分钟线、实盘环境 |
我个人习惯:开发阶段用CSV,方便肉眼检查数据对不对。生产环境用HDF5,性能差距太大了。你想想看,回测时读取100只股票的日线数据,CSV可能要几秒,HDF5可能几百毫秒就搞定了。
避坑指南:我曾经用CSV存了3年的分钟线数据,结果回测时光读取数据就花了半小时。后来换成HDF5,压缩后体积缩小了70%,读取时间缩短到2分钟。血的教训。
实战:用AkShare获取股票日线数据并存储
光说不练假把式。咱们直接上代码。
import akshare as ak
import pandas as pd
import os
# 获取股票日线数据
def get_stock_daily(symbol="000001", start_date="20230101", end_date="20231231"):
"""
获取单只股票的日线数据
"""
try:
df = ak.stock_zh_a_hist(symbol=symbol,
period="daily",
start_date=start_date,
end_date=end_date,
adjust="qfq") # 前复权
return df
except Exception as e:
print(f"获取 {symbol} 数据失败: {e}")
return None
# 存储为CSV
def save_to_csv(df, filepath):
df.to_csv(filepath, index=False)
print(f"数据已保存到 {filepath}")
# 存储为HDF5
def save_to_hdf5(df, filepath, key="data"):
df.to_hdf(filepath, key=key, mode="w", complevel=5)
print(f"数据已保存到 {filepath}")
# 使用示例
if __name__ == "__main__":
# 获取平安银行日线数据
df = get_stock_daily("000001", "20230101", "20231231")
if df is not None:
# 保存为CSV
save_to_csv(df, "000001_daily.csv")
# 保存为HDF5
save_to_hdf5(df, "000001_daily.h5")
print("数据预览:")
print(df.head())
小技巧:HDF5支持多键存储,你可以把多只股票的数据存在同一个文件里,用不同的key区分。比如
data/stock_data.h5 里可以同时存 000001、600036 等。
知识体系总览
下面这张图,帮你理清本章的核心逻辑。
这张图把本章的核心逻辑串起来了。你从数据源出发,根据策略需求选择频率,再根据数据量决定存储方式。每一步都有讲究。
一句话总结:数据获取不是简单的“下载就完事”,而是要根据你的策略、频率、数据量,选择最合适的工具和存储方式。这一步做好了,后面的回测和实盘才能稳。