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: 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 |
Free forum by Nabble | Edit this page |