- Medidas Estadísticas de Dispersión Relativa - junio 11, 2024
- Modelos SARIMA(Arima Estacionales).¿Qué son y cómo usarlos para Predecir? - enero 4, 2024
- ¿Qué es el RUIDO BLANCO ? Econometría en R - junio 21, 2023
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)