金融数据获取:从零搭建你的数据管道

做量化交易,数据就是你的弹药。没有干净、可靠的数据,再牛的策略也是空中楼阁。今天我们就来聊聊,怎么把股票、期货的历史数据搞到手,再把它收拾得服服帖帖。

一、数据源的选择:tushare vs akshare

我个人习惯用这两个库。tushare是老牌选手,数据质量高,但有些接口需要积分。akshare是后起之秀,免费、覆盖面广,连期货、外汇、宏观经济数据都有。

说白了,怎么选?

  • 做股票回测:tushare的日线数据更稳定,我用了三年没出过大问题
  • 做期货、多品种:akshare更省心,不用积分,直接调接口
  • 高频数据:两个都不太够,得找专业数据商
我的经验:刚开始做回测时,我同时用两个库拉数据做交叉验证。有一次发现某只股票tushare和akshare的复权数据差了0.3%,排查了半天,原来是除权日处理方式不同。从那以后,我统一用后复权,并在代码里加了校验逻辑。

二、实战:用tushare拉取股票数据

先装库:pip install tushare。然后去官网注册,拿到token。

import tushare as ts
import pandas as pd

# 初始化
pro = ts.pro_api('你的token')

# 获取平安银行日线数据
df = pro.daily(
    ts_code='000001.SZ',
    start_date='20200101',
    end_date='20231231'
)

# 按日期排序
df = df.sort_values('trade_date')
print(df.head())

嗯,这里要注意:tushare返回的数据默认是按日期降序的。我刚开始没注意,直接拿来做回测,结果策略表现异常好——后来才发现是用了未来数据。你想想看,用明天的数据做今天的决策,这不就是作弊吗?

三、期货数据获取:akshare的玩法

期货数据用akshare更顺手。它不需要token,直接调函数就行。

import akshare as ak

# 获取螺纹钢主力连续合约
df_futures = ak.futures_main_sina(
    symbol='RB0'
)

# 获取铁矿石历史数据
df_iron = ak.futures_hist_daily(
    symbol='I0',
    start_date='20200101',
    end_date='20231231'
)

print(df_futures.head())

我曾经踩过一个坑:akshare的期货主力合约数据,换月时会有跳空。比如螺纹钢从RB2401换到RB2405,价格可能差几百点。如果不处理,回测结果会失真。后来我加了换月价差修正,才算解决了这个问题。

四、数据清洗与预处理

数据拿到手,别急着用。先做三件事:

  1. 检查缺失值:停牌日、节假日会导致数据缺失
  2. 处理异常值:比如某天涨幅超过20%,大概率是数据错误
  3. 统一格式:日期、价格、成交量,字段名要规范
def clean_data(df):
    # 1. 删除全空行
    df = df.dropna(how='all')
    
    # 2. 填充缺失值(用前一天的收盘价)
    df['close'] = df['close'].fillna(method='ffill')
    
    # 3. 剔除异常值(涨跌幅超过20%)
    df = df[df['pct_chg'].abs() < 20]
    
    # 4. 日期格式统一
    df['trade_date'] = pd.to_datetime(df['trade_date'])
    
    return df

df_clean = clean_data(df)
避坑指南:我曾经用fillna(method='bfill')填充缺失值,结果把停牌复牌后的跳空数据给填错了。比如某股票停牌一个月,复牌后直接跌停,用后向填充会把跌停价填到停牌期间,回测时策略以为停牌期间也在交易,逻辑全乱套了。所以,停牌日的数据我建议直接删除,不要填充。

五、本地数据存储:CSV vs HDF5

数据清洗完了,得存起来。我一般这样选:

存储方式 优点 缺点 适用场景
CSV 通用、可读、方便分享 慢、占空间、不支持多索引 小数据量、单品种
HDF5 快、压缩率高、支持多表 二进制、不易直接查看 大数据量、多品种、高频

我个人习惯:小项目用CSV,大项目用HDF5。比如回测50只股票,每天拉一次数据,CSV完全够用。但如果要存全市场5000只股票的分钟数据,那必须上HDF5。

# CSV存储
df_clean.to_csv('stock_000001.csv', index=False)

# HDF5存储(支持多表)
with pd.HDFStore('market_data.h5') as store:
    store['000001'] = df_clean
    store['000002'] = df_clean2
    # 可以存几十个品种
    
# 读取HDF5
with pd.HDFStore('market_data.h5') as store:
    df_read = store['000001']

性能对比:我测试过,同样100万条数据,CSV读取需要3.2秒,HDF5只需要0.4秒。而且HDF5文件大小只有CSV的60%。所以,如果你做多品种回测,强烈建议用HDF5。

六、知识体系总览

下面这张图,帮你理清整个数据管道的脉络:

金融数据获取与处理流程 数据源 tushare / akshare API接口调用 数据清洗 缺失值·异常值·格式 本地存储 CSV / HDF5 策略回测 关键注意事项 • 检查数据完整性 • 处理复权与换月 • 避免未来数据 • 多源交叉验证 • 存储格式选型

这张图把整个流程串起来了:从数据源出发,经过API获取、清洗处理,最后存到本地,供回测使用。每一步都有坑,但只要你按这个流程走,基本不会出大问题。

七、总结

数据获取这件事,说白了就是三个字:稳、准、快

  • :数据源要可靠,多准备几个备选
  • :清洗逻辑要严谨,别让脏数据混进去
  • :存储格式选对,回测时能省大量时间

我刚开始做量化时,花在数据上的时间占了整个项目的60%。现在熟练了,大概20%就够了。但即便如此,每次换新品种、换数据源,我还是会花半天时间做数据校验。嗯,这个习惯救了我很多次。


专注资料整理