3. 金融时序平稳性检验与差分

金融时序平稳性检验与差分 学习卡片

任务说明

对股价序列做ADF单位根检验,判断其是否平稳;若不平稳则进行一阶差分,对差分后的收益率序列再次做ADF检验,确认平稳后保存为CSV文件。核心依赖:pandas、numpy、statsmodels。

处理流程

股价序列 price ADF检验 (原序列) 一阶差分 diff(1) ADF检验 (收益率序列) p > 0.05 → 不平稳 p < 0.05 → 平稳

完整代码

import numpy as np
import pandas as pd
from statsmodels.tsa.stattools import adfuller

# 1. 构造示例股价序列(几何随机游走,非平稳)
np.random.seed(42)
n = 300
returns = np.random.normal(0, 0.01, n)
price = 100 * np.exp(np.cumsum(returns))
df = pd.DataFrame({"price": price})

# 2. 对原序列做ADF检验
def adf_report(series, name):
    stat, pval, usedlag, nobs, crit, _ = adfuller(series, autolag="AIC")
    print(f"[{name}] ADF统计量={stat:.4f}, p值={pval:.4f}, 滞后阶数={usedlag}")
    print(f"  临界值: 1%={crit['1%']:.3f}, 5%={crit['5%']:.3f}, 10%={crit['10%']:.3f}")
    return pval

p_price = adf_report(df["price"], "原始股价")

# 3. 确定差分阶数:p>0.05 则一阶差分
d = 0
series = df["price"]
while adf_report(series, f"差分{d}阶") > 0.05 and d < 2:
    d += 1
    series = df["price"].diff(d).dropna()

print(f"\n确定差分阶数 d = {d}")

# 4. 生成平稳收益率序列并保存
df["return"] = df["price"].pct_change()
df_clean = df.dropna().reset_index(drop=True)
df_clean.to_csv("price_returns.csv", index=False)
print(f"已保存 price_returns.csv,共 {len(df_clean)} 行")
print(df_clean.head())

运行方式

pip install pandas numpy statsmodels
python adf_diff.py

验证方法与通过条件

  • 终端输出中原始股价的 p 值应大于 0.05(非平稳),差分后序列的 p 值应小于 0.05(平稳)。
  • 脚本打印的差分阶数 d 应为 1(几何随机游走一阶差分即平稳)。
  • 当前目录生成 price_returns.csv,包含 price 与 return 两列,行数为 299(去掉首个 NaN)。
  • 用 pd.read_csv("price_returns.csv") 读回后,对 return 列再次调用 adfuller,p 值应小于 0.05。

关键点

autolag="AIC" 自动选择滞后阶数,避免人为设定偏差;pct_change() 得到对数收益率近似值,是金融时序中最常用的平稳化手段。若原序列已平稳(p<0.05),循环不会执行差分,d 保持为 0。