Ejemplo de cartera de fondo de inversión en R

| Última modificación: 10 de octubre de 2024 | Tiempo de Lectura: 3 minutos

Algunos de nuestros reconocimientos:

Premios KeepCoding

En este artículo te mostraremos un ejemplo de cartera de fondo de inversión en R para minimizar la varianza.

Cartera de fondo de inversión en R

Partimos de varios fondos de inversión y queremos una cartera que nos maximice el retorno medio en un año mientras minimiza la varianza. Para ello, buscamos calcular unos coeficientes que nos digan qué porcentaje de nuestra cartera corresponde a cada fondo de inversión en R.

Cargamos la cartera de fondo de inversión en R con la rentabilidad a un año vista:

In [132]: funds <- read.csv ('data/fondos_inversion.csv')
funds$date <- as.Date(funds$date)

In [133]: head (funds)
datefondo.1fondo.2fondo.3fondo.4fondo.5fondo.6fondo.7fondo.8fondo.9fondo.22fondo.23fondo.24fondo.25
<date><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl>
12015-04-171.2426261.4504981.2838211.2837201.5216071.5216401.3510851.2420521.2138781.4400021.3421621.8287621.348290
22015-04-181.242626
1.4504981.2838211.2837201.5216071.5216401.3510851.2420521.2138781.2138781.3421621.8287621.348290
32015-04-191.242626
1.4504981.2838211.2837201.5216071.5216401.3510851.2420521.2138781.2138781.3421621.8287621.348290
42015-04-201.2532861.4666061.2659391.2688151.5166621.5166961.3515251.2526151.2263821.4552061.3266551.7822501.339593
52015-04-211.2594901.4574081.2780231.2780351.5360471.5360771.3478791.2588991.2316481.4542981.3390611.8294591.348979
62015-04-221.2428911.4604471.2698611.2697871.5576591.5576591.3441931.2422871.2125251.4481071.3352521.8611521.357175

Esto lo podemos pintar así:

In [135]: library (ggplot2)
ggplot (funds, aes(x = date)) + geom_line (aes (y = fondo.1.color = "fondo1")) + geom_line (aes (y = fondo.2, color = "fondo2"))
fondo de inversión en R
In [136] : df_subset <- funds
df_subset$date <- NULL

Queremos optimizar un retorno máximo y una varianza mínima de nuestro portafolio:

Dadas las variables:

Queremos encontrar los coeficientes c1, de forma que la siguiente función sea mínima:

Debe cumplir las siguientes limitaciones:

In [137]: library(pracma)
variance_importance <- 100

roi_optim <- function (coefs) {
mn <- mean (rowSums (repmat (coefs, nrow(df_subset),1) * df_subset))
vr <- var (rowSums (repmat (coefs, nrow(df_subset), 1) * df_subset)) 
return (-mn/exp (1 + variance_importance * vr))
#return (mn)
}
constrain_func <- function (coefs) {
sum(coefs)
}
In 11: x0 <- rep(1/ncol (df_subset), ncol (df_subset)) #Valor inicial de los coeficientes
lx <- rep (0, lenght (x0)) #Valor mínimo de los coeficientes
ux <- rep (1, lenght (x0)) #Valor máximo de los coeficientes
soll <- Rsolnp :: solnp (x0, fun = roi_optim, eqfun = constrain_func, eqB = 1, LB = lx, UB = ux)

In [139] : lx

0- 0- 0- 0- 0- 0- 0- 0- 0- 0- 0- 0- 0- 0- 0- 0- 0- 0- 0- 0- 0- 0- 0- 0- 0- 0- 0- 0- 0- 0- 0-

In [140]: ux

1- 1- 1- 1- 1- 1- 1- 1- 1- 1- 1- 1- 1- 1- 1- 1- 1- 1- 1- 1- 1- 1- 1- 1- 1- 1- 1- 1- 1- 1- 1-

In [141] : soll$pars

8.51600458131105e-08 – 2.37396166066272e-08 – 9.80498626556178e-09 – 9.79624168211611e-09 – 7.55872530855147e-08 – 3.81844795504704e-05 – 0.115153571187694 – 2.37490219608833e-08 – 3.36953190604144e-08 – 2.84152953887565e-08 – 8.55404748007717e-08 – 2.99134401863966e-08 – 3.60547670800086e-08 1.76651394740702e-08 – 2.42111850443934e-08 – 2.8458842850002e-08 – 3.00636014668393e-08 – 0.357986118890563 – 0.329013969300045 – 3.4446595251685e-08 – 3.44991721343077e-08 – 7.15215851504688e-08 – 2.6623767557937e-08 – 1.10224127479035e-06 – 2.45417759315134e-08 – 1.9613507034608e-11 – 0.197804682962264 – 155764146919459e-06 – 3.54567273528448e-08 – 3.53159129983526e-08 – 9.01675885049376e-09

In [ ]: coefs <- soll$pars
names (coefs) <- colnames (df_subset)
coefs <- round (coefs [coefs > 1e - 2], 4)
coefs <- coefs/sum (coefs)

In [ ] : coefs

Para calcular el fondo de inversión en R agregado resultante sería:

In [142]: coefs <- soll$pars
names (coefs) <- colnames (df_subset)
coefs <- round (coefs [coefs > le-2], 4)
coefs <- coefs/sum (coefs)

In [143]: coefs

fondo.10: 0 1152

fondo.15: 0.329

fondo.19: 0.358

fondo.20: 0.1978

In [144] : funds ["portfolio"] <- as.matrix (funds [names (coefs) ] ) %*% coefs

In [145] : head (funds)
In [146] : ggplot (funds, aes(x=date)) + geom_line (aes (y = portfolio, color = "minima varianza")) +
geom_line (aes (y = fondo.10, color = "fondo 10"))+
geom Line (aes (y-fondo.15.color="fondo.15"))+
geom_line (aes (y = fondo.19, color = "fondo, 19))+
geom line (aesty-fondo.28.color" fondo.20"))
In [147]: 10 ^ (colMeans (log10 (funds [c ("portfolio", names (coefs)) ] ) ))

portfolio: 1.0577233152499

fondo.10: 1.04435252394117

fondo.15: 1.07308781575452

fondo. 19: 1.04087504856109

fondo.20: 1.03798441709755

In 1: apply (funds [c ("portfolio", names (coefs))], 2, var)

portfolio: 0.00439885329302952

fondo.10: 0.0192770515898909

fondo.15: 0.0106828702655021

fondo. 19: 0.00767870804654685

fondo.20: 0.015899536378032

En este artículo hemos visto un ejemplo de cartera de fondo de inversión en R para minimizar la varianza. Para ello, juntamos varios fondos de inversión. Lo que buscamos con ellos es una cartera que nos maximice el retorno medio a un año mientras minimiza la varianza del mismo.

Hemos calculado los coeficientes que nos muestran el porcentaje de nuestra cartera que corresponde a cada fondo de inversión en R.

Recuerda que este tema y muchos otros forman parte de nuestro Bootcamp en Big Data, una formación intensiva en la que podrás aprender, en tan solo 8 meses, todo lo necesario para incursionar en el prolífico mercado laboral del Big Data. ¡Anímate a preguntar para obtener más información, te esperamos!

Sandra Navarro

Business Intelligence & Big Data Advisor & Coordinadora del Bootcamp en Data Science, Big Data & Machine Learning.

Posts más leídos

¡CONVOCATORIA ABIERTA!

Big Data, IA & Machine Learning

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado