Digamos que tengo un conjunto de datos de 10 años de Tesla (ejemplo) y estoy tomando el cambio porcentual del lag 2:
tsla <- quantmod::getSymbols("TSLA", from = base::as.Date("2011-01-01"), to = base::as.Date("2022-01-31"), auto.assign = F)
tsla = as_tibble(tsla)
head(tsla)
d = tsla%>%
dplyr::select(TSLA.Adjusted)%>%
dplyr::mutate(Close = TSLA.Adjusted)%>%
dplyr::mutate(y = as.numeric((Close - dplyr::lag(Close, 2)) / Close))%>%
dplyr::select(Close,y)%>%
tidyr::drop_na();d
Que se ven así:
# A tibble: 2,786 × 2
Close y
<dbl> <dbl>
1 5.37 0.00783
2 5.58 0.0434
3 5.65 0.0499
4 5.69 0.0200
5 5.39 -0.0475
6 5.39 -0.0553
7 5.24 -0.0282
8 5.15 -0.0470
9 5.13 -0.0226
10 4.81 -0.0716
# … with 2,776 more rows
Ahora quiero ajustar el modelo GARCH(1,1) con innovaciones normales.
garnor1 = function(x){
require(fGarch)
t = length(x)
fit = garchFit(~garch(1,1),data=x,trace=F,cond.dist="norm")
m = fit@fitted
cv = fit@sigma.t
var = m+cv*qnorm(0.01) # low tail
return(var[t])
}
Lo que he conseguido es estimar el menor valor en riesgo para los rendimientos de 2 días hasta el tiempo $t$ . Esto dará un número que es el VaR hasta ahora (digamos hoy). ¿Estoy en lo cierto hasta ahora?
En caso afirmativo, sé que el VaR se está calculando a partir de la función predictiva para el $t+2$ valor cuantílico. Haciendo esto tengo que predecir la función anterior:
g11pre = function(x){
require(fGarch)
fit = garchFit(~garch(1,1),data=x,trace=F,cond.dist="norm")
df=coef(fit)["shape"]
p = predict(fit,2)
m=p$meanForecast
cv=p$standardDeviation
var=m+cv*qnorm(0.01)
return(var[2])
}
¿Y esta última función predictiva la tengo que backtestar o la anterior?
Editar
Para el backtesting en la función predictiva he probado algo por mi cuenta (para entenderlo bien):
db= d%>%
dplyr::mutate(back_lower = zoo::rollapplyr(y,252,FUN = g11pre,by = 21,fill=NA))%>%
tidyr::fill(back_lower)%>%
tidyr::drop_na()
Sé que parece extraño, pero me explico: estoy utilizando el conjunto de datos de 10 años. El período de estimación son los primeros 252 días y luego el rollo de un mes (21) días, no estoy interesado en la evaluación de 2 días del modelo. El resultado del backtesting:
p = ggplot() +
geom_line(data = db, aes(x =1:length(y) , y = y), color = "black") +
geom_line(data = db, aes(x = 1:length(back_lower), y = back_lower), color = "red") +
xlab('') +
ylab('risk low')
Eso parece un gráfico de pasos (esto es lo que debe parecer)