具体到这个例子,如何修改: import numpy as np import pandas as pd import arch # 如果用我的模型,改为 residuals = y_test - y_hat residuals = y_test - y_hat # 对残差数据进行正则化处理 log_diff_residuals = np.log(residuals).diff().dropna() # 使用GARCH模型对差分数据进行拟合 garch = arch.arch_model(log_diff_residuals, vol='GARCH') res = garch.fit() # 反向正则化得到修正后的预测值 y_hat_corrected = y_test1 + np.exp(log_diff_residuals.cumsum()) * res.conditional_volatility[-8:].values
时间: 2024-03-04 18:49:11 浏览: 122
如果要确保 `y_hat_corrected` 只能是正数,可以考虑对 `log_diff_residuals` 进行平方根变换来进行调整。具体地,可以将以下这行代码:
```
log_diff_residuals = np.log(residuals).diff().dropna()
```
修改为:
```
log_diff_residuals = np.sqrt(np.abs(np.log(residuals)).diff().dropna()) * np.sign(np.log(residuals).diff().dropna())
```
这里的 `np.abs()` 函数是用来获取绝对值,`np.sign()` 函数是用来获取符号,这样就可以保证调整后的值是正数。然后,将以下这行代码:
```
y_hat_corrected = y_test1 + np.exp(log_diff_residuals.cumsum()) * res.conditional_volatility[-8:].values
```
修改为:
```
y_hat_corrected = y_test1 + np.power(np.exp(np.power(log_diff_residuals.cumsum(), 2)), 1/2) * res.conditional_volatility[-8:].values
```
这里的 `np.power()` 函数是用来进行平方根运算的,这样就可以保证 `y_hat_corrected` 是正数。
相关问题
import pandas as pd import numpy as np import matplotlib.pyplot as plt from statsmodels.tsa.stattools import adfuller from statsmodels.stats.diagnostic import acorr_ljungbox from arch import arch_model from pmdarima.arima import auto_arima # 读取Excel数据 data = pd.read_excel('三个-负向标准化-二分.xlsx') data2 = pd.read_excel # 将数据转换为时间序列 data['DATE'] = pd.to_datetime(data['DATE']) # data.set_index('DATE', inplace=True) data = data['F4'] # ADF检验 ADFresult = adfuller(data) print('ADF Statistic: %f' % ADFresult[0]) print('p-value: %f' % ADFresult[1]) if ADFresult[1] > 0.05: # 进行差分 diff_data = data.diff().dropna() # 再次进行ADF检验 AADFresult = adfuller(diff_data) print('ADF Statistic after differencing: %f' % AADFresult[0]) print('p-value after differencing: %f' % AADFresult[1]) data = diff_data # Ljung-Box检验 # result = acorr_ljungbox(data, lags=10) # print('Ljung-Box Statistics: ', result[0]) # print('p-values: ', result[1]) # 使用auto_arima函数选择最佳ARIMA模型 stepwise_model = auto_arima(data, start_p=0, start_q=0, max_p=15, max_q=15, start_P=0, seasonal=False, d=1, D=1, trace=True, error_action='ignore', suppress_warnings=True, stepwise=False) model_resid = stepwise_model.resid() print(stepwise_model.summary()) # # 计算ARIMA-GARCH组合模型的参数 # model = arch_model(model_resid, mean='AR', lags=2, vol='GARCH', p=2, o=0, q=1) # AGresult = model.fit(disp='off') # print(AGresult.summary()) model = arch_model(model_resid, mean='AR', lags=2, vol='GARCH', o=0) # 使用 auto_arima 函数自动确定 p 和 q 的值 stepwise_fit = auto_arima(model_resid, start_p=0, start_q=0, max_p=5, max_q=5, start_P=0, seasonal=True, d=1, D=1, trace=True, error_action='ignore', suppress_warnings=True, stepwise=False) # 根据自动确定的 p 和 q 的值来拟合模型 model = arch_model(model_resid, mean='AR', lags=2, vol='GARCH', p=stepwise_fit.order[1], q=stepwise_fit.order[2], o=0) AGresult = model.fit(disp='off') print(AGresult.summary())后面加上对最终残差进行检验的代码
可以加上以下代码来对最终的残差进行检验:
# 残差序列的Ljung-Box检验
resid_lb = acorr_ljungbox(AGresult.resid, lags=10)
print('Ljung-Box Statistics of Residuals: ', resid_lb[0])
print('p-values of Residuals: ', resid_lb[1])
# 残差序列的自相关图和偏自相关图
fig, ax = plt.subplots(nrows=2, figsize=(10, 8))
fig.subplots_adjust(hspace=0.5)
ax[0].plot(AGresult.resid)
ax[0].set_title('Residuals of ARIMA-GARCH Model')
ax[1] = plot_acf(AGresult.resid, ax=ax[1], lags=10)
plt.show()
其中,acorr_ljungbox() 函数用于进行 Ljung-Box 检验,plot_acf() 函数用于绘制自相关图和偏自相关图。通过这些检验和图形可以对模型的残差进行评估,判断模型是否具有良好的拟合效果。
请把下面这段改写加入正则处理 : # 如果用我的模型,改为 residuals = y_test - y_hat residuals = y_test - y_hat # 使用GARCH模型对8步预测结果进行修正 garch = arch.arch_model(residuals, vol='GARCH') res = garch.fit() y_test1 后8个数是我的模型预测值 # 假设 y_test1 是原始预测值,res 是 GARCH 模型的拟合结果 y_hat_corrected = y_test1 + res.conditional_volatility[-8:]
可以将上述代码修改为如下形式,加入对残差数据的正则化处理:
```python
import numpy as np
import pandas as pd
import arch
# 如果用我的模型,改为 residuals = y_test - y_hat
residuals = y_test - y_hat
# 对残差数据进行正则化处理
log_diff_residuals = np.log(residuals).diff().dropna()
# 使用GARCH模型对差分数据进行拟合
garch = arch.arch_model(log_diff_residuals, vol='GARCH')
res = garch.fit()
# 反向正则化得到修正后的预测值
y_hat_corrected = y_test1 + np.exp(log_diff_residuals.cumsum()) * res.conditional_volatility[-8:].values
```
这里首先对残差数据进行了正则化处理,然后使用GARCH模型对差分数据进行拟合,得到波动性的条件方差。最后,使用反向正则化公式将条件方差应用到原始预测值上,得到修正后的预测值。需要注意的是,这里使用了差分数据的累计和,将其反向正则化得到真实的预测值。
阅读全文