SARIMAX创建模拟

时间:2019-04-10 18:15:36

标签: python time-series

我正在尝试在python上使用此函数来模拟我已构建的SARIMAX模型, statsmodels.tsa.statespace.sarimax.SARIMAX.simulate 目的是使用该模型进行蒙特卡洛模拟

当我尝试使用已有的数据将initial_state放在函数上时,就会发生问题

我已经尝试过不使用initial_state,并且模拟结果似乎很好,但是初始点不是我期望的。当我尝试设置initial_state时,模拟结果呈指数增长。

我使用2017-2019年的每日降水量数据

#Define the test model using another set of data, but the same order.
testMdl = smt.SARIMAX(rain_df_daily.y, order = (5, 3, 0), seasonal_order=(1,1,2,12),enforce_stationarity=False,
                                            enforce_invertibility=False)

#Set initial state 
#testMdl.initialize_known(rain_df_daily[:'2018-01-01'].y.mean,rain_df_daily[:'2018-01-01'].y.std)
testMdl.initialize_known(sarima_results.predicted_state[:,-2], 
                         sarima_results.predicted_state_cov[:,:,-2])

#Initialize the test model with the coefficients from the fit model:
testMdl = testMdl.filter(sarima_results.params)
#Seems you can also use .smooth() to initialize coefficients, but have not looked into the difference
#exoCopy = exoCopy.smooth(fitMdl.params)

samples = pd.DataFrame(columns = range(0,50)) #initialize obs. sample df
for sample in range(0, 50): #For each sample

    #samples[sample] = testMdl.simulate(24, initial_state=mdlExo.predicted_state[:,-1])
    samples[sample] = testMdl.simulate(40, initial_state = rain_df_daily['2018-02-21':].y)

我希望结果将接近预期的平均值

1 个答案:

答案 0 :(得分:0)

我认为您的模型存在的问题是指定的顺序参数,而不是模拟的初始值。

例如拟合降雨数据的简单模型

Rainfall data

model = SARIMAX(df, 
            order=(1, 0, 1), 
            trend='n',
            seasonal_order=(1, 2, 1, 5),
            enforce_stationarity=False,
            enforce_invertibility=False).fit()
model.forecast(60).plot()

产生结果

Simpler fit

模拟

samples = []
for sample in range(50): 
    samples.append(model.simulate(30, initial_state=model.predicted_state[:, -1]))

sns.lineplot(data=samples)

结果

Simulation

这肯定不是一个很好的模型,但结果与预测平均值相差不远。