1
$\begingroup$

I'm trying to replicate the Example given in pag. 229-230 of Dynamic Hedging by N. Taleb and I am not sure on how to convert the Greeks in Dollars and how the author is computing the Greeks.

Start with a currency position in GBP-USD. Spot is 1.605. The trader buys a 6-month call (183 days) in the amount of GBP 100 mil. The price is 4.578% and the trader pays $4'578'000. USD rate is 5.8438% (yearly) and GBP is 6.915%. He computes the Forward exchange rate to be 1.5973.

I managed to obtain the call value with BS (see formula in the Appendix) by supposing the market trades at 1, thus dividing the spot rate and the strike (=1.5973 I suppose) by the spot rate.

I would like to replicate the whole "Taleb \$-value column" in the below Table. Take the Delta, which is around 0.50. How do you calculate its value in dollars? Since it is negative, is the trader selling GBP or USD?

Please, let me know if more details are needed. Thanks for the help. I am new to FX Options.

Bonus Part for the ones willing to read everything

I report in the Table below the Greeks, in Dollars values, computed directly from Black-Scholes Model and from "discretization" of the underlying or parameters that affects the BS formula, as it seems Taleb is doing. (see Appendix for formulas).

Greek BS Model \$ Value "Discrete" Method \$ Value Taleb \$ Value
Delta 0.5021 80'198'736 0.00519 829'283 -82'656'000
Gamma 3.4365 548'918'092 0.03407 5'442'567 8'355'000
Vega 0.2742 43'808'238 0.00274 438'038 438'000
$\text{Rho}$ 0.2334 37'292'607 0.00237 379'053 385'000
$\text{Rho}_f$ -0.2464 -40'767'691 -0.00250 -399'570 -408'000

Bonus Questions:

  1. It seems that the face value of 159'730'000$ is used, instead of the one of the call, to compute the "\$-values" above? How Taleb is computing the Dollar value of the Greeks?

  2. Except Gamma, some Greeks are distant some power of 10. I suppose I should multiply the BS Greeks for $0.01$, the increment that I am considering in the "discrete" version of the Greeks since they represent, mathematically, a derivate. Correct?

  3. How is the author calculating the Gamma?

  4. Taleb states that the trader hedge is "50 deltas": what does this means? How does this affect the numbers in my Table?

  5. Taleb is also calculating the sensitivity to $r_f$ in this way: $(183/360) \times 100\text{bp}\times \text{Delta} $. Where does this formula come from?

Again, thanks for the help.

Appendix

Appendix: Black Scholes - Formulas (see Options, Futures and Other Derivatives by Hull, ch. 19)

$d_1 = \frac{\log(S/K)+(r-r_f+0.5\sigma^2)T}{\sigma\sqrt{T}}$

$d_2 = d_1 - \sigma\sqrt{T}$

$c(S;K;T,\sigma,r,r_f) = Se^{-r_f T}\Phi(d_1)-Ke^{-rT}\Phi(d_2)$

$\text{Delta} = \Phi(d_1)e^{-r_f T}$

$\text{Gamma} = \frac{\phi(d_1)e^{-r_f T}}{\sigma S\sqrt{T}}$

$\text{Vega} = S\sqrt{T}\phi(d_1)e^{-r_f T}$

$ \text{Rho} = KTe^{-r_f T}\Phi(d_2) $

$ \text{Rho}_f = STe^{-r_f T}\Phi(d_1)$

Appendix: Discrete Formulas Note: the asset is supposed to trade at 1. I indicate here only the parameter that change.

$\text{Delta} = c(S=1.01S)-c(S=S)$

$\text{Gamma} = \text{Delta}(S=1.01S)-\text{Delta}(S=S)$

$\text{Vega} = c(\sigma=16.7\%)-c(\sigma=15.7\%)$

$ \text{Rho} = c(r=6.8438\%)-c(r=5.8438\%)$

$ \text{Rho}_f =c(r_f=7.915\%)-c(r_f=6.915\%) $

Appendix: R code

call_BS_currency=function(S,K,t,r,rf,sigma=0.157,base=365)
{
  d1=(log(S/K)+(r-rf+0.5*(sigma^2))*t/base)/(sigma*sqrt(t/base))

  d2=d1-sigma*sqrt(t/base)

  c=S*exp(-rf*t/base)*pnorm(d1)-K*pnorm(d2)*exp(-r*t/base)

  delta=exp(-rf*t/base)*pnorm(d1)

  gamma=dnorm(d1)*exp(-rf*t/base)/(S*sigma*sqrt(t/base))

  vega=S*sqrt(t/base)*dnorm(d1)*exp(-rf*t/base)

  rho1=K*t/base*exp(-r*t/base)*pnorm(d2)

  rho2=-t/base*exp(-rf*t/base)*S*pnorm(d1)

  c(c=c,delta=delta,gamma=gamma,vega=vega,rho1=rho1,rho2=rho2)
}

greek_discrete_computation=function(face_value)
{
 delta=call_BS_currency(S=1.6050/1.6050*1.01,
                        K=1.5973/1.6050,
                        t=183,
                        r=0.058438,
                        rf=0.06915,
                        base=360,
                        sigma=0.157)[1]- 
       call_BS_currency(S=1.6050/1.6050,
                        K=1.5973/1.6050,
                        t=183,
                        r=0.058438,
                        rf=0.06915,
                        base=360,
                        sigma=0.157)[1]
 
  gamma=call_BS_currency(S=1.6050/1.6050*1.01,
                        K=1.5973/1.6050,
                        t=183,
                        r=0.058438,
                        rf=0.06915,
                        base=360,
                        sigma=0.157)[2]- 
       call_BS_currency(S=1.6050/1.6050,
                        K=1.5973/1.6050,
                        t=183,
                        r=0.058438,
                        rf=0.06915,
                        base=360,
                        sigma=0.157)[2]

   vega=call_BS_currency(S=1.6050/1.6050,
                         K=1.5973/1.6050,
                         t=183,
                         r=0.058438,
                         rf=0.06915,
                         base=360,
                         sigma=0.167)[1]- 
        call_BS_currency(S=1.6050/1.6050,
                         K=1.5973/1.6050,
                         t=183,
                         r=0.058438,
                         rf=0.06915,
                         base=360,
                         sigma=0.157)[1]


   rho1=call_BS_currency(S=1.6050/1.6050,
                         K=1.5973/1.6050,
                         t=183,
                         r=0.068438,
                         rf=0.06915,
                         base=360,
                         sigma=0.157)[1]- 
        call_BS_currency(S=1.6050/1.6050,
                         K=1.5973/1.6050,
                         t=183,
                         r=0.058438,
                         rf=0.06915,
                         base=360,
                         sigma=0.157)[1]

   rho2=call_BS_currency(S=1.6050/1.6050,
                         K=1.5973/1.6050,
                         t=183,
                         r=0.058438,
                         rf=0.07915,
                         base=360,
                         sigma=0.157)[1]- 
        call_BS_currency(S=1.6050/1.6050,
                         K=1.5973/1.6050,
                         t=183,
                         r=0.058438,
                         rf=0.06915,
                         base=360,
                         sigma=0.157)[1]

  c(face_value=face_value/face_value,
    delta=delta,
    gamma=gamma,
    vega=vega,
    rho1=rho1,
    rho2=rho2)*face_value

}

# BS Greeks and Face Value
100*1e6*1.5973*call_BS_currency(S=1.6050/1.6050,
                                K=1.5973/1.6050,
                                t=183,
                                r=0.058438,
                                rf=0.06915,
                                base=360,
                                sigma=0.157)

# Discrete Greeks
greek_discrete_computation(100*1e6*1.5973)
                        
$\endgroup$
11
  • 1
    $\begingroup$ That's a lot of questions. Have you tried looking at existing answers (even if unrelated to the book?). FX option price: quant.stackexchange.com/a/70296/54838, Greeks with FD are usually not forward difference but central difference quant.stackexchange.com/a/77239/54838 as well as quant.stackexchange.com/a/69775/54838. Vega is called by 0.01 (for the same reason theta is scaled by /365). $\endgroup$
    – AKdemy
    Commented Jul 20 at 14:21
  • $\begingroup$ I'll have a look at it, thank you. $\endgroup$
    – Enrico
    Commented Jul 20 at 14:54
  • $\begingroup$ I read the links but I'm not able to solve my questions with them. Basically my main concern is about the value with which Taleb is computing the $-value of the Greeks, especially Delta and Gamma, which are very far from what I found. The other Greeks are quite near and I can understand there could be peculiar differences in the formulas used. $\endgroup$
    – Enrico
    Commented Jul 21 at 7:41
  • 1
    $\begingroup$ I believe taleb does not actually use a vol of 15.7% but rather something like 10.45%. With that I get a Price of 4.578m USD. Spot delta of 79.85m USD. Vega of 43.789m, or for a single vol point, 438k USD with rounding and a gamma of 8.357m USD, which is very close to the 8355k in the text. Otherwhise I cannot make it make sense $\endgroup$ Commented Jul 26 at 12:43
  • 1
    $\begingroup$ K = 1.5973 F = 1.5973 Sima = 10.45% T = 183/365 GBP notional = 100m DF usd = 0.971151004 (discount factor) Using black76 for convenience. D1 = LN(F/K) + (0.5*sigma^0.5)*T / 0.5*sigma^0.5 forward delta = Norm(D1) = 0.5147 Forward GBP delta = 0.5147*100m GBP which we can convert to Spot USD delta = -0.5147*100m GBP * F * DF_USD = -79 849 995 USD $\endgroup$ Commented Jul 26 at 14:04

2 Answers 2

3
$\begingroup$

Alright so this is the best I can come up with. It's always tricky to reverse engineer textbooks where all inputs are not explicitly given. i'd also like to point out that the chapter is more about working with Greeks provided as given, than their derivation per se, so perhaps the below is a mood point.

I simply don't think the Vol used is 15.7% but rather ~10.45%. It's the only vol that gives the same Greeks as he is using unless I'm missing something blatantly obvious.

I'm using black76. It seems easier given we're provided with the forward price directly and the interest rates are not continuously compounded but discrete 360 base rates that I find easier to convert to a discount factor.

You're going to have to excuse the notation here, this is a lot of stuff to type.

F= 1.5973, K = 1.5973 (assumption, we know he says 50 delta and ATM, but not given what ATM convention he is using), sigma = 10.45% T = 183/365 = 0.50137, GBP notional = 100m DFUSD = 1/(1+0.058438 x 183/360) = 0.9712

with that I get D1 = 0.0369969 and D2 = -0.0369969.

C = [norm(d1) x F - norm(d2) x K] x DF_USD x 100m = 4,578k USD.

Delta = -norm(d1) x F x 100m GBP x DF_USD x 100m = -79,850k USD. (negative because we are long GBP, Short USD and traders often like showing direction wrt. USD)

Vega = normprime(d1) x F x T^0.5 x 0.01 x DF_USD x 100m = 438K USD.

Gamma = (normprime(d1)/(sigma x T^0.5)) x 0.01 x DF_USD x 100m = 8,357k (full disclosure, 2k difference, gamma is very sensitive to the tiniest differences input on an ATM option)

Further details

On this point: "I managed to obtain the call value with BS (see formula in the Appendix) by supposing the market trades at 1, thus dividing the spot rate and the strike (=1.5973 I suppose) by the spot rate."

That's a big no no in FX options in general :) an implied vol for GBPUSD cannot be used for USDGBP and vice versa (your inversion).

"Except Gamma, some Greeks are distant some power of 10. I suppose I should multiply the BS Greeks for 0.01 , the increment that I am considering in the "discrete" version of the Greeks since they represent, mathematically, a derivate". Correct?

If you calculate sensitivities as finite/forward difference. You're effectively calculating a slope over a discrete interval. Y2-Y1/X2-X1. So yes, you need to divide the output change with the input change increment.

As AKdemy said, sensitivities are usually scaled to sizes practical for the different risk factors. Vega and Gamma are usually multiplied down to a vol point/percentage point respectively to keep them manageable, theta to a single day and curves to a single bps.

"Taleb states that the trader hedge is "50 deltas": what does this means? How does this affect the numbers in my Table?"

Means that (spot I suppose) delta is 50% of the underlying notional. For 100 units of underlying in the option you buy 50 units spot as a hedge.

Taleb is also calculating the sensitivity to rf in this way: (183/360)×100bp×Delta

Hint: A 1 year forward, where the interest rate moves 100bps, will result in the forward price changing by ~1%. This is useful if, for instance, using black 76, where the interest rates are not direct inputs.

Hope this helps

$\endgroup$
3
  • $\begingroup$ Thank you! A couple of question and I'm done. 1) It seems that "F" is missing in the Gamma formula, otherwise I can't get the correct number. The strange thing is that I would expect F to be in the denominator and not to multiply by it. What is happening? 2) The Vega formula is wrong I think: there should not be "sigma" in it. Do you confirm? 3) Could you articulate a little bit more the hint? Thanks again for your time. $\endgroup$
    – Enrico
    Commented Jul 27 at 8:12
  • $\begingroup$ Why did you chose Black76? This is interesting to me. Thanks. $\endgroup$
    – Enrico
    Commented Jul 27 at 8:59
  • 1
    $\begingroup$ You’re right on the vol in the Vega. Not actually how I calculated, just a type in reply which i’ve corrected. I think Attack68 explained the gamma better. Can be a bit tricky when working with FX. I used black76 because it seemed easier with the information given, including your question on rho. Suppose you have a one year forward and the rate changes by 100 bps, then the forward price will change by 1%. This will give the same PNL as had you simply assumed a spot move of 1%, hence you can use the delta to approximate the theta. $\endgroup$ Commented Jul 27 at 18:52
3
$\begingroup$

Using @LongTimeLurker 's values I plugged these into my calculator, and I get the following values in agreement with his:

# PYTHON
from rateslib import *  # version >= 1.4.0

# Spot FX Rate
fxr = FXRates({"gbpusd": 1.605}, settlement=dt(2024, 7, 29))

# Build Curves for an FX Forward market
usdusd = Curve({dt(2024, 7, 29): 1.0, dt(2025, 1, 30): 0.9712})
gbpgbp = Curve({dt(2024, 7, 29): 1.0, dt(2025, 1, 30): 0.9664})
gbpusd = Curve({dt(2024, 7, 29): 1.0, dt(2025, 1, 30): 0.9665})

# Build an FX Forward model from data.
fxf = FXForwards(
    fx_rates=fxr, 
    fx_curves={"usdusd": usdusd, "gbpgbp": gbpgbp, "gbpusd": gbpusd}
)

# Solve the curves so that the forward rate is exactly 1.5973
solver = Solver(
    curves=[gbpusd],
    instruments=[FXExchange(pair="gbpusd", settlement=dt(2025, 1, 30), curves=[None, gbpusd, None, usdusd])],
    s=[1.5973],
    fx=fxf,
)

# Finally construct an FXCall and calculate the greeks
fxc = FXCall(
    pair="gbpusd", 
    expiry=dt(2025, 1, 28), 
    delivery_lag=2, 
    payment_lag=2, 
    strike=1.5973,
    notional=100e6,
    delta_type="forward"
)
fxc.analytic_greeks(fx=fxf, curves=[None, gbpusd, None, usdusd], vol=10.45)

The results are as follows:

{'delta': <Dual: 0.514754, (fx_gbpusd, c1972_0, c1972_1), [3.4, -5.4, 5.6]>,
 'delta_gbp': <Dual: 51475393.768868, (fx_gbpusd, c1972_0, c1972_1), [335693162.0, -538787525.0, 557439308.8]>,
 'gamma': <Dual: 3.373116, (fx_gbpusd, c1972_0, c1972_1), [-3.2, 5.1, -5.2]>,
 'gamma_gbp_1%': <Dual: 5387875.250399, (fx_gbpusd, c1972_0, c1972_1), [-1678201.1, 2693512.8, -2786757.0]>,
 'vega': <Dual: 0.437912, (fx_gbpusd, c1972_0, c1972_1), [0.1, -0.2, 0.2]>,
 'vega_usd': <Dual: 437912.180504, (fx_gbpusd, c1972_0, c1972_1), [136442.8, -218990.6, 226571.7]>,
 'vomma': <Dual: -0.005736, (fx_gbpusd, c1972_0, c1972_1), [-0.0, 0.0, -0.0]>,
 'vanna': <Dual: 0.141166, (fx_gbpusd, c1972_0, c1972_1), [-32.2, 51.6, -53.4]>,
 '_kega': <Dual: 0.041850, (fx_gbpusd, c1972_0, c1972_1), [-9.5, 15.3, -15.8]>,
 '_kappa': <Dual: -0.471266, (fx_gbpusd, c1972_0, c1972_1), [-3.3, 5.2, -5.4]>,
 '_delta_index': None,
 '__delta_type': 'forward',
 '__vol': 0.1045,
 '__strike': 1.5973,
 '__forward': <Dual: 1.597299, (fx_gbpusd, c1972_0, c1972_1), [1.0, -1.6, 1.7]>,
 '__sqrt_t': 0.7080747580684533,
 '__bs76': <Dual: 0.045782, (fx_gbpusd, c1972_0, c1972_1), [0.5, -0.8, 0.8]>,
 '__notional': 100000000.0,
 '__class': 'FXCallPeriod'}

If we multiply the GBP delta by -1.5973 = -\$82,221,646. This is forward delta, spot delta gives a different value.

The USD Gamma is \$8,606,052, although this value relies on GBPUSD moving by 1% which is obviously different if USDGBP moves by 1%, and it was converted by the forward rate of 1.5973. So getting full agreement with Taleb through reverse engineering is tricky here.

The premium (from bs76) is \$4,578,200

$\endgroup$
4
  • $\begingroup$ Thank you. I can replicate the numbers given by the software with some code. What I do not understand are the "conventions" to traslate them in dollars. I see for example gamma=3.373116 and then USD Gamma $8,606,052$. $\endgroup$
    – Enrico
    Commented Jul 27 at 8:02
  • $\begingroup$ The given Python code has expressed "delta_gbp", which is nominal amount of delta in GBP given the notional of 100mm GBP. To convert this to USD I manually used the forward rate of 1.5973 giving USD 82,221,645. $\endgroup$
    – Attack68
    Commented Jul 27 at 13:14
  • 1
    $\begingroup$ "gamma" of 3.37 is the change in "delta" for a 1.0 change in GBPUSD FX rate. To calculate the nominal amount of GBP this corresponds to for a 1% move in currency, take 3.37 * 1.5973 * 0.01 * 100mm notional = GBP 5,382,900. To then convert this to USD, as I mentioned in the answer is that I simply used the forward FX rate again, giving 8,600k USD $\endgroup$
    – Attack68
    Commented Jul 27 at 13:20
  • $\begingroup$ Now it's clear, I missed the 1% of 1.5973. I thought you were multiply for 1.5973^2 and I couldn't find the reason. Now I see it, it's for the conversion in USD. $\endgroup$
    – Enrico
    Commented Jul 27 at 14:01

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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