public void DigitalFacts() { var t = 1.0; var f = 100; var vol = 0.32; var rf = 0.0; var cp = OptionType.C; var k = 110; var digiPV = BlackFunctions.BlackDigitalPV(f, k, rf, t, vol, cp); var spread = 0.0001; var expected = (BlackFunctions.BlackPV(f, k, rf, t, vol, cp) - BlackFunctions.BlackPV(f, k + spread, rf, t, vol, cp)) / spread; Assert.Equal(expected, digiPV, 6); var iv = BlackFunctions.BlackDigitalImpliedVol(f, k, rf, t, digiPV, cp); Assert.Equal(vol, iv, 6); }
public double CDF(DateTime expiry, double fwd, double strike) { var t = TimeBasis.CalculateYearFraction(OriginDate, expiry); var vol = GetVolForAbsoluteStrike(strike, expiry, fwd); var nu = vol * Sqrt(t); (var d1, var d2) = BlackFunctions.D1d2(fwd, strike, t, vol); var vega = BlackFunctions.BlackVega(fwd, strike, 0.0, t, vol) / 0.01; var digi = BlackFunctions.BlackDigitalPV(fwd, strike, 0.0, t, vol, OptionType.P); var dvdk = Dvdk(strike, expiry, fwd); return(digi + vega * dvdk); //var dk = fwd * 1e-10; //var volU = GetVolForAbsoluteStrike(strike + dk, expiry, fwd); //var volD = GetVolForAbsoluteStrike(strike - dk, expiry, fwd); //var pU = BlackFunctions.BlackPV(fwd, strike + dk, 0.0, t, volU, OptionType.P); //var pD = BlackFunctions.BlackPV(fwd, strike - dk, 0.0, t, volD, OptionType.P); //var dPdK = (pU - pD) / (2.0 * dk); //return dPdK; }