Últimas entradas de Victor A.Rico (ver todo)

Las cópulas son distribuciones Multivariantes que sirven para medir la dependencia que puede haber entre muchas variables. Son una alternativa que busca corregir los errores o problemas que tiene el coeficiente de Correlación. Gracias a ellas se consigue modelar la dependencia entre variables fuera de lo estrictamente lineal y saliéndonos del mundo gaussiano.

En este video te mostraré un método para poder elegir que cópulas matemáticas se adaptan mejor a un determinada variable, en este caso usando el mercado Forex.

CODIGO R DEL VIDEO

 

#VIDEO COPULAS FOREX

#Video Elección de Cópulas

#Son distribuciones Multivariantes que sirven para dependencia que puede haber entre muchas variables
#Son una alternativa que busca corregir los errores o problemas que tiene el coeficiente de Correlación
#Se consigue modelar la dependencia entre variables fuera de lo estrictamente lineal y saliéndonos del mundo gaussiano


#install.packages(«quantmod»)
library(quantmod)
#install.packages(«tseries»)
library(tseries)
#install.packages(«fImport»)
library(fImport)

getSymbols(«CADCHF=X»,src=»yahoo»,from = «2017-02-18»)
getSymbols(«AUDNZD=X»,src=»yahoo»,from = «2017-02-18»)
getSymbols(«AUDUSD=X»,src=»yahoo»,from = «2017-02-18»)
getSymbols(«EURCHF=X»,src=»yahoo»,from = «2017-02-18»)
getSymbols(«EURGBP=X»,src=»yahoo»,from = «2017-02-18»)
getSymbols(«EURJPY=X»,src=»yahoo»,from = «2017-02-18»)
getSymbols(«EURNZD=X»,src=»yahoo»,from = «2017-12-18»)
getSymbols(«EURUSD=X»,src=»yahoo»,from = «2017-02-18»)
getSymbols(«GBPCHF=X»,src=»yahoo»,from = «2017-02-18»)
getSymbols(«NZDCAD=X»,src=»yahoo»,from = «2017-02-18»)

#precios de cierre

CADCHF= `CADCHF=X`[,4]
AUDNZD= `AUDNZD=X`[,4]
AUDUSD= `AUDUSD=X`[,4]
EURCHF= `EURCHF=X`[,4]
EURGBP= `EURGBP=X`[,4]
EURJPY= `EURJPY=X`[,4]
EURNZD= `EURNZD=X`[,4]
EURUSD= `EURUSD=X`[,4]
GBPCHF= `GBPCHF=X`[,4]
NZDCAD= `NZDCAD=X`[,4]

 

?returns

#FOREX<- cbind(USDTRY,USDSGD,USDHKD,USDMXN,USDNOK,USDSEK,USDDKK,EURSEK,EURNOK,EURNZD,NZDJPY,NZDCHF,EURUSD,GBPUSD,USDCHF,NZDUSD,EURAUD,GBPNZD,USDCAD,USDJPY,AUDCAD,CHFJPY,EURMXN,AUDNZD,AUDUSD,EURNZD,EURGBP,GBPCAD,GBPAUD,GBPJPY,EURCAD,AUDJPY,EURJPY,GBPCHF,EURCHF,NZDCAD,CADCHF)

FX1=cbind(CADCHF,AUDNZD,AUDUSD,EURCHF,EURGBP,EURJPY,EURNZD,EURUSD,GBPCHF,NZDCAD)


#Caluclamos los retornos y x 100 para calcularlos en %

FX1=returns(FX1)
FX1=100*FX1[,1:ncol(FX1)]
FX<-as.timeSeries(FX1)
FX<-na.omit(FX)
head(FX)


plot(FX)
head(FX)

EURUSD_r <- FX[,8]
EURGBP_r <- FX[,5]

media_eurusd<-mean(EURUSD_r)
media_eurgbp<-mean(EURGBP_r)
desv_eurusd<- sd(EURUSD_r)
desv_eurgbp<- sd(EURGBP_r)

# Ajuste de cópulas con paquete <copula>
#—————————————-

install.packages(«copula») # hacer esto una sola vez

library(copula) # cargar paquete instalado al inicio de cada sesión en R

### Normal de dos en dos sacando el AIC al final

set.seed(6) # for reproducibility

#normal.cop <- normalCopula(c(0.5), dim=2, dispstr=»un»)
#x <- rCopula(n, normal.cop) # «true» observations (simulated)
#u <- pobs(x)


# pseudo-observations

# 1 Tenemos que crear una matrix 2 *2 para cada combinacion de variables

# 2 Esa matriz la llamaremos «x»

# 3.Para crear la cópula usaremos las pseudo observaciones de x, para que no
# nos de error ni salgan valores negativos

# Comenzamos por orden con el Variable 1 y 2. Luego habrá que hacer
# 1 y 3, 1 y 4 …….

# probar 3 copulas = normal, t student y gumbell
# crea aic
# mirar la que tiene menor aic


res11<- EURUSD_r #Variable 1
res22<- EURGBP_r #variable 2

nn<- length(res11) # número de filas de la matriz = longiutd de la varialbe
columnas<- 2 # Como la cópula será BI variada aquí es 2

x<- matrix(c(res11,res22),nn,columnas) #
u<- pobs(x)

# Fijamos la COpula por el método Maxima Verosimilitud(likehood)(ML)

fit.ml <- fitCopula(normalCopula(dim=2, dispstr=»un»), u, method=»ml», traceOpt=TRUE)
#?fitCopula

summary(fit.ml)
confint(fit.ml)
confint(fit.ml, level = 0.999)

Estimador<- fit.ml@estimate # Estimate
Error_est<-fit.ml@var.est # Error estándar
Log_ver<-fit.ml@loglik # Valor máxima verosimilutd

Error_est
Log_ver

# CALCULO DE CRITERIO DE AKAIKE(AIC) Y EL BIC

# Lo hacemos a mano con la Fórmula

# AIC <- -2*log-likelihood + k * npar

aic<- -2*Log_ver + 2*1 #-2*log-likelihood + k*npar
aic

bic <- -2*Log_ver + log(nn)* 1 #-2*log-likelihood + k*npar
bic

#copula normal eurgbp eurusd = -36.06


## COPULAS DE T STUDENT

# Fijamos la COpula t studente método Máxima Verosimilitud

tc.ml <- fitCopula(tCopula(dim=2, dispstr=»un»), u, method=»ml»)
summary(tc.ml)
confint(tc.ml)
confint(tc.ml, level = 0.999)

Estimador_t<-tc.ml@estimate
Error_est_t<-tc.ml@var.est
Log_ver_t<-tc.ml@loglik

# Sacamos AIC y BIC

#-2*log-likelihood + k*npar

aic_t <- -2*Log_ver_t + 2* 1
bic_t<- -2*Log_ver_t + log(nn)* 1

aic_t
bic_t

## COPULA DE GUMBELL ( arquimediana)

 

fit.ml <- fitCopula(gumbelCopula(), u, method=»ml»)
summary(fit.ml)

Estimador_gumbell<- fit.ml@estimate # Estimate
Error_est_gumbell<-fit.ml@var.est # Error estándar
Log_ver_gumbell<-fit.ml@loglik # Valor máxima verosimilutd

Error_est_gumbell
Log_ver_gumbell

# CALCULO DE CRITERIO DE AKAIKE(AIC) Y EL BIC
# Lo hacemos a mano con la Fórmula

# AIC <- -2*log-likelihood + k * npar

aic_gumbell<- -2*Log_ver_gumbell + 2*1 #-2*log-likelihood + k*npar
aic_gumbell

bic_gumbell <- -2*Log_ver_gumbell + log(nn)* 1 #-2*log-likelihood + k*npar
bic_gumbell

 

aic #normal
aic_t
aic_gumbell

# 1 t student 2 normal 3 gumbell

bic
bic_t
bic_gumbell

##


#simulaciones copula

copula_sim <- rCopula(1000,tc.ml@copula)

# Gráficos de dispersión de las pseudo-observaciones simuladas

#dev.new(); par(mfrow = c(1, 2))
plot(copula_sim, main = «Cópula t»)

hist(copula_sim[,2])

Por Victor A.Rico

Diplomado en Ciencias Empresariales y Operador del Mercado Español de Futuros y Opciones

2 comentarios en «Elegir Cópulas Matemáticas en R. Ejemplo en Forex»
  1. Hola, muy buen material, muchas gracias, me ayudó a entender que son las copulas y para que sirven,
    pero tengo una pregunta, si tengo distribuciones marginales de distinta longitud (F1 con 50 datos y F2 con 30 datos) como puedo hallar la copula?

    1. Hola!! Pues lo único que se me ocurre es que uses solo 30 datos de de F1. Puedes probar con varias muestras distintas de 30 datos y ver como varia. Por ejemplo, la primera con los 30 primeros, otra con los 30 últimos y otra con 30 centrales.

Deja una respuesta

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