【问题标题】:Forecasting Volatility by EGARCH(1,1) using `arch` PackageEGARCH(1,1) 使用 `arch` 包预测波动率
【发布时间】:2022-01-01 17:27:42
【问题描述】:

目的

我想使用archpackage通过EGARCH(1,1)模型预测每日波动率
预测区间:01-04-201512-06-2018 (mm-dd-yyyy 格式)

因此我应该从20132015 获取数据(例如)以拟合其上的EGARCH(1,1) 模型,然后预测01-04-201512-06-2018 的每日波动率


代码

所以我试着这样写:

# Packages That we need
from pandas_datareader import data as web
from arch import arch_model
import pandas as pd
#---------------------------------------

# grab Microsoft daily adjusted close price data from '01-03-2013' to '12-06-2018' and store it in DataFrame
df = pd.DataFrame(web.get_data_yahoo('MSFT' , start='01-03-2013' , end='12-06-2018')['Adj Close'])

#---------------------------------------

# calculate daily rate of return that is necessary for predicting daily Volatility by EGARCH
daily_rate_of_return_EGARCH = np.log(df.loc[ : '01-04-2015']/df.loc[ : '01-04-2015'].shift())
# drop NaN values
daily_rate_of_return_EGARCH = daily_rate_of_return_EGARCH.dropna()

#---------------------------------------

# Volatility Forecasting By EGARCH(1,1)
model_EGARCH = arch_model(daily_rate_of_return_EGARCH, vol='EGARCH' , p = 1 , o = 0 , q = 1)
fitted_EGARCH = model_EGARCH.fit(disp='off')

#---------------------------------------

# and finally, Forecasting step
# Note that as mentioned in `purpose` section, predict interval should be from '01-04-2015' to end of the data frame
horizon = len(df.loc['01-04-2015' : ])
volatility_FORECASTED = fitted_EGARCH.forecast(horizon = horizon , method='simulation')

错误

然后我得到了这个错误:

MemoryError                               Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_12900/1021856026.py in <module>
      1 horizon = len(df.loc['01-04-2015':])
----> 2 volatility_FORECASTED = fitted_EGARCH.forecast(horizon = horizon , method='simulation') 

MemoryError: Unable to allocate 3.71 GiB for an array with shape (503, 1000, 989) and data type float64

看来 arch 会节省大量数据。

预期结果

我期望的是一个简单的pandas.Series,其中包含从'01-04-2015''12-06-2018'每日波动预测。确切地说,我的意思是这样的:
(注意:日期格式 --> mm-dd-yyyy)

    (DATE)     (VOLATILITY)
'01-04-2015'      .....
'01-05-2015'      .....
'01-06-2015'      .....
.                   .
.                   .
.                   .
'12-06-2018'      .....

我怎样才能做到这一点?

【问题讨论】:

  • 您是要创建一系列提前 1 步预测,还是要创建 h=1,2,...,+4 年的一系列 h 步出现预测?
  • @KevinS “试图创建 h=1,2,...,+4 年的一系列 h 步出现预测”。就像在 预期结果 部分中提到的那样。我想通过 EGARCH(1,1) 预测未来 800 天的波动率(例如!)。所以我需要的只是 800 个波动率预测值,仅此而已。
  • 发生这种情况是因为您必须使用模拟来预测 EGARCH 模型中地平线何时 > 1。模拟路径作为ARCHModelForecast 对象的一部分存储和返回。通过模拟产生非常长期的预测不是该项目的目标。您在这里有两个选择。首先,使用具有分析预测的模型,例如 GARCH。其次,您可以预测一些较小的范围,看看预测是否恒定,然后使用这个值。经过大约 20 次观察后,它似乎已经收敛。最后,您可以编写自定义预测代码。
  • @KevinS 感谢您的建议,亲爱的教授。正如您所说的“最后,您可以编写自定义预测代码。”,如果我使用滑动窗口会怎样?我的意思是例如第 1-5 天 --> 预测第 6 天 | 第 2-6 天 --> 预测第 7 天 | 第 3-7 天 --> 预测第 8 天依此类推... 。这样一来,我每次预测都只提前一步预测!这可以成为这种长期预测的可能解决方案之一吗?

标签: python time-series volatility arch


【解决方案1】:

您只需要传递reindex=False 关键字,内存需求就会急剧下降。您需要最新版本的 arch 包才能使用此功能,该功能将预测的输出形状更改为仅包含预测值,因此对齐方式与历史行为不同。

# Packages That we need
from pandas_datareader import data as web
from arch import arch_model
import pandas as pd
#---------------------------------------

# grab Microsoft daily adjusted close price data from '01-03-2013' to '12-06-2018' and store it in DataFrame
df = pd.DataFrame(web.get_data_yahoo('MSFT' , start='01-03-2013' , end='12-06-2018')['Adj Close'])

#---------------------------------------

# calculate daily rate of return that is necessary for predicting daily Volatility by EGARCH
daily_rate_of_return_EGARCH = np.log(df.loc[ : '01-04-2015']/df.loc[ : '01-04-2015'].shift())
# drop NaN values
daily_rate_of_return_EGARCH = daily_rate_of_return_EGARCH.dropna()

#---------------------------------------

# Volatility Forecasting By EGARCH(1,1)
model_EGARCH = arch_model(daily_rate_of_return_EGARCH, vol='EGARCH' , p = 1 , o = 0 , q = 1)
fitted_EGARCH = model_EGARCH.fit(disp='off')

#---------------------------------------

# and finally, Forecasting step
# Note that as mentioned in `purpose` section, predict interval should be from '01-04-2015' to end of the data frame
horizon = len(df.loc['01-04-2015' : ])
volatility_FORECASTED = fitted_EGARCH.forecast(horizon = horizon , method='simulation', reindex=False)

【讨论】:

  • 非常感谢亲爱的教授,我执行了你的解决方案,我得到了这个 WARNING"DataScaleWarning: y is bad scale, which估计模型参数时可能会影响优化器的收敛性。y 的尺度为 0.0001942。当该值在 1 到 1000 之间时,参数估计效果更好。建议重新尺度为 100 * y。"。我应该担心结果吗?我知道长期预测波动性是没有意义的,并且结果不能保证会发生并且有准确的预测,但是我应该重新调整数据还是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-25
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
  • 2019-09-03
相关资源
最近更新 更多