Método de Validación Cruzada

💎Si vamos a crear un determinado tipo de modelo estadístico o econométrico con el objetivo de realizar predicciones o modelar el comportamiento de alguna variable, cómo por ejemplo dentro del campo del trading, donde creamos estrategias para invertir, tenemos que saber que no basta sólo con desarrollar el modelo, sino que también tenemos que analizar y comprobar como se puede comportar en el futuro ante diferentes situaciones.

Entonces una vez que tenemos el modelo, o si estamos haciendo trading, la estrategia en sí, una manera de comprobar la estabilidad y robustez de éstos es usando la técnica de validacíón cruzada, que no es más que dividir los datos que tenemos en partes, de forma que usaremos una parte de los datos para la creación de nuestro modelo y otra parte para probar su comportamiento

🤪 Aunque al principio parezca complicado, en realidad es algo más simple de lo que parece y tiene mucha lógica, ya que lo que buscaremos en líneas generales es intentar adaptarnos o simular lo que podríamos encontrarnos una vez lo tengamos que usar en la realidad.

Hay muchas formas de realizar este método. La más simple, y la que puedes usar al principio para ir aprendiendo si no tienes conocimiento es simplemente dividir todos tus datos en dos partes. Una parte la usas para crear el modelo y la otra para probarlo.

Lo único que pasa con hacerlo así es que es muy probable que los resultados varíen mucho en función de la cantidad de datos que uses y cómo los dividas, pero igualmente es una forma de comenzar.

Por ejemplo, imaginemos que quieres predecir el precio de una acción el siguiente mes, y tienes datos mensuales de 6 años. Pues puedes usar los 5 primeros años para crear el modelo y el último para probarlo. 👇👇

MÉTODO DE VALIDACIÓN CRUZADA CON K ITERACIONES

Otra forma es con el método k-fold.  Lo que se hará es crear varios subconjuntos, y se irá iterando en función de los subconjuntos que se tengan. Es más preciso que el primer método porque es más dinámico y podremos comprobar mejor si nuestro sistema o modelo se adapta bien a las diferentes situaciones.

Validación cruzada de K iteraciones con K=4.

MÉTODO DE VALIDACIÓN CRUZADA DEJANDO UNO FUERA (LOOCV)

Otra opción es la validación cruzada dejando uno fuera. Aquí usamos todos los datos para entrenar el modelo y sólo uno para comprobar o testear. En el gráfico de abajo puedes ver cómo si dividen los datos de la muestra.

Validación cruzada dejando uno fuera (LOOCV).

💻Hay muchas más formas, y dentro sobretodo de la parte de Machine Learning se utilizan muchas combinaciones, pero la idea principal es la que hemos expuesto. Es muy importante usar alguna de estas técnicas para poder estar más seguros cuando usemos modelos en nuestros análisis.

En el siguiente vídeo explico más detallado este tema haciendo un ejemplo en R studio creando primero un modelo de regresión lineal múltiple para predecir el precio de una divisa y después usando la validación cruzada para ver la eficacia del modelo. Más abajo dejaré el código usado en el vídeo.

CÓDIGO DEL VÍDEO 👍


#MODELO DE REGRESION y VALIDACIÓN CRUZADA


## Método para comprobar la robustez de los modelos

## Basado en dividir los datos usando unos para crear
## y otros para probar - In sample/Out sample

## Muchas formas de hacerlo- Machine Learning
## Importante en TRADING


## PARTE 1 -- CREACIÓN DEL MODELO LINEAL 


#install.packages("quantmod")
library(quantmod)
#install.packages("tseries")
library(tseries)
#install.packages("forecast")
library(forecast)
#install.packages("TSA")
library(TSA)
#install.packages("Quandl")
library(Quandl)



#1. Descargamos las variables que vamos a usar

getSymbols("INDPRO",src="FRED")  #Industrial Production Index
getSymbols("UMCSENT",src="FRED") #University of Michigan: Consumer Sentiment
getSymbols("FEDFUNDS",src="FRED") #tasa interes fondos federales
getSymbols("CCRETT01USM661N",src="FRED") #Tipo de cambio efectivo IPC
getSymbols("M2NS",src="FRED")     #Stock de dinero M2
getSymbols("PAYEMS",src="FRED")   # Des trabajadores no rurales
getSymbols("BOPGSTB",src="FRED")  #Balance cuenta, Diferencia entre exp e imp
getSymbols("EXUSUK",src="FRED")   #GBP mensual



## Predecir GBPUSD -- 1 mes 

###2.  Dividimos lso datos en 2 muestras
##  IN SAMPLE y OUT SAMPLE


prod= INDPRO["2001-01::2019-12"]
sent= UMCSENT["2001-01::2019-12"]
Fedfunds=FEDFUNDS["2001-01::2019-12"]
GBP=EXUSUK["2001-01::2019-12"]
credit=CCRETT01USM661N["2001-01::2019-12"]
pay=PAYEMS["2001-01::2019-12"]
money=M2NS["2001-01::2019-12"]
trade=BOPGSTB["2001-01::2019-12"]


#creamos una tabla

t_varibles=data.frame(merge(sent,Fedfunds,GBP,credit,pay,money,trade))



#creamos el modelo 


Mod_Macro = lm(EXUSUK~UMCSENT+FEDFUNDS+CCRETT01USM661N+PAYEMS+M2NS+BOPGSTB,data=t_varibles)

summary(Mod_Macro)

anova(Mod_Macro)


### Como algo interesante sería buscar más variables
### dentro de la FRED y mejorar este modelo 


## Mirar la existencia de Heterocedasticidad,atuocrrelación etc


plot(Mod_Macro)
res<-residuals(Mod_Macro)
plot(res,type="l")

#hist(res)

#dwtest(Mod_Macro)


# Comprobamos el Modelo OUT-SAMPLE

prod= INDPRO["2000-01::2001-01"]
sent= UMCSENT["2000-01::2001-01"]
Fedfunds=FEDFUNDS["2000-01::2001-01"]
credit=CCRETT01USM661N["2000-01::2001-01"]
pay=PAYEMS["2000-01::2001-01"]
money=M2NS["2000-01::2001-01"]
trade=BOPGSTB["2000-01::2001-01"]

GBP=EXUSUK["2000-01::2001-12"]


#probamos el modelo


t_varibles_2=na.omit( data.frame(merge(sent,Fedfunds,GBP,credit,pay,money,trade)))
t_varibles_2


#realizamos las Predicciones con el modelo y Probamos Out-Sample


Out_Sample=predict(Mod_Macro,newdata=t_varibles_2)
Out_Sample


error<-(t_varibles_2$EXUSUK-Out_Sample)

error_medio<- mean(error)
error_medio


error

#1-(SCE/SCT)


### hacerlo años diferentes,incluso con cantidad de datos diferentes


### esto lo puedes hacer con diferentes periodos, o
## hacia adelante WALK-FORWARD -- video Sarima 



#install.packages("LARF")
#library(LARF)

#kfold<-cvlm(MRLM, tabla, m=5, seed = NULL)
#summary(kfold)


#install.packages("ISLR")
#library(ISLR)

#cv.lm(t_varibles,Mod_Macro)




# K-fold cross-validation
install.packages("DAAG")
library(DAAG)



Kfold<-cv.lm(t_varibles,Mod_Macro, m=3)

Kfold$Predicted


test<- Kfold$EXUSUK-Kfold$cvpred
test
plot(test,type="l")
plot(Kfold$cvpred,type="l")

comparacion<-cbind(Kfold$EXUSUK,Kfold$cvpred)

#############################

Fuente de los gráficos

https://es.wikipedia.org/wiki/Validaci%C3%B3n_cruzada

4 comentarios en “Método de Validación Cruzada”

  1. Excelente muchas gracias voy a ponerlo a prueba. Justo estaba haciendo modelos de regresion lineal pero no sabia como haver validaciom cruzada a una serie de tiempo.. la validacion cruzada es un backtesting?

    1. Gracias!! Se podría decir que es un backtesting, aunque backtesting se usa más bien dentro del campo de la bolsa cuando miras la rentabilidad y métricas de esa estrategia en el pasado.Como yo lo entiendo es que la validación cruzada es un método para hacer backtesting,creo que se entiende así mejor,pero igualmente está dentro de la misma lógica,que es comprobar con datos out-sample lo que podría pasar.

  2. Hola, me queda una duda, si es una serie de tiempo la validacion cruzada no se puede realizar aleatoria correcto? por lo cual en tu ejemplo tus datos de entrenamiento dejas por fuera el primer año 2000, sin embargo se deberia probar desde los años mas antiguos y dejar por fuera el mas reciente, ejemplo: si tenemos data de 10 año, 2000 al 2010
    Se hace el modelo con la data completa, y luego aplico el cross validation, del modelo resultante tomo la data 2000 al 2007 y entreno con 2008, luego la data del 2000 al 2008 y entreno con 2009 y asi sucesivamente. Este procedimiento lo toma en cuenta la funcion «cv.lm»?

    1. Si usas la función cv.lm debes de usar todos los datos ya que la propia función te hace la particiones. Si lo haces tú poco a poco a mano puedes hacerlo al revés de mi ejemplo, probar con el último año, o en realidad como quieras. Simplemente yo os he puesto un ejemplo para que sepáis lo que es, pero vosotros podéis probar incluso comparar resultados de las funciones con los vuestros.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll al inicio