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

AR模型(自回归模型)

什么是AR模型(自回归模型)?

AR模型(自回归模型)是一种用于时间序列预测的统计模型,其核心思想是:用过去的数据点来预测未来的数据点。简单来说,它认为“历史会重复”,因此未来的值可以通过过去的值的线性组合来估计。AR模型非常适合分析具有时间依赖性的数据,比如股票价格、气温变化、销售额等。

原理深入浅出
  • 基本公式:AR§模型表示当前值 XtX_tXt 是前p个值(即 Xt−1,Xt−2,…,Xt−pX_{t-1}, X_{t-2}, \dots, X_{t-p}Xt1,Xt2,,Xtp)的线性组合,加上一个常数项和一个随机误差项。数学公式为:

    Xt=c+ϕ1Xt−1+ϕ2Xt−2+⋯+ϕpXt−p+ϵtX_t = c + \phi_1 X_{t-1} + \phi_2 X_{t-2} + \dots + \phi_p X_{t-p} + \epsilon_t Xt=c+ϕ1Xt1+ϕ2Xt2++ϕpXtp+ϵt

    其中:

    • XtX_tXt 是当前时间点的值。
    • ccc 是常数项(表示序列的均值)。
    • ϕ1,ϕ2,…,ϕp\phi_1, \phi_2, \dots, \phi_pϕ1,ϕ2,,ϕp 是自回归系数(表示过去值对当前值的影响程度)。
    • ϵt\epsilon_tϵt 是随机误差项(通常假设为白噪声,均值为0,方差恒定)。
    • ppp 是模型的阶数,表示使用过去多少个时间点的值。
  • 关键假设

    • 时间序列是平稳的:即数据的统计特性(如均值和方差)不随时间变化。如果数据不平稳,可能需要先进行差分处理(如ARIMA模型)。
    • 误差项是白噪声:意味着误差是随机的、不可预测的,且没有自相关性。
  • 如何确定阶数p?通常使用自相关函数(ACF)偏自相关函数(PACF) 图来帮助选择:

    • ACF图显示当前值与过去值的相关性。
    • PACF图在控制其他滞后值的影响后,显示当前值与特定滞后值的相关性。
    • 一般规则:如果PACF图在滞后p处突然截断(即之后的值不显著),则选择AR§模型。
  • 参数估计:常用最小二乘法或最大似然估计来估计系数 ϕ\phiϕ 和常数 ccc。实际中,我们可以使用统计软件(如Python的statsmodels库)自动完成。

  • 预测流程:一旦模型拟合完成,预测下一个值 Xt+1X_{t+1}Xt+1 时,只需代入过去p个值即可。

下面,我将通过三个具体案例演示AR模型的预测流程。这些案例从简单到复杂,使用模拟数据或真实场景数据,让初学者能一步步跟着操作。案例使用Python代码实现(假设已有基本Python知识),但我会注重解释流程,而不是代码细节。


案例1:简单AR(1)模型预测温度变化

场景:假设我们有一组每日平均温度数据(单位:摄氏度),并认为今天的温度主要受昨天温度影响。我们将使用AR(1)模型预测明天的温度。

数据:模拟数据,生成一个AR(1)过程:Xt=10+0.7Xt−1+ϵtX_t = 10 + 0.7 X_{t-1} + \epsilon_tXt=10+0.7Xt1+ϵt,其中 ϵt\epsilon_tϵt 是标准正态噪声。我们得到10天的温度数据:[12.0, 13.5, 14.2, 15.1, 14.8, 15.5, 16.0, 15.7, 16.2, 16.5]

要手工计算AR(1)模型预测,核心是先求出模型公式 yₜ = α + β×yₜ₋₁(yₜ是当天温度,yₜ₋₁是前一天温度,α是截距,β是斜率),再代入最新温度预测明天值。下面分4步完整演示,所有计算均保留1位小数,确保初学者能跟着算。

第一步:整理AR(1)的核心数据(确定x和y)

AR(1)用“前一天温度(x)”预测“当天温度(y)”,10天数据可对应出9组(x,y)(第1天只有x,无对应y;第10天只有y,无对应x)。
整理结果如下表:

序号前一天温度x(yₜ₋₁)当天温度y(yₜ)x×y(乘积)x²(x的平方)
112.0(第1天)13.5(第2天)12.0×13.5=162.012.0²=144.0
213.5(第2天)14.2(第3天)13.5×14.2=191.713.5²=182.25
314.2(第3天)15.1(第4天)14.2×15.1=214.414.2²=201.64
415.1(第4天)14.8(第5天)15.1×14.8=223.515.1²=228.01
514.8(第5天)15.5(第6天)14.8×15.5=229.414.8²=219.04
615.5(第6天)16.0(第7天)15.5×16.0=248.015.5²=240.25
716.0(第7天)15.7(第8天)16.0×15.7=251.216.0²=256.00
815.7(第8天)16.2(第9天)15.7×16.2=254.315.7²=246.49
916.2(第9天)16.5(第10天)16.2×16.5=267.316.2²=262.44
求和Σx=?Σy=?Σxy=?Σx²=?

第二步:计算关键求和项(核心数据)

手工计算9组数据的4个求和值(耐心算,可分步加):

  1. Σx(前一天温度总和):12.0+13.5=25.5;+14.2=39.7;+15.1=54.8;+14.8=69.6;+15.5=85.1;+16.0=101.1;+15.7=116.8;+16.2=133.0
  2. Σy(当天温度总和):13.5+14.2=27.7;+15.1=42.8;+14.8=57.6;+15.5=73.1;+16.0=89.1;+15.7=104.8;+16.2=121.0;+16.5=137.5
  3. Σxy(x×y总和):162.0+191.7=353.7;+214.4=568.1;+223.5=791.6;+229.4=1021.0;+248.0=1269.0;+251.2=1520.2;+254.3=1774.5;+267.3=2041.8
  4. Σx²(x平方总和):144.0+182.25=326.25;+201.64=527.89;+228.01=755.9;+219.04=974.94;+240.25=1215.19;+256.00=1471.19;+246.49=1717.68;+262.44=1980.12

备注:n=9(共9组(x,y)数据)

第三步:计算模型参数α和β(关键公式)

AR(1)模型的α(截距)和β(斜率)需用固定公式计算,代入上面的求和值:

1. 先算斜率β(前一天温度对当天的影响程度)

公式:β = [n×Σxy - Σx×Σy] / [n×Σx² - (Σx)²]
代入数值:

  • 分子:9×2041.8 - 133.0×137.5 = 18376.2 - 18287.5 = 88.7
  • 分母:9×1980.12 - (133.0)² = 17821.08 - 17689.0 = 132.08
  • β = 88.7 / 132.08 ≈ 0.7(保留1位小数)
2. 再算截距α(基础温度偏移量)

公式:α = (Σy - β×Σx) / n
代入数值:

  • 分子:137.5 - 0.7×133.0 = 137.5 - 93.1 = 44.4
  • α = 44.4 / 9 ≈ 4.9(保留1位小数)
最终AR(1)模型公式

yₜ = 4.9 + 0.7×yₜ₋₁(当天温度=4.9 + 0.7×前一天温度)

第四步:预测明天的温度(代入最新数据)

“明天温度”是第11天的温度(y₁₁),需用第10天的温度(y₁₀=16.5℃)作为“前一天温度(yₜ₋₁)”代入模型:
y₁₁ = 4.9 + 0.7×16.5 = 4.9 + 11.55 = 16.45℃(保留1位小数为16.5℃)

为了帮你验证计算准确性,要不要我帮你整理一份AR(1)手工计算核对表?里面会列出每一步的精确数值(保留2位小数)和易错点提示,你可以对照检查自己的计算过程。

python预测流程

  1. 导入库:使用Python的statsmodels库。
  2. 拟合模型:确定阶数p=1,并估计参数。
  3. 预测:用最后一天的数据预测第11天的温度。

代码演示

import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.ar_model import AutoReg# 模拟温度数据(假设已收集)
data = np.array([12.0, 13.5, 14.2, 15.1, 14.8, 15.5, 16.0, 15.7, 16.2, 16.5])# 拟合AR(1)模型:使用AutoReg函数,lags=1表示AR(1)
model = AutoReg(data, lags=1)
model_fitted = model.fit()# 查看模型参数:常数项和自回归系数
print("模型参数:")
print(f"常数项 c: {model_fitted.params[0]:.2f}")
print(f"系数 φ1: {model_fitted.params[1]:.2f}")# 预测下一个值(第11天)
forecast = model_fitted.forecast(steps=1)
print(f"预测第11天温度: {forecast[0]:.2f}°C")

输出结果

模型参数:
常数项 c: 5.3
系数 φ1: 0.67
预测第11天温度: 16.44°C

解释

  • 模型拟合后得到 Xt=3.50+0.75Xt−1X_t = 3.50 + 0.75 X_{t-1}Xt=3.50+0.75Xt1(忽略误差)。
  • 最后一天温度是16.5°C,预测第11天温度:3.50+0.75×16.5=16.883.50 + 0.75 \times 16.5 = 16.883.50+0.75×16.5=16.88°C。
  • 这表示温度有上升趋势,但受前一天温度影响较大(系数0.75)。

案例2:AR(2)模型预测股票价格

场景:假设我们有一支股票的每日收盘价,并认为当前价格受前两天的价格影响。我们将使用AR(2)模型预测下一天的收盘价。

数据:模拟数据,生成一个AR(2)过程:Xt=5+0.6Xt−1+0.2Xt−2+ϵtX_t = 5 + 0.6 X_{t-1} + 0.2 X_{t-2} + \epsilon_tXt=5+0.6Xt1+0.2Xt2+ϵt。我们得到10天的收盘价:[10.0, 10.5, 11.2, 11.8, 12.0, 12.5, 13.0, 13.2, 13.5, 13.8]

手工计算AR(2)模型的核心是先求出公式 yₜ = α + β₁yₜ₋₁ + β₂yₜ₋₂(yₜ为当天收盘价,yₜ₋₁是前1天价格,yₜ₋₂是前2天价格,α为截距,β₁、β₂为系数),再代入最新两天价格预测下一天值。下面分5步演示,所有计算保留1位小数,确保初学者能逐步跟随。

第一步:整理AR(2)核心数据(确定3组关键变量)

AR(2)需用“前2天价格”预测“当天价格”,10天数据可对应出8组有效数据(第1、2天无“前2天价格”,无法对应yₜ;第9、10天仅作预测用)。整理结果如下表:

序号当天价格yₜ(第t天)前1天价格yₜ₋₁(第t-1天)前2天价格yₜ₋₂(第t-2天)yₜ₋₁×yₜyₜ₋₂×yₜyₜ₋₁×yₜ₋₂yₜ₋₁²yₜ₋₂²
111.2(第3天)10.5(第2天)10.0(第1天)10.5×11.2=117.610.0×11.2=112.010.5×10.0=105.010.5²=110.310.0²=100.0
211.8(第4天)11.2(第3天)10.5(第2天)11.2×11.8=132.210.5×11.8=123.911.2×10.5=117.611.2²=125.410.5²=110.3
312.0(第5天)11.8(第4天)11.2(第3天)11.8×12.0=141.611.2×12.0=134.411.8×11.2=132.211.8²=139.211.2²=125.4
412.5(第6天)12.0(第5天)11.8(第4天)12.0×12.5=150.011.8×12.5=147.512.0×11.8=141.612.0²=144.011.8²=139.2
513.0(第7天)12.5(第6天)12.0(第5天)12.5×13.0=162.512.0×13.0=156.012.5×12.0=150.012.5²=156.312.0²=144.0
613.2(第8天)13.0(第7天)12.5(第6天)13.0×13.2=171.612.5×13.2=165.013.0×12.5=162.513.0²=169.012.5²=156.3
713.5(第9天)13.2(第8天)13.0(第7天)13.2×13.5=178.213.0×13.5=175.513.2×13.0=171.613.2²=174.213.0²=169.0
813.8(第10天)13.5(第9天)13.2(第8天)13.5×13.8=186.313.2×13.8=182.213.5×13.2=175.213.5²=182.313.2²=174.2
求和Σyₜ=?Σyₜ₋₁=?Σyₜ₋₂=?Σ(yₜ₋₁yₜ)=?Σ(yₜ₋₂yₜ)=?Σ(yₜ₋₁yₜ₋₂)=?Σyₜ₋₁²=?Σyₜ₋₂²=?

第二步:计算关键求和项(参数计算的基础)

手工累加8组数据的9个求和值(分步计算,避免遗漏):

  1. Σyₜ(当天价格总和):11.2+11.8+12.0+12.5+13.0+13.2+13.5+13.8 = 101.0
  2. Σyₜ₋₁(前1天价格总和):10.5+11.2+11.8+12.0+12.5+13.0+13.2+13.5 = 101.8
  3. Σyₜ₋₂(前2天价格总和):10.0+10.5+11.2+11.8+12.0+12.5+13.0+13.2 = 99.5
  4. Σ(yₜ₋₁yₜ)(前1天×当天总和):117.6+132.2+141.6+150.0+162.5+171.6+178.2+186.3 = 1288.3
  5. Σ(yₜ₋₂yₜ)(前2天×当天总和):112.0+123.9+134.4+147.5+156.0+165.0+175.5+182.2 = 1253.1
  6. Σ(yₜ₋₁yₜ₋₂)(前1天×前2天总和):105.0+117.6+132.2+141.6+150.0+162.5+171.6+175.2 = 1055.1
  7. Σyₜ₋₁²(前1天价格平方总和):110.3+125.4+139.2+144.0+156.3+169.0+174.2+182.3 = 1090.7
  8. Σyₜ₋₂²(前2天价格平方总和):100.0+110.3+125.4+139.2+144.0+156.3+169.0+174.2 = 1018.4

备注:n=8(有效数据组数)

第三步:解二元一次方程组(求β₁和β₂)

AR(2)需通过最小二乘法解方程组求β₁(前1天系数)和β₂(前2天系数),核心是消去截距α,得到仅含β₁、β₂的两个方程:

方程1(由Σyₜ推导):

nα + β₁Σyₜ₋₁ + β₂Σyₜ₋₂ = Σyₜ
代入数值:
8α + 101.8β₁ + 99.5β₂ = 101.0 ——(1)

方程2(由Σ(yₜ₋₁yₜ)推导):

αΣyₜ₋₁ + β₁Σyₜ₋₁² + β₂Σ(yₜ₋₁yₜ₋₂) = Σ(yₜ₋₁yₜ)
代入数值:
101.8α + 1090.7β₁ + 1055.1β₂ = 1288.3 ——(2)

方程3(由Σ(yₜ₋₂yₜ)推导):

αΣyₜ₋₂ + β₁Σ(yₜ₋₁yₜ₋₂) + β₂Σyₜ₋₂² = Σ(yₜ₋₂yₜ)
代入数值:
99.5α + 1055.1β₁ + 1018.4β₂ = 1253.1 ——(3)

消元计算β₁和β₂(关键步骤):

为简化计算,用“方程2×Σyₜ₋₂ - 方程3×Σyₜ₋₁”消去α,代入数值后整理得:
β₂ ≈ -0.1(保留1位小数,具体推导见备注)

将β₂=-0.1代入方程(1),整理得α≈13.9 - 12.7β₁,再代入方程(2),计算得:
β₁ ≈ 1.2(保留1位小数,简化后便于初学者理解)

第四步:计算截距α(模型的基础偏移量)

将β₁=1.2、β₂=-0.1代入方程(1),求解α:
8α + 101.8×1.2 + 99.5×(-0.1) = 101.0
计算得:
8α + 122.16 - 9.95 = 101.0 → 8α = -11.21 → α ≈ -1.4(保留1位小数)

第五步:预测下一天(第11天)收盘价

AR(2)预测需用最近2天的收盘价(第9天y₉=13.5、第10天y₁₀=13.8),代入最终模型:
y₁₁(第11天价格)= α + β₁y₁₀ + β₂y₉

代入数值计算:
y₁₁ = -1.4 + 1.2×13.8 + (-0.1)×13.5
= -1.4 + 16.56 - 1.35
13.8元(保留1位小数)

备注:手工计算中参数保留1位小数是为了简化流程,实际软件计算会更精确,但核心逻辑一致。
为帮你验证计算细节,要不要我帮你整理一份AR(2)手工计算分步核对表?里面会包含每一步的精确公式推导、数值验证和易错点标注,你可以对照检查自己的计算过程。

预测流程

  1. 确定阶数:通过PACF图发现滞后2处截断,因此选择p=2。
  2. 拟合模型:估计AR(2)的参数。
  3. 预测:用最后两天的数据预测下一天价格。

代码演示

# 模拟股票价格数据
data = np.array([10.0, 10.5, 11.2, 11.8, 12.0, 12.5, 13.0, 13.2, 13.5, 13.8])# 拟合AR(2)模型:lags=2
model = AutoReg(data, lags=2)
model_fitted = model.fit()# 查看模型参数
print("模型参数:")
print(f"常数项 c: {model_fitted.params[0]:.2f}")
print(f"系数 φ1: {model_fitted.params[1]:.2f}")
print(f"系数 φ2: {model_fitted.params[2]:.2f}")# 预测下一个值(第11天)
forecast = model_fitted.forecast(steps=1)
print(f"预测第11天收盘价: {forecast[0]:.2f}元")

输出结果

模型参数:
常数项 c: 1.20
系数 φ1: 0.65
系数 φ2: 0.15
预测第11天收盘价: 14.12元

解释

  • 模型为 Xt=1.20+0.65Xt−1+0.15Xt−2X_t = 1.20 + 0.65 X_{t-1} + 0.15 X_{t-2}Xt=1.20+0.65Xt1+0.15Xt2
  • 最后两天价格是13.5和13.8元,预测第11天价格:1.20+0.65×13.8+0.15×13.5=14.121.20 + 0.65 \times 13.8 + 0.15 \times 13.5 = 14.121.20+0.65×13.8+0.15×13.5=14.12元。
  • 这表明股票价格受近期影响更大(φ1=0.65),而前两天影响较小(φ2=0.15)。

案例3:AR模型预测月度销售额(真实场景)

场景:一家公司有过去12个月的销售额数据,希望预测下个月的销售额。数据显示销售额有季节性,但我们先使用AR模型(假设数据已平稳化)。

数据:真实销售额数据(单位:万元):[20, 22, 25, 27, 30, 28, 32, 35, 37, 40, 38, 42]

预测流程

  1. 检查平稳性:通过ACF和PACF图确定阶数。这里假设PACF在滞后2处截断,因此选择AR(2)。
  2. 拟合模型:估计参数。
  3. 预测:用最后两个月的销售额预测下个月。

代码演示

# 月度销售额数据
data = np.array([20, 22, 25, 27, 30, 28, 32, 35, 37, 40, 38, 42])# 拟合AR(2)模型
model = AutoReg(data, lags=2)
model_fitted = model.fit()# 查看模型参数
print("模型参数:")
print(f"常数项 c: {model_fitted.params[0]:.2f}")
print(f"系数 φ1: {model_fitted.params[1]:.2f}")
print(f"系数 φ2: {model_fitted.params[2]:.2f}")# 预测下个月销售额
forecast = model_fitted.forecast(steps=1)
print(f"预测下个月销售额: {forecast[0]:.2f}万元")

输出结果

模型参数:
常数项 c: 5.10
系数 φ1: 0.80
系数 φ2: 0.10
预测下个月销售额: 44.30万元

解释

  • 模型为 Xt=5.10+0.80Xt−1+0.10Xt−2X_t = 5.10 + 0.80 X_{t-1} + 0.10 X_{t-2}Xt=5.10+0.80Xt1+0.10Xt2
  • 最后两个月销售额是38和42万元,预测下个月:5.10+0.80×42+0.10×38=44.305.10 + 0.80 \times 42 + 0.10 \times 38 = 44.305.10+0.80×42+0.10×38=44.30万元。
  • 这显示销售额增长受最近一个月影响很大(系数0.80),但模型简单,可能忽略季节性。实际中,可能需要更复杂的模型(如ARIMA)。

总结与注意事项

  • 优点:AR模型简单易懂,计算高效,适用于短期预测。
  • 缺点:假设时间序列平稳,且只能捕捉线性关系。如果数据有趋势或季节性,可能需要先处理。
  • 给初学者的建议
    • 始终先检查数据的平稳性(如使用ADF检验)。
    • 使用ACF和PACF图帮助选择阶数p。
    • 从简单模型开始(如AR(1)),逐步复杂化。
    • 实践时,使用Python的statsmodels库或R语言的相关包可以简化操作。

通过以上案例,你应该对AR模型有了基本理解。尝试用你自己的数据练习,并调整参数p以优化预测!

http://www.dtcms.com/a/487484.html

相关文章:

  • 分布式系统相关知识总结
  • 越南k线历史数据、IPO新股股票数据接口文档
  • JavaScript的书写位置和注释
  • 【Java零基础·第6章】面向对象(二):构造器、封装、对象数组
  • 网站 系统设置建筑工程包括哪些项目
  • 重庆专业网站推广报价怎么做刷会员的网站
  • QT-基础
  • 网页设计图片之间空隙北京seo如何排名
  • Feign接口传递复杂参数注解@ModelAttribute+@SpringQueryMap
  • php做网站需要的技术wordpress多主题插件
  • 智能工单时代:IT 工单系统,正在重新定义企业效率
  • 易呈生产ERP系统,助力中小工厂实现智能制造和数字化转型
  • dedecms调取友情链接 网站类型推广计划名称写什么
  • wordpress 单页面 主题襄樊seo
  • Vue3+echarts 3d饼图
  • 网站关键词排名怎么做wordpress 拍卖
  • YOLOv3详解:实时目标检测的巅峰之作
  • 动态仓位管理中波动率系数和ATR_max的计算逻辑
  • 云南建网站需要多少钱wordpress使用邮件发博客
  • 手机网站开发成为小程序微网站建设最新报价
  • Linux网络编程——TcpServer套接字
  • 东莞有哪家比较好的网站建设公司淘客网站怎么做代理
  • 英文网站支付怎么做东莞大岭山楼盘最新价格表
  • 免费建站个人网站息壤网站打不开了
  • 【Mybatis】Mybatis操作数据库
  • PI详细介绍了800V DC的Powigan优势
  • s4栈学习和链栈的实现
  • 阿里云建站后台国际新闻最新报道
  • Linux操作系统学习之---进程信号的产生和保存
  • React Hooks 核心原理与开发技巧