Interés compuesto con una app shiny en R

post-thumb

Índice

Este artículo ilustra el concepto general del efecto compuesto, luego las implicaciones financieras del interés compuesto y una calculadora de interés compuesto hecha con una app shiny en R.

Qué es el efecto compuesto

Como se explica en el libro The Compound Effect by Darren Hardy: https://amzn.to/3rymwkj

el efecto compuesto es el principio que permite obtener enormes beneficios desde una serie de decisiones pequeñas e inteligentes a lo largo del tiempo.

El beneficio exponencial del efecto compuesto se debe a una serie de acciones acumuladas a lo largo del tiempo … por ejemplo si produces videos de YouTube los ingresos que obtienes provienen de los nuevos videos que publicas más todos los anteriores.

Decisiones pequeñas e inteligentes + constancia + tiempo = DIFERENCIA RADICAL

En su libro, Darren Hardy da ejemplos de cómo aplicar el efecto compuesto al desarrollo personal, por ejemplo, aquí hay un par de frases que vale la pena recordar:

  • “Preparación (crecimiento personal) + Actitud (creencias / mentalidad) + Oportunidad + Acción (hacer algo al respecto) = Suerte”

  • “Si es difícil, vergonzoso o aburrido. Solo hazlo y basta. Y sigues haciéndolo, y la magia del Efecto Compuesto te recompensará generosamente”.

Interés compuesto

El efecto compuesto puede generar un rendimiento sustancial para tus inversiones personales con el interés compuesto. El enorme crecimiento debido al interés compuesto se produce porque la inversión genera ganancias no solo del capital invertido sino también del interés acumulado.

Por ejemplo, para una inversión de 100 euros a una tasa de interés del 10%, el interés generado al cabo de un año es de 10 euros (= 10% de 100 euros), pero en el segundo año el interés se calculará sobre el nuevo capital total de 110 euros, por lo tanto el interés será de 11 euros (= 10% de 110 euros) y así adelante…

Año Capital Interés ganado
1 100 10
2 110 11
3 121 12,1
4 133,1 13,31

Como dijo Warren Buffet: “Mi riqueza proviene de una combinación de vivir en los Estados Unidos, algunos geness afortunados y el interés compuesto”.

Podemos explicar mejor este concepto con un ejemplo: digamos que hay dos amigos, Tom y Jerry, que invierten la misma cantidad total de dinero pero durante un período de tiempo diferente.

Tom invierte 150 euro al mes con una tasa de interés del 5% durante 20 años y una inversión inicial de 5.000 euro, al final del período de 20 años depositó 41.000 euro con un total de 32.418 euro en intereses:

interés compuesto

Jerry, en cambio, invierte 100 euros al mes al 5% durante 30 años y una inversión inicial de 5000 euros, al final del período de 30 años depositó la misma cantidad total de 41.000 euros pero con un resultado total de 64.564 euros en intereses:

Por lo tanto, solamente por el mayor tiempo, la misma cantidad de inversión total genera un interés total más grande.

interés compuesto

Fórmula interés compuesto

Esta es la fórmula para calcular el interés compuesto con contribuciones mensuales al final de cada mes a intervalos mensuales compuestos.

Total = interés compuesto sobre la inversión inicial + valor futuro de los depósitos mensuales

Interés compuesto sobre la inversión inicial = $ PV \left(1 + \frac{r}{n}\right)^{(nt)}$

Valor futuro de los depósitos mensuales = $ MD \cdot \frac {(1+\frac{r}{n})^{(nt)}-1} {r/n} $

quindi

Total = $ PV \left(1 + \frac{r}{n}\right)^{(nt)}$ + $ MD \cdot \frac {(1+\frac{r}{n})^{(nt)}-1} {r/n} $

dónde

  • Total = importe total acumulado después de t años
  • i = tasa de interés
  • PV = valor de la inversión inicial actual
  • t = tiempo en años
  • n = 12 para los 12 meses del año
  • MD = depósitos mensuales

Interés simple

Con el interés simple, el interés ganado proviene únicamente del capital inicialmente invertido y el flujo de intereses no contribuye a aumentar el importe invertido.

Por ejemplo, la siguiente tabla muestra el flujo de caja de un bono con un interés fijo del 10% anual con un capital inicial de 100 euros. La diferencia con el interés compuesto es que el flujo de efectivo de interés generado por el bono no se suma al capital al comienzo de cada período.

Año Capital Interés ganado
1 100 10
2 100 10
3 100 10
4 100 10

Fórmula interés simple

Las variables en la fórmula de interés simple son solo la inversión inicial, el tiempo y la tasa de interés:

$Total = PV + (PV \cdot i \cdot t) $

dónde

  • Total = importe total acumulado después de t años
  • i = tasa de interés
  • PV = valor de la inversión inicial actual

Calculadora de interés compuesto con una app shiny en R

En el siguiente enlace es posible simular diferentes escenarios de inversión con una calculadora de interés compuesto hecha con una app shiny en R:

https://enricotips.shinyapps.io/compound_interest

Código de la calculadora de interés compuesto con la app shiny en R

Este es el código detrás de la app shiny en R:

---
title: "Compound interest"
output: 
  flexdashboard::flex_dashboard
runtime: shiny
---
knitr::opts_chunk$set(echo = FALSE)
library(dplyr)
library(tidyr)
library(DT)
library(highcharter)
library(shinyjs)
Inputs {.sidebar}
---------
useShinyjs(rmd = TRUE)

tags$style("#years {width:230px}")
label1 <- HTML(paste0("Select the number of ", strong("years"),":" ))
sliderInput(inputId="years", label =label1, value = 20, min=1, max=80)
# numericInput(inputId="years", label =label1, value = 20, min=0)

tags$style("#PV {width:230px}")
label2 <- HTML(paste0("Insert the ", strong("initial investment"),":" ))
numericInput(inputId="PV", label =label2, value = 5000, min=0)
# sliderInput(inputId="PV", label =label2, value = 5000, min=0, max=1000000)

tags$style("#i {width:230px}")
label3 <- HTML(paste0("Select the expected ", strong("interest rate")," in % per year:" ))
# numericInput(inputId="i", label =label3, value = 5, min=0)
sliderInput(inputId="i", label=label3, value = 5, min=1, max=30)

tags$style("#MD {width:230px}")
label4 <- HTML(paste0("Insert the ", strong("monthly deposit"),":" ))
numericInput(inputId="MD", label =label4, value = 500, min=0)
# sliderInput(inputId="MD", label =label4, value = 500, min=0, max=20000)

tags$style("#Calculate {width:230px}")
actionButton("Calculate", "Calculate", icon("calculator"), style="color: #fff; background-color: #337ab7; border-color: #2e6da4")

helpText(HTML(paste0(strong("All fields are required.")," The calculation is done with monthly contributions at the end of each month based on monthly compound intervals." )))
Column {.tabset}
-------
result <- eventReactive (input$Calculate,{
req(input$years)
req(input$i)
req(input$PV)
req(input$MD)

i <- input$i  
i <- i/100
PV <-input$PV
t <- input$years
n <- 12
MD <- input$MD

Balance_vector <- c()
for (y in 1:t){
Balance_partial <- PV*((1+i/n)^(n*y)) + MD *( ( ( (1 + i/n)^(n*y) ) - 1) / (i/n))
Balance_vector <- append(Balance_vector, Balance_partial) 
}
Balance_vector <- round(Balance_vector, 2)
Balance_vector <- c(PV, Balance_vector)

Deposit_vector <- rep(n * MD, t)
Deposit_vector <- c(PV, Deposit_vector)

year_vector <- 0:t

compound_df <- cbind(year_vector, Deposit_vector, Balance_vector)
compound_df <- as.data.frame(compound_df)

compound_df$total_deposits <- cumsum(compound_df$Deposit_vector)
compound_df <- compound_df %>% mutate(Total_interest=Balance_vector-total_deposits)
compound_df$Total_interest <- round(compound_df$Total_interest, 2)

compound_df$interest <- compound_df$Total_interest - lag(compound_df$Total_interest)
compound_df$interest <- compound_df$interest %>% replace_na(0)
compound_df$interest <- round(compound_df$interest, 2)

compound_df <- compound_df %>% select(year_vector, Deposit_vector, interest, total_deposits, Total_interest, Balance_vector)

names(compound_df) <- c("Year", "Deposits", "Interest", "Total Deposits", "Total Interest", "Balance")

number_rows <- t+1

list(compound_df=compound_df, number_rows=number_rows)
 })
### Plot
highchartOutput("plot") 
output$plot <-renderHighchart({ 
   
highchart() %>% 
hc_chart(type = "column") %>% 
hc_xAxis(title = list(text = "Years")) %>% 
hc_plotOptions(column = list(
   dataLabels = list(enabled = FALSE),
   stacking = "normal",
   enableMouseTracking = TRUE)
   ) %>% 
hc_series( list(name="Total Interest",data=result()[['compound_df']]$`Total Interest`, color="green"),
          list(name="Total Deposits",data=result()[['compound_df']]$`Total Deposits`, color="blue")
          )
   })
### Table
DT::dataTableOutput("compound_df_table") 

output$compound_df_table <-DT::renderDataTable(server = TRUE,(DT::datatable(
        result()[['compound_df']], rownames = FALSE,
        options = list(scrollY = '450px', pageLength = result()[['number_rows']], dom = 't', ordering=F) ) %>%formatRound(c("Deposits", "Interest", "Total Deposits", "Total Interest", "Balance"), digits = 2)   ) )
Compartir en:

DISCLOSURE: Los artículos pueden contener enlaces de afiliados. Si compras algo a través de uno de esos enlaces, es posible que obtenga una pequeña comisión, sin ningún costo adicional para ti.