3. Python金融数据处理
在金融RNN与LSTM序列预测中,模型效果的上限往往不由网络结构决定,而由数据质量决定。原始行情数据存在停牌、非交易日、字段缺失、量纲差异大等问题,直接喂入网络会导致梯度异常、收敛缓慢甚至预测失效。本节围绕Pandas这一核心工具,系统讲解从原始行情到可训练张量的完整数据处理链路。
一、核心原理:金融时间序列的三重特殊性
金融时间序列与普通序列数据存在三点本质差异,这决定了处理策略的选择。
- 时间索引不可省略:金融数据的行序即时间序,索引必须是DatetimeIndex,否则重采样、滑动窗口、滞后特征全部失效。
- 缺失具有经济含义:停牌造成的缺失与数据源故障造成的缺失,处理方式完全不同,前者应前向填充,后者应标记或剔除。
- 量纲与平稳性:价格、成交量、换手率的数值范围相差数个数量级,且价格序列非平稳,必须标准化与差分处理。
金融序列预测的建模对象通常是“收益率”而非“价格”。价格序列存在单位根,直接建模容易产生伪回归;收益率序列近似平稳,更适合作为LSTM的输入目标。
二、方法流程:从原始行情到训练张量
完整链路可归纳为五个阶段:索引对齐、缺失处理、重采样、特征工程、标准化。下图展示了各阶段的数据形态变化与关键操作。
三、关键操作与代码实现
1. 时间索引与缺失值处理
import pandas as pd
import numpy as np
df = pd.read_csv("stock.csv", parse_dates=["date"], index_col="date")
df = df.asfreq("B") # 对齐到工作日,缺失处填 NaN
# 停牌:前向填充收盘价,成交量填 0
df["close"] = df["close"].ffill()
df["volume"] = df["volume"].fillna(0)
# 长缺口标记,避免污染训练
df["is_gap"] = df["close"].isna().astype(int)
df = df.dropna(subset=["close"])
asfreq 只对齐索引不改变数值,resample 会按聚合规则生成新值。判断缺失是“停牌”还是“数据源故障”,可结合成交量是否为0与缺口长度综合判断。
2. 重采样
# 日频转周频:收盘取最后,成交量求和
weekly = df.resample("W-FRI").agg({
"open": "first", "high": "max",
"low": "min", "close": "last", "volume": "sum"
})
# 分钟转日频
daily = minute_df.resample("1D").agg({"price": "ohlc", "volume": "sum"})
3. 特征工程
- 收益率:
df["close"].pct_change(),平稳化处理的基础。 - 滚动波动率:
ret.rolling(20).std(),刻画风险状态。 - 滞后特征:
df["close"].shift(1),构造监督学习标签。 - 技术指标:MA、RSI、MACD,需注意计算窗口不得跨越未来数据。
4. 数据标准化
from sklearn.preprocessing import StandardScaler
split = int(len(df) * 0.8)
train, test = df.iloc[:split], df.iloc[split:]
scaler = StandardScaler().fit(train[features])
train_scaled = scaler.transform(train[features])
test_scaled = scaler.transform(test[features]) # 只用训练集参数
四、常见误区与复盘
| 误区 | 后果 | 正确做法 |
|---|---|---|
| 用全量数据 fit 标准化器 | 未来信息泄漏,回测虚高 | 仅训练集 fit,验证/测试 transform |
| 缺失值一律均值填充 | 破坏时间连续性,引入虚假平稳 | 停牌用 ffill,故障缺口剔除或标记 |
| 对价格直接建模 | 非平稳导致伪回归 | 改用收益率或做差分 |
| 重采样后未检查索引 | 周末/节假日产生空行 | 用 asfreq 或 resample 后 dropna |
| 滚动特征跨越未来 | 标签泄漏,模型失效 | rolling 后 shift,确保只用历史 |
数据泄漏是金融时序建模最隐蔽的错误。任何涉及全局统计量的操作(标准化、归一化、缺失填充的均值)都必须严格限制在训练集时间范围内,否则离线指标再漂亮,实盘也会迅速失效。
完成本节处理后,数据应满足:索引为连续交易日、无未解释缺失、特征平稳且量纲统一、标准化参数仅来自训练集。这样的数据才能作为LSTM输入张量的可靠基础。