Roll in windows per la previsione del VaR

inerba

Nuovo Utente
Registrato
9/11/17
Messaggi
55
Punti reazioni
0
.
 
Ultima modifica:
Sto cercando di capire come sfruttare i modelli Garch per stimare il VaR. Il programma che ho scelto è R studio, essendo da molti consigliato per la sua intuitività. Nonostante ciò, sto riscontrando alcune difficoltà nel capire il funzionamento della funzione "ugarchroll" presente nel pacchetto rugarch, essendomi posto come obiettivo quello di riuscire ad ottenere gli stessi valori di unconditional e conditional coverage della tabella in allegato. In particolare, non capisco come "giocare" con le funzioni n.start, window.size e forecast.length per riuscire ad ottenere (relativamente ad es. all'S&P500 per un AR(1)Garch(1,1)) la probabilità del 72,25% (LR.uc p-value dalla notazione del test) così come da tabella. Ho un campione osservato di 3857 osservazioni e, come si vede, devo fare forecast su 2000 one-step ahead osservazioni al 95% di significatività. Qualcuno è in grado di spiegarmi l'utilizzo corretto della funzione?

Certo che probabilità come quelle usando modelli praticamente arbitrari - come AR(3)EGARCH(1,2)... ma dai - e numerosità del campione altrettanto arbitrarie (500 osservazioni?) lasciano un po' perplessi, ma chi sono io per contestare :rolleyes:

Comunque veniamo alle tue domande.

Immagino tu stia facendo un uso del codice pressapoco come questo:
Codice:
require(rugarch)
data(sp500ret)
spec <- ugarchspec(mean.model = list(armaOrder = c(1, 0)))
mod <- ugarchroll(spec, data = sp500ret, n.ahead = 1, 
                  n.start = 2000,  refit.every = 100, refit.window = "recursive", 
                  solver = "hybrid", fit.control = list(),
                  calculate.VaR = TRUE, VaR.alpha = c(0.01, 0.05),
                  keep.coef = TRUE)
report(mod, type="VaR", VaR.alpha = 0.01, conf.level = 0.95)
ugarchroll() usato così dice:
  1. prendi i primi n.start dati;
  2. stima il modello che hai specificato in spec;
  3. estrai le varie misure di varianza;
  4. avanza di refit.every osservazioni (quindi al successivo passaggio hai un campione di n.start + refit.every osservazioni);
  5. riparti da 2.
Dalla tabella non si capisce se si parla di rolling forecast o di un semplice in-sample, nel qual caso le misure di confidenza di Kupiec e Christoffersen potrebbero differire da quelle che hai tu.
 
.
 
Ultima modifica:
Cren, innanzitutto ti ringrazio molto per la risposta.
Ho seguito le tue istruzioni (allego lo script in R e il risultato del test applicato al mio solito AR(1)GARCH(1) su S&P500) ma le percentuali sia di Kupiec che di Christoffersen non coincidono. Credo, con ogni probabilità, di sbagliare al punto 4. Come posso modificare il codice?
Secondo me è un problema di campione di dati.

Ad es. ho provato a modificare un po' i dati in ingresso per il S&P 500 e come vedi...
Codice:
VaR Backtest Report
===========================================
Model:				sGARCH-norm
Backtest Length:	3666
Data:				

==========================================
alpha:				5%
Expected Exceed:	183.3
Actual VaR Exceed:	198
Actual %:			5.4%

Unconditional Coverage (Kupiec)
Null-Hypothesis:	Correct Exceedances
LR.uc Statistic:	NaN
LR.uc Critical:		3.841
LR.uc p-value:		NaN
Reject Null:		NA

Conditional Coverage (Christoffersen)
Null-Hypothesis:	Correct Exceedances and
					Independence of Failures
LR.cc Statistic:	NaN
LR.cc Critical:		5.991
LR.cc p-value:		NaN
Reject Null:		NA

In secondo luogo tu sei sicuro che nel paper abbiano usato delle previsioni "rolling"? Senza questa certezza sono troppe combinazioni possibili da provare: anche solo refit.every potrebbe essere qualsiasi valore e poche eccedenze in più o in meno del VaR possono alterare i risultati dei test di ipotesi.
 
.
 
Ultima modifica:
Allora Cren, di nuovo grazie.
La risposta la trovi in allegato: è un rolling sample, a quanto pare. Detto questo, il campione di dati fa semplicemente riferimento alla serie storica dell'S&P500 dallo 09/07/1987 al 18/10/2002 (dove si considerano già esclusi i non-trading days). Hai qualche dritta su come procedere? L'obiettivo di replica che mi sono posto prevede la determinazione di percentuali quantomeno simili a quella della tabella.
Ok, allora se stanno usando quella procedura il codice dovrebbe essere così:
Codice:
roll.norm.SP500 <- ugarchroll(ARMA10sgarch11.norm.SP500, log_returnsSP500,
                              refit.window = "moving", calculate.VaR = TRUE, cluster = cluster,
                              n.ahead = 1, window.size = 2000, refit.every = 1, VaR.alpha = 0.05)
refit.window va bene a "moving", refit.every va messo al più computazionalmente intensivo possibile 1 (questi accademici hanno un sacco di tempo da perdere pare).

In questo modo non è possibile rigettare l'ipotesi nulla:
Codice:
VaR Backtest Report
===========================================
Model:				sGARCH-norm
Backtest Length:	500
Data:				

==========================================
alpha:				5%
Expected Exceed:	25
Actual VaR Exceed:	33
Actual %:			6.6%

Unconditional Coverage (Kupiec)
Null-Hypothesis:	Correct Exceedances
LR.uc Statistic:	2.459
LR.uc Critical:		3.841
LR.uc p-value:		0.117
Reject Null:		NO

Conditional Coverage (Christoffersen)
Null-Hypothesis:	Correct Exceedances and
					Independence of Failures
LR.cc Statistic:	2.477
LR.cc Critical:		5.991
LR.cc p-value:		0.29
Reject Null:		NO
Comunque il campione considerato influisce parecchio su questi test d'ipotesi.
 
.
 
Ultima modifica:
In ogni caso dal test che hai fatto sembrerebbe che nemmeno in questo caso l'LR.uc p-value di Kupiac coincida (o almeno si avvicini) alla percentuale in tabella. Che sia da intendersi come il complemento ad uno? Avremmo dunque 1-0,117=...
Ad una rapida occhiata io l'ho inteso come il complemento a 1: l'ipotesi nulla non può essere rifiutata altrimenti si rischia di commettere un errore con il 11,7% di probabilità, quindi nella tabella che hai messo all'inizio c'è la validità statistica del modello.
 
Indietro