Diebold - Li improvement

Premesso che finora ho fatto solo girare il filtro senza niente annesso, la macchina su cui sto lavorando adesso ha un Intel Xeon X5560 a 2.80 GHz e 3.00 GB di RAM.

La serie elaborata è una matrice 109 x 10 (109 mesi a partire dal marzo 2003 e 10 tassi di rendimento per ogni mese che costituiscono la yield curve).

Far girare il filtro finora è stato pressochè istantaneo, nell'ordine del mezzo secondo.

Ho il presentimento che quando si inizierà a fare sul serio le cose peggioreranno.

Sappiate che mi sto convincendo ad arrendermi.

Stiamo rasentando pericolosamente il limite oltre il quale i potenziali benefici non ripagano lo sforzo, ovvero il sottoscritto ha bisogno di impratichirsi col filtro di Kalman e la rappresentazione spazio-stato prima di stare dietro a Koopman.

Per ora (probabilmente domani) mi limiterò a includere nel modello che avevo già elaborato le tre variabili macroeconomiche suggerite da Diebold, Rudebusch e Aruoba e produrre un VAR di ragguardevoli dimensioni.

Se in futuro acquisirò maggiore dimestichezza con il filtro di Kalman con grandezze vettoriali/matriciali, ci torno su.


Pago pizza che includerle o non includerle quando serve cambia poco.

(e manco so quali sono le tre variabili macro..ergo magari sparo una sentenza senza motivazioni..ma sarei veramente sorpreso della scoperta di ben tre predittori efficienti)

Poi controlli le differenze Cren?:)
 
(e manco so quali sono le tre variabili macro..ergo magari sparo una sentenza senza motivazioni..ma sarei veramente sorpreso della scoperta di ben tre predittori efficienti)
«[...] Our measures of the economy include three key variables: manufacturing capacity utilization; the federal funds rate; annual price inflation.»​

Almeno un po' di logica sembra esserci.
 
Sto solo facendo girare il filtro, sono ancora alle fasi preliminari ma è opportuno appurarne fin da subito la correttezza.

Vado subito a vedere perchè effettivamente ho necessità di reimpostare il sistema spazio-stato di Diebold, Rudebusch e Aruoba nella forma classica

gif.latex


Per quanto riguarda mu:

a_t+1 = (I - mu)*T + T*a_t + H*eta_t

se poi non ti frega di conoscere mu (I-mu)*T diventa poi che una semplice costante di un VAR(1).

Nota sulla complessità computazionale:
ho lavorato un po' con questa letteratura... Il problema come hai già visto non è il kalman, anche a dimensioni elevate quello gira alla svelta, sono le massimizzazioni della likelihood che sono toste perché ci sono tanti parametri, un mare di parametri. Come riportato in koopman il modello base (DRA senza macro fattori) sono già la bellezza di 36 parametri vincolando la matrice di varianza della measurement equation a essere diagonale.
Bisogna intendersene non poco di ottimizzazione per stimare sti modelli e diventa poi una sfida col computer dai dubbi risvolti pratici (ed a questi mi sembra che sei interessato). Il modello base comunque non è impossibile stimarlo... quello di koopman... mi sa che è meglio chiedere a lui qualche dritta :D.

Per verificare l'implementazione del kalman se vuoi ti posso fare avere i dati di Diebold, ci ficchi dentro i parametri riportati nel paper già ottimizzati e lì non ci scappi ti deve venire uguale :)
 
Per quanto riguarda mu:

a_t+1 = (I - mu)*T + T*a_t + H*eta_t

se poi non ti frega di conoscere mu (I-mu)*T diventa poi che una semplice costante di un VAR(1).
Ok, perfetto; nel filtro di Kalman che uso è possibile specificare una costante sia per la transition sia per la measurement equation, il problema è che ieri ho smanettato ancora un po' con dati finanziari e probabilmente non ho ancora capito bene come usarlo.

Nella fattispecie ho costruito un polinomio spazio-stato di primo grado (una retta) di cui ottimizzare le due matrici di covarianza su un campione di VIX settimanale che ho preso a caso, successivamente ho seguito passo a passo la procedura di ottimizzazione dei parametri mediante MLE per arrivare a poter fare il famoso "smoothing".

Ebbene, i valori cambiano in funzione dell'estensione del campione, quindi guarda al futuro.

Ergo ho sbagliato qualcosa fin da principio.

Tu saresti così gentile da elaborarci un piccolo tutorial, o segnalarci una guida per principianti, sugli utilizzi del filtro con le serie storiche sia per quanto riguarda la stima di fattori latenti tempo-varianti sia come filtro?

Il funzionamento del filtro e la rappresentazione spazio-stato sono chiare, ma non capisco come calare questa rappresentazione e il filtro all'interno di una procedura di stima di parametri o di uno smoothing.

Nel frattempo, tornato in ufficio questo pomeriggio dal Salone del Risparmio, ho fissato λ sulla base del campione (*) e ho aggiunto produzione industriale, tasso BCE e inflazione italiana ai parametri Nelson-Siegel stimati al solito modo (procedura "two step") sulla serie storica della yield curve BTP.

Purtroppo da regolamento non posso darvi il link ai passaggi precedenti perchè risiedono su un altro forum, ma suppongo che qualche parola mirata in Google ci rimandi subito ;)

(*) Avrete già capito che la scelta è obbligata perchè non mi posso permettere di avere un oggetto tempo variante come quello col suo profilo seghettato all'interno del VAR, almeno finchè non lo tratto da fattore latente.

Vediamo allora cosa ci dice il nostro modello VAR; dopo la prima stima del VAR con ritardi selezionati secondo AIC, ho fatto una seconda stima escludendo quelle variabili con t-ratio < 2:
  • produzione industriale in calo & boccheggio;
  • tassi d'interesse pressochè stazionari;
  • inflazione che non accenna a diminuire.
E' il caso di dare un'occhiata alla forma della curva BTP...
 

Allegati

  • img.png
    img.png
    10,3 KB · Visite: 66
  • img1.PNG
    img1.PNG
    11,3 KB · Visite: 61
Ultima modifica:
E a quanto lo hai fissato lambda?
0.04981217.

E' il valore che ricorreva più spesso nella spezzata anche se, come ho già scritto, la differenza con gli altri valori ricorrenti è talmente labile che si poteva fissare a piacere in un intervallo ragionevole.

Certo, se uno decide di metterlo a "5" perchè gli piace... :D
 
0.04981217.

E' il valore che ricorreva più spesso nella spezzata anche se, come ho già scritto, la differenza con gli altri valori ricorrenti è talmente labile che si poteva fissare a piacere in un intervallo ragionevole.

Certo, se uno decide di metterlo a "5" perchè gli piace... :D

...
 

Allegati

  • Ottimo Yeld Curve.pdf
    1,5 MB · Visite: 362
Ok, vedo che anche loro non si pongono minimamente il problema e usano il valore suggerito da Diebold e Li.

A questo punto tanto vale adottarlo, non che la differenza tra il mio 0.05 e il loro 0.069 sia tale da farmi pensare a significative differenze della curva.

Piuttosto sono dei matti furiosi a frullare tutte le curve di tutti i maledetti Paesi là dentro, ma se non altro è solo un sfoggio di potenza muscolare facilmente replicabile anche qui con lo scotto dei tempi di elaborazione (...e la voglia di caricare tutte quelle serie nella base dati di partenza, che è il peggio...).

A questo punto non so se sia preferibile concentrarsi sul singolo Paese ma con variabili economiche oppure frullare tutti i Paesi ed escludere le variabili economiche; in quest'ultimo caso secondo me si è troppo sensibili a correlazioni di natura prettamente finanziaria, che come sappiamo risentono molto di aspetti "umorali" (risk off - risk on) e meno di aspetti economici.
 
Ok, vedo che anche loro non si pongono minimamente il problema e usano il valore suggerito da Diebold e Li.

A questo punto tanto vale adottarlo, non che la differenza tra il mio 0.05 e il loro 0.069 sia tale da farmi pensare a significative differenze della curva.

Piuttosto sono dei matti furiosi a frullare tutte le curve di tutti i maledetti Paesi là dentro, ma se non altro è solo un sfoggio di potenza muscolare facilmente replicabile anche qui con lo scotto dei tempi di elaborazione (...e la voglia di caricare tutte quelle serie nella base dati di partenza, che è il peggio...).

A questo punto non so se sia preferibile concentrarsi sul singolo Paese ma con variabili economiche oppure frullare tutti i Paesi ed escludere le variabili economiche; in quest'ultimo caso secondo me si è troppo sensibili a correlazioni di natura prettamente finanziaria, che come sappiamo risentono molto di aspetti "umorali" (risk off - risk on) e meno di aspetti economici.


E te lo sto a di da tre giorni...(ovvero, non cambia nulla....ma è un mio parere. Fallo semplice):)

Ora, nel paper che ti ho allegato con michele dovreste fare in fretta..(ci sono tutti i riferimenti, ML e Kalman inclusi, vai in fondo)

Dai un abbraccio virtuale a PAT e allegalo dove vuoi (e continua dove vuoi:))

Ciao:bye:

EDIT: ho letto di fretta. Il secondo metodo, ovvero frullare "tutti" (ma poi ma quali tutti..4) è meno sensibile del primo alla varianza (imho) ed usa le pere per prevedere le pere.)

Produzione industriale..Tassi..sono banane. Se hanno un potere previsivo lo avranno (IMHO) quando la varianza consentirà loro di averlo.

E a te\noi non servirà:)
 
(e continua dove vuoi:))
Senza dubbio continuerò qui; l'argomento "Diebold e Li" è stato risolto dove avevo iniziato ad occuparmene, ma qui si parla di improvement dello stesso e ho ancora molto da imparare sulle metodologie di stima più sofisticate.

Ora leggerò con più calma alcune particolarità del documento di Modugno e Nikolau (ma la tipa si chiama davvero Kleopatra..!).

Sto riflettendo su quanto può risultare complesso da gestire un modello con dentro cinque o sei curve anzichè una sola.
 
Senza dubbio continuerò qui; l'argomento "Diebold e Li" è stato risolto dove avevo iniziato ad occuparmene, ma qui si parla di improvement dello stesso e ho ancora molto da imparare sulle metodologie di stima più sofisticate.

Ora leggerò con più calma alcune particolarità del documento di Modugno e Nikolau (ma la tipa si chiama davvero Kleopatra..!).

Sto riflettendo su quanto può risultare complesso da gestire un modello con dentro cinque o sei curve anzichè una sola.

Ho corretto il post..

Sono contento che continui qui.:)OK!

ps: mi hanno garantito che di meglio non si può fare. Se mi hanno detto la verità bisogna scoprirlo mettendolo in piedi.:)
 
Dai un abbraccio virtuale a PAT
Si sta occupando di meteorologia :D
Il secondo metodo, ovvero frullare "tutti" (ma poi ma quali tutti..4) è meno sensibile del primo alla varianza (imho) ed usa le pere per prevedere le pere.)
L'unico problema che ho riscontrato in casi analoghi ma su curve corporate è che a usare solo yield curve sovente ti tiri dentro delle cose che sono praticamente la stessa serie.

Per esempio, non so che contributo al VAR possono dare insieme Italia e Spagna che una solo delle due non può dare, specie se si estraggono legami lineari con la Germania (ovvero: PIIGS ↓ = Germania ↑ e viceversa).
ps: mi hanno garantito che di meglio non si può fare.
In effetti gli sviluppi di Koopman sono sicuramente lo stato dell'arte dal punto di vista del sofismo econometrico, ma aggiungono solo dettagli e perfezionamenti a qualcosa che, come scrivevo, «se deve funzionare lo farà comunque».

Torniamo al lavoro.
 
Si sta occupando di meteorologia :D

L'unico problema che ho riscontrato in casi analoghi ma su curve corporate è che a usare solo yield curve sovente ti tiri dentro delle cose che sono praticamente la stessa serie.

Per esempio, non so che contributo al VAR possono dare insieme Italia e Spagna che una solo delle due non può dare, specie se si estraggono legami lineari con la Germania (ovvero: PIIGS ↓ = Germania ↑ e viceversa).

In effetti gli sviluppi di Koopman sono sicuramente lo stato dell'arte dal punto di vista del sofismo econometrico, ma aggiungono solo dettagli e perfezionamenti a qualcosa che, come scrivevo, «se deve funzionare lo farà comunque».

Torniamo al lavoro.

Ma infatti i 4 sono italia (che serve a noi), Germania, Inghilterra(simile alla Germania) e USA.

Euro,Marco,Sterlina e Dollaro.

.

Credo...tutto il resto è la stessa pappa. (sempre parere personale e non dotto..sia chiaro..)

Buon lavoro
 
Modello macroeconomico completato.

Zibordi mode ON: «Shortate quei fottuti BTP! :censored:

:D

Al di là delle battute e dei facili entusiasmi, è molto interessante notare che l'inclusione di produzione industriale calante, inflazione galoppante e tassi stazionari ha avuto la meglio sulla presunta dinamica mean reverting dei parametri.

Codice R Commander (con molti comandi sulla stessa riga, non odiatemi):
Codice:
	#	Nelson-Siegel, Diebold-Li yield and Diebold-Rudebusch-Aruoba curve forecasting model
	#	By Cren
	
	#	-----------	

	##	Loading required packages

library(YieldCurve, pos=4) ; library(quantmod, pos=4) ; library(ggplot2, pos=4) ; library(FitAR, pos=4) ; library(forecast, pos=4) ; library(vars, pos=4) ; library(timeSeries, pos=4)

	#	-----------

	##	Nelson-Siegel fitting

	###	Put R Var yield time series matrix as "X" (comprehensive of date rows and columns maturities); creating empty parameters' matrix

pnames <- c("beta_0", "beta_1", "beta_2", "lambda") ; param <- matrix(0, nrow = dim(X)[1], ncol = 4, dimnames = list(NULL, pnames)) ; param

	###	Fitting Nelson-Siegel model	

for(i in 1:dim(X)[1]) {beta <- Nelson.Siegel(rate = X[i,], maturity = c(seq(from = 1, to = 10, by = 1), 15, 20, 30) * 12, MidTau = c(3, 5, 7) * 12) ; param[i,] <- t(beta)}
plot(as.timeSeries(param), main = "BTPs' Nelson-Siegel parameters", xlab = "Monthly observations from 28/2/2003 to 30/3/2012") ; grid(nx = 20, ny = 20)

	#	-----------

	##	Diebold-Li forecasting

	###	Augmented-Dickey-Fuller unit root test for each parameter

for(i in 1:4) {print(summary(ur.df(param[,i], type = "drift", lags = 1)))}
	
	###	Fitting AR(1) model (you can use "stats" or "FitAR" package according to your taste)

ar.beta <- matrix(0, nrow = 1, ncol = 4)
for(i in 1:4) {k <- FitARp(param[,i], 1, lag.max = 1, MLEQ = FALSE) ; ar.beta[,i] <- predict(k, n.ahead = 1)$Forecasts[1]}
for(i in 1:4) {k <- ar(x = param[,i], aic = FALSE, order.max = 1, demean = TRUE) ; ar.beta[,i] <- predict(k, n.ahead = 1)$pred[1]}

	###	Yield curve forecasting via AR(1) model

y_1 <- NSrates(betaCoeff = param[dim(X)[1],1:3], lambdat = param[dim(X)[1],4], maturity = c(seq(from = 1, to = 10, by = 1), 15, 20, 30) * 12)	; y_1 ; y <- NSrates(betaCoeff = ar.beta[,1:3], lambdat = ar.beta[4], maturity = c(seq(from = 1, to = 10, by = 1), 15, 20, 30) * 12) ; y ; Maturity <- c(seq(from = 1, to = 10, by = 1), 15, 20, 30) * 1 ; Maturity
plot(lwd = 2, X[dim(X)[1],] ~ Maturity, main = "Diebold-Li BTPs' yield curve prediction", ylab = "Yield [%]", xlab = "Maturity [years]", type = "b") ; lines(lwd = 2, Maturity, y, col = 2) ; lines(lwd = 2, Maturity, y_1, col = 3) ; grid(nx = 20, ny = 20) ; legend(lwd = c(2, 2, 2), col = c(1, 2, 3), bty = "n", x = "bottomright", legend = c("Actual yield curve", "1 month forecasted yield curve", "Actual Nelson-Siegel fitting"))

	#	-----------

	##	Diebold-Rudebusch-Aruoba forecasting

	###	ECST IT Bloomberg's function for Italy Economic Statistics: ITPRNIY Index | EURR003M Index | CPTFEMU Index
	
	###	Coercing lambda to...

param[,4] <- max(param[,4])
param[,4] <- 0.069			#	Diebold-Li's choice

	###	Put R Var economic variables as "Y". Creating VAR data matrix and estimating VAR model (neither constant nor trend); 1-step forecast

L <- cbind(param[,1:3], Y) ; plot(as.timeSeries(L), plot.type = "m", col = c(1,2,3,4,5,6), main = "Diebold-Rudebusch-Aruoba exogenous variables")
var.2c <- VAR(L, p = 48, type = "none", season = NULL, exogen = NULL, lag.max = 48, ic = "AIC")	; var.2d <- restrict(var.2c, method = "ser", thresh = 2.0) ; var.2c.prd <- predict(var.2d, n.ahead = 1, ci = 0.9) ; var.2c.prd ; par(mai = c(0.5,0.5,0.5,0.5))
plot(var.2c.prd, ylab = "", col = terrain.colors(12), lwd = 1, type = "o", pch = 23, col.main = "green3", xaxt = "n", font.main = "1")

	###	Yield curve forecasting

DRApar <- matrix(0, nrow = 1, ncol = 3) ; DRApar[1] <- var.2c.prd$fcst$beta_0[1] ; DRApar[2] <- var.2c.prd$fcst$beta_1[1] ; DRApar[3] <- var.2c.prd$fcst$beta_2[1] ; DRApar
y_DRA <- NSrates(betaCoeff = DRApar, lambdat = param[1,4], maturity = c(seq(from = 1, to = 10, by = 1), 15, 20, 30) * 12)
plot(lwd = 2, X[dim(X)[1],] ~ Maturity, main = "Diebold-Rudebusch-Aruoba BTPs' yield curve prediction", ylab = "Yield [%]", xlab = "Maturity [years]", type = "b") ; lines(lwd = 2, Maturity, y_DRA, col = 2) ; lines(lwd = 2, Maturity, y_1, col = 3) ; grid(nx = 20, ny = 20) ; legend(lwd = c(2, 2, 2), col = c(1, 2, 3), bty = "n", x = "bottomright", l
 

Allegati

  • img.png
    img.png
    8,3 KB · Visite: 231
Ultima modifica:
Cren per quanto riguarda la stima dei parametri:
1 - devi costruirti (o usare quello già imlementato) un filtro di kalman che ti passi come output una matrice tale per cui ogni riga sia il vettore dei prediction error e un array dove ogni elemento è la matrice di varianza associata ai prediction error.

2 -Questi due output lì dai in pasto ad una funzione che ti calcola la likelihood (la formula esplicita la trovi per esempio in koopman) che è funzione solo dei due precedenti output (che a loro volta ovviamente sono funzione dei parametri del modello che vogliamo stimare)

3 - massimizzi questa funzione.

Ora mi rendo conto di non essere di grande aiuto ma qui entra in campo il linguaggio di programmazione se si vuole scendere nello specifico. Io in genere uso matlab anche se a suo tempo ho usato un altro programma (Oxmetrics) per questo specifico scopo.

Come già detto lo step critico è il numero 3.
 
Modello macroeconomico completato.
Mi stavo dimenticando di specificare una cosa importantissima!

Poichè i dati sono mensili, la curva nera a pallini è la situazione al 31 marzo 2012; quindi la previsione della curva rossa è come fosse stata fatta quasi venti giorni fa.

In pratica, secondo il modello, tra meno di 10 giorni dovremmo ritrovarci sulla rossa.

Se qualcuno mi fa la cortesia di allegare un bel grafico dei futures su BTP a media e/o lunga scadenza, io sono a casa e vado a farmi una seduta spiritica...
 
Ciao,
sto analizzando questo modello e tentando la calibrazione via filtro di kalman. Tuttavia girovando in internet, non ho trovato niente in merito al mio dubbio. Diebold modella con un AR (1) o VAR (1) la serie dei beta (livello, inclinazione e curvatura) direttamente sui livelli. Ma le serie dei beta non superano il test della radice unitaria. Sono cioè tutte 3 I(1). La modellizzazione pertanto andrebbe fatta sulle differenze prime per avere delle stime consistenti. Qualcuno sa dirmi perché questo aspetto viene ignorato? O se è stata data una risposta. Nel suo primo paper dove usa la calibrazione in due step e seleziona l'AR (1) conferma la radice unitaria delle serie ma poi se ne frega. Gli stessi parametri una volta calibrati evidenziano una forte persistenza e sono prossimi a 1.
Infine, se si calibra il modello in un solo step con filtro di kalman, la convergenza è tutt'altro che banale. Voi come procedete? Avete suggerimenti?

Grazie
 
Grazie a te per aver aperto un argomento interessante.
 
Indietro