SARIMAX 模拟可能的路径

guy*_*345 3 python stochastic-process statsmodels autoregressive-models arima

我正在尝试创建随机过程的可能路径的模拟,该过程不锚定到任何特定点。例如,将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
Run Code Online (Sandbox Code Playgroud)

拟合模型:

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())
Run Code Online (Sandbox Code Playgroud)

创建模拟:

res.simulate(len(data),  repetitions=10).plot();
Run Code Online (Sandbox Code Playgroud)

这是历史:

在此输入图像描述

这是模拟:

在此输入图像描述

模拟曲线分布广泛且彼此分离,因此这是没有意义的。最初的历史进程并没有那么大的差异。我理解错了什么?如何进行正确的模拟?

Kev*_*n S 5

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

采用上面的代码,但使用

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

Run Code Online (Sandbox Code Playgroud)

我得到的情节看起来像

10 SARIMAX 模拟

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

其他注意事项

另一项小注意事项:您不应该使用trend="c"with d=1。您应该改用trend="t"when d=1,以便模型包含漂移。您估计的模型应该是

mod = sm.tsa.statespace.SARIMAX(data["wpi"], trend="t", order=(1, 1, 1))
Run Code Online (Sandbox Code Playgroud)

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