/// <summary> /// Creates a test vol surface to test temporal and strike volatility interpolation /// </summary> /// <returns></returns> public IVolatilitySurface CreateTestVolSurface() { IVolatilitySurface volSurface = new VolatilitySurface("BHP", 4500M, DateTime.Today); ForwardExpiry expiry1 = new ForwardExpiry(DateTime.Parse("01-Jan-2010"), 4200); ForwardExpiry expiry2 = new ForwardExpiry(DateTime.Parse("01-Jan-2011"), 4400); OptionPosition call1 = new OptionPosition("1245", 104, PositionType.Call); OptionPosition put1 = new OptionPosition("1246", 1200, PositionType.Put); OptionPosition call2 = new OptionPosition("1645", 180, PositionType.Call); OptionPosition put2 = new OptionPosition("1646", 1300, PositionType.Put); Strike strike1 = new Strike(4200, call1, put1); Strike strike2 = new Strike(4000, call2, put2); IVolatilityPoint point1 = new VolatilityPoint(); point1.SetVolatility(0.30M, VolatilityState.Default()); put1.SetVolatility(point1); call1.SetVolatility(point1); IVolatilityPoint point2 = new VolatilityPoint(); point2.SetVolatility(0.40M, VolatilityState.Default()); call2.SetVolatility(point2); put2.SetVolatility(point2); expiry1.AddStrike(strike1, true); expiry2.AddStrike(strike2, true); volSurface.AddExpiry(expiry1); volSurface.AddExpiry(expiry2); return(volSurface); }
/// <summary> /// Creates the one point child. /// </summary> /// <returns></returns> public IVolatilitySurface CreateOnePointChild() { IVolatilitySurface volSurface = new VolatilitySurface("BHP", 4500M, DateTime.Today); ForwardExpiry expiry0 = new ForwardExpiry(DateTime.Parse("10-9-2009"), 4700); OptionPosition call0 = new OptionPosition("1145", 104, PositionType.Call); OptionPosition put0 = new OptionPosition("1146", 1200, PositionType.Put); Strike strike0 = new Strike(0.20, 4599, call0, put0); expiry0.AddStrike(strike0, true); volSurface.AddExpiry(expiry0); return(volSurface); }
/// <summary> /// Creates a null volatility surface to be used in extrapolation tests that utilise /// the historical volatility ratio /// </summary> /// <returns></returns> public IVolatilitySurface CreateNullVolSurface() { IVolatilitySurface volSurface = new VolatilitySurface("BHP", 4500M, DateTime.Today); ForwardExpiry expiry0 = new ForwardExpiry(DateTime.Parse("14-9-2009"), 4700); ForwardExpiry expiry1 = new ForwardExpiry(DateTime.Parse("16-9-2009"), 4700); ForwardExpiry expiry2 = new ForwardExpiry(DateTime.Parse("30-9-2009"), 4750); OptionPosition call0 = new OptionPosition("1145", 104, PositionType.Call); OptionPosition put0 = new OptionPosition("1146", 1200, PositionType.Put); OptionPosition call1 = new OptionPosition("1245", 104, PositionType.Call); OptionPosition put1 = new OptionPosition("1246", 1200, PositionType.Put); OptionPosition call2 = new OptionPosition("1645", 180, PositionType.Call); OptionPosition put2 = new OptionPosition("1646", 1300, PositionType.Put); Strike strike0 = new Strike(1.00, 4599, call0, put0); Strike strike1 = new Strike(0.867, 4700, call1, put1); Strike strike2 = new Strike(1.00, 4750, call2, put2); Strike strike3 = new Strike(1.2, 4750, call2, put2); Strike strike4 = new Strike(0.30, 4750, call2, put2); IVolatilityPoint point0 = new VolatilityPoint(); point0.SetVolatility(0.00M, VolatilityState.Default()); put0.SetVolatility(point0); call0.SetVolatility(point0); strike0.SetVolatility(point0); IVolatilityPoint point1 = new VolatilityPoint(); point1.SetVolatility(0.00M, VolatilityState.Default()); put1.SetVolatility(point1); call1.SetVolatility(point1); strike1.SetVolatility(point1); IVolatilityPoint point2 = new VolatilityPoint(); point2.SetVolatility(0.00M, VolatilityState.Default()); strike2.SetVolatility(point2); call2.SetVolatility(point2); put2.SetVolatility(point2); IVolatilityPoint point3 = new VolatilityPoint(); point3.SetVolatility(0.00M, VolatilityState.Default()); strike3.SetVolatility(point3); IVolatilityPoint point4 = new VolatilityPoint(); point4.SetVolatility(0.00M, VolatilityState.Default()); strike4.SetVolatility(point4); expiry0.AddStrike(strike0, true); expiry1.AddStrike(strike1, true); expiry2.AddStrike(strike2, true); expiry2.AddStrike(strike3, true); expiry2.AddStrike(strike4, true); volSurface.AddExpiry(expiry0); volSurface.AddExpiry(expiry1); volSurface.AddExpiry(expiry2); return(volSurface); }
/// <summary> /// Fits this instance. /// </summary> public void Fit(VolatilitySurface surface, double strike, DateTime expiry) { // fit in expiry direction double y = strike; double x = (expiry.Subtract(surface.Date)).Days / 365.0; ExtendedInterpolatedSurface interpCurve = surface.InterpCurve; IPoint point = new Point2D(x, y); interpCurve.Value(point); IInterpolation model = interpCurve.GetYAxisInterpolatingFunction(); var sabr = (SABRModelInterpolation)model; //Assign params; SABRParams = sabr.CalibrationEngine.GetSABRParameters; }
public void TestPricevsORCExample() { DateTime[] rtDates = { DateTime.Parse("17-Aug-2010"), DateTime.Parse("17-Sep-2010"), DateTime.Parse("18-Oct-2010"), DateTime.Parse("17-Nov-2010"), DateTime.Parse("10-Dec-2010") }; double[] rates = { 0.045507232, 0.046609656, 0.047336042, 0.047655159, 0.047737236 }; RateCurve rc = new RateCurve("AUD", "Semi-Annual", DateTime.Parse("16-Aug-2010"), rtDates, rates); //Dividend d1 = new Dividend(DateTime.Parse("16-8-2010"), 11.745786M); Dividend d2 = new Dividend(DateTime.Parse("17-8-2010"), 0.893295M); Dividend d3 = new Dividend(DateTime.Parse("23-8-2010"), 7.856689M); Dividend d4 = new Dividend(DateTime.Parse("24-8-2010"), 2.898251M); Dividend d5 = new Dividend(DateTime.Parse("25-8-2010"), 3.344721M); Dividend d6 = new Dividend(DateTime.Parse("26-8-2010"), 0.485070M); Dividend d7 = new Dividend(DateTime.Parse("27-8-2010"), 0.835305M); Dividend d8 = new Dividend(DateTime.Parse("30-8-2010"), 3.952976M); Dividend d9 = new Dividend(DateTime.Parse("31-8-2010"), 0.884255M); Dividend d10 = new Dividend(DateTime.Parse("1-9-2010"), 2.013798M); Dividend d11 = new Dividend(DateTime.Parse("2-9-2010"), 1.241407M); Dividend d12 = new Dividend(DateTime.Parse("3-9-2010"), 0.613699M); Dividend d13 = new Dividend(DateTime.Parse("6-9-2010"), 11.712946M); Dividend d14 = new Dividend(DateTime.Parse("7-9-2010"), 3.775104M); Dividend d15 = new Dividend(DateTime.Parse("8-9-2010"), 0.606597M); Dividend d16 = new Dividend(DateTime.Parse("9-9-2010"), 0.268093M); Dividend d17 = new Dividend(DateTime.Parse("10-9-2010"), 0.144851M); Dividend d18 = new Dividend(DateTime.Parse("13-9-2010"), 1.600975M); Dividend d19 = new Dividend(DateTime.Parse("14-9-2010"), 1.499946M); Dividend d20 = new Dividend(DateTime.Parse("15-9-2010"), 0.238824M); Dividend d21 = new Dividend(DateTime.Parse("16-9-2010"), 0.117931M); List <Dividend> divCurve = new List <Dividend>() { d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16, d17, d18, d19, d20, d21 }; DateTime date0 = new DateTime(2010, 08, 16); DateTime exp = new DateTime(2010, 9, 16); double spot = 4447.62; //double future = 4420; double strike = 4200; string stockId = "XJO_Spot"; Stock stock = new Stock(date0, Convert.ToDecimal(spot), stockId, "XJO", rc, divCurve); double fwd = stock.GetForward(date0, exp); var wingParams1 = new OrcWingParameters { CurrentVol = 0.234828, RefVol = 0.234828, SlopeRef = -0.109109, PutCurve = 1.235556, CallCurve = 0.60895, DnCutoff = -0.493791, UpCutoff = 0.506209, RefFwd = 4420.092383, AtmForward = 4420.092383, Vcr = 0, Scr = 0, Ssr = 100, Dsr = 0.2, Usr = 0.2, }; VolatilitySurface vs = new VolatilitySurface(stockId, Convert.ToDecimal(spot), date0); ForwardExpiry expiry = new ForwardExpiry(exp, Convert.ToDecimal(fwd)); OptionPosition op = new OptionPosition("XJO_Vanilla_ETO_Sep10_4200.000_Put", 30.237108, PositionType.Put); Strike strike0 = new Strike(strike, null, op); expiry.AddStrike(strike0, true); List <double> strikes1 = new List <double> { 4200 }; ForwardExpiry forwardexpiry = vs.ValueAt(stock, exp, strikes1, wingParams1, true, false); double vol = Convert.ToDouble(forwardexpiry.Strikes[0].Volatility.Value); var utils = new AmOptionAnalytics(date0, exp, spot, strike, vol, "European", "Put", rc, divCurve, 120); double pr = Math.Round(utils.Price(), 7); }