Welcome to THETAWIKI. If you like to create or edit a page please make sure to login or register an account. All registered users please make sure to provide a valid email address.

Bond Option

From ThetaWiki
Jump to: navigation, search

The models for European Option or American Option in the equity market can, in most cases, be used to price bond options without significan changes. We show how to price a bond option using ThetaML, when bond prices are observed readily or obtained analytically using a particular interest rate model.

A European Bond Option

Consider a European put on a zero-coupon bond. We will now assume that the bond price is given (for that an interest rate model also need be defined) and design an option on the bond similar to the European Option for stocks.

model EuropeanPut_Bond
    import K    "Option strike price"
    import L    "Bond principal"
    import Topt "Option time to maturity"
    import EUR  "Discount numeraire"
    import P    "underlying bond prices"
    export Popt "Option Price, Empiric"
 
    %at current time, set the option value to have the same expected discounted
    %value as the variable 'V'; the ThetaML future operator '!' accompanying the
    %variable 'V' acts like a function on 'V', such that the values of 'V'at 
    %current time remain to be determined at a later instance when 'V' is assigned 
    %some values
    Popt = E(V!)
    %the ThetaML command 'theta' passes time by 'Topt' years
    theta Topt
    %at option maturity time T, set the option payoffs;
    %the option payoffs are discounted to time 0 by the discount numeraire 'EUR'
    V = max(K - L*P, 0) * EUR
end

In the above implementation, we need to differentiate between the maturity time of the bond option (Topt) and that of the bond itself, which we denote by T. The bond price and the discount factor are provided by an external model. Since all models we have assume a face value of $1, we introduce a separate variable L for the bond principal. Besides these differences, the model implementation is virtually equivalent to the European Option.

Combining the Option with an Interest Rate Model

The above bond option model is generic and is independent of any interest rate model. Someinterest rate models however gives analytical formulas for bond option prices. We can use the convenience of analytical formulas to compare with the performance of the model implemented above.

As an example we consider the Vasicek Model. A European put with maturity time $ T_{\text{opt}} $ on a bond with maturity $ T $ has the formula

$ K P(0,T_{\text{opt}})N(-h+\sigma_P) - L P(0,T)N(-h) \! $

where

$ \sigma_P = \frac{\sigma}{a}(1-e^{-a(T-T_{\text{opt}}}) \sqrt{\frac{1-e^{-2aT_{\text{opt}}}}{2a}} \! $
$ h = \frac{1}{\sigma_P} \text{ln} \frac{LP(0,T)}{KP(0,T_{\text{opt}}) } +\frac{\sigma_P}{2}\! $

using these formulas we can build the following model

model EuropeanPut
    import K     "Option strike price"
    import L     "Bond Principal"
    import Topt  "Maturity of Bond Option"
    import sigma "Vasicek short rate volatility"
    import a     "Vasicek short rate mean reversion speed"
    import b     "Vasicek short rate mean reversion level"
    import T     "Bond maturity"
    import r0    "Initial short rate"
    export Popt  "Option Price, Analytic"
 
    B0s = ( 1 - exp(-a*T) )/a
    B0T = ( 1 - exp(-a*Topt) )/a
 
    P0s = exp( (B0s-T)*   (a^2*b-sigma^2/2)/(a^2) - (sigma^2)*B0s^2/(4*a) )*exp(-B0s*r0)
    P0T = exp( (B0T-Topt)*(a^2*b-sigma^2/2)/(a^2) - (sigma^2)*B0T^2/(4*a) )*exp(-B0T*r0)
 
    sigma_p = (sigma/a)*( 1 - exp(-a*(T-Topt)) )*sqrt( (1 - exp(-2*a*Topt))/(2*a) )
    h = (1/sigma_p) * log(L*P0s/(K*P0T)) + sigma_p/2
    %call the matlab error function erf()
    Popt = K*P0T*0.5*(1 + @matlab:erf( (sigma_p-h)/sqrt(2) )) - L*P0s*0.5*(1 + @matlab:erf(-h/sqrt(2)))
end

The bond prices $ P(0,T) $ and $ P(0,T_{\text{opt}}) $ are calculated using the analytical formula for the Vasicek model. The formulas for the bond option however, are valid for the Hull-White model, only the calculations for $ P(0,T) $ and $ P(0,T_{\text{opt}}) $ need to be changed.