Arte SheetsLearn. Try. Understand.

Quantitative Finance & Derivatives

Goldman-Sosin-Gatto Floating-Strike Lookback Call Formula

Price continuous floating-strike lookback calls paying S_T - S_min in Excel and Arte Sheets using the Goldman-Sosin-Gatto (1979) / Conze-Viswanathan formula.

Understand why buying at the path minimum S_min doubles vanilla ATM option value

A floating-strike lookback call lets the holder buy the asset at maturity T at the lowest price S_min achieved anywhere along [0, T], guaranteeing a non-negative payoff S_T - S_min >= 0 on every non-constant path! Goldman, Sosin, and Gatto (1979) derived the closed-form value given running minimum m_min <= S (with m_min = S at inception).

For r <> q (carry b = r - q <> 0), C_LB = S*EXP(-q*T)*N(a_1) - m_min*EXP(-r*T)*N(a_2) + S*EXP(-r*T)*(sig^2 / (2*b))*(((S / m_min)^(-2*b / sig^2)) * N(-a_1 + (2*b / sig)*SQRT(T)) - EXP(b*T)*N(-a_1)), where a_1 = (LN(S / m_min) + (b + 0.5*sig^2)*T) / (sig*SQRT(T)) and a_2 = a_1 - sig*SQRT(T). Test inception S = m_min = 100 (B2, B3), r = 0.08 (B4), q = 0 (B5), sig = 0.25 (B6), and T = 0.50 (B7).

Lookback ComponentRole in FormulaBehavior Check
Running Minimum Strike TermS*EXP(-q*T)*N(a_1) - m_min*EXP(-r*T)*N(a_2)Equals vanilla call at strike K = m_min
Future New-Low Bonus TermS*EXP(-r*T)*(sig^2/(2*b))*((S/m)^(-2*b/sig^2)*N(...) - EXP(b*T)*N(-a_1))Captures expected savings if S drops below m_min
Lower Running Minimum m_min = 90Locks in 10 points of already-achieved dipRaises lookback call value immediately

Inception vs Seasoned Lookback d-Parameter a_1 Formula

Enforce physical path ordering m_min <= S (running minimum can never exceed current spot S!).

=IF(OR(B2 <= 0, B3 <= 0, B3 > B2, B6 <= 0, B7 <= 0), "Require 0 < S_min <= S", ROUND((LN(B2 / B3) + (B4 - B5 + 0.5 * B6^2) * B7) / (B6 * SQRT(B7)), 4))

Goldman-Sosin-Gatto Floating-Strike Lookback Call Formula

Combine the vanilla strike-m_min leg with the future-minimum reflection bonus inside LET (requiring nonzero carry |r - q| >= 0.0001).

=LET(s_px, B2, m_low, B3, r_rf, B4, q_div, B5, sig_v, B6, t_yr, B7, b_car, r_rf - q_div, IF(OR(s_px <= 0, m_low <= 0, m_low > s_px, sig_v <= 0, t_yr <= 0, ABS(b_car) < 0.0001), "Invalid Lookback Input", LET(sig_t, sig_v * SQRT(t_yr), a_1, (LN(s_px / m_low) + (b_car + 0.5 * sig_v^2) * t_yr) / sig_t, a_2, a_1 - sig_t, a_3, -a_1 + (2 * b_car / sig_v) * SQRT(t_yr), u_1, 1 / (1 + 0.2316419 * ABS(a_1)), ph_1, 0.3989422804014327 * EXP(-0.5 * a_1^2) * u_1 * (0.31938153 + u_1 * (-0.356563782 + u_1 * (1.781477937 + u_1 * (-1.821255978 + 1.330274429 * u_1)))), na_1, IF(a_1 >= 0, 1 - ph_1, ph_1), nma_1, 1 - na_1, u_2, 1 / (1 + 0.2316419 * ABS(a_2)), ph_2, 0.3989422804014327 * EXP(-0.5 * a_2^2) * u_2 * (0.31938153 + u_2 * (-0.356563782 + u_2 * (1.781477937 + u_2 * (-1.821255978 + 1.330274429 * u_2)))), na_2, IF(a_2 >= 0, 1 - ph_2, ph_2), u_3, 1 / (1 + 0.2316419 * ABS(a_3)), ph_3, 0.3989422804014327 * EXP(-0.5 * a_3^2) * u_3 * (0.31938153 + u_3 * (-0.356563782 + u_3 * (1.781477937 + u_3 * (-1.821255978 + 1.330274429 * u_3)))), na_3, IF(a_3 >= 0, 1 - ph_3, ph_3), c_base, s_px * EXP(-q_div * t_yr) * na_1 - m_low * EXP(-r_rf * t_yr) * na_2, c_bon, s_px * EXP(-r_rf * t_yr) * ((sig_v^2) / (2 * b_car)) * (((s_px / m_low)^(-2 * b_car / (sig_v^2))) * na_3 - EXP(b_car * t_yr) * nma_1), ROUND(c_base + c_bon, 4))))

Try the example

Use the original values or change them to test your understanding.

Further reading