En la siguiente entrada se
crea una función llamada momentoMovil que tiene como objetivo rotar
una ventana móvil para calcular ya sea el promedio o la volatilidad histórica de
una serie Es decir, dado una serie unidimensional necesitamos estimar momentos
de esta serie en el tiempo a partir de una ventana móvil. Note que dado una
ventana igual a n, la primera estimación toma las observaciones 1:n, en la
segunda toma 2:n+1, 3:n+2 y asi sucesivamente, hasta recorrer todas las
observaciones.
Para cumplir con la terea anterior
se crea una función llamada momentoMovil que requiere tres argumentos:
1.
serie = una serie temporal sobre la
cual se desea aplicar la ventana móvil.
2.
ventana = indica el
tamaño de la ventana que vamos a utilizar para realizar nuestros cálculos. Por
ejemplo, sí este número es igual a 10 (valor por default) indica que se va
obtener la volatilidad (o promedio) de las primeras 10 observaciones, rotándose
posteriormente para las siguientes observaciones como se explicó anteriormente.
3.
momento = asume dos valores, 1 para obtener la volatilidad histórica
a partir de ventanas móviles y 2 para el caso del promedio.
¿Cómo funciona?
Esta función utiliza un bucle
para recorrer las observaciones del vector [for (obs in 1:tr)], siendo la clave la indexación usada para obtener una parte del vector x,
en tal sentido, cuando obs=1, se llaman las observaciones de x del 1 al 10
mediante idenxacion x[obs:(obs+ventana-1)], obs:(obs+ventana-1)=1:(1+10-1)=1:10… note que siempre se va cambiando siempre en el
for es obs, que va tomando el valor de 1,2,3,…n-10. Finalmente,
usamos un condicional para que en función del valor tomado por el argumento memento, guarde la volatilidad histórica
o la media de la serie.
#' En la función momentoMovil
#' @param serie serie unidimensional de
datos
#' @param ventana longitud de la ventana
#' @param momento 1 calcula la volatilidad,
2 media
#' @return serie historica de volatilidad o
media
momentoMovil <- function(serie, ventana=10, momento=1){
TT <-
length(x)
tr <- TT-ventana
v_sd <- c()
for (obs in 1:tr){
xn
<- x[obs:(obs+ventana-1)]
if (momento
== 1){
v_sd <- c(v_sd, sd(xn, na.rm
= T)) }
else {
v_sd <- c(v_sd, mean(xn,
na.rm = T)) }
}
return(v_sd)
}
Como usar la función
Ahora se genera una variable
aleatoria para probar la función anterior. Modificando el argumento momento de
la función podemos generar la volatilidad o la media histórica mediante una
ventana móvil.
set.seed(0)
x <- qnorm(runif(200,0,1),0,1)
x <- ts(x, start = 2000, frequency = 12)
plot(x, type = "l")
Obtener la volatilidad histórica
# Usar la función
hist_vol <- momentoMovil(x, 20, 1)
plot(hist_vol, type="l")
Obtener la media histórica
hist_media <- momentoMovil(x, 20, 2)
plot(hist_media, type="l")