-
Notifications
You must be signed in to change notification settings - Fork 2
/
MDUE_CostosTransaccion.R
116 lines (76 loc) · 2.58 KB
/
MDUE_CostosTransaccion.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# Si no está instalado, instalamos el paquete "pacman"
if ( !require("pacman") ) install.packages("pacman")
# Instalamos y Cargamos los paquetes necesarios
pacman::p_load( tidyverse, NlcOptim)
# carga de datos
data <- read.csv("raw_data/retornos.csv")[,-1]
#Lectura de su estructura
class(data)
str(data)
# vector fila de ceros: limite inferior que puede adoptar 'x'
v0 <- rep(0,dim(data)[2])
# class(v0)
# dim(v0)
# length(v0)
# vector fila de unos: limite superior que puede adoptar 'x'
v1 <- rep(1, dim(data)[2])
# class(v1)
# dim(v1)
# length(v1)
# vector fila de Condicion Inicial de tenencias: un guess de 'x'
v2 <- t(c(1, 0, 0, 0))
# class(v2)
# dim(v2)
# length(v2)
# Vector columa de costos de transaccion para cada activo.
k <- t(t(c(0.005, 0.026, 0.042, 0.062)))
# k <- t(t(c(0, 0, 0, 0)))
# class(k)
# dim(k)
# length(k)
# vector fila de unos
f <- t(rep(1, dim(data)[1]))
# class(f)
# dim(f)
# length(f)
# funcion de utilidad exponencial negativa sobre los retornos
# Tiene un -1 adelante porque la funcion "solnl" MINIMIZA, y nosotros estamos buscando un maximo.
eval_f <- function(x) {
return(
# x <- c(0, 0.639427, 0.115038, 0.245536) # para chequear que la funcion de un numero como resultado.
-1 * ( (1/n) * (f %*% t( -exp (-j*( f + x %*% t(data) - as.numeric(abs(x-v2) %*% k) ))
)
)
)
)
}
n <- dim(data)[1]
demandas <- data.frame()
# j es la aversión al riesgo que vamos a probar para 5 valores:
for (j in 1:5){
T1 <- solnl( X = v2,
objfun = eval_f,
Aeq = t(v1),
Beq = 1,
lb = v0,
ub = v1
)
demandas <- rbind(demandas, round(T1$par,6))
}
colnames(demandas) <- colnames(data)
demandas$aversion_riesgo <- c(1,2,3,4,5)
demandas_aux <- gather(demandas, -5, key = 'activo', value = 'tenencia')
ggplot(demandas_aux,
aes(x = aversion_riesgo, y = tenencia, color=activo))+
geom_line() + geom_point() +
labs(title = "Optimización de cartera",
subtitle = "Tenencias óptimas de activos para distintos niveles de averisón al riesgo",
caption = "Fuente: Tesis Doctoral de Eduardo Ariel Corso") +
theme_bw() +
theme(legend.position="top",
panel.border = element_blank(),
plot.title = element_text(face="bold",hjust =0.5),
plot.subtitle = element_text(hjust =0.5),
plot.caption = element_text(size=8, colour = "gray40", hjust =1),
axis.title = element_blank(),
panel.grid.minor = element_blank())