第二章:金融市场基础与数据获取

各位同学,欢迎来到第二章。

做量化交易,说白了就是跟数据打交道。你策略再牛,模型再花哨,数据源出了问题,一切都是白搭。我见过太多人把精力全花在调参上,结果数据预处理阶段就埋了雷——嗯,这种坑我自己也踩过不少。

这一章,我们先把地基打牢。我会带你快速过一遍三大主流市场(股票、期货、加密货币)的核心差异,然后手把手教你用 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,列名是 OpenHighLowCloseVolume 等。如果你同时下载多只股票,它会返回一个 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 本章知识体系

下面这张图总结了本章的核心逻辑。你可以把它当作一个「数据流水线」来看:

数据获取与预处理流程 数据源 股票 / 期货 / 加密货币 获取数据 yfinance.download() 数据清洗 处理缺失值 数据预处理 重采样 / 标准化 训练数据 状态 / 动作 / 奖励 整个流程的核心:从原始数据到可用的训练数据 选择合适的数据源 注意数据频率和范围 缺失值处理要谨慎 重采样后检查数据

2.5 本章小结

这一章我们聊了三个市场的核心差异,学会了用 yfinance 拉数据,也掌握了缺失值处理和重采样的基本方法。说实话,这些内容看起来简单,但我在实际项目中见过太多人在这里翻车。

记住一句话:数据质量决定了模型的上限。你花再多时间调参,也弥补不了数据上的硬伤。

核心要点:
  • 股票、期货、加密货币各有特点,选择数据源时要考虑交易时间和数据质量
  • yfinance 适合快速获取历史数据,但要注意数据频率和调整因子
  • 缺失值处理要结合业务场景,不要盲目填充
  • 重采样时注意不同字段的聚合方式
  • 数据标准化对强化学习模型训练至关重要

蓝海数据掘金营,专注资料整理