Teoría de Markowitz en R : Cartera Tangencial

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

Dentro de la Teoría Moderna de Carteras de H.Markowitz hay varios tipos de portafolios que podemos crear. De uno de ellos ya hablé en el post anterior donde expliqué el porftolio de Media-Varianza .

Otro tipo es el llamado Tangencial, cuyo objetivo es encontrar aquella combinación de activos y pesos que maximiza el ratio de Sharpe. En este vídeo tienes un ejemplo en R usando pares de divisas. Más abajo tienes el código usado para copiarlo si lo deseas.

Codigo R

 

## CARTERA DE MARKOWITZ — TANGENCIAL


## CÓNOCIDA COMO MÁXIMO SHARPE


### entre todo el conjunto de posibilidades que tenemos
## elegiremos aquella — max atio sharpe


#install.packages(«quantmod»)

library(quantmod)

#getFX(«EUR/USD»)

library(«tseries»)

library(«fImport»)
library(«urca»)
library(«vars»)


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(«EURCAD=X»,src=»yahoo»,from = «2017-02-18»)

getSymbols(«CADCHF=X»,src=»yahoo»,from = «2019-01-01»)
getSymbols(«AUDNZD=X»,src=»yahoo»,from = «2019-01-01»)
getSymbols(«AUDUSD=X»,src=»yahoo»,from = «2019-01-01»)
getSymbols(«EURCHF=X»,src=»yahoo»,from = «2019-01-01»)
getSymbols(«EURGBP=X»,src=»yahoo»,from = «2019-01-01»)
getSymbols(«EURCAD=X»,src=»yahoo»,from = «2019-01-01»)

 

CADCHF= `CADCHF=X`[,4] # precios diarios de cierre
AUDNZD= `AUDNZD=X`[,4]
AUDUSD= `AUDUSD=X`[,4]
EURCHF= `EURCHF=X`[,4]
EURGBP= `EURGBP=X`[,4]
EURCAD= `EURCAD=X`[,4]


#### tabla

forex_mark <-na.omit(cbind(CADCHF,AUDNZD,AUDUSD,EURCHF,EURGBP,EURCAD))

plot(forex_mark)

#Calculamos los retornos y x 100 para calcularlos en %

forex_mark_ret=na.omit(returns(forex_mark))
forex_mark_ret = 100 * forex_mark_ret

Forex_ret<-as.timeSeries(forex_mark_ret)

names(Forex_ret)<- cbind(«CADCHF»,»AUDNZD»,»AUDUSD»,»EURCHF»,»EURGBP»,»EURCAD»)

plot(Forex_ret)

apply(Forex_ret,2,mean) #♠ media diaria


assetReturns <- Forex_ret[, 1:6]
names(assetReturns)


#### pasarlo a positivo y hacer con longonly


#### codigo sharpe


library(quadprog)


portfolioWeights <- function(assetReturns, targetReturn)
{
nAssets = ncol(assetReturns)
portfolio = solve.QP(
Dmat = cov(assetReturns),
dvec = rep(0, times=nAssets),
Amat = t(rbind(Return=colMeans(assetReturns),
Budget=rep(1, nAssets))), #LongOnly=diag(nAssets)
bvec = c(Return=targetReturn, budget=1),
#LongOnly=rep(0, times=nAssets)),
meq=2)
weights = portfolio$solution
weights
}

 


tangencyPortfolio <- function (assetReturns, riskFreeRate=0)
{
# 1 Función de cálculo del Sharpe Ratio:

sharpeRatio <- function(x, assetReturns, riskFreeRate)
{
targetReturn = x
weights = portfolioWeights(assetReturns, targetReturn)
targetRisk = sqrt( weights %*% cov(assetReturns) %*% weights )[[1]]
ratio = (targetReturn – riskFreeRate)/targetRisk
attr(ratio, «weights») <- weights
attr(ratio, «targetRisk») <- targetRisk
ratio
}

# 2 Optimización :

nAssets = ncol(assetReturns)
mu = colMeans(assetReturns)
Cov = cov(assetReturns)
tgPortfolio <- optimize(
f=sharpeRatio, interval=range(mu), maximum=TRUE,
assetReturns=assetReturns, riskFreeRate=riskFreeRate)

# 3 Salida y caracteristica:

tgReturn = tgPortfolio$maximum
tgRisk = attr(tgPortfolio$objective, «targetRisk»)
tgWeights = attr(tgPortfolio$objective, «weights»)
sharpeRatio = sharpeRatio(tgReturn, assetReturns, riskFreeRate)[[1]]
# Return Value:
list(
sharpeRatio=sharpeRatio,
tgRisk=tgRisk, tgReturn=tgReturn, tgWeights=tgWeights)
}



tangencyPortfolio(assetReturns, riskFreeRate = 0)


tangencial<- tangencyPortfolio(assetReturns, riskFreeRate = 0)

tangencial$tgWeights*100


sum(tangencial$tgWeights)

apply(Forex_ret,2,mean) #♠ media diaria





abs(tangencial$tgWeights)*100


sum(abs(tangencial$tgWeights))*100

456.4795/100

pesos_equi<- abs(tangencial$tgWeights)*100/4.5647
pesos_equi

sum(pesos_equi)

Deja una respuesta

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