3. 金融时序平稳性检验与差分
任务说明
对股价序列做ADF单位根检验,判断其是否平稳;若不平稳则进行一阶差分,对差分后的收益率序列再次做ADF检验,确认平稳后保存为CSV文件。核心依赖:pandas、numpy、statsmodels。
处理流程
完整代码
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。