# pacchetto lIfecOntingencies # calcoli finanziari e attuariali install.packages("lifecontingencies") library(lifecontingencies) ######################## # funzioni finanziarie # ######################## # intensity2Interest # converte intensita' in tasso intensity2Interest(0.05) # exp(delta * t) = (1 + i) ^ t # uguale a exp(0.05) - 1 # interest2Intensity # converte tasso in intensita' interest2Intensity(i = 0.03) # uguale a log(1 + 0.03) # interest2Discount # converte tasso d'interesse in tasso di sconto interest2Discount(i = 0.04) # uguale a 0.04 / (1 + 0.04) # discount2Interest # converte tasso di sconto in tasso d'interesse ) # uguale a 0.07 / (1 - 0.07) # convertible2Effective(i, k = 1, type = "interest") # converte tasso convertibile k volte all'anno in tasso annuo convertible2Effective(i = 0.05, k = 12, type = "interest") # uguale a (1 + 0.05 / 12) ^ 12 - 1 # 1 + i = (1 + ik) ^ k; ik * k # effective2Convertible(i, k = 1, type = "interest") # converte tasso annuo in tasso convertibile k volte all'anno effective2Convertible(i = 0.1, k = 4, type = "interest") # uguale a 4 * ( (1 + 0.1) ^ (1 / 4) - 1 ) # presentValue(cashFlows, timeIds, interestRates, probabilities, power = 1) # valore attuale di un insieme di importi # valore attuale di 100 fra 5 anni al 3% presentValue(cashFlows = 100, timeIds = 5, interestRates = 0.03) # valore attuale di 100 fra 5 anni al 3% con prob. di insolvenza 20% presentValue(cashFlows = 100, timeIds = 5, interestRates = 0.03, probabilities = 0.8) 100 * (1 + 0.03) ^ (-5) * 0.8 # valore attuale di 100, 200, 300 fra 2, 3, 5 anni al 3% presentValue(cashFlows = c(100, 200, 300), timeIds = c(2, 3, 5), interestRates = 0.03) sum(c(100, 200, 300) * (1 + 0.03) ^ (-c(2, 3, 5))) # prezzo di un coupon bond con tasso cedolare pari a 2, nominale 100, cedole semestrali, scadenza 15 anni, prossima cedola fra 6 mesi # struttura per scadenza # i(0, t) = 0.01 + 0.002 * t flussi <- c(rep(2, 29), 102) epoche <- seq(from = 0.5, to = 15, by = 0.5) # seq(from = 0.5, to = 15, length.out = 30) i0t <- function(t)0.01 + 0.002 * t presentValue(cashFlows = flussi, timeIds = epoche, interestRates = i0t(epoche)) presentValue(cashFlows = flussi, timeIds = epoche, interestRates = 0.01 + 0.002 * epoche) sum(flussi * (1 + 0.01 + 0.002 * epoche) ^ (- epoche)) # annuity(i, n, m = 0, k = 1, type = "immediate") # valore attuale di una rendita # i = tasso di interesse (o vettore di tassi) # n = numero di anni # m = differimento # k = frazionamento # type = "immediate" (posticipata), = "due" (anticipata) # durata 10 anni, frequenza mensile, posticipata, rata 100 (per anno), tasso 10% 100 * annuity(i = 0.1, n = 10, k = 12, type = "immediate") # durata 10 anni, frequenza mensile, anticipata, rata 100 (per anno), tasso 10% 100 * annuity(i = 0.1, n = 10, k = 12, type = "due") presentValue(cashFlows = 100 * annuity(i = 0.1, n = 10, k = 12, type = "due"), timeIds = 1 / 12, interestRates = 0.1) # durata 10 anni, differita 5 anni, frequenza mensile, posticipata, rata 100 (per anno), tasso 10% 100 * annuity(i = 0.1, n = 10, m = 5, k = 12, type = "immediate") presentValue(cashFlows = 100 * annuity(i = 0.1, n = 10, k = 12, type = "immediate"), timeIds = 5, interestRates = 0.1) # accumulated(i, n, m = 0, k = 1, type = "immediate") # montante di una rendita # increasingAnnuity(i, n, type = "immediate") # valore attuale di una rendita crescente # decreasingAnnuity(i, n,type="immediate") # valore attuale di una rendita decrescente # duration(cashFlows, timeIds, i, k = 1, macaulay = TRUE) duration(cashFlows = 100, timeIds = 3, i = 0.04, macaulay = FALSE) duration(cashFlows = 100, timeIds = 3, i = 0.04, macaulay = TRUE) / (1 + 0.04) # duration di un coupon bond : proprieta' durationCB <- function(tassocedolare, nominale = 100, i, n, frequenza = 1){ flussi <- c(rep(tassocedolare * nominale, n * frequenza - 1), (1 + tassocedolare) * nominale) epoche <- seq(1 / frequenza, n, by = 1 / frequenza) duration(cashFlows = flussi, timeIds = epoche, i = i, macaulay = FALSE) } # la duration di un CB decresce con il tasso d'interesse (TIR) d1 <- Vectorize(FUN = durationCB, vectorize.args = "i") plot(d1(tassocedolare = 0.04, i = seq(from = 0.01, to = 0.1, by = 0.01), n = 10)) # la duration di un CB decresce con il tasso cedolare d2 <- Vectorize(FUN = durationCB, vectorize.args = "tassocedolare") plot(d2(tassocedolare = seq(from = 0.01, to = 0.2, by = 0.01), i = 0.05, n = 10)) # la duration di un CB # cresce con la durata, se i <= tassocedolare # prima cresce poi decresce se i > tassocedolare durate <- seq(from = 1, to = 201, by = 10) d3 <- Vectorize(FUN = durationCB, vectorize.args = "n") plot(durate, d3(tassocedolare = 0.02, i = 0.04, n = durate), type = "l", xlab = "durata", ylab = "duration") lines(durate, d3(tassocedolare = 0.04, i = 0.04, n = durate), type = "l", xlab = "durata", ylab = "duration", lty = 2) lines(durate, d3(tassocedolare = 0.06, i = 0.04, n = durate), type = "l", xlab = "durata", ylab = "duration", lty = 3) # regole di calcolo dei giorni e convezioni sui giorni lavorativi ?as.Date install.packages("RQuantLib") library(help = RQuantLib) dates <- seq(from = as.Date("07/04/2009", format = "%d/%m/%y"), to = as.Date("14/04/2009", format = "%d/%m/%y"), by = 1) isBusinessDay(calendar = "UnitedStates", dates = dates) isBusinessDay(calendar = "UnitedStates/NYSE", dates = dates) isHoliday isWeekend(calendar = "UnitedStates", dates = dates) isWeekend(calendar = "UnitedStates/NYSE", dates = dates) isEndOfMonth getEndOfMonth(calendar = "UnitedStates", dates = dates + 20) adjust(calendar = "UnitedStates", dates = dates) businessDaysBetween(calendar = "UnitedStates", from = dates[1], to = dates[8]) dayCount(startDates = dates[1], endDates = dates[8], dayCounters = 1) yearFraction(startDates = dates[1], endDates = dates[8], dayCounters = 0)