Questions on the G2++ model class

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

Questions on the G2++ model class

Jonathan Budd
Hi all

I posted a while back asking about creating a hybrid Black-Scholes G2++ model. I've made quite a bit of progress and can now successfully generate stochastic rates and push them to the Black-Scholes process via a relinkable handle. It may not be the neatest or most efficient way, but it certainly works. Happy to share advice with anyone undertaking similar endeavours.

I'm now at the stage where I'm testing the output of my simulations and I've still got some questions on the use of the G2 class. In particular, I'm unable to recover the input yield term structure exactly. 

Can anyone tell me:

1. If I instantiate the G2 model as follows:

boost::shared_ptr<G2> model(new G2(discountingTermStructure, a, sigma, b, eta, rho));

Do I need to somehow calibrate the model to the yield term structure, that is, fine-tune the parameters to fit? Put another way, will some choices of the parameter set {a, sigma, beta, eta, rho} produce better fits to the input yield term structure than others? This post (http://old.nabble.com/G2-model-calibration-td21838327.html#a21879502) seems to suggest the answer is no (but does talk about bootstrapping, how do I do this?). Corollary 4.2.1 in Brigo & Mercurio (2nd ed.) suggests I shouldn't have to calibrate just yet either. I'm aware that calibration is usually done using swaption or caplet volatilities, but my intention at this stage is simply to generate paths based on the yield term structure.

If I proceed to run the simulation, I get a slowly regularly increasing error that doesn't disappear with more simulations (exacerbated by higher values of sigma, eta). I'm fairly sure I'm testing this correctly; after outputting the forward rates (t, t+1) (see below), I create the spot rates by summing the forward rates, converting this to a ZCB P(0,t) and then averaging these.

2. To retrieve ZCB prices, I need to feed the G2 model a 2D stochastic process; namely a 2D Ornstein Uhlenbeck. I've played with several versions of this: the G2Process class, two OU processes in a StochasticProcessArray and all the results are pretty much the same. For the sake of illustration, let's say it's instantiated using the following:

boost::shared_ptr<StochasticProcess> g2Process(new G2Process(a, sigma, b, eta, rho));

I now evolve the process in a loop using 

x = g2Process->evolve(t, x, dt, dz);

where dz is an array of normal random variates generated in each pass of the loop, dt = 1.0 and x[0], x[1] initially set to 0.0.

And then get the price of a zero-coupon discount bond  at time t and maturing at time t+1 using:

zcbBond = model->discountBond(t, t+1, x);

Which I can then convert to the forward rate using

-1.0*log(zbcBond);

Is this the intended usage?

Any help appreciated.

Kind regards


Jonathan

------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and
threat landscape has changed and how IT managers can respond. Discussions
will include endpoint security, mobile security and the latest in malware
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
QuantLib-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/quantlib-users