2. 金融时间序列基础
在把 RNN、LSTM 用于金融预测之前,必须先弄清楚“喂给模型的数据到底是什么”。金融时间序列并不是一条简单的价格曲线,而是由价格、收益率、成交量、波动率等多条相互关联的序列构成。理解它们的统计性质,决定了模型能否学到真实规律,还是仅仅拟合噪声。
一、四类核心数据类型
金融市场的原始观测通常可以归纳为四类,它们的信息含量和建模用途各不相同。
- 价格(Price):开盘价、最高价、最低价、收盘价(OHLC)。价格序列通常是非平稳的,存在趋势和单位根,直接输入模型容易导致伪回归。
- 收益率(Return):常用对数收益率
r_t = ln(P_t / P_{t-1})。相比价格更接近平稳序列,是预测任务中最常用的目标变量。 - 成交量(Volume):反映市场参与度与流动性,常呈现尖峰厚尾和长记忆性,通常需要做对数或标准化处理。
- 波动率(Volatility):收益率的条件标准差,具有波动聚集(volatility clustering)特征,常用 GARCH 族模型或已实现波动率来刻画。
二、平稳性、自相关与白噪声
平稳性(Stationarity)是时间序列建模的地基。若一个序列的均值、方差和自协方差不随时间平移而改变,则称其为弱平稳。非平稳序列会让模型学到“时间趋势”而非“可复用规律”。常用检验方法包括 ADF 检验和 KPSS 检验。
from statsmodels.tsa.stattools import adfuller
result = adfuller(returns, autolag="AIC")
print("ADF Statistic:", result[0])
print("p-value:", result[1])
# p-value < 0.05 通常认为序列平稳
自相关(Autocorrelation)衡量序列与自身滞后项的相关程度。ACF 用于观察整体相关性衰减,PACF 用于识别剔除中间滞后后的直接相关。金融收益率往往在低阶滞后上自相关很弱,但绝对收益率或平方收益率却表现出显著的长记忆性——这正是波动率聚集的统计证据。
白噪声(White Noise)是均值为零、方差恒定、各期互不相关的序列。它是“没有可预测信息”的基准。若模型残差接近白噪声,说明模型已提取了主要结构;若残差仍有显著自相关,则说明模型欠拟合。
三、方法流程:从原始行情到模型输入
把原始行情转化为可训练序列,通常遵循以下流程:
- 数据对齐:统一时间频率(日线、分钟线),处理停牌、缺失值与不同市场时区。
- 价格转收益率:使用对数收益率,避免价格量纲差异并近似可加。
- 平稳性检验:对每条特征做 ADF 检验,不平稳则差分或取对数差分。
- 自相关分析:用 ACF/PACF 确定滞后阶数,构造滞后特征。
- 波动率特征:计算滚动标准差或 GARCH 条件方差,作为额外输入。
- 标准化与滑窗:按训练集统计量做 Z-score,再切分为固定长度的滑动窗口样本。
# 构造滑动窗口样本(示意)
def make_windows(series, window=30):
X, y = [], []
for i in range(len(series) - window):
X.append(series[i:i+window])
y.append(series[i+window])
return np.array(X), np.array(y)
四、案例场景与常见误区
假设我们要预测某只股票未来一日的收益率方向。若直接把收盘价序列输入 LSTM,模型很可能学到“价格长期上涨”这一趋势,在测试集上表现虚高,实盘却失效。正确做法是:以对数收益率作为目标,加入成交量变化率和 20 日滚动波动率作为辅助特征,并对所有特征做平稳化与标准化。
| 概念 | 判断方法 | 建模含义 |
|---|---|---|
| 平稳性 | ADF p < 0.05 | 可安全用于回归与神经网络输入 |
| 自相关 | ACF/PACF 显著超出置信带 | 存在可利用的滞后结构 |
| 白噪声 | Ljung-Box p > 0.05 | 无可预测信息,模型残差理想状态 |
| 波动聚集 | 平方收益率 ACF 缓慢衰减 | 需引入 GARCH 或波动率特征 |
掌握这些基础概念后,RNN 与 LSTM 才有意义:它们擅长捕捉序列中的非线性依赖与长程记忆,但前提是输入序列已经过平稳化、特征化和合理切分。数据质量与统计性质,往往比网络结构更能决定金融预测的成败。