Una respuesta con R y pseudocódigo:
Como señala @markleeds, no hay necesidad de dos bucles for, ya que puedes vectorizar el bucle exterior. Sólo necesitas el último bucle for si quieres hacer estimaciones de volatilidad rolling Roger-Satchell. No puedo codificar en Go
pero puedo proporcionarle un pseudocódigo .
Deje que sus datos de OHLC se definan como X∈RT×4 donde cada columna es, respectivamente, la apertura, el máximo, el mínimo y el cierre diarios. Es decir, X es una matriz con la dimensión del tiempo, t=1,…,T como las filas y OHLC como las columnas. Construyendo algo de pseudocódigo, su función Golang debería tener una estructura similar a la del fragmento de abajo:
function RSVol(OHLC, n){
""Initialise RSVol to store numeric values:""
RSVol = Vector()
""These are now vectors of dimension T x 1:""
open = OHLC[,1]
high = OHLC[,2]
low = OHLC[,3]
close = OHLC[,4]
""the inner part of the mean:""
inner = log(high/close) * log(high/open) + log(low/close) * log(low/open)
""Doing a rolling mean depending on n:""
for(i=n:length(open); i++){
RSVol[i] = sqrt(mean(inner[i+1-n:i])
}
return(RSVol)
}
La implementación del pseudocódigo anterior en R
y comparando mi función con el estimador Rogers Satchell en el TTR
producen los mismos resultados:
library(TTR)
#first 6 rolling estimates with n=10.
myfunc <- RSVol(OHLC,10)[11:16]
TTR_RSVol <- volatility(OHLC, n = 10, calc = "rogers.satchell", N = 1, mean0 = FALSE)[11:16]
data.frame(myfunc = myfunc, TTR_func = TTR_RSVol)
![results]()
Los resultados casi idénticos vistos arriba, dan cierta validez a mi pseudocódigo y R
código . He proporcionado mi R
función en un apéndice más abajo. Espero que esto ayude a la correcta implementación de su estimador Rogers Satchell en Go
. Si no es así, edite su pregunta y proporcione algunos datos de ejemplo o dónde conseguirlos. Entonces podremos hacer una comparación de resultados entre las funciones construidas.
Apéndice: Código R
He proporcionado mi código R a continuación para una mejor comprensión.
RSVol <- function(OHLC, n){
open <- OHLC[,1]
high <- OHLC[,2]
low <- OHLC[,3]
close <- OHLC[,4]
RSVol <- numeric()
firstpart <- log(high/close) * log(high/open)
lastpart <- log(low/close) * log(low/open)
inner <- firstpart + lastpart
#calculating rolling mean:
for(i in n:nrow(OHLC)){
RSVol[i] <- sqrt(mean(inner[(i+1-n):i]))
}
return(RSVol)
}
1 votos
Hola: No me queda claro por qué tienes dos bucles. Deberías hacer un bucle sobre tt y eso es todo. Eso puede estar causando su problema posiblemente.
0 votos
@markleeds Hay dos bucles porque estoy tratando de calcular la volatilidad rodante, donde la longitud del período es de 30 días.
0 votos
Ya veo. Así que tal vez ese no sea tu problema. Espero que la respuesta de Pleb aclare lo que hiciste mal. No la he revisado pero parece útil. Háganos saber si eso no aclara.