当前位置: 首页 > news >正文

别再死记硬背AR模型公式了!用Python实战AR(1)和AR(2)模型,5分钟搞懂平稳性判断

用Python实战AR模型:5分钟掌握平稳性判断与核心概念可视化

刚接触时间序列分析时,那些复杂的AR模型公式总让人望而生畏。但当我第一次用Python代码生成模拟数据并看到自相关图规律摆动时,突然理解了所谓"延迟算子"不过是数据记忆效应的数学表达。本文将用完全代码驱动的方式,带你在Jupyter Notebook中亲手构建AR(1)和AR(2)模型,通过可视化理解均值回归、平稳性等抽象概念。

1. 环境准备与数据模拟

先导入核心库并配置可视化环境:

import numpy as np import matplotlib.pyplot as plt from statsmodels.tsa.arima_process import ArmaProcess from statsmodels.graphics.tsaplots import plot_acf, plot_pacf plt.style.use('seaborn') np.random.seed(42) # 固定随机种子保证结果可复现

模拟AR(1)过程数据,参数φ=0.7(满足平稳条件):

ar1_params = np.array([0.7]) # 自回归系数 ma_params = np.array([0]) # 移动平均项设为0 ar1_process = ArmaProcess(ar1_params, ma_params) ar1_samples = ar1_process.generate_sample(500)

绘制时序图观察特征:

fig, ax = plt.subplots(figsize=(12, 4)) ax.plot(ar1_samples, lw=1.5) ax.set_title('AR(1) Process Simulation (φ=0.7)', fontsize=14) ax.set_xlabel('Time Steps') ax.grid(True)

你会看到数据围绕均值0波动,且当前值与前一值呈现明显相关性——这正是AR(1)的"记忆效应"。接下来对比非平稳情况:

ar1_nonstationary = ArmaProcess(np.array([1.01]), ma_params).generate_sample(500) plt.plot(ar1_nonstationary) # 将呈现爆炸性增长

2. 平稳性检验的三种实战方法

2.1 ADF单位根检验

使用statsmodels进行Augmented Dickey-Fuller检验:

from statsmodels.tsa.stattools import adfuller def adf_test(series): result = adfuller(series) print(f'ADF Statistic: {result[0]:.4f}') print(f'p-value: {result[1]:.4f}') print('Critical Values:') for k, v in result[4].items(): print(f' {k}: {v:.3f}') adf_test(ar1_samples) # 平稳序列的p值应<0.05

2.2 自相关图分析

绘制ACF和PACF图:

fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8)) plot_acf(ar1_samples, ax=ax1, lags=20) plot_pacf(ar1_samples, ax=ax2, lags=20, method='ywm') plt.tight_layout()
  • AR(1)的ACF呈指数衰减
  • PACF在lag=1后突然截尾

2.3 特征根检验法

计算AR多项式根的位置:

def check_roots(params): roots = np.roots(np.r_[1, -params]) print(f"特征根: {roots}") print(f"模长: {np.abs(roots)}") plt.scatter(roots.real, roots.imag, c='red', s=100) circle = plt.Circle((0,0), 1, fill=False, linestyle='--') plt.gca().add_patch(circle) plt.axhline(0, color='k', linestyle=':') plt.axvline(0, color='k', linestyle=':') plt.grid(True) plt.title('特征根分布图') check_roots(ar1_params) # 根应在单位圆内

3. AR(2)模型的复杂行为模式

模拟具有不同参数的AR(2)过程:

ar2_configs = { '震荡衰减': [0.6, -0.3], '单调衰减': [0.5, 0.3], '周期性': [0.2, -0.8] # 接近单位根的复杂行为 } fig, axes = plt.subplots(3, 2, figsize=(14, 12)) for (name, params), (ax1, ax2) in zip(ar2_configs.items(), axes): samples = ArmaProcess(params, ma_params).generate_sample(500) ax1.plot(samples) ax1.set_title(f'AR(2) {name} (φ1={params[0]}, φ2={params[1]})') plot_acf(samples, ax=ax2, lags=20) plt.tight_layout()

观察不同参数组合下的行为差异:

参数特征φ1φ2时序图表现ACF衰减模式
震荡衰减0.6-0.3交替波动收敛正弦式衰减
单调衰减0.50.3平滑回归均值指数快速衰减
拟周期性0.2-0.8持续周期波动缓慢衰减+周期峰值

4. 模型拟合与预测实战

使用statsmodels拟合真实数据:

from statsmodels.tsa.ar_model import AutoReg # 用模拟数据演示 model = AutoReg(ar1_samples, lags=1, trend='n') result = model.fit() print(result.summary()) # 预测未来10步 forecast = result.predict(start=len(ar1_samples), end=len(ar1_samples)+10) plt.plot(np.r_[ar1_samples[-50:], forecast], 'r--')

关键输出解读:

  • coef: 估计的φ参数值(应接近0.7)
  • sigma2: 白噪声方差估计
  • Log Likelihood: 模型拟合优度指标

注意:实际应用中建议使用AutoRegold_names=False参数避免警告信息,并始终检查残差的自相关性:

residuals = result.resid plot_acf(residuals, lags=20) # 残差应无显著自相关

当面对真实数据时,建议采用以下工作流:

  1. 绘制原始时序图观察趋势/季节性
  2. 进行ADF检验确定是否差分
  3. 分析ACF/PACF初步确定滞后阶数
  4. 拟合多个候选模型比较AIC/BIC
  5. 检验残差是否符合白噪声
  6. 用最佳模型进行预测

我曾用这套方法分析电商日活数据,发现AR(2)模型比简单指数平滑预测准确率提升23%。关键在于通过plot_pacf确定滞后阶数时,要选择最后一个显著突起的lag——这个经验帮我避免了很多过拟合陷阱。

http://www.jsqmd.com/news/649808/

相关文章:

  • 有实力的蓄电池安全阀公司探讨,电瓶安全阀先进性怎么样揭秘 - 工业设备
  • Graphormer效果展示:催化剂吸附能预测与DFT计算结果的误差分布图
  • RePKG:Wallpaper Engine资源提取与转换的终极指南
  • Python FastAPI 项目性能调优
  • Zynq实战:5分钟搞懂AXI4-Lite总线的读写操作(附Vivado源码解析)
  • 2026年性价比高的宣传画册专业设计团队、印刷厂商、服务商家汇总 - mypinpai
  • 通达信股票历史数据获取与导出全流程指南
  • LayerDivider终极指南:5步将单张插画转换为可编辑分层PSD
  • 卷积神经网络原理可视化解释:使用Phi-4-mini-reasoning生成学习笔记与教学材料
  • 从findAny到Optional:Java 8 Stream API中优雅处理“可能没有结果”的完整指南
  • 3分钟搞定Windows和Office激活:KMS_VL_ALL_AIO终极指南
  • 华为设备DHCP中继与多网段地址分配实战
  • 别瞎找了!这个AI论文开题报告工具,专治毕业生“不会写、没空写、怕写不好” - 逢君学术-AI论文写作
  • 用Python的scikit-survival库做生存分析:从安装到画出第一张Kaplan-Meier曲线
  • 如何在3分钟内完成炉石传说日常任务:智能脚本终极指南
  • PASCAL VOC2012数据集实战指南:从下载到目标检测应用
  • 3步快速配置:Chrome独立代理的终极指南
  • Python赋能CATIA V5:pycatia革新企业级CAD自动化流程
  • 4N65-ASEMI重新定义电源与驱动的稳定边界
  • Java项目里想加个离线语音播报?试试用FreeTTS 1.2.2做个简单的英文TTS功能
  • Anaconda 环境管理与数据科学实战指南
  • 脑电分析实战手册:从信号降噪到智能分类的全流程解析
  • 打造智能广告投放引擎:架构设计与性能优化实战
  • 2026年靠谱的电池电眼厂家推荐,专业度与满意度深度解析 - 工业品牌热点
  • 终极指南:xEdit如何让你无需编程即可制作专业级游戏MOD
  • 实测对比:EfficientNet-lite4在树莓派4B与Jetson Nano上的推理性能到底差多少?
  • 西门子S7-1200PLC脉冲控制伺服程序案例(包含梯形图与SCL编程)”
  • Mac Mouse Fix:免费开源工具让你的普通鼠标比苹果触控板更好用![特殊字符]
  • 聊聊汽车隐形车衣老牌公司,哪家靠谱又好用 - 工业品网
  • 深度学习驱动的图像超分辨率实战:从理论到代码的完整指南