可能路径的 SARIMAX 模拟 其他注意事项

问题描述

我正在尝试创建一个随机过程的可能路径的模拟,该过程未锚定到任何特定点。例如。将SARIMAX模型与天气温度数据拟合,然后利用该模型进行温度模拟。

这里我使用 statsmodels 页面中的标准演示作为更简单的示例:

import numpy as np
import pandas as pd
from scipy.stats import norm
import statsmodels.api as sm
import matplotlib.pyplot as plt
from datetime import datetime
import requests
from io import BytesIO

拟合模型:

wpi1 = requests.get('https://www.stata-press.com/data/r12/wpi1.dta').content
data = pd.read_stata(BytesIO(wpi1))
data.index = data.t
# Set the frequency
data.index.freq="QS-OCT"

# Fit the model
mod = sm.tsa.statespace.SARIMAX(data['wpi'],trend='c',order=(1,1,1))
res = mod.fit(disp=False)
print(res.summary())

创建模拟:

res.simulate(len(data),repetitions=10).plot();

这是历史:

enter image description here

这是模拟:

enter image description here

模拟曲线分布如此广泛且彼此相距甚远,这毫无意义。最初的历史过程没有那么大的差异。我怎么理解错误?如何进行正确的模拟?

解决方法

当您不传递初始状态时,它会使用第一个预测状态及其预测协方差来启动模拟。由于没有可用于进行第一次预测的信息,因此它使用方差为 1,000,000 的扩散先验。这就是为什么您的时间序列范围很广。一个简单的解决方案是使用 smoothed_state 传递您自己的初始状态。

使用上面的代码,但使用

initial = res.smoothed_state[:,0]
res.simulate(len(data),repetitions=10,initial_state=initial).plot()

我得到一个看起来像的情节

10 simulation from SARIMAX

第一个值是该模型中真正重要的值,即 30.6。您可以通过从另一个(合理的)分布中绘制初始状态来直接在此处添加一些随机性。默认分布对于模拟来说是不合理的,因为它有一个扩散先验(但是,对于估计来说非常合理)。

其他注意事项

另一个小注意事项:您不应将 trend="c"d=1 一起使用。您应该在 trend="t" 时使用 d=1,以便模型包含漂移。你估计的模型应该是

mod = sm.tsa.statespace.SARIMAX(data["wpi"],trend="t",order=(1,1,1))

我在上图中使用了这个模型来捕捉数据中的积极趋势。