# installa e carica il pacchetto "YieldCUrve" install.packages("YieldCurve") library(YieldCurve) # carica il data set "ECBYieldCurve" che contiene una matrice # con tassi (intensita') spot (in %) di government bonds e AAA companies forniti dalla ECB # ogni riga contiene i tassi per scadenze 3, 6 mesi, da 1 a 30 anni (32 scadenze), r(t,t + Delta) # tassi dal 2006-12-29 al 2009-07-24 (655 osservazioni) data("ECBYieldCurve") # serie temporale dei tassi a 3m ECBYieldCurve[, 1] plot(ECBYieldCurve[, 1], main = "3 months rate") # curva dei tassi al 27/12/2006 ECBYieldCurve[1, ] # scadenze mat.ECB <- c(3/12, 6/12, 1 : 30) # plot curva dei tassi al 27/12/2006 plot(mat.ECB, ECBYieldCurve[1, ], type = "b", xlab = "scadenze", ylab = "tassi", main = "Struttura per scadenza - 27/12/2006") # seleziona alcune date (scadenze settimanali) dates.fit <- seq(1, 655, by = 7) # fitta Nelson-Siegel in corrispondenza a queste date Nelson.Siegel.fit <- Nelson.Siegel(rate = ECBYieldCurve[dates.fit, ], maturity = mat.ECB) # calcola tassi fittati su una griglia di scadenze mat.ECB.new <- c(seq(0, 1, by = 1/12), 2 : 10, seq(10, 50, by = 5)) y <- NSrates(Nelson.Siegel.fit, mat.ECB.new) # plot dei tassi al 9/1/2007 index(ECBYieldCurve[dates.fit[2], ]) #[1] "2007-01-9" plot(mat.ECB, ECBYieldCurve[dates.fit[2], ], main = "Fitting Nelson-Siegel", type = "o", xlab = "scadenza", ylab = "tasso") # plot della curva fittata lines(mat.ECB.new, y[2, ], col = "red") # aggiungi legenda legend("bottomright", legend = c("osservata", "fittata"), col = c("black", "red"), lty = 1, bty = "n") grid() # serie temporale dei tassi a lungo r(oo) = beta_0 # e dei tassi a breve r(0) = beta_0 + beta_1 plot(Nelson.Siegel.fit[, "beta_0"], type = "o", main = "tassi a breve e a lungo") lines(Nelson.Siegel.fit[, "beta_0"] + Nelson.Siegel.fit[, "beta_1"], type = "o", col = "red") # installa e carica il pacchetto per animazioni install.packages("animation") library(animation) ani.record(reset = TRUE) # pulisce la history prima di registrare plot.rates <- function() { for (i in 1 : length(dates.fit)) { plot(mat.ECB.new, y[i, ], main = paste("Fitting Nelson-Siegel: ", index(y[i, ])), type = "l", ylim = c(0, 5), xlab = "scadenza", ylab = "tasso", lwd = 2) ani.record() # registra } } plot.rates() oopts = ani.options(interval = 0.5) # intervallo tra frames ani.replay() ## HTML animation page Binomial n = 20, p = 0.1 saveHTML({ par(mar = c(3, 3, 1, 0.5), mgp = c(1.5, 0.5, 0), tcl = -0.3) ani.options(interval = 0.5, nmax = ifelse(interactive(), 50, 10)) plot.rates }, img.name = "fitted_NS", htmlfile = "fitted_NS.html", ani.height = 500, ani.width = 600, title = "Strutture per scadenza fittate con Nelson-Siegel", description = "L'animazione mostra le curve dei tassi fittate con Nelson-Siegel al variare della data") # ripetere l'esercizio usando le istruzioni # per il fit: Svensson # per calcolare i tassi: Srates # altri pacchetti per il fitting di Nelson-Siegel & Svensson: # termstrc # fBonds # NMOF # RQuantLib