FX Volatility Smiles and Uncertainty

Week 7 — 10 March 2025

The syllabus records “Black-Scholes shortcomings: smile effects.” The source export contains the volatility-surface helper below and explicitly labels it “Vol Surface Functions — Not to be completed by Student.” I am preserving that status rather than presenting it as a finished calibration method.

Risk-reversal and fly interpolation

' ------------------- ' ------------------- ' ------------------- ' ------------------- ' -------------------
' ------------------- ' ------------------- ' ------------------- ' ------------------- ' -------------------
' ------------------- ' ------------------- ' ------------------- ' ------------------- ' -------------------
' ------------------- Vol Surface Functions - Not to be completed by Student ---------------------
Function RRFlyQuadraticFit(lowStrike As Double, _
                    atmFStrike As Double, _
                    highStrike As Double, _
                    ATMFVol As Double, _
                    RRvol As Double, _
                    FlyVol As Double, _
                    XpointATMF As Double, _
                    XPoint As Double)
    Dim VollowStrike As Double
    Dim VolATF As Double
    Dim VolHighStrike As Double
    Dim lowStrikeRelative As Double
    Dim highStrikeRelative As Double
    Dim XPointRelative As Double
    Dim zero As Double
    'If a crazy strike
    If Abs(XPoint) > atmFStrike * 1000 Or Abs(XPoint) < atmFStrike / 1000 Then
     RRFlyQuadraticFit = 0#
    'If not a crazy strike
    Else
     'Make everything relative to ATMF
     lowStrikeRelative = lowStrike - atmFStrike
     highStrikeRelative = highStrike - atmFStrike
     XPointRelative = XPoint - XpointATMF
     zero = 0#
     ' Low Strike vol
      VollowStrike = ATMFVol - RRvol / 2 + FlyVol
      VolATF = ATMFVol
       VolHighStrike = ATMFVol + RRvol / 2 + FlyVol
        RRFlyQuadraticFit = QuadraticFit(lowStrikeRelative, _
                                         VollowStrike, _
                                         zero, _
                                         VolATF, _
                                         highStrikeRelative, _
                                         VolHighStrike, _
                                         XPointRelative)
    End If
End Function
Function QuadraticFit(X1 As Double, _
                    Y1 As Double, _
                    X2 As Double, _
                    Y2 As Double, _
                    X3 As Double, _
                    Y3 As Double, _
                    XPoint As Double)
    Dim Acoef As Double
    Dim Bcoef As Double
    Dim Ccoef As Double
    Acoef = ((Y2 - Y1) * (X1 - X3) + _
         (Y3 - Y1) * (X2 - X1)) / _
        ((X1 - X3) * (X2 ^ 2 - X1 ^ 2) + _
         (X2 - X1) * (X3 ^ 2 - X1 ^ 2))
    Bcoef = ((Y2 - Y1) - Acoef * (X2 ^ 2 - X1 ^ 2)) _
        / (X2 - X1)
    Ccoef = Y1 - Acoef * X1 ^ 2 - Bcoef * X1
    QuadraticFit = Acoef * XPoint ^ 2 + Bcoef * XPoint + Ccoef
End Function
'------------------- AUXILIARY FUNCTIONS --------------------

Auxiliary normal terms

' D1 calculation
Function dOne(S, X, T, r, v)
    dOne = (Log(S / X) + (0.5 * v ^ 2) * T) / (v * (Sqr(T)))
End Function
' N(d1) calculation
Function NdOne(S, X, T, r, v)
    NdOne = Exp(-(dOne(S, X, T, r, v) ^ 2) / 2) / (Sqr(2 * Application.WorksheetFunction.Pi()))
End Function
' D2 calculation
Function dTwo(S, X, T, r, v)
    dTwo = dOne(S, X, T, r, v) - v * Sqr(T)
End Function
 ' N(D2) calculation
Function NdTwo(S, X, T, r, v)

The source gives an implementation sketch for interpolating a quadratic through low-strike, at-the-money-forward, and high-strike volatilities. It does not include a worked smile calibration or a claim that the helper was completed.