我试图找出在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”变量。
感谢。
答案 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)
。