¿Que es el modelo CAPM?
\[ R_j-R_f=\alpha+\beta E[R_M-R_f] \]
Para estimar esta ecuacion necesitamos tres cosas, el IPC, el activo y la tasa libre de riesgo (CETES).
El IPC y el activo los puedo bajar de yaoo finanzas, la tasa CETE no. “Para este modelo se recomienda usar los ultimos 5 años”
library(quantmod)
## Loading required package: xts
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
## Loading required package: TTR
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.5 v purrr 0.3.4
## v tibble 3.1.6 v dplyr 1.0.7
## v tidyr 1.2.0 v stringr 1.4.0
## v readr 2.1.2 v forcats 0.5.1
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::first() masks xts::first()
## x dplyr::lag() masks stats::lag()
## x dplyr::last() masks xts::last()
library(PerformanceAnalytics)
##
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
##
## legend
library(lubridate)
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
Lo usaual es calcular el beta del modelo CAPM usando los ultimos 5 años de informacion.
datos <- new.env()
clave <- 'VESTA.MX' #Nombre del activo en la bolsa
getSymbols(clave, from='2017-01-01' , to=today(), env = datos) #Selecionamos los datos de los activos, from = inicio, to = hasta, envairomente
## 'getSymbols' currently uses auto.assign=TRUE by default, but will
## use auto.assign=FALSE in 0.5-0. You will still be able to use
## 'loadSymbols' to automatically load data. getOption("getSymbols.env")
## and getOption("getSymbols.auto.assign") will still be checked for
## alternate defaults.
##
## This message is shown once per session and may be disabled by setting
## options("getSymbols.warning4.0"=FALSE). See ?getSymbols for details.
## [1] "VESTA.MX"
getSymbols('^MXX', from='2017-01-01', to=today(), env = datos)
## [1] "^MXX"
clave2 <- 'GCARSOA1.MX' #Nombre del activo en la bolsa
getSymbols(clave2, from='2017-01-01' , to=today(), env = datos) #Selecionamos los datos de los activos, from = inicio, to = hasta, envairomente
## [1] "GCARSOA1.MX"
Definir quien es el activo y quien es el mercado
precio_a <- datos[[clave]][,6] + datos[[clave2]][,6] #Definimos el activo, selecionamos el cierre ajustado del activo
precio_a_m <- to.monthly(precio_a)[,4] #Convertir el rendimiento diario a rendimiento mensual #[,4] Estamos selecionando la columna 4
#Lo que hace es que toma el primer y ultimo precio del activo de cada mes
rend_mens_a <- monthlyReturn(precio_a_m)[-1,]
names(rend_mens_a) <- 'Portafolio'
plot(rend_mens_a)
Definimos el mercado
precio_ipc <- datos[['MXX']][,6] #Definimos el activo, selecionamos el cierre ajustado del activo
precio_ipc_m <- to.monthly(precio_ipc)[,4] #Convertir el rendimiento diario a rendimiento mensual #[,4] Estamos selecionando la columna 4
#Lo que hace es que toma el primer y ultimo precio del activo de cada mes
rend_mens_ipc <- monthlyReturn(precio_ipc_m)[-1,]
names(rend_mens_ipc) <- 'IPC'
plot(rend_mens_ipc)
plot(merge.xts(rend_mens_a, rend_mens_ipc), legend.loc = 'bottom', main = 'Comparacion Mensual')
Ahora descargaremos los datos de ‘Banxico’, para poder obtenre la tasa libre de riesgo, la cual obtendremos de banxico
library(readxl)
ruta_excel <- "C:\\Users\\Jose Joaquin Ocgueda\\Desktop\\Analisis del Riesgo\\Consulta_20220303-081201590.xlsx"
Rf <- read_excel(ruta_excel)
Modificar los datos de Excel, los datos vienen con rendimiento semanal anualizado y vienen en porcentaje y se necesita en normal.
Rf <- subset(Rf, Rf$Fecha>='2017-01-01') #Acomodamos las fechas en excel
Rf$SF43936 <- as.numeric(Rf$SF43936)/100/12 #dividimos entre 100 para dejar de hacerlo porcental y entre doce par que sea mensual
Convertimos RF a
Rf <- as.xts(Rf$SF43936, order.by = Rf$Fecha) #Lo convertimos a una serie de tiempo para manipular los datos
Rf <- to.monthly(Rf)
Rf <- Rf[,4] #escojimos la ultima columna
Rf <- Rf[-1,] #borramos la primela fila
Ya tenemos mis datos acomodados, para efectuar mi regresion linela, y calcular los parametros que necesito.
Rj será el exceso de rendimiento de mi activo con relacion a la tasa libre de riesgo
Rm sera el exce de rendimieto del mercado con relacion a la tasa libre de riesgo
Rj <- Return.excess(rend_mens_a,Rf)
plot(Rj)
Rm <- Return.excess(rend_mens_ipc, Rf)
plot(Rm)
CAMP <- lm(Rj~Rm) # - indica que es una funcino
summary(CAMP) # INTERCEPT = ALFA eso indica el desempeño de mi actiovo contra el mercado
##
## Call:
## lm(formula = Rj ~ Rm)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.115135 -0.029796 -0.002465 0.027906 0.221712
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.0005405 0.0071066 0.076 0.94
## Rm 1.0700568 0.1526095 7.012 2.39e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.0559 on 60 degrees of freedom
## Multiple R-squared: 0.4504, Adjusted R-squared: 0.4412
## F-statistic: 49.16 on 1 and 60 DF, p-value: 2.389e-09
#Rm es el BETA
#R-squared es el risgo sistematico de mi activo
Beta <- CAMP$coefficients[2]
Beta
## Rm
## 1.070057
Alpha <- CAMP$coefficients[1]
Alpha
## (Intercept)
## 0.000540532
Rc, representa el R-Cuadradro de la regresion que significa el porcentaje de cambio explicados en la variable dependeiente qie son consecuencua de la indepiente. En terminos de la regresion que estamos haciendo RC es el % del riesgo sistematico.
Rc <- 0.4504 #Multiple R-squared
La desviacion estandar de todo lo que modifica el excesso de rendimieto de mi activo que no se relaciona con el excesso del mercado. “Riesgo”
sigma_e <- 0.0559 #Residual standard error
El riesgo total de un activo, usando este modelo CAPM, a traves de la regresion lineal es equivalente a la siguiente realcion.
#Riesgo total de mi activo
RT <- sigma_e^2/(1-Rc)*100
RT
## [1] 0.5685608
Esto significa que el riesgo total de mi activo es de 0.432639%… Variasiones que puedes encontrar en el activo diariamente,
Sabemos que el riesgo se divide en dos partes, sistematico y no sistematico.
El sistematico esta dado por
Riesgo_NS <- (sigma_e^2)*100
Riesgo_NS
## [1] 0.312481
RIesgo de sistema
Riesgo_s <- RT-Riesgo_NS
Riesgo_s
## [1] 0.2560798
Si sacamos proporciones de Riesgo, tenemos lo siguiente
Riesgo_s/RT #es lo mismo que RC
## [1] 0.4504
Riesgo_NS/RT
## [1] 0.5496
Riesgo total = Son las perdidas o variaciones que esperamos del activo en sierto periodo de timepo.
library(tidyverse)
CAPM <- tibble('Riesgo Total'= paste(format(RT, digits=4),'%'), 'Riesgo Sistematico' = paste(format(Riesgo_s,digits=4),'%'), 'Riesgo No Sitematico'= Riesgo_NS, 'Porcentaje del riesgo Sistematico'= Riesgo_s/RT, 'Porcentaje del riesgo No Sistematico'= Riesgo_NS/RT, 'Beta'=Beta, 'Alpha'=Alpha)
CAPM
## # A tibble: 1 x 7
## `Riesgo Total` `Riesgo Sistematico` `Riesgo No Sitematico` `Porcentaje del r~`
## <chr> <chr> <dbl> <dbl>
## 1 0.5686 % 0.2561 % 0.312 0.450
## # ... with 3 more variables: `Porcentaje del riesgo No Sistematico` <dbl>,
## # Beta <dbl>, Alpha <dbl>