30 nov 2019

Ventana móvil de volatilidad en R


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")

Recesión plot en R usando ggplot (recession plot in r)

En el siguiente ejemplo se simular y replica -parcialmente- un ejemplo usado por el FMI para ilustrar la importancia del uso de series de ti...