7

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

 3 years ago
source link: https://segmentfault.com/a/1190000040123351
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

原文链接:http://tecdat.cn/?p=22692 

原文出处:拓端数据部落公众号

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

getSymbols('C')
C = adjustOHLC(C, use.Adjusted = TRUE)
R_d = ROC(Cl(C), na.pad = FALSE)

考虑一下花旗集团在上述样本期间的1分钟绝对收益的相关图。

acf(abs((R_i))

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

考虑连续复利收益率 r_{t,i}  ,其中  t  表示一天, i 表示计算收益率的定期间隔时间。在这个模型下,条件方差是每日和随机(日内)成分的乘积,因此,收益可以表示为:。

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

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

然后可以用它来生成波动率的随机分量 q_{t,i} 与 GARCH 的动态关系。接下来的章节提供了一个使用花旗集团数据集的模型演示。

模型要求用户传递一个xts对象,即所考虑时期的数据的预测日方差。

# 定义一个日模型
spec(list(armaOrder = c(1, 1)))
# 使用ugarchroll方法创建一个滚动的预测
roll(spec)
#提取sigma 预测
sigma = as.xts(df\[, 'Sigma'\])
#现在估计日内模型
spec( list(model = 'mcsGARCH'))
# DailyVar是预测日方差的必要xts对象
fit(data = R, spec, Var = sigma^2)

下面的图表显示了将波动率分解为其不同的组成部分。使用标准的 GARCH 模型不可能捕捉到总波动率的规律模式。

plot(fit@DiurnalVar^0.5))

为预测编写代码的最大挑战是处理时间的对齐和匹配问题,特别是未来的时间/日期,因为该模型依赖于日内分量,而日内分量是特定的。与估计方法一样,预测程序也要求提供所考虑的时期的预测波动率。

我们用ugarchforecast估算。

forecast(fit2, n.ahead = 10, n.roll = 299, f_sigma^2)

与标准的GARCH仿真不同,区间时间在日内GARCH中很重要,因为我们生成的路径是遵循非常具体的定期抽样的时间点。此外,需要再次提供所考虑的模拟期的模拟或预测日方差。这是一个xts对象,也可以选择有m.sim列,这样每个独立的模拟都是基于日方差独立模拟的调整残差。下面的示例代码显示了对未来1分钟间隔的10,000个点的模拟,并说明了季节性成分的影响。

# dtime包含了数据集中唯一的区间点的集合
# (可从mcsGARCH模型的所有rugarch对象中获得)
sim = sim(fit, n.sim = 10000,Var = var_sim)
#
plot(as.numeric(sim@simulation$DiurnalVar^0.5), type = 'l')

滚动的回测和风险值

ugarchroll函数对于在回测应用中测试模型的充分性非常有用,下面的代码说明了模型在数据期间的情况。

n = length(index(R_d\['2008-01-01/2008-03-01'\]))
roll(spec, data = R, refit.window = 'moving')

效果比较理想。

如下图所示,VaR能很好地处理日内数据。观察到的VaR峰值是开盘前后的季节性因素造成的。

D = as.POSIXct(rownames(roll@forecast$VaR))
VaRplot(0.01, actual = xts(roll@forecast$VaR\[, 3\], D), VaR = xts(roll@forecast$VaR\[,1\], D))

在乘法模型中增加额外的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.


最受欢迎的见解

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模型进行时间序列预测


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK