金融数据获取:从零搭建你的数据管道
做量化交易,数据就是你的弹药。没有干净、可靠的数据,再牛的策略也是空中楼阁。今天我们就来聊聊,怎么把股票、期货的历史数据搞到手,再把它收拾得服服帖帖。
一、数据源的选择:tushare vs akshare
我个人习惯用这两个库。tushare是老牌选手,数据质量高,但有些接口需要积分。akshare是后起之秀,免费、覆盖面广,连期货、外汇、宏观经济数据都有。
说白了,怎么选?
- 做股票回测:tushare的日线数据更稳定,我用了三年没出过大问题
- 做期货、多品种:akshare更省心,不用积分,直接调接口
- 高频数据:两个都不太够,得找专业数据商
二、实战:用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,价格可能差几百点。如果不处理,回测结果会失真。后来我加了换月价差修正,才算解决了这个问题。
四、数据清洗与预处理
数据拿到手,别急着用。先做三件事:
- 检查缺失值:停牌日、节假日会导致数据缺失
- 处理异常值:比如某天涨幅超过20%,大概率是数据错误
- 统一格式:日期、价格、成交量,字段名要规范
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)
五、本地数据存储: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。
六、知识体系总览
下面这张图,帮你理清整个数据管道的脉络:
这张图把整个流程串起来了:从数据源出发,经过API获取、清洗处理,最后存到本地,供回测使用。每一步都有坑,但只要你按这个流程走,基本不会出大问题。
七、总结
数据获取这件事,说白了就是三个字:稳、准、快。
- 稳:数据源要可靠,多准备几个备选
- 准:清洗逻辑要严谨,别让脏数据混进去
- 快:存储格式选对,回测时能省大量时间
我刚开始做量化时,花在数据上的时间占了整个项目的60%。现在熟练了,大概20%就够了。但即便如此,每次换新品种、换数据源,我还是会花半天时间做数据校验。嗯,这个习惯救了我很多次。