Simulating returns using copula and SPD distribution Classic List Threaded 4 messages Open this post in threaded view
|

Simulating returns using copula and SPD distribution

 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[] = U.u1* *test[] = 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* #Degrees of Freedom *df.fit = fit.mpl@copula@parameters* #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]] _______________________________________________ [hidden email] mailing list https://stat.ethz.ch/mailman/listinfo/r-sig-finance-- Subscriber-posting only. If you want to post, subscribe first. -- Also note that this is not the r-help list where general R questions should go.
Open this post in threaded view
|

Re: Simulating returns using copula and SPD distribution

 You've missed a step. Think about it: 1. You take z. 2. Fit an spd. 3. Transform it to U using pspd. 4. Fit a copula on U. 5. Sample from copula to generate u. 6. Need to translate u back to z (step 1) using the quantile function (qspd) and the estimated parameters from step 2. i.e. you've missed step 6. -Alexios On 28/05/2014 16:53, Guillaume PEALAT wrote: > 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[] = U.u1* > > *test[] = 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* > > #Degrees of Freedom > > *df.fit = fit.mpl@copula@parameters* > > > > #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]] > > _______________________________________________ > [hidden email] mailing list > https://stat.ethz.ch/mailman/listinfo/r-sig-finance> -- Subscriber-posting only. If you want to post, subscribe first. > -- Also note that this is not the r-help list where general R questions should go. > > _______________________________________________ [hidden email] mailing list https://stat.ethz.ch/mailman/listinfo/r-sig-finance-- Subscriber-posting only. If you want to post, subscribe first. -- Also note that this is not the r-help list where general R questions should go.