# rugarch: GARCH external regressors

I'm currently playing around with the great rugarch package in R. However, I tried to test the external regressor functionality. I implemented a GARCH(1,1) process and compared it with a GARCH(0,1) process where I added the lagged squared returns as external regressor. The results should be the same but aren't. Does anyone of you know where my mistake is? Thank you very much in advance for your help.

library(rugarch)
library(quantmod)
getSymbols('C', from = '2000-01-01')
C = adjustOHLC(C, use.Adjusted = TRUE)
R_d = ROC(Cl(C), na.pad = FALSE)

extReg = R_d[1:length(R_d)-1]^2
spec = ugarchspec(mean.model = list(armaOrder = c(0, 0),include.mean = FALSE), variance.model = list(model = 'sGARCH', garchOrder = c(1, 1)), distribution = 'norm')
spec2 = ugarchspec(mean.model = list(armaOrder = c(0, 0),include.mean = FALSE), variance.model = list(model = 'sGARCH', garchOrder = c(0, 1),external.regressors=extReg), distribution = 'norm')

fit = ugarchfit(data = R_d[2:length(R_d),1], spec = spec)
fit2 = ugarchfit(data = R_d[2:length(R_d),1], spec = spec2)


The coefficients of the fit model are:

omega: 2.1038530309075e-06
alpha1: 0.0863073049030114
beta1: 0.912692551076183


The coefficients of the fit2 model are:

omega: 8.17097079205033e-07
beta1: 0.999316873189476
vxreg1: 1.01005006640392e-08

• Excellent question! I have replicated your results, I am getting the same output. Funny... – Richard Hardy Jun 10 '16 at 8:13
• I just figured out that when you multiply the returns(R_d) by 100 the coefficients are almost identical. For the model fit : omega=2.112759, alpha1=0.086474, beta1=0.912525. For the model fit 2: omega=1.941635, beta1=0.912261, vxreg1=0.088643. – Filippo Scopel Jun 10 '16 at 12:57

## 1 Answer

I have found the mistake. The ugarchfit function sets automatically non negativity constraints for all coefficients- This makes sense since the alpha in our case shouldn't be negative. However, when releasing the constraint to negative values you get the right results. The only explanation I can think of is that in the course of optimisation, temporarily negative coefficients estimates are occurring.

setbounds(spec2)<-list(vxreg1=c(-1,1))