R:在R中编码这个公式的最有效方法是什么?

时间:2016-04-29 21:35:35

标签: r performance

我试图找出在R中编码这个公式的最有效方法。我可以使用循环来实现它。但这不是最有效的。

效率比率指标的公式:

ER = Direction / Volatility 
Direction = ABS (Close – Close[n])
Volatility = n ∑ (ABS(Close – Close[1])) 

波动率是最近n次价格变动的绝对值之和(收盘价 - 先前收盘价)

n =回顾期间。例如:n = 10

R代码:

library(quantmod)
getSymbols("SPY")
prices <- Ad(SPY)

ER <- function(prices, n=10)
{
   direction <- abs((prices - lag(prices,n)))
   volatility <- 
   efficiencyRatio <- direction/volatility
   return(efficiencyRatio)
}

我正在寻找帮助填写ER函数内的“volatility”变量。

感谢。

2 个答案:

答案 0 :(得分:1)

您可以使用rollapply包中的zoo在长度为n的滚动窗口中应用您的函数。

以下是仅使用代码的direction部分的示例。当然,您可以扩展下面代码中的direction函数,以包含其余的计算。

library(zoo)

roll.direction = function(dat, n) {

  # The function to apply
  direction = function(x) {
    abs(x[length(x)] - x[1])
  }

  # Apply the function to dat in a rolling window of length n
  rollapply(dat, width=n, FUN=direction)
}

现在对您的数据运行该功能:

roll.direction(as.numeric(prices[,1]), 10)

答案 1 :(得分:0)

我认为您可以按如下方式计算波动率:

# silly example
y <- 1:10

volatility <- length(y) * sum(sapply(2:(length(y)), 
                                     function(i) abs(y[i]-y[i-1])))

你可以分解函数,看sapply(2:10, function(i) abs(y[i]-y[i-1]))计算9 1s,这对于矢量是有意义的。按天数加总数和倍数。

如果要将其扩展为长于n的向量,要获得移动平均线,可以使用

volatility <- function(y, n) {
                sapply((n+1):length(y), 
                  function(rollSpot) {
                     n * sum(sapply((rollSpot-(n-1)):rollSpot, 
                                    function(i) abs(y[i]-y[i-1])))
                  })
              }

rollSpot变量为移动平均值编制索引:您回顾了多少个句点。当前实施包括当前时段和先前的n-1时段。如果您想要包含前n个句点,则可以将(rollSpot-(n-1)):rollSpot递减到(rollSpot-n):(rollSpot-1)