Hi,

I am fitting some SPD distributions to past returns and some Copula to
simulate the dependance.
I am struggling with the simulation part, as the returns I simulate a
clearly out of line after some time.

I have attached some sample code in order to clarify the point.

I first calibrate the SPD distribution on the past returns:

#Calibrating the SPD distributioon the residuals of an ARMA+GARCH

*spec.u1 = ugarchspec(mean.model=list(armaOrder=c(1,1)),
distribution="std")*

*fit.u1 = ugarchfit(spec.u1, return.u1)*

*z.u1= residuals(fit.u1, standardize=TRUE)*

*gpd.u1 = spdfit(z.u1, upper=1. - tailFraction, lower=tailFraction)*


#Calibrating the SPD distributioon the residuals of an ARMA+GARCH

*spec.u2 = ugarchspec(mean.model=list(armaOrder=c(1,1)),
distribution="std")*

*fit.u2 = ugarchfit(spec.u2, return.u1)*

*z.u2= residuals(fit.u2, standardize=TRUE)*

*gpd.u2 = spdfit(z.u2, upper=1. - tailFraction, lower=tailFraction)*


Then, once we have all this set, we need to calibrate the Copula of our
choice


#Calibrate the Copula

#We extract the residuals from the xts into a vector

*res.u1 = as.vector(z.u1[,1])*

*res.u2 = as.vector(z.u2[,1])*

#We transform the margin to uniform

*U.u1 = pspd(res.u1, gpd.u1)*

*U.u2 = pspd(res.u2, gpd.u2)*



#We create the matrix to help us calibrate the Copula

*test <-list()*

*test[[1]] = U.u1*

*test[[2]] = U.u2*

*test_matrix = do.call(rbind, test)*



*set.seed(123)*



#We define the Copula we want to use

*tcopula<-tCopula(param=0.5, dim=2, dispstr = "ex", df =6)*

#We fit the Copula with maximum Likelihood

*fit.mpl <- fitCopula(tcopula, t(test_matrix), method="ml")*



#We get back the parameters

#Rho

*rho.fit = fit.mpl@copula@parameters[1]*

#Degrees of Freedom

*df.fit = fit.mpl@copula@parameters[2]*



#Create fitted t-copula object

*t.cop.fit = tCopula(param=rho.fit, dim=2, df=df.fit)*



*margins = c("t", "t")*

*paramMargins = list(list(df=df.fit),list(df=df.fit))*



#Create fitted custom distribution object

*myBvd.tcop.fit = mvdc(copula=t.cop.fit, margins = margins, paramMargins=
paramMargins)*



If all is well, I should be able to run some simulations and simulate my
returns from this set up:


#Generate random numbers from the Copula

*u = rMvdc(nsim, myBvd.tcop.fit)*

*u.1 = u[,1]*

#Generate the simulated returns

*sim.u1 = ugarchsim(fit.u1, n.sim=nsim, startMethod="sample", m.sim=1,*

*                    custom.dist=list(name="sample",distfit=matrix(u.1,
ncol=1)))*

#Get back the simulated returns

*sim.u1.returns = sim.u1@simulation$seriesSim*



The problem lies in the order of magnitude the simulated returns. I can get
some occurrence of +26% for example, which is clearly wrong.


Could someone point me on the wrong part?

I have also a remaining question:

In the univariate case, we can simulate the random number with *rspd(n =
days, gpd.u1)*, and they will be in accordance with the gpd distribtuion
calibrated.

In the multivariate case, can I consider this step to be taken care of by
the random number of the Copula since it has been calibrated on the margins
transformed to Uniform by the gpd distribution function?


Thanks

	[[alternative HTML version deleted]]

