【问题标题】:Faster Way of Calculating Rolling Realized Volatility in RR中计算滚动实现波动率的更快方法
【发布时间】:2012-10-10 15:51:26
【问题描述】:

我想计算一组指数的滚动 20 天实际波动率。这是我用来下载指数价格、计算每日收益和 20 天实际波动率的代码。

library(quantmod)
library(PerformanceAnalytics)

tickers = c("^RUT","^STOXX50E","^HSI", "^N225", "^KS11")
myEnv <- new.env()
getSymbols(tickers, src='yahoo', from = "2003-01-01", env = myEnv)
index <- do.call(merge, c(eapply(myEnv, Ad), all=FALSE))

#Calculate daily returns for all indices and convert to arithmetic returns
index.ret <- exp(CalculateReturns(index,method="compound")) - 1
index.ret[1,] <- 0

#Calculate realized volatility
realizedvol <- rollapply(index.ret, width = 20, FUN=sd.annualized)

在最后一行之前,一切都运行得很快。我没有计时,但它是在几分钟的范围内,而我希望它只需要几秒钟。是否有更快的方法来计算已实现的波动率?

谢谢。

【问题讨论】:

  • 我建议使用ROC 来计算回报; PerformanceAnalytics 无法决定如何设置默认值。 index.ret &lt;- ROC(index, type='discrete', na.pad=FALSE)
  • 感谢您的提示。我尝试将我的大部分功能限制在尽可能少的库中,以防在我开始混合来自不同库的功能时出现不兼容或不一致的情况。我的这种想法是不是完全被误导了?
  • 一点也不。您必须加载的库越少,加载库所需的时间就越少,您的代码就越不可能从上游中断,并且其他人无需安装新包即可使用您的代码的可能性就越大。

标签: r xts


【解决方案1】:

您可以在 TTR 包(由 quantmod 加载)中使用 runSD,但您需要将 runSD 应用于每一列,将 apply 的结果转换回 xts 对象,并手动年化结果。

realized.vol <- xts(apply(index.ret,2,runSD,n=20), index(index.ret))*sqrt(252)

【讨论】:

  • 这非常有效 - 大约需要 2 秒。为什么这比我的方法快得多?
  • @mchangun: runSD 在 C 中进行几乎所有计算,而您的方法在纯 R 中进行大部分计算。
  • @GSee:其中之一。很长一段时间以来,我一直在将它们从 Fortran 迁移到 C。最终,TTR 中的 run* 函数将移至 zoo 和 xts 中的 roll* 函数。
  • @JoshuaUlrich 这可能有点跑题了,但这种实际波动实际上是历史波动,对吧?我之所以问,是因为有一大堆模型可以估计未知的已实现波动率;或者我可能把自己和行话弄糊涂了..
  • @stucash:你是对的。估计“未知已实现波动率”的模型是隐含波动率模型,并使用期权数据来预测已实现波动率。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
  • 2017-11-13
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多