进行|拓端tecdat|R语言乘法GARCH模型对高频交易数据进行波动性预测

原文链接:http://tecdat.cn/?p=22692
原文出处:拓端数据部落公众号
在过去十年中 , 人们对高频交易和模型的兴趣成倍增长 。 虽然我对高频噪音中出现信号的有效性有一些怀疑 , 但我还是决定使用GARCH模型研究一下收益率的统计模型 。 与每日和较低频率的收益不同 , 日内高频数据有某些特殊的特点 , 使得使用标准的建模方法是无效的 。 在这篇文章中 , 我将使用花旗集团2008年1月2日至2008年2月29日期间的1分钟收益率 。 这个数据集删除了异常值 。 考虑的日内时间范围是09:30至16:00 , 即证券交易所的正式交易时间 。 与大多数此类关于日内数据建模的研究一样 , 当天的第一个收益被删除 。 每日数据从雅虎财经下载 。

  1. getSymbols('C')
  2. C = adjustOHLC(C, use.Adjusted = TRUE)
  3. R_d = ROC(Cl(C), na.pad = FALSE)
考虑一下花旗集团在上述样本期间的1分钟绝对收益的相关图 。
acf(abs((R_i))

进行|拓端tecdat|R语言乘法GARCH模型对高频交易数据进行波动性预测
文章图片

有规律的模式非常明显 , 大约每 390 个周期(1 天)重复一次 , 并显示出开盘和收盘时的波动性增加 。 GARCH , 以及更普遍的ARMA模型只能处理指数衰减 , 而不是这里看到的那种模式 。 为了使绝对收益去季节化 , 文献中提出了几种方法 , 如Andersen和Bollerslev(1997)的灵活傅里叶方法 , 以及Bollerslev和Ghysels(1996)的定期GARCH模型 。 但是 , 我发现这些模型都不太容易操作 。 Engle和Sokalska(2012)(以下简称ES2012)引入了乘法分量GARCH模型作为一种简单的替代方法 。 本文讨论了它的实现、挑战和使用这个模型的具体细节 。
模型
考虑连续复利收益率 r_{t,i}, 其中 t 表示一天 ,i 表示计算收益率的定期间隔时间 。 在这个模型下 , 条件方差是每日和随机(日内)成分的乘积 , 因此 , 收益可以表示为: 。

进行|拓端tecdat|R语言乘法GARCH模型对高频交易数据进行波动性预测
文章图片

其中 q_{t,i}是随机的日内波动率 , sigma_t是每日外生确定的预测波动率 ,s_i是每个定期间隔 i 的日波动率 。 预测波动率 sigma_t是由外部的多因素风险模型得出的 , 但是同样可以从每日 GARCH 模型中产生这种预测 。 该过程的季节性部分定义为: 。

进行|拓端tecdat|R语言乘法GARCH模型对高频交易数据进行波动性预测
文章图片

用残差除以波动率和日波动率 , 就得到了归一化残差 。

进行|拓端tecdat|R语言乘法GARCH模型对高频交易数据进行波动性预测
文章图片

然后可以用它来生成波动率的随机分量 q_{t,i} 与 GARCH 的动态关系 。 接下来的章节提供了一个使用花旗集团数据集的模型演示 。
估算
模型要求用户传递一个xts对象 , 即所考虑时期的数据的预测日方差 。
  1. # 定义一个日模型
  2. spec(list(armaOrder = c(1, 1)))
  3. # 使用ugarchroll方法创建一个滚动的预测
  4. roll(spec)
  5. #提取sigma 预测
  6. sigma = as.xts(df[, 'Sigma'])
  7. #现在估计日内模型
  8. spec( list(model = 'mcsGARCH'))
  9. # DailyVar是预测日方差的必要xts对象
  10. fit(data = https://www.sohu.com/a/R, spec, Var = sigma^2)
下面的图表显示了将波动率分解为其不同的组成部分 。 使用标准的 GARCH 模型不可能捕捉到总波动率的规律模式 。
plot(fit@DiurnalVar^0.5))

进行|拓端tecdat|R语言乘法GARCH模型对高频交易数据进行波动性预测
文章图片

预测
为预测编写代码的最大挑战是处理时间的对齐和匹配问题 , 特别是未来的时间/日期 , 因为该模型依赖于日内分量 , 而日内分量是特定的 。 与估计方法一样 , 预测程序也要求提供所考虑的时期的预测波动率 。
我们用ugarchforecast估算 。
forecast(fit2, n.ahead = 10, n.roll = 299, f_sigma^2)

进行|拓端tecdat|R语言乘法GARCH模型对高频交易数据进行波动性预测
文章图片

仿真
与标准的GARCH仿真不同 , 区间时间在日内GARCH中很重要 , 因为我们生成的路径是遵循非常具体的定期抽样的时间点 。 此外 , 需要再次提供所考虑的模拟期的模拟或预测日方差 。 这是一个xts对象 , 也可以选择有m.sim列 , 这样每个独立的模拟都是基于日方差独立模拟的调整残差 。 下面的示例代码显示了对未来1分钟间隔的10,000个点的模拟 , 并说明了季节性成分的影响 。
  1. # dtime包含了数据集中唯一的区间点的集合
  2. # (可从mcsGARCH模型的所有rugarch对象中获得)
  3. sim = sim(fit, n.sim = 10000,Var = var_sim)
  4. #
  5. plot(as.numeric(sim@simulation$DiurnalVar^0.5), type = 'l')

进行|拓端tecdat|R语言乘法GARCH模型对高频交易数据进行波动性预测
文章图片

滚动的回测和风险值
ugarchroll函数对于在回测应用中测试模型的充分性非常有用 , 下面的代码说明了模型在数据期间的情况 。
  1. n = length(index(R_d['2008-01-01/2008-03-01']))
  2. roll(spec, data = https://www.sohu.com/a/R, refit.window ='moving')

进行|拓端tecdat|R语言乘法GARCH模型对高频交易数据进行波动性预测
文章图片

效果比较理想 。
如下图所示 , VaR能很好地处理日内数据 。 观察到的VaR峰值是开盘前后的季节性因素造成的 。
  1. D = as.POSIXct(rownames(roll@forecast$VaR))
  2. VaRplot(0.01, actual = xts(roll@forecast$VaR[, 3], D), VaR = xts(roll@forecast$VaR[,1], D))

进行|拓端tecdat|R语言乘法GARCH模型对高频交易数据进行波动性预测
文章图片

展望
在乘法模型中增加额外的GARCH模型是非常 "容易 "的 , 如eGARCH、GJR等 。 另一个可能的扩展方向是分别处理一周中每一天的昼夜效应 。
最后 , 这个模型不是 "上手即用 "的 , 需要在准备日内收益率数据时进行一些思考 。
参考文献
Bollerslev, T., & Ghysels, E. (1996). Periodic autoregressive conditional heteroscedasticity. Journal of Business & Economic Statistics, 14(2), 139–151.
Andersen, T. G., & Bollerslev, T. (1997). Intraday periodicity and volatility persistence in financial markets. Journal of Empirical Finance, 4(2), 115–158.

进行|拓端tecdat|R语言乘法GARCH模型对高频交易数据进行波动性预测
文章图片

最受欢迎的见解
1.在python中使用lstm和pytorch进行时间序列预测
2.python中利用长短期记忆模型lstm进行时间序列预测分析
3.使用r语言进行时间序列(arima , 指数平滑)分析
4.r语言多元copula-garch-模型时间序列预测
5.r语言copulas和金融时间序列案例
6.使用r语言随机波动模型sv处理时间序列中的随机波动
7.r语言时间序列tar阈值自回归模型
8.r语言k-shape时间序列聚类方法对股票价格时间序列聚类
9.python3用arima模型进行时间序列预测
原文链接:http://tecdat.cn/?p=22692
原文出处:拓端数据部落公众号
在过去十年中 , 人们对高频交易和模型的兴趣成倍增长 。 虽然我对高频噪音中出现信号的有效性有一些怀疑 , 但我还是决定使用GARCH模型研究一下收益率的统计模型 。 与每日和较低频率的收益不同 , 日内高频数据有某些特殊的特点 , 使得使用标准的建模方法是无效的 。 在这篇文章中 , 我将使用花旗集团2008年1月2日至2008年2月29日期间的1分钟收益率 。 这个数据集删除了异常值 。 考虑的日内时间范围是09:30至16:00 , 即证券交易所的正式交易时间 。 与大多数此类关于日内数据建模的研究一样 , 当天的第一个收益被删除 。 每日数据从雅虎财经下载 。
  1. getSymbols('C')
  2. C = adjustOHLC(C, use.Adjusted = TRUE)
  3. R_d = ROC(Cl(C), na.pad = FALSE)
考虑一下花旗集团在上述样本期间的1分钟绝对收益的相关图 。
acf(abs((R_i))

进行|拓端tecdat|R语言乘法GARCH模型对高频交易数据进行波动性预测
文章图片

有规律的模式非常明显 , 大约每 390 个周期(1 天)重复一次 , 并显示出开盘和收盘时的波动性增加 。 GARCH , 以及更普遍的ARMA模型只能处理指数衰减 , 而不是这里看到的那种模式 。 为了使绝对收益去季节化 , 文献中提出了几种方法 , 如Andersen和Bollerslev(1997)的灵活傅里叶方法 , 以及Bollerslev和Ghysels(1996)的定期GARCH模型 。 但是 , 我发现这些模型都不太容易操作 。 Engle和Sokalska(2012)(以下简称ES2012)引入了乘法分量GARCH模型作为一种简单的替代方法 。 本文讨论了它的实现、挑战和使用这个模型的具体细节 。
模型
考虑连续复利收益率 r_{t,i}, 其中 t 表示一天 ,i 表示计算收益率的定期间隔时间 。 在这个模型下 , 条件方差是每日和随机(日内)成分的乘积 , 因此 , 收益可以表示为: 。

进行|拓端tecdat|R语言乘法GARCH模型对高频交易数据进行波动性预测
文章图片

其中 q_{t,i}是随机的日内波动率 , sigma_t是每日外生确定的预测波动率 ,s_i是每个定期间隔 i 的日波动率 。 预测波动率 sigma_t是由外部的多因素风险模型得出的 , 但是同样可以从每日 GARCH 模型中产生这种预测 。 该过程的季节性部分定义为: 。

进行|拓端tecdat|R语言乘法GARCH模型对高频交易数据进行波动性预测
文章图片

用残差除以波动率和日波动率 , 就得到了归一化残差 。

进行|拓端tecdat|R语言乘法GARCH模型对高频交易数据进行波动性预测
文章图片

然后可以用它来生成波动率的随机分量 q_{t,i} 与 GARCH 的动态关系 。 接下来的章节提供了一个使用花旗集团数据集的模型演示 。
估算
模型要求用户传递一个xts对象 , 即所考虑时期的数据的预测日方差 。
  1. # 定义一个日模型
  2. spec(list(armaOrder = c(1, 1)))
  3. # 使用ugarchroll方法创建一个滚动的预测
  4. roll(spec)
  5. #提取sigma 预测
  6. sigma = as.xts(df[, 'Sigma'])
  7. #现在估计日内模型
  8. spec( list(model = 'mcsGARCH'))
  9. # DailyVar是预测日方差的必要xts对象
  10. fit(data = https://www.sohu.com/a/R, spec, Var = sigma^2)
下面的图表显示了将波动率分解为其不同的组成部分 。 使用标准的 GARCH 模型不可能捕捉到总波动率的规律模式 。
plot(fit@DiurnalVar^0.5))

进行|拓端tecdat|R语言乘法GARCH模型对高频交易数据进行波动性预测
文章图片

预测
为预测编写代码的最大挑战是处理时间的对齐和匹配问题 , 特别是未来的时间/日期 , 因为该模型依赖于日内分量 , 而日内分量是特定的 。 与估计方法一样 , 预测程序也要求提供所考虑的时期的预测波动率 。
我们用ugarchforecast估算 。
forecast(fit2, n.ahead = 10, n.roll = 299, f_sigma^2)

进行|拓端tecdat|R语言乘法GARCH模型对高频交易数据进行波动性预测
文章图片

仿真
与标准的GARCH仿真不同 , 区间时间在日内GARCH中很重要 , 因为我们生成的路径是遵循非常具体的定期抽样的时间点 。 此外 , 需要再次提供所考虑的模拟期的模拟或预测日方差 。 这是一个xts对象 , 也可以选择有m.sim列 , 这样每个独立的模拟都是基于日方差独立模拟的调整残差 。 下面的示例代码显示了对未来1分钟间隔的10,000个点的模拟 , 并说明了季节性成分的影响 。
  1. # dtime包含了数据集中唯一的区间点的集合
  2. # (可从mcsGARCH模型的所有rugarch对象中获得)
  3. sim = sim(fit, n.sim = 10000,Var = var_sim)
  4. #
  5. plot(as.numeric(sim@simulation$DiurnalVar^0.5), type = 'l')

进行|拓端tecdat|R语言乘法GARCH模型对高频交易数据进行波动性预测
文章图片

滚动的回测和风险值
ugarchroll函数对于在回测应用中测试模型的充分性非常有用 , 下面的代码说明了模型在数据期间的情况 。
  1. n = length(index(R_d['2008-01-01/2008-03-01']))
  2. roll(spec, data = https://www.sohu.com/a/R, refit.window ='moving')

进行|拓端tecdat|R语言乘法GARCH模型对高频交易数据进行波动性预测
文章图片

效果比较理想 。
如下图所示 , VaR能很好地处理日内数据 。 观察到的VaR峰值是开盘前后的季节性因素造成的 。
  1. D = as.POSIXct(rownames(roll@forecast$VaR))
  2. VaRplot(0.01, actual = xts(roll@forecast$VaR[, 3], D), VaR = xts(roll@forecast$VaR[,1], D))

进行|拓端tecdat|R语言乘法GARCH模型对高频交易数据进行波动性预测
文章图片

展望
在乘法模型中增加额外的GARCH模型是非常 "容易 "的 , 如eGARCH、GJR等 。 另一个可能的扩展方向是分别处理一周中每一天的昼夜效应 。
最后 , 这个模型不是 "上手即用 "的 , 需要在准备日内收益率数据时进行一些思考 。
参考文献
Bollerslev, T., & Ghysels, E. (1996). Periodic autoregressive conditional heteroscedasticity. Journal of Business & Economic Statistics, 14(2), 139–151.
Andersen, T. G., & Bollerslev, T. (1997). Intraday periodicity and volatility persistence in financial markets. Journal of Empirical Finance, 4(2), 115–158.

进行|拓端tecdat|R语言乘法GARCH模型对高频交易数据进行波动性预测
文章图片

最受欢迎的见解
1.在python中使用lstm和pytorch进行时间序列预测
2.python中利用长短期记忆模型lstm进行时间序列预测分析
3.使用r语言进行时间序列(arima , 指数平滑)分析
4.r语言多元copula-garch-模型时间序列预测
5.r语言copulas和金融时间序列案例
6.使用r语言随机波动模型sv处理时间序列中的随机波动
7.r语言时间序列tar阈值自回归模型
8.r语言k-shape时间序列聚类方法对股票价格时间序列聚类
【进行|拓端tecdat|R语言乘法GARCH模型对高频交易数据进行波动性预测】9.python3用arima模型进行时间序列预测

    推荐阅读