金融数据分析·时间序列·AR模型

第二章 金融时间序列线性模型

        时间序列是指将某一个统计指标在不同时间上的各个数值,按时间先后顺序排列而成的序列。时间序列的发展可以追溯到1927年Yule提出的AR模型和1937年Walker提出的MA模型及将两个模型合并得到的ARMA模型;随后标志性的事件包括1970年Box和Jenkins中提出的ARIMA模型,1982年Engle提出的ARCH模型,1985年Bollerslov针对多变量的情况提出的GARCH模型。

1、AR(Autoregressive model,AR)模型,自回归模型

1.1 AR(1)模型

        自回归模型就是变量对变量自身滞后项进行回归。当x_t具有统计显著的滞后为1的自相关系数时,滞后值x_t−1可能会在预测x_t时有用。

上述模型称为一阶自回归模型(Autoregressive model,AR),或简称AR(1)模型。其中{a_t}是均值为0、方差为σ_a^2的白噪声序列。AR(1)模型有若干类似于简单线性回归模型的性质。假定序列{x_t}是弱平稳的,则有:

        其中μ和γ_0是常数,γ_j是j的函数而与t无关。

        即,AR(1)模型性质(总结):

        AR(1)模型的自相关函数(ACF)性质:
        AR(1)模型的ACF满足:。因为ρ_0=1,所以有:

        这个性质表明弱平稳AR(1)序列的自相关函数(ACF)从ρ_0=1开始以比率为ϕ_1的指数速度衰减。当ϕ_1>0,AR(1)模型的自相关函数(ACF)图像呈现指数衰减。当ϕ_1<0,AR(1)模型的ACF由上下两个都以ϕ_1^2比率衰减的图组成。

图:AR模型的系数对ACF的影响

1.2 AR(2)模型

上述模型称为二阶自回归模型(Autoregressive model,AR),或简称AR(2)模型。

AR(2)模型性质:

1.3 AR(p)模型

AR(p)模型性质:

       小结:想象一下,你正在预测明天的天气,你可能会参考今天、昨天(滞后1阶)甚至前几天(滞后p阶)的天气情况来做出预测,这种基于过去数据来预测未来的方法,就是自回归的思想。在ARIMA模型中,自回归部分就是使用过去的时间序列值来预测当前或未来的值。

1.4 AR(p)模型的定阶方法

        在实际应用中,AR时间序列的阶数p是未知的,必须根据实际数据来决定。因此需要对AR模型定阶。一般有两个确定阶数p的方法:一是利用AIC、BIC等信息准则,二是利用偏自相关函数。

①AIC(赤池信息准则)和BIC(贝叶斯信息准则)

        信息准则法是选择最优的阶数以平衡模型的拟合优度和模型的复杂度,为了利用AIC来选择一个AR模型,要计算AIC(ℓ),其中ℓ=0,1,2,⋯,p。p为事先给定的一个正整数,然后选择阶k,使AIC达到最小值。该过程同样适用于BIC。

②偏自相关函数PACF

        平稳时间序列的偏自相关函数PACF是ACF的函数,对一个AR(p)模型,滞后为p的样本偏自相关函数PACF不应为零,而对所有j>p,ϕ_j,j应当接近于零。利用这一性质就可判断阶数p。

         这些性质表明AR(p)序列的样本偏自相关函数是p步截尾的。

1.5 AR模型建模(GDP季度数据AR建模)

        本例使用中国GDP的季度数据,先绘制GDP序列的对数序列和增长率的时序图(对数GDP增长率为对数GDP之间的一阶差分),调用AR模型进行拟合,计算PACF、AIC和BIC各阶对应的值,找出最小的AIC和BIC时对应的阶数即可。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.stattools import pacf
from statsmodels.tsa.ar_model import AutoReg
from statsmodels.tsa.arima.model import ARIMA
import math
import warnings
warnings.filterwarnings('ignore')

# 读取数据
data = pd.read_table('gdp.txt', header=0)

data = pd.read_table("gdp.txt", sep='\s+', header=0)  # 使用空格分隔符
gdp = data.iloc[:, 1]  # 获取第二列的数据
gdp.head()
print("GDP数据的数量:", len(gdp))

# 创建时间序列
gdp_series = pd.Series(gdp.values, index=pd.date_range(start='1992-01-01', periods=120, freq='Q'))

import matplotlib.font_manager as fm
# 设置字体为SimHei
plt.rcParams['font.sans-serif'] = ['SimHei'] 
# 解决负号显示问题
plt.rcParams['axes.unicode_minus'] = False

# 绘制log(GDP)图
plt.figure(figsize=(10, 6))
plt.plot(np.log(gdp_series))
plt.xlabel("年份")
plt.ylabel("log(GDP)")
plt.title("对数GDP")
plt.show()

# 计算GDP增长率并绘图
rate = np.diff(np.log(gdp_series))
plt.figure(figsize=(10, 6))
plt.plot(rate)
plt.xlabel("年份")
plt.ylabel("增长率")
plt.title("GDP增长率")
plt.show()


# 计算PACF并绘图
plt.figure(figsize=(10, 6))
pacf_values = pacf(rate, nlags=12)
plt.stem(pacf_values)
plt.xlabel("滞后阶数")
plt.ylabel("PACF")
plt.title("PACF of GDP增长率")
plt.show()

# 构建AR模型
model = AutoReg(rate, lags=20, old_names=False)
ar_res = model.fit()

# 输出模型定阶
print("AR模型定阶: ", ar_res.ar_lags)
print("模型AIC: ", ar_res.aic)

# 定义一个用于存储不同滞后阶数下AIC的列表
aic_values = []

# 尝试不同的滞后阶数,计算每个阶数的AIC
for lag in range(1, 21):
    model = AutoReg(rate, lags=lag, old_names=False)
    ar_res = model.fit()
    aic_values.append(ar_res.aic)

# 绘制AIC随滞后阶数的变化图
plt.figure(figsize=(10, 6))
plt.stem(range(1, 21), aic_values, basefmt=" ")
plt.xlabel("k")
plt.ylabel("AIC")
plt.title("AIC 值")
plt.show()

# 计算BIC
T = len(rate)
bic_values = aic_values + np.arange(1, 21) * (math.log(T) - 2) / T

# 绘制BIC
plt.figure(figsize=(10, 6))
plt.stem(range(1, 21), bic_values, basefmt=" ")
plt.xlabel("k")
plt.ylabel("BIC")
plt.title("BIC 值")
plt.show()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值