public void VegaFacts() { var t = 1.0; var k = 100; var f = 100; var vol = 0.32; var rf = 0.05; var cp = OptionType.P; //vega closely matches numerical estimate var PV1 = BlackFunctions.BlackPV(f, k, rf, t, vol - 0.00005, cp); var PV2 = BlackFunctions.BlackPV(f, k, rf, t, vol + 0.00005, cp); var vegaEst = (PV2 - PV1) / 0.0001 * 0.01; var vega = BlackFunctions.BlackVega(f, k, rf, t, vol); Assert.Equal(vegaEst, vega, 6); //all else the same, more time==more vega var vegaNear = BlackFunctions.BlackVega(f, k, rf, t, vol); var vegaFar = BlackFunctions.BlackVega(f, k, rf, t * 2, vol); Assert.True(vegaFar > vegaNear); //cases for zero vega vega = BlackFunctions.BlackVega(f, 0, rf, t, vol); Assert.Equal(0, vega, 8); vega = BlackFunctions.BlackVega(f, 1e6, rf, t, vol); Assert.Equal(0, vega, 8); }
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; }
public void BlackGammaVega_Facts() { Assert.Equal(0.0, BlackFunctions.BlackGamma(0.1, 1.0, 0.5, 0.0, 0.001)); Assert.Equal(0.0, BlackFunctions.BlackVega(0.1, 1.0, 0.5, 0.0, 0.001)); }