May 25th, 2014, 1:59 pm
I'm currently following the stochastic basis modelling framework (Mercurio & Xie 2012). Specifically, I assume a one-factor hull-white dynamics with constant mean reversion rate a and volatility parameter sigma for the OIS rate. Then I also assume a one factor lognormal process for the basis spread S with zero drift and constant volatility coefficient sigma_x. For convenience, I assume that it is independent of the OIS rate . In this way the caplet payoff can now be expressed as (F+S-K)^+ which is equivalent to (F-(K-S))^+, so such a payoff can be seen as a caplet with strike (K-S). For each caplet maturity, I have a pair of jointly normal random variables: the OIS rate and the log of the basis. The conditional expectation of the payoff, given the value of the log of the basis should be analytically solvable with a Black type formula. I just need to integrate the product of this formula with the density of the log of the basis with the help of Gauss-Hermite method. However, when I tried to calibrate these to the market cap prices, I set the initial guess for a, sigma and sigma_x to be 0.002,0.06 and 0.0002, with the lower bound (0,0,0) and upper bound (1,1,0.02), I set the upper bound for sigma_x to be 0.02 because otherwise K-S may be less than -1 and cause log(YenDiscount_factor(t2-t)*(1+(K-s)*Tenor)/YenDiscount_factor(t1-t)) to be complex in the caplet pricing formula, the calibration result:a=6.66844389082694e-11sigma=0.00649142137517748sigma_x=0.02The optimizer lsqnonlin in matlab doesn't seem to give a global minimum that makes sense.I wonder if this is the problem of assuming zero-correlation between the OIS rate and the basis spread or it?s the boundary for sigma_x that I set inappropriate and yield unrealistic basis spreads.Really appreciate if you could shed some light on this.Below are the functions for calculating the difference between the market cap and the model cap prices:y_initial=[0.002,0.06,0.0002]'; y_lb=[0,0.0002,0]; % lower bounds of b, sigma_y and sigma_sy_ub=[1,1,0.02];Gauss_Hermite_x=[-5.220271691,-4.428532807,-3.762187352,-3.157848818,-2.59113379,-2.04923171,-1.524170619,-1.010368387,-0.503520163,0,...0.503520163,1.010368387,1.524170619,2.04923171,2.59113379,3.157848818,3.762187352,4.428532807,5.220271691]';Gauss_Hermite_w=[1.33E-12,2.16E-09,4.49E-07,2.72E-05,0.000670878,0.007988867,0.050810387,0.183632701,0.391608989,0.502974888,0.391608989,0.183632701,0.050810387,...0.007988867,0.000670878,2.72E-05,4.49E-07,2.16E-09,1.33E-12]';N_GH=size(Gauss_Hermite_x);%Cap differencey=zeros(NoOfCap(1),1);for j=1:NoOfCap(1) Black_cap=0; Cap=0; for k=2:YenCap_maturity(j)/Tenor Caplet=0; for n=1:N_GH(1) s=Spread(k-1)*exp(-x(3)^2*Tenor*(k-1)/2+sqrt(2)*Gauss_Hermite_x(n)*x(3)*sqrt(Tenor*(k-1)));% problematic Caplet=Caplet+Gauss_Hermite_w(n)*YenCaplet(0,k-1,k,x(1),x(2),YenStrike(j),s); end Cap=Cap+Caplet/sqrt(pi); % model cap price F=(YenTibor_factor(k-1)/YenTibor_factor(k)-1)/Tenor; Black_cap=Black_cap+YenDiscount_factor(k)*Tenor*Black_capprice(F,YenStrike(j),YenCapData(j)*sqrt((k-1)*Tenor)); % Black cap price end y(j)=Black_cap-Cap; endend
Last edited by
Tristanw1987 on May 24th, 2014, 10:00 pm, edited 1 time in total.