金融数据获取:量化交易的“原材料”

做量化交易,说白了就是和数据打交道。你策略再牛,模型再炫,没有数据就是巧妇难为无米之炊。我个人习惯把数据获取比作“做饭前的买菜”——菜买不好,后面全白搭。

这一章,咱们就聊聊怎么把“菜”买对、买全、存好。

数据源的选择: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 里可以同时存 000001600036 等。

知识体系总览

下面这张图,帮你理清本章的核心逻辑。

金融数据获取知识体系 数据源选择 数据频率 数据存储 Tushare AkShare 日线数据 分钟线数据 CSV HDF5 核心原则 策略决定频率 → 频率决定数据源 → 数据量决定存储方式

这张图把本章的核心逻辑串起来了。你从数据源出发,根据策略需求选择频率,再根据数据量决定存储方式。每一步都有讲究。

一句话总结:数据获取不是简单的“下载就完事”,而是要根据你的策略、频率、数据量,选择最合适的工具和存储方式。这一步做好了,后面的回测和实盘才能稳。

专注资料整理