3
$\begingroup$

I am trying to replicate the results in Consistent Pricing of FX Options, A. Castagna and F. Mercurio. However, when I calculate the strike prices for 25-delta put and call and ATM I cannot get the same result as in the article.

The parameters given in the article (p.5):

  • T = 94/365
  • S = 1.205
  • s(ATM) = 0.0905
  • s(RR) = -0.0050
  • s(BF) = 0.0013

These result in s(25dPut) = 0.0943 and s(25dCall) = 0.0893 (equations 4 and 5 on pages 2 and 3).

  • K(25dPut) = 1.1733
  • K(25dCall) = 1.2487

The values I get (equations 6 and 7 on p. 3) are:

  • K(25dPut) = 1.16688287...
  • K(25dCall) = 1.2421907...

Here is my Python code:

S       = 1.205
tau     = 94.0 / 365.0
iv_v    = 0.0905
rr_v    = -0.005
bf_v    = 0.0013
for_df  = 0.9902752
dom_df  = 0.9945049

vol_call = iv_v + bf_v + 0.5 * rr_v
vol_put = iv_v + bf_v - 0.5 * rr_v

alpha = - scipy.stats.norm.ppf( 0.25 * np.exp( (for_df**(-1) - 1) * tau) )
k1 = S * np.exp( - alpha * vol_put * np.sqrt(tau) + ((dom_df**(-1) - 1) - (for_df**(-1) - 1) + 0.5 * vol_put**(2) ) * tau )
k2 = S * np.exp( alpha * vol_call * np.sqrt(tau) + ((dom_df**(-1) - 1) - (for_df**(-1) - 1) + 0.5 * vol_call**(2) ) * tau )

This code gives wrong results, but I cannot figure out where the error is.

$\endgroup$
1
$\begingroup$

The interest rates (calculated from discount factors) you are using are wrong. Correct formulas: $r_{dom}$ = $-\frac{log(dom_{df})}{T}$

$r_{for}$ = $-\frac{log(for_{df})}{T}$

alpha = - scipy.stats.norm.ppf( 0.25 * np.exp( for_df**(-1) )

k1 = S * np.exp( - alpha * vol_put * np.sqrt(tau) + ($r_{dom}$ - $r_{for}$ + 0.5 * vol_put**(2) ) * tau )

k2 = S * np.exp( alpha * vol_call * np.sqrt(tau) + ($r_{dom}$ - $r_{for}$ + 0.5 * vol_call**(2) ) * tau )

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.