可能路径的 SARIMAX 模拟

SARIMAX simulation of possible paths

我正在尝试创建一个随机过程的可能路径的模拟,它没有锚定到任何特定点。例如。将 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();

这是历史:

这是模拟:

模拟的曲线分布如此之广,而且彼此之间的距离如此之远,以至于这没有意义。最初的历史过程没有那么大的差异。我理解错了什么?如何进行正确的模拟?

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

传递您自己的初始状态

使用上面的代码,但使用

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

我得到的情节看起来像

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

其他注意事项

另一个小提示:你不应该将 trend="c"d=1 一起使用。当 d=1 时,您应该改用 trend="t",以便模型包含漂移。你估计的型号应该是

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

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