Interesse composto con un'app shiny in R

post-thumb

Indice

Questo articolo illustra il concetto generale dell’effetto composto, quindi le implicazioni finanziarie dell’interesse composto ed infine un calcolatore dell’interesse composto realizzato con un’app shiny in R.

Cosa è l’effetto composto

Come spiegato nel libro The Compound Effect by Darren Hardy: https://amzn.to/3rymwkj

l’effetto composto è il principio per ottenere enormi benefici da una serie di piccole ed intelligenti scelte nel tempo.

Il beneficio esponenziale dell’effetto composto è dovuto ad una serie di azioni accumulate nel tempo…per esempio se produci video su YouTube il reddito che ottieni proviene dai nuovi video che pubblichi più da tutti quelli precedenti.

Piccole ed intelligenti scelte + costanza + tempo = DIFFERENZA RADICALE

Nel suo libro Darren Hardy fornisce esempi su come applicare l’effetto composto allo sviluppo personale, per esempio qui ci sono un paio di frasi che vale la pena ricordare:

  • “Preparazione (crescita personale) + Atteggiamento (convinzione / mentalità) + Opportunità + Azione (fare qualcosa al riguardo) = Fortuna”

  • “Se è difficile, imbarazzante o noioso. Fallo e basta. E continua a farlo, e la magia dell’Effetto Composto ti ricompenserà generosamente.”

Interesse composto

L’effetto composto può generare un notevole ritorno sui tuoi investimenti personali con l’interesse composto. L’enorme crescita dovuta all’interesse composto avviene perché l’investimento cres guadagni non solo dal capitale investito ma anche dagli interessi accumulati.

Ad esempio, per un investimento di 100 euro ad un tasso di interesse del 10%, l’interesse generato dopo un anno è di 10 euro (= 10% di 100 euro), ma al secondo anno gli interessi verranno calcolati sul nuovo capitale totale di 110 euro, quindi l’interesse sarà di 11 euro (= 10% di 110 euro) e così via …

Anno Capitale Interesse guadagnato
1 100 10
2 110 11
3 121 12,1
4 133,1 13,31

Come disse Warren Buffet: “La mia ricchezza deriva da una combinazione di vivere in America, alcuni geni fortunati e l’interesse composto”

Possiamo spiegare meglio questo concetto con un esempio: diciamo che ci sono due amici, Tom e Jerry, che investono la stessa somma di denaro totale ma in un arco di tempo diverso.

Tom investe per 20 anni 150 euro al mese al 5% e un investimento iniziale di 5000 euro, alla fine del periodo di 20 anni ha depositato 41.000 euro con un ottenendo in totale 32.418 euro in interessi:

interesse composto

Jerry invece investe per 30 anni 100 euro al mese al 5% e un investimento iniziale di 5000 euro, alla fine del periodo di 30 anni ha depositato lo stesso importo complessivo di 41.000 euro ma con un risultato totale di 64.564 euro in interessi:

Pertanto, proprio a causa del tempo più lungo, la stessa quantità di investimenti totali genera interessi molto più elevati.

interesse composto

Formula interesse composto

Questa è la formula per calcolare l’interesse composto con contributi mensili alla fine di ogni mese sulla base di intervalli composti mensili.

Totale = Interesse composto sull’investimento iniziale + Valore futuro dei depositi mensili

Interesse composto sull’investimento iniziale = $ PV \left(1 + \frac{r}{n}\right)^{(nt)}$

Valore futuro dei depositi mensili = $ MD \cdot \frac {(1+\frac{r}{n})^{(nt)}-1} {r/n} $

quindi

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

dove

  • Totale = importo totale accumulato dopo t anni
  • i = tasso di interesse
  • PV = valore attuale investimento iniziale
  • t = tempo in anni
  • n = 12 per i 12 mesi in un anno
  • MD = depositi mensili

Interesse semplice

Con l’interesse semplice, l’interesse maturato proviene solo dal capitale inizialmente investito ed il flusso degli interessi non contribuisce all’importo totale maturato.

Ad esempio, la tabella seguente mostra il flusso di cassa di un’obbligazione con un interesse fisso del 10% annuo con un capitale iniziale di 100 euro. La differenza con l’interesse composto è che il flusso di cassa degli interessi generati dall’obbligazione non va ad aggiungersi al capitale all’inizio di ogni periodo.

Anno Capitale Interesse guadagnato
1 100 10
2 100 10
3 100 10
4 100 10

Formula interesse semplice

Le variabili nella formula per l’interesse semplice sono solo l’investimento iniziale, il tempo e il tasso di interesse:

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

dove

  • Totale = importo totale accumulato dopo t anni
  • i = tasso di interesse
  • PV = valore attuale investimento iniziale

Calcolatore interesse composto con un’app shiny in R

Al seguente link è possibile simulare diversi scenari di investimento con un calcolatore di interesse composto realizzato con un’app shiny in R:

https://enricotips.shinyapps.io/compound_interest

Codice per il calcolatore dell’interesse composto l’app shiny in R

Questo è il codice dietro l’app shiny in 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)   ) )
Condividi su:

DISCLOSURE: Gli articoli possono contenere link di affiliazione. Se acquisti qualcosa tramite uno di questi link, potrei ricevere una piccola commissione, senza alcun costo aggiuntivo per te.