量化投资基础(四)之AR、MA、ARMA与ARIMA模型

点赞、关注,养成良好习惯

Life is short, U need Python

量化投资基础系列,不断更新中


1 引言

时间序列经典模型主要有:

  • 自回归模型(Auto Regressive,AR)
  • 移动回归模型(Moving Average,MA)
  • 移动自回归模型(Auto Regressive Moving Average,ARMA)
  • 差分移动自回归模型(Auto Regressive Integrated Moving Average,ARIMA)

本案例主要介绍这四种模型的基本原理以及以沪深300指数收盘价数据为例,探讨如何使用Python对平稳时间序列进行建模和预测分析。

2 AR模型

2.1 理论介绍

自回归模型(Auto Regressive,AR)是一个线性模型,将时间序列变量当期值作为被解释变数、过去期的历史值当作解释变数,因此被称作自回归模型。 p p p 阶自回归模型,即 AR( p p p) 的一般表达式为:
x t = ϕ 0 + ϕ 1 x t − 1 + ϕ 2 x t − 2 + ... + ϕ p x t − p + ε t x_t=\phi_0+\phi_1 x_{t-1}+\phi_2 x_{t-2}+\ldots+\phi_p x_{t-p}+\varepsilon_t xt=ϕ0+ϕ1xt−1+ϕ2xt−2+...+ϕpxt−p+εt

其中, { ε t } \left\{\varepsilon_t\right\} {εt} 是一个零均值、独立、同分布的白噪声序列,即满足:
E ( ε t ) = 0 ; Var ⁡ ( ε t ) = σ ε 2 ; E ( ε t ε s ) = 0 , ∀ s ≠ t \mathbb{E}\left(\varepsilon_t\right)=0 ; \quad \operatorname{Var}\left(\varepsilon_t\right)=\sigma_{\varepsilon}^2 ; \quad \mathbb{E}\left(\varepsilon_t \varepsilon_s\right)=0, \ \ \forall \ s \neq t E(εt)=0;Var(εt)=σε2;E(εtεs)=0, ∀ s=t

且解释变数 x s x_s xs 与残差项 ε t \varepsilon_t εt 无相关性,即 E ( x s ε t ) = 0 , ∀ s < t \mathbb{E}\left(x_s \varepsilon_t\right)=0,\forall s<t E(xsεt)=0,∀s<t 。为了研究 AR 模型的统计性质,假设平稳的时间序列 x t x_t xt 可以用 AR( 2 2 2) 模型来刻画:
x t = ϕ 0 + ϕ 1 x t − 1 + ϕ 2 x t − 2 + ε t , ∣ ϕ 1 ∣ < 1 , ∣ ϕ 2 ∣ < 1 x_t=\phi_0+\phi_1 x_{t-1}+\phi_2 x_{t-2}+\varepsilon_t,\ \ \ |\phi_1|<1,\ |\phi_2|<1 xt=ϕ0+ϕ1xt−1+ϕ2xt−2+εt, ∣ϕ1∣<1, ∣ϕ2∣<1

由于平稳时间序列的均值不变,则
μ = E ( x t ) = ϕ 0 + ϕ 1 E ( x t − 1 ) + ϕ 2 E ( x t − 2 ) + E ( ε t ) \mu=\mathbb{E}\left(x_t\right)=\phi_0+\phi_1 \mathbb{E}\left(x_{t-1}\right)+\phi_2 \mathbb{E}\left(x_{t-2}\right)+\mathbb{E}\left(\varepsilon_t\right) μ=E(xt)=ϕ0+ϕ1E(xt−1)+ϕ2E(xt−2)+E(εt)


μ = ϕ 0 + ϕ 1 μ + ϕ 2 μ + 0 μ = ϕ 0 1 − ϕ 1 − ϕ 2 \begin{aligned} \mu & =\phi_0+\phi_1 \mu+\phi_2 \mu+0 \\ \mu & =\frac{\phi_0}{1-\phi_1-\phi_2} \end{aligned} μμ=ϕ0+ϕ1μ+ϕ2μ+0=1−ϕ1−ϕ2ϕ0

于是
x t − μ = ϕ 0 + ϕ 1 ( x t − 1 − μ ) + ϕ 2 ( x t − 2 − μ ) + ( ϕ 1 + ϕ 2 − 1 ) μ + ε t = ϕ 1 ( x t − 1 − μ ) + ϕ 2 ( x t − 2 − μ ) + ε t \begin{aligned} x_t-\mu & =\phi_0+\phi_1\left(x_{t-1}-\mu\right)+\phi_2\left(x_{t-2}-\mu\right)+\left(\phi_1+\phi_2-1\right) \mu+\varepsilon_t \\ & =\phi_1\left(x_{t-1}-\mu\right)+\phi_2\left(x_{t-2}-\mu\right)+\varepsilon_t \end{aligned} xt−μ=ϕ0+ϕ1(xt−1−μ)+ϕ2(xt−2−μ)+(ϕ1+ϕ2−1)μ+εt=ϕ1(xt−1−μ)+ϕ2(xt−2−μ)+εt

将上式两边分别乘以 ( x t − 1 − μ ) \left(x_{t-1}-\mu\right) (xt−1−μ) 并取期望再除以方差 γ 0 \gamma_0 γ0 之后,可以得到以下公式:
γ 1 γ 0 = ϕ 1 γ 0 γ 0 + ϕ 2 γ 1 γ 0 \frac{\gamma_1}{\gamma_0}=\phi_1 \frac{\gamma_0}{\gamma_0}+\phi_2 \frac{\gamma_1}{\gamma_0} γ0γ1=ϕ1γ0γ0+ϕ2γ0γ1

其中, γ 1 = C o v ( x t , x t − 1 ) \gamma_1=Cov(x_{t},x_{t-1}) γ1=Cov(xt,xt−1), γ 0 = C o v ( x t , x t ) = V a r ( x t ) \gamma_0=Cov(x_{t},x_{t})=Var(x_t) γ0=Cov(xt,xt)=Var(xt)。


ρ 1 = ϕ 1 + ϕ 2 ρ 1 \rho_1=\phi_1+\phi_2 \rho_1 ρ1=ϕ1+ϕ2ρ1

从而
ρ 1 = ϕ 1 1 − ϕ 2 \rho_1=\frac{\phi_1}{1-\phi_2} ρ1=1−ϕ2ϕ1

同样的方式乘以 ( x t − 2 − μ ) \left(x_{t-2}-\mu\right) (xt−2−μ) 并取期望再除以方差 γ 0 \gamma_0 γ0 可得:
ρ 2 = ϕ 1 ρ 1 + ϕ 2 \rho_2=\phi_1 \rho_1+\phi_2 ρ2=ϕ1ρ1+ϕ2

综上可知:
ρ 1 = ϕ 1 1 − ϕ 2 ρ 2 = ϕ 1 ρ 1 + ϕ 2 \begin{aligned} \rho_1 & =\frac{\phi_1}{1-\phi_2} \\ \rho_2 & =\phi_1 \rho_1+\phi_2 \end{aligned} ρ1ρ2=1−ϕ2ϕ1=ϕ1ρ1+ϕ2

同样的方式时乘以 ( x t − k − μ ) , ∀ k ⩾ 3 \left(x_{t-k}-\mu\right), \forall k \geqslant 3 (xt−k−μ),∀k⩾3, 可得三阶以上(包含三阶)的自相关系数:

ρ k = ϕ 1 ρ k − 1 + ϕ 2 ρ k − 2 ( k ⩾ 3 ) \rho_k=\phi_1 \rho_{k-1}+\phi_2 \rho_{k-2}\ \ (k \geqslant 3) ρk=ϕ1ρk−1+ϕ2ρk−2 (k⩾3)

可以看出符合 A R ( 2 ) \mathrm{AR}(\mathrm{2}) AR(2) 模型的时间序列之 自相关系数 会随着阶数的增加而减小,但是很多阶数之后仍不等于 0 , 会呈现出所谓 拖尾 的现象。

现在将分析拓展至 A R ( p ) \mathrm{AR}(\mathrm{p}) AR(p) 模型。如果时间序列是平稳的,可得:
μ = ϕ 0 1 − ϕ 1 − ϕ 2 − ⋯ − ϕ p \mu=\frac{\phi_0}{1-\phi_1-\phi_2-\cdots-\phi_p} μ=1−ϕ1−ϕ2−⋯−ϕpϕ0

两边减去均值 μ \mu μ 可得:
x t − μ = ϕ 1 ( x t − 1 − μ ) + ϕ 2 ( x t − 2 − μ ) + ... + ϕ p ( x t − p − μ ) + ε t x_t-\mu=\phi_1\left(x_{t-1}-\mu\right)+\phi_2\left(x_{t-2}-\mu\right)+\ldots+\phi_p\left(x_{t-p}-\mu\right)+\varepsilon_t xt−μ=ϕ1(xt−1−μ)+ϕ2(xt−2−μ)+...+ϕp(xt−p−μ)+εt

两边分别乘以 ( x t − μ ) \left(x_t-\mu\right) (xt−μ) 、 ( x t − 1 − μ ) 、 ... \left(x_{t-1}-\mu\right) 、 \ldots (xt−1−μ)、... 并取期望再除以方差 γ 0 \gamma_0 γ0 可得:
1 = ϕ 1 ρ 1 + ϕ 2 ρ 2 + ... + ϕ p ρ p ρ 1 = ϕ 1 + ϕ 2 ρ 1 + ϕ 3 ρ 2 + ⋯ + ϕ p ρ p − 1 ρ 2 = ϕ 1 ρ 1 + ϕ 2 + ϕ 3 ρ 1 + ⋯ + ϕ p ρ p − 2 ⋮ ρ p = ϕ 1 ρ p − 1 + ϕ 2 ρ p − 2 + ϕ 3 ρ p − 3 + ⋯ + + ϕ p − 1 ρ 1 + ϕ p \begin{aligned} 1 & =\phi_1 \rho_1+\phi_2 \rho_2+\ldots+\phi_p \rho_p \\ \rho_1 & =\phi_1+\phi_2 \rho_1+\phi_3 \rho_2+\cdots+\phi_p \rho_{p-1} \\ \rho_2 & =\phi_1 \rho_1+\phi_2+\phi_3 \rho_1+\cdots+\phi_p \rho_{p-2} \\ & \vdots \\ \rho_p & =\phi_1 \rho_{p-1}+\phi_2 \rho_{p-2}+\phi_3 \rho_{p-3}+\cdots++\phi_{p-1}\rho_{1}+\phi_p \end{aligned} 1ρ1ρ2ρp=ϕ1ρ1+ϕ2ρ2+...+ϕpρp=ϕ1+ϕ2ρ1+ϕ3ρ2+⋯+ϕpρp−1=ϕ1ρ1+ϕ2+ϕ3ρ1+⋯+ϕpρp−2⋮=ϕ1ρp−1+ϕ2ρp−2+ϕ3ρp−3+⋯++ϕp−1ρ1+ϕp

根据这些线性关系式,可以解得 ρ 1 , ρ 2 , ... , ρ p \rho_1, \rho_2, \ldots, \rho_p ρ1,ρ2,...,ρp,对于大于 p p p 阶的自相关系数 ρ k \rho_k ρk,也有:

ρ k = ϕ 1 ρ k − 1 + ϕ 2 ρ k − 2 + ... + ϕ p ρ k − p \rho_k=\phi_1 \rho_{k-1}+\phi_2 \rho_{k-2}+\ldots+\phi_p \rho_{k-p} ρk=ϕ1ρk−1+ϕ2ρk−2+...+ϕpρk−p

因此,符合 A R ( p ) \mathrm{AR}(\mathrm{p}) AR(p) 模型的平稳时间序列,其自相关系数在 p p p 阶之后依然可能不为 0 ,亦会呈现出所谓 拖尾 的现象。

AR( p p p) 模型的建模步骤

(1) 序列识别

  • 判别序列是否是平稳的。若非平稳的,则需对其变换处理使得其平稳(比如,差分、平滑、变换、分解)。
  • 判别平稳的序列是否是白噪声的。若白噪声的(白噪声序列无法构建ARMA模型),则建模结束;否则,进行下一步。

(2) 模型识别

  • 确定 p p p 的值,选择最优的模型。通过平稳序列的偏自相关函数(PACF)确定 p p p。
  • 如果偏自相关函数不是很明显的话,可以尝试建立几个备选模型,然后根据AIC或BIC指标进行选择(一般选择较小的AIC或BIC值)。

(3) 模型估计

  • 模型估计即模型的参数估计,查看参数对应的 p p p 值是否显著为0。

(4) 模型诊断

  • 对模型残差序列进行检验,确保其服从正态分布的白噪声序列(可以看残差的自相关图,也可以使用假设检验方法D-W检验、Box-Ljung检验、Ljung-Box检验)。当残差序列是白噪声序列时,表明序列中信息充分提取到模型中了。
    常用平稳化的方法
    (1)差分:差分可以去除序列中的趋势和季节性。一阶差分可以去除线性趋势,如果还有二次趋势,还可以继续二阶差分。二阶差分后还未平稳的话就要注意了,继续差分即便最终平稳了,但是多次差分后解释力下降,且有可能造成过度差分,最差为差分后的序列为白噪声,后面也没法分析了。对于周期型序列也可以用季节差分的方式去除时间序列季节性。

(2)平滑:对当前序列值减去平滑值得到一个残差序列,当平滑结果能比较好的描述原始序列趋势特征的时候,残差序列一般是平稳的,后续可对残差序列进行建模预测。计算平滑值的方法可以用 简单移动平均加权移动平均一次指数平滑二次指数平滑等。同类思想,还可以拟合一个回归方程,用回归方程描述原始序列的趋势特征。

(3)变换:如对数变换,能够去除方差随时间增长的趋势。对数据进行取log处理,变换前的序列必须满足大于0。取对数后,原数据越大,缩小的幅度越大,可以使得方差随时间波动大的时间序列的方差变得更稳定,从而一定程度上使得序列平稳。但也不一定变换后即平稳,比如呈指数趋势的序列,变换后只能将指数趋势转化为线性趋势,此时再使用一阶差分即可将序列变得平稳,同时变换后的数据可以看成增长率的对数,解释性强。其它还有 开根号Box-Cox变换Yeo-Johonson变换等。这些变换试图将数据转换为正态分布,虽然对于平稳性来说并不总是必要的,但通常能够纠正序列的非线性问题。

(4)分解:可以将时间序列分解成3部分:长期趋势、季节变动、不规则波动。3种成分相加即加法模型,3种成分相乘即乘法模型,既加又乘即混合模型。分解目的为去除季节性的影响,分解后可对分解出的趋势项、季节项和余项分别进行预测。常用时间序列分解方法有 朴素分解X11分解SEATS分解STL分解等,其中STL分解用的较多。

2.2 实证分析

  • 本案例选取沪深300 收盘价(close)日线数据为研究对象!

读取数据

python 复制代码
# 导入包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
import matplotlib
%matplotlib inline
import warnings
warnings.filterwarnings('ignore')

df = pd.read_csv('000300.csv',index_col='trade_date')
df.index = pd.to_datetime(df.index)
df.head()

(1)模拟AR(1) 过程(数据来源于扰动项 ε t \varepsilon_t εt为正态分布的时间序列:np.random.normal)

python 复制代码
import statsmodels.api as sma
import scipy.stats as scs

# 先定义一个画图函数
def ts_plot(data,lags=None,title=''): 
    if not isinstance(data, pd.Series):
        data = pd.Series(data)

    # matplotlib官方提供了五种不同的图形风格,
    # 包括:'bmh'、'ggplot'、'dark_background'、'fivethirtyeight'和'grayscale'
    with plt.style.context('ggplot'):
        fig = plt.figure(figsize=(8, 6))

    layout = (3, 2)
    ts_ax = plt.subplot2grid(layout, (0, 0), colspan=2)
    acf_ax = plt.subplot2grid(layout, (1, 0))
    pacf_ax = plt.subplot2grid(layout, (1, 1))
    qq_ax = plt.subplot2grid(layout, (2, 0))
    pp_ax = plt.subplot2grid(layout, (2, 1))

    data.plot(ax=ts_ax)
    ts_ax.set_title(title+'时序图')

    sma.graphics.tsa.plot_acf(data, lags=lags, ax=acf_ax, alpha=0.5)
    acf_ax.set_title('自相关系数')

    sma.graphics.tsa.plot_pacf(data, lags=lags, ax=pacf_ax, alpha=0.5)
    pacf_ax.set_title('偏自相关系数')

    sma.qqplot(data, line='s', ax=qq_ax)
    qq_ax.set_title('QQ 图')

    scs.probplot(data, sparams=(data.mean(),data.std()), plot=pp_ax)
    pp_ax.set_title('PP 图')

    plt.tight_layout()
    plt.show()
python 复制代码
# 模拟AR(1) 过程:x_t = phi_0 + phi_1 * x_{t-1} + w_t
# 设置随机种子(括号里数字无意义,只是为了复现需要)
np.random.seed(1)
# 模拟次数
n = 5000
# AR模型的参数
a = 0.8                              # phi_1 = 0.8
# 扰动项为正态分布
x = w = np.random.normal(size=n)
for t in range(1,n):
    x[t] = a * x[t-1] + w[t]         # phi_0 = 0

#画图
ts_plot(x,lags=20)

结论:模拟的 AR(1) 模型是正态的。自相关系数图(ACF)显示滞后值之间存在显著的序列相关性,偏自相关系数图(PACF)则显示在滞后1期时截尾(迅速降为0)。

  • 假如模拟的AR(1)模型是正确的,那么估计的系数参数将很接近真实的系数0.8,选择的阶数也会等于1。
python 复制代码
from statsmodels.tsa.ar_model import AutoReg
from statsmodels.tsa.ar_model import ar_select_order

省略代码详见资源包!

(2)利用 AR( p p p) 模型来拟合沪深300的收盘价(df.close)

python 复制代码
省略代码详见资源包!

3 MA模型

3.1 理论介绍

MA( q q q) 模型与 AR( p p p) 模型非常相似。

不同之处在于,MA( q q q) 模型是对过去的白噪声误差项的线性组合,而不是过去观测值的线性组合。

MA 模型的动机是可以直接 通过拟合误差项的模型来观察误差过程中的 "冲击"。在 AR 模型中,通过在一系列过去的观察中使用ACF间接 观察到这些冲击。

MA( q q q) 模型认为因变量序列 x t x_t xt 与随机冲击项的当前值 ε t \varepsilon_t εt 及 q q q 期滞后值 ε t − 1 , ε t − 2 , ... \varepsilon_{t-1}, \varepsilon_{t-2}, \ldots εt−1,εt−2,..., ε t − q \varepsilon_{t-q} εt−q 有关, 而且是随机冲击项的加权平均, 因此被称作移动平均模型。一个 q q q 阶移动平均模型 MA( q q q) 可以用数学表达为:

x t = μ + ε t + θ 1 ε t − 1 + θ 2 ε t − 2 + ... + θ q ε t − q x_t=\mu+\varepsilon_t+\theta_1 \varepsilon_{t-1}+\theta_2 \varepsilon_{t-2}+\ldots+\theta_q \varepsilon_{t-q} xt=μ+εt+θ1εt−1+θ2εt−2+...+θqεt−q

其中 { ε t } \left\{\varepsilon_t\right\} {εt} 是均值为零、独立、同分布的白噪声序列, 满足:

E ( ε t ) = 0 ; Var ⁡ ( ε t ) = σ ε 2 ; E ( ε t ε s ) = 0 , ∀ s ≠ t \mathbb{E}\left(\varepsilon_t\right)=0 ; \quad \operatorname{Var}\left(\varepsilon_t\right)=\sigma_{\varepsilon}^2 ; \quad \mathbb{E}\left(\varepsilon_t \varepsilon_s\right)=0, \forall s \neq t E(εt)=0;Var(εt)=σε2;E(εtεs)=0,∀s=t

由于 MA( q q q) 仅仅是白噪声过程的线性组合, 因此有:

E ( x t ) = μ , Var ⁡ ( x t ) = γ 0 = ( 1 + θ 1 2 + θ 2 2 + ⋯ + θ q 2 ) σ ε 2 , ρ l = { 1 , l = 0 θ l + θ l + 1 θ 1 + θ l + 2 θ 2 + ... + θ q θ q − l 1 + θ 1 2 + θ 2 2 + ... + θ q 2 , ∀ l = 1 , 2 , ... , q 0 , ∀ l > q \begin{aligned} & \mathbb{E}\left(x_t\right)=\mu, \\ & \operatorname{Var}\left(x_t\right)=\gamma_0=\left(1+\theta_1^2+\theta_2^2+\dots+\theta_q^2\right) \sigma_{\varepsilon}^2 \text {, } \\ & \rho_l= \begin{cases}1, & l=0 \\ \frac{\theta_l \ + \ \theta_{l+1} \ \ \theta_1 \ + \ \theta_{l+2} \ \ \theta_2 \ + \ \dots \ + \ \theta_q \ \theta_{q-l}}{1 \ + \ {\theta_1}^{2} \ + \ {\theta_2}^{2} \ + \ \dots \ + \ {\theta_q}^{2}}, & \forall l=1,2, \ldots, q \\ 0, & \forall l>q\end{cases} \\ & \end{aligned} E(xt)=μ,Var(xt)=γ0=(1+θ12+θ22+⋯+θq2)σε2, ρl=⎩ ⎨ ⎧1,1 + θ12 + θ22 + ... + θq2θl + θl+1 θ1 + θl+2 θ2 + ... + θq θq−l,0,l=0∀l=1,2,...,q∀l>q

由以上公式可以得知 MA( q q q) 模型一个很重要的统计性质:MA( q q q) 模型自相关系数 q q q 阶截尾。所谓的 q q q 阶截尾是指, 在 q q q 阶以后 MA( q q q) 模型的自相关系数马上截止, q + 1 q+1 q+1 阶起就等于 0 (即上式 γ l = 0 , ∀ l > q \gamma_l=0, \forall l>q γl=0,∀l>q 所表达的内容)。考虑 AR 模型和 MA 模型自相关系数的性质, 可以根据自相关图(ACF), 来初步判断所研究的时间序列大致符合什么类型的模型。

3.2 实证分析

(1)模拟MA(1) 过程(数据来源于包:smt.arma_generate_sample)

python 复制代码
省略代码详见资源包!

(2)利用 MA( q q q) 模型来拟合 沪深300 的收盘价(df.close)
序列识别

python 复制代码
省略代码详见资源包!

模型识别(定阶)

  • 通过自相关函数(ACF)可视化定阶!

  • 根据最小化AIC准则确定 q q q。计算比较耗时,为了控制计算量,这里限制MA最大阶不超过3。大家可以尝试其它准则定阶(比如,BIC和HQIC)。

python 复制代码
省略代码详见资源包!

模型估计

以MA(3)模型为例!

python 复制代码
省略代码详见资源包!

模型诊断

可视化 残差 直方图、QQ图,看是否正态分布,可视化ACF看是否仍存有自相关性。

残差的白噪声检验(Ljung-Box检验)。

python 复制代码
省略代码详见资源包!

4 ARMA模型

4.1 理论介绍

AR( p p p) 模型认为时间序列中当期的值与过去 p p p 期的滞后值有关,MA( q q q) 模型则用滞后 q q q 期的随机扰动项来解释当期的 x t x_t xt。不过在金融经济领域中,很多变量的值既会与自己过去期的表现有关系,又受到过去随机冲击的影响,ARMA模型表达的就是这个思想。ARMA模型全称为自回归移动平均(Autoregressive Moving Average,ARMA)模型,是研究时间序列的重要方法,由AR模型与MA模型混合构成。

ARMA( p p p, q q q)模型的一般表达式为:

x t = ϕ 0 + ϕ 1 x t − 1 + ⋯ + ϕ p x t − p + θ 1 ε t − 1 + ⋯ + θ q ε t − q + ε t . x_t = \phi_0 + \phi_1 x_{t-1} + \dots + \phi_p x_{t-p} + \theta_1 \varepsilon_{t-1} + \dots + \theta_q \varepsilon_{t-q} + \varepsilon_t. xt=ϕ0+ϕ1xt−1+⋯+ϕpxt−p+θ1εt−1+⋯+θqεt−q+εt.

其中, ε t {\varepsilon_{t}} εt是零均值、独立、同分布白噪声序列,满足:

E ( ε t ) = 0 ; Var ⁡ ( ε t ) = σ ε 2 ; E ( ε t ε s ) = 0 , ∀ s ≠ t \mathbb{E}\left(\varepsilon_t\right)=0 ; \quad \operatorname{Var}\left(\varepsilon_t\right)=\sigma_{\varepsilon}^2 ; \quad \mathbb{E}\left(\varepsilon_t \varepsilon_s\right)=0, \forall s \neq t E(εt)=0;Var(εt)=σε2;E(εtεs)=0,∀s=t

很显然,相较于 AR( p p p) 和 MA( q q q) 模型, ARMA( p p p, q q q) 更具有普适性, AR( p p p)是 q = 0 q=0 q=0 时的 ARMA( p p p, q q q) 模型, MA( q q q) 模型是当 p = 0 p=0 p=0 时的 ARMA( p p p, q q q) 模型。

从金融的角度理解,AR 和 MA 模型的理论意义在于:AR( p p p)模型试图捕捉(解释)交易市场中经常观察到的动量和均值回复效应;MA( q q q)模型尝试捕捉(解释)在白噪声条件下观察到的冲击效应,这些冲击效应可以被认为是影响观察过程的意外事件。ARMA模型的弱点在于忽视了大多数金融时间序列中的波动聚集效应。

ARMA( p p p, q q q) 模型的建模过程

(1) 序列识别

  • 判别序列是否是平稳的。若非平稳的,则需对其变换处理使得其平稳(比如,差分、平滑、变换、分解)。
  • 判别平稳的序列是否是白噪声的。若白噪声的(白噪声序列无法构建ARMA模型),则建模结束;否则,进行下一步。

(2) 模型识别

  • 确定 p p p 和 q q q 的值,选择最优的模型。通过序列的自相关(ACF)确定 q q q 和偏自相关函数(PACF)确定 p p p。
  • 如果自相关和偏自相关函数不是很明显的话,可以尝试建立几个备选模型,然后根据AIC或BIC指标进行选择(一般选择较小的AIC或BIC值)。

(3) 模型估计

  • 模型估计即模型的参数估计,查看参数对应的 p p p 值是否显著为0。

(4) 模型诊断

  • 对模型残差序列进行检验,确保其服从正态分布的白噪声序列。当残差序列是白噪声序列时,表明序列中信息充分提取到模型中了。

4.2 实证分析

python 复制代码
省略代码详见资源包!

模型检验

可视化 残差 直方图、QQ图,看是否正态分布,可视化ACF看是否仍存有自相关性。

残差的白噪声检验(Ljung-Box检验)。

python 复制代码
省略代码详见资源包!

模型评估

  • 利用拟合模型的 predict() 方法对沪深300的收盘价进行预测(拟合)。
python 复制代码
省略代码详见资源包!

5 ARIMA模型

5.1 理论介绍

ARIMA模型全称是差分移动自回归模型(Autoregressive Integrated Moving Average Models,ARIMA),是ARMA模型的拓展。

由于现实中很多时间序列不是平稳的,但可以通过差分来实现平稳,即通过 一阶差分 可以将 非平稳 序列转化为 平稳 序列。

由于前三个模型都有时间序列平稳的假设,如果时间序列存在明显的上升或者下降趋势,模型预测的效果大大折扣。对于有明显下降或者上升趋势的数据集,可以使用差分的方式将其转化为平稳序列,然后使用ARMA模型进行拟合。

假设模型经过 d d d 次差分通过了时间序列平稳的检验,ARMA的系数为 p p p 和 q q q,则 ARIMA 模型为 ARIMA( p p p, d d d, q q q)。

5.2 实证分析

由于沪深300收盘价序列经过一阶差分后为平稳时间序列。因此, ARIMA( p p p, d d d, q q q)模型即为ARIMA( p p p,1, q q q)!特别提醒:是模型中研究对象为沪深300的收盘价序列(df.close)!

python 复制代码
省略代码详见资源包!

6. 结束语

本文主要以沪深300指数收盘价数据为例,简要介绍了时间序列四大经典模型的基本原理和Python实证分析。不难发现,这些模型在拟合和预测沪深300指数收盘价上样本内拟合效果还不错,但样本外效果不是很好(读者可以结合资源包代码自己尝试)。

实际上,这些模型有一个潜在假设是干扰项的方差是固定不变的,但是研究者发现金融数据(如股票收益率)大都存在异方差现象,因此传统的时间序列模型无法获得可靠的估计结果。

为了解决金融资产收益率序列波动聚集的难题,学者们提出了 ARCHGARCH 以及 协整模型,接下来将会对这些模型进行详细介绍并给出相应的Python实证分析。

7. 参考资料

  • 蔡立耑. 量化投资以Python为工具[M]. 北京:电子工业出版社,2017.
  • PyQuant. 量化投资基础[M]. 北京:科学出版社,2024.

8. 资源包下载


  • 写作不易,切勿白剽
  • 点赞关注,最大鼓励
  • 持续更新,未完待续...
相关推荐
丕羽38 分钟前
【Pytorch】基本语法
人工智能·pytorch·python
bryant_meng1 小时前
【python】Distribution
开发语言·python·分布函数·常用分布
m0_594526302 小时前
Python批量合并多个PDF
java·python·pdf
工业互联网专业2 小时前
Python毕业设计选题:基于Hadoop的租房数据分析系统的设计与实现
vue.js·hadoop·python·flask·毕业设计·源码·课程设计
钱钱钱端3 小时前
【压力测试】如何确定系统最大并发用户数?
自动化测试·软件测试·python·职场和发展·压力测试·postman
慕卿扬3 小时前
基于python的机器学习(二)—— 使用Scikit-learn库
笔记·python·学习·机器学习·scikit-learn
Json____3 小时前
python的安装环境Miniconda(Conda 命令管理依赖配置)
开发语言·python·conda·miniconda
小袁在上班3 小时前
Python 单元测试中的 Mocking 与 Stubbing:提高测试效率的关键技术
python·单元测试·log4j
白狐欧莱雅3 小时前
使用python中的pygame简单实现飞机大战游戏
经验分享·python·游戏·pygame
阿_旭3 小时前
基于YOLO11/v10/v8/v5深度学习的维修工具检测识别系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】
人工智能·python·深度学习·qt·ai