数学模型

Wang Haihua

🍈 🍉🍊 🍋 🍌


差分运算

差分方法是一种非常简便、有效的确定性信息提出方法。Cramer 分解 定理在理论上保证了适当阶数的差分一定可以充分提取确定性信息。差分 运算的实际是使用自回归的方式提取确定性信息。 $$ \nabla^{d} X_{t}=(1-B)^{d} X_{t}=\sum_{i=0}^{d}(-1)^{i} C_{d}^{i} X_{t-i} $$

在实践操作中, 我们会根据序列不同的特点选择合适的差分方式, 常见 情况有以下三种: (1)序列蕴含着显著的线性趋势,一阶差分就可以实现平稳。
(2)序列蕴含着曲线趋势, 通常二阶或三阶差分就可以提取曲线趋势 的影响。
(3) 对于蕴含着固定周期的序列进行步长为周期长度的差分运算, 通 常可以较好地提取周期信息。

从理论上来说,足够多次的差分运算可以充分地提取原序列中的非平稳确定性信息,但是,过度的差分会造成有用信息的浪费。因此,在实际运用中差分运算阶数应当要适当,避免过度差分。

ARIMA 模型

差分运算具有强大的确定信息提取能力, 对差分运算后得到的平稳序 列可用 ARMA 模型进行拟合。 具有如下结构的模型称为 $\operatorname{ARIMA}(p, d, q)$ 模型: $$ \left\{\begin{array}{l} \phi(B) \nabla^{d} X_{t}=\theta(B) \varepsilon_{t}, \\ E\left(\varepsilon_{t}\right)=0, \quad \operatorname{Var}\left(\varepsilon_{t}\right)=\sigma_{\varepsilon}^{2}, \quad E\left(\varepsilon_{t} \varepsilon_{s}\right)=0, \quad s \neq t, \\ E\left(X_{s} \varepsilon_{t}\right)=0, \quad \forall s<t . \end{array}\right. $$ 特别地, 当 $d=0$ 时, $\operatorname{ARIMA}(p, d, q)$ 模型实际上就是 $\operatorname{ARMA}(p, q)$ 模型;

当 $p=0$ 时, $\operatorname{ARIMA}(p, d, q)$ 模型实际上就是 IMA( $d, q)$ 模型; 当 $q=0$ 时, $\operatorname{ARIMA}(p, d, q)$ 模型实际上就是 $\operatorname{ARI}(p, d)$ 模型; 当 $d=1, p=q=0$ 时, $\operatorname{ARIMA}(p, d, q)$ 模型记为 $$ \left\{\begin{array}{l} X_{t}=X_{t-1}+\varepsilon_{t}, \\ E\left(\varepsilon_{t}\right)=0, \quad \operatorname{Var}\left(\varepsilon_{t}\right)=\sigma_{\varepsilon}^{2}, \quad E\left(\varepsilon_{t} \varepsilon_{s}\right)=0, s \neq t, \\ E\left(X_{s} \varepsilon_{t}\right)=0, \quad \forall s<t . \end{array}\right. $$ 该模型称为随机游走模型。 ARIMA 模型建模与 ARMA 模型建模过程类似。

例子

例 $18.6$ 试利用文件 austa.csv, 建立适当的 ARIMA 模型, 其中 austa.csv 中的数据格式如图 $18.7$ 所示, 共 31 个数据。

解 原始数据的一次差分及差分数据的自相关图如图 18.8。通过试着 取 $p, q$ 的一些值, 根据 AIC 和 BIC 等指标, 确定建立 $A R I M A(2,1,0)$ 模型。利 用 Python 软件, 求得的残差取值及分布如图 $18.9$ 所示。得到的预测值与 原始数据的对比如图 $18.10$ 所示。

代码

import pandas as pd
from statsmodels.graphics.tsaplots import plot_acf
import pylab as plt
from statsmodels.tsa.arima_model import ARIMA

plt.rc('axes',unicode_minus=False)
plt.rc('font',size=16); plt.rc('font',family='SimHei')
df=pd.read_csv('data/austa.csv')

plt.subplot(121); plt.plot(df.value.diff())
plt.title('一次差分')
ax2=plt.subplot(122)
plot_acf(df.value.diff().dropna(), ax=ax2,title='自相关')
md=ARIMA(df.value, order=(2,1,0))
mdf=md.fit(disp=0)
print(mdf.summary())
residuals = pd.DataFrame(mdf.resid)
fig, ax = plt.subplots(1,2)
residuals.plot(title="残差", ax=ax[0])

residuals.plot(kind='kde', title='密度', ax=ax[1])
plt.legend(''); plt.ylabel('')          
mdf.plot_predict()  #原始数据与预测值对比图
plt.show()