第二章:金融市场基础与数据获取
各位同学,欢迎来到第二章。
做量化交易,说白了就是跟数据打交道。你策略再牛,模型再花哨,数据源出了问题,一切都是白搭。我见过太多人把精力全花在调参上,结果数据预处理阶段就埋了雷——嗯,这种坑我自己也踩过不少。
这一章,我们先把地基打牢。我会带你快速过一遍三大主流市场(股票、期货、加密货币)的核心差异,然后手把手教你用 yfinance 拉数据,最后重点讲数据清洗与预处理。这部分内容虽然基础,但绝对是实战中出问题最多的地方。
2.1 三大市场:股票、期货、加密货币
先聊聊这三个市场的特点。你不需要成为每个领域的专家,但得知道它们各自「脾气」如何。
股票市场
股票市场是最传统的。交易时间固定(比如A股是9:30-15:00),有涨跌停限制,流动性相对较好。我个人习惯把股票数据当作强化学习入门的第一块试验田——因为数据相对干净,规律性也强。
期货市场
期货就有点不一样了。它有杠杆,可以做多也可以做空,而且有交割日。我记得刚接触期货时,最让我头疼的就是「换月」问题——主力合约会变,价格会有跳空。如果你直接把不同合约的数据拼在一起,回测结果会非常离谱。
加密货币市场
加密货币嘛,7×24小时交易,没有涨跌停,波动极大。我在项目中遇到过最夸张的情况:一个小时内价格上下波动30%。这种数据对强化学习模型来说,既是机会也是挑战。另外,加密货币的数据源质量参差不齐,有些交易所的数据甚至会有时间戳错乱的问题。
| 特性 | 股票 | 期货 | 加密货币 |
|---|---|---|---|
| 交易时间 | 固定时段 | 近乎全天(有夜盘) | 7×24小时 |
| 杠杆 | 无(或低) | 有 | 有 |
| 数据频率 | 日/分钟 | 分钟/ tick | 秒级/ tick |
| 数据质量 | 高 | 中高 | 中低 |
2.2 使用 yfinance 获取历史数据
yfinance 是我最常用的免费数据源之一。它从 Yahoo Finance 拉数据,覆盖股票、ETF、指数、期货等。虽然免费,但数据质量在大多数场景下够用。
安装很简单:
pip install yfinance
获取数据的基本用法:
import yfinance as yf
# 下载苹果股票2023年全年的日线数据
data = yf.download('AAPL', start='2023-01-01', end='2023-12-31')
print(data.head())
你可能会问:为什么选 yfinance 而不是其他库?我个人觉得它最大的优点是「零配置」——不需要 API key,不需要注册,一行代码就能拿到数据。对于快速原型验证来说,非常方便。
不过要注意一点:yfinance 返回的数据是 pandas DataFrame,列名是 Open、High、Low、Close、Volume 等。如果你同时下载多只股票,它会返回一个 MultiIndex 的 DataFrame,处理起来稍微麻烦一些。
yf.download(..., auto_adjust=True),它会自动调整价格(考虑分红、拆股等因素)。
2.3 数据清洗与预处理
数据拉下来之后,别急着扔进模型。先做清洗。这一步做不好,后面全是白费功夫。
处理缺失值
缺失值在金融数据里很常见。比如节假日没有交易数据,或者某些交易所的数据源偶尔断流。我见过最离谱的情况:某只股票因为停牌,连续20个交易日的收盘价全是 NaN。
常见的处理方法有三种:
- 直接删除:如果缺失值很少,直接 drop 掉最省事。
- 向前填充:用上一个有效值填充。适合处理非交易日的缺失。
- 插值:用前后值做线性插值。适合处理短时间内的数据断裂。
# 检查缺失值
print(data.isnull().sum())
# 向前填充
data.fillna(method='ffill', inplace=True)
# 或者直接删除
data.dropna(inplace=True)
重采样
重采样就是把数据从一种时间频率转换成另一种。比如把分钟线重采样成小时线,或者把日线重采样成周线。
为什么需要重采样?因为强化学习模型的训练频率和交易频率不一定匹配。你想想看,如果你做的是日频交易,却用分钟级数据训练模型,计算量会非常大,而且容易过拟合到噪声上。
# 将日线数据重采样为周线
weekly_data = data.resample('W').agg({
'Open': 'first',
'High': 'max',
'Low': 'min',
'Close': 'last',
'Volume': 'sum'
})
这里要注意:重采样时,不同字段的聚合方式不一样。开盘价取第一个,收盘价取最后一个,最高价取最大值,最低价取最小值,成交量取总和。这个逻辑不难,但容易搞混。
数据标准化
强化学习模型对输入数据的尺度很敏感。如果价格从几十到几万不等,模型训练会非常不稳定。我一般会做 Z-score 标准化:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaled_data = scaler.fit_transform(data[['Close']])
标准化之后,数据均值为0,标准差为1。这样模型就能更快收敛。
2.4 本章知识体系
下面这张图总结了本章的核心逻辑。你可以把它当作一个「数据流水线」来看:
2.5 本章小结
这一章我们聊了三个市场的核心差异,学会了用 yfinance 拉数据,也掌握了缺失值处理和重采样的基本方法。说实话,这些内容看起来简单,但我在实际项目中见过太多人在这里翻车。
记住一句话:数据质量决定了模型的上限。你花再多时间调参,也弥补不了数据上的硬伤。
- 股票、期货、加密货币各有特点,选择数据源时要考虑交易时间和数据质量
- yfinance 适合快速获取历史数据,但要注意数据频率和调整因子
- 缺失值处理要结合业务场景,不要盲目填充
- 重采样时注意不同字段的聚合方式
- 数据标准化对强化学习模型训练至关重要