statsmodels.tsa.holtwinters.HoltWintersResults.simulate

HoltWintersResults.simulate(nsimulations, anchor=None, repetitions=1, error='add', random_errors=None, random_state=None)[source]

使用状态空间公式的随机模拟。

Parameters:
nsimulationsint

模拟步骤的数量。

anchorint, str, or datetime, optional

模拟的第一个周期。模拟将以锚点之前的所有现有数据点为条件。类型取决于给定的内生变量在模型中的索引。两个特殊情况是字符串‘start’和‘end’。start表示从样本的第一个周期开始模拟,而end表示从样本后的第一个周期开始模拟。整数值可以从0到nobs,或者可以是负数以应用负索引。最后,如果向模型提供了日期/时间索引,则此参数可以是日期字符串或日期时间类型。默认值为‘end’。

repetitionsint, optional

要生成的模拟路径数量。默认是1条模拟路径。

error{“add”, “mul”, “additive”, “multiplicative”}, optional

状态空间公式的误差模型。默认是 "加法"

random_errorsoptional

指定如何获取随机误差。可以是以下之一:

  • None: 随机正态分布的值,方差根据拟合误差估计,从numpy的标准随机数生成器中抽取(可以使用random_state参数进行种子设定)。这是默认选项。

  • 来自 scipy.stats 的分布函数,例如 scipy.stats.norm:将分布函数拟合到拟合误差并从拟合的分布中抽取样本。 注意 scipy.stats.normscipy.stats.norm() 之间的区别,后者是一个冻结的分布函数。

  • 来自 scipy.stats 的冻结分布函数,例如 scipy.stats.norm(scale=2):从冻结的分布函数中抽取样本。

  • 一个形状为 (nsimulations, repetitions) 的 np.ndarray:使用给定的值作为随机误差。

  • "bootstrap": 从拟合误差中对随机误差进行采样。

random_stateint or np.random.RandomState, optional

随机数生成器的种子或一个 np.random.RandomState 对象。仅在 random_errorsNone 时使用。默认值为 None

Returns:
simpd.Series, pd.DataFrame or np.ndarray

一个 np.ndarraypd.Seriespd.DataFrame 的模拟值。 如果原始数据是 pd.Seriespd.DataFramesim 将是一个 pd.Series 如果 repetitions 是 1,并且是一个 pd.DataFrame 的形状 (nsimulations, repetitions) 否则。 否则,如果 repetitions 是 1,返回一个 np.ndarray 的形状 (nsimulations,),如果 repetitions 不是 1,则返回一个 np.ndarray 的形状 (nsimulations, repetitions)。

注释

该模拟基于Holt-Winter方法的状态空间模型。状态空间模型假设时间\(t\)的真实值围绕预测值随机分布。如果使用加性误差模型,这意味着:

\[\begin{split}y_t &= \hat{y}_{t|t-1} + e_t\\ e_t &\sim \mathcal{N}(0, \sigma^2)\end{split}\]

使用乘法误差模型:

\[\begin{split}y_t &= \hat{y}_{t|t-1} \cdot (1 + e_t)\\ e_t &\sim \mathcal{N}(0, \sigma^2)\end{split}\]

将这些方程代入平滑方程公式中,得到状态空间方程。这里使用的符号遵循[1]

此外,

\[\begin{split}B_t &= b_{t-1} \circ_d \phi\\ L_t &= l_{t-1} \circ_b B_t\\ S_t &= s_{t-m}\\ Y_t &= L_t \circ_s S_t,\end{split}\]

其中 \(\circ_d\) 是连接趋势和阻尼参数的操作(如果趋势是加性的则为乘法,如果趋势是乘性的则为幂),\(\circ_b\) 是连接水平和趋势的操作(如果趋势是加性的则为加法,如果趋势是乘性的则为乘法),\(\circ_s\) 是连接季节性到其余部分的操作。

状态空间方程可以表示为

\[\begin{split}y_t &= Y_t + \eta \cdot e_t\\ l_t &= L_t + \alpha \cdot (M_e \cdot L_t + \kappa_l) \cdot e_t\\ b_t &= B_t + \beta \cdot (M_e \cdot B_t + \kappa_b) \cdot e_t\\ s_t &= S_t + \gamma \cdot (M_e \cdot S_t + \kappa_s) \cdot e_t\\\end{split}\]

\[\begin{split}\eta &= \begin{cases} Y_t\quad\text{if error is multiplicative}\\ 1\quad\text{else} \end{cases}\\ M_e &= \begin{cases} 1\quad\text{if error is multiplicative}\\ 0\quad\text{else} \end{cases}\\\end{split}\]

并且,当使用加性误差模型时,

\[\begin{split}\kappa_l &= \begin{cases} \frac{1}{S_t}\quad \text{if seasonality is multiplicative}\\ 1\quad\text{else} \end{cases}\\ \kappa_b &= \begin{cases} \frac{\kappa_l}{l_{t-1}}\quad \text{if trend is multiplicative}\\ \kappa_l\quad\text{else} \end{cases}\\ \kappa_s &= \begin{cases} \frac{1}{L_t}\quad\text{if seasonality is multiplicative}\\ 1\quad\text{else} \end{cases}\end{split}\]

当使用乘法误差模型时

\[\begin{split}\kappa_l &= \begin{cases} 0\quad \text{if seasonality is multiplicative}\\ S_t\quad\text{else} \end{cases}\\ \kappa_b &= \begin{cases} \frac{\kappa_l}{l_{t-1}}\quad \text{if trend is multiplicative}\\ \kappa_l + l_{t-1}\quad\text{else} \end{cases}\\ \kappa_s &= \begin{cases} 0\quad\text{if seasonality is multiplicative}\\ L_t\quad\text{else} \end{cases}\end{split}\]

参考文献

[1]

Hyndman, R.J., & Athanasopoulos, G. (2018) 预测:原理与实践,第二版,OTexts: 墨尔本,澳大利亚。OTexts.com/fpp2。访问于2020年2月28日。


Last update: Oct 16, 2024