public void TestLargeImpliedVol() { var stock = TestDataHelper.GetStock("RIO"); Assert.AreEqual("RIO", stock.Name); var stockObject = TestHelper.CreateStock(stock); ForwardExpiry fwd = new ForwardExpiry(DateTime.Parse("24-09-2009"), 5818); Strike str = new Strike(5800, null, null, Units.Cents); fwd.AddStrike(str, true); stockObject.VolatilitySurface.AddExpiry(fwd); foreach (ForwardExpiry fwdExp in stockObject.VolatilitySurface.Expiries) { foreach (Strike strike in fwdExp.Strikes) { if (strike.StrikePrice == 5800 && (fwdExp.ExpiryDate == DateTime.Parse("24-09-2009"))) { var vol0 = OptionHelper.GetImpliedVol(stockObject, fwdExp.ExpiryDate, strike.StrikePrice, false, "A", 450.0, 120); AmOptionAnalytics call = new AmOptionAnalytics(stockObject.Date, fwdExp.ExpiryDate, Convert.ToDouble(stockObject.Spot), strike.StrikePrice, vol0, "A", "P", stockObject.RateCurve, stockObject.Dividends, 120); Assert.AreEqual(call.Price(), 450, 0.01); } } } }
public void TestImpliedVol2() { var stock = TestDataHelper.GetStock("ANZ"); Assert.AreEqual("ANZ", stock.Name); Stock stockObject = TestHelper.CreateStock(stock); ForwardExpiry fwd = new ForwardExpiry(DateTime.Parse("29-10-2009"), 3676); Strike str = new Strike(3650, null, null, Units.Cents); fwd.AddStrike(str, true); stockObject.VolatilitySurface.AddExpiry(fwd); foreach (ForwardExpiry fwdExp in stockObject.VolatilitySurface.Expiries) { foreach (Strike strike in fwdExp.Strikes) { if (strike.StrikePrice == 3650 && (fwdExp.ExpiryDate == DateTime.Parse("29-10-2009"))) { stockObject.Spot = 3676; var vol0 = OptionHelper.GetImpliedVol(stockObject, fwdExp.ExpiryDate, strike.StrikePrice, true, "A", 224.5, 120); AmOptionAnalytics call = new AmOptionAnalytics(stockObject.Date, fwdExp.ExpiryDate, Convert.ToDouble(stockObject.Spot), strike.StrikePrice, vol0, "A", "C", stockObject.RateCurve, stockObject.Dividends, 120); Assert.AreEqual(call.Price(), 224.5, 0.01); } } } }
public void TestImpliedVol4() { DateTime today = new DateTime(2010, 07, 14); RateCurve rc = new RateCurve("AUD", "Continuous", DateTime.Parse("14-Jul-2010"), new[] { DateTime.Parse("14-Jul-2010"), DateTime.Parse("28-Jun-2012") }, new[] { 0.045507, 0.050645 }); Dividend d1 = new Dividend(DateTime.Parse("6-9-2010"), 49.90M); Dividend d2 = new Dividend(DateTime.Parse("28-2-2011"), 54.43M); Dividend d3 = new Dividend(DateTime.Parse("5-9-2011"), 58.97M); Dividend d4 = new Dividend(DateTime.Parse("27-2-2012"), 61.24M); Dividend d5 = new Dividend(DateTime.Parse("3-9-2012"), 65.78M); Dividend d6 = new Dividend(DateTime.Parse("25-2-2013"), 68.05M); Dividend d7 = new Dividend(DateTime.Parse("2-9-2013"), 72.58M); Dividend d8 = new Dividend(DateTime.Parse("2-9-2013"), 72.58M); Dividend d9 = new Dividend(DateTime.Parse("24-2-2014"), 73.72M); Dividend d10 = new Dividend(DateTime.Parse("1-9-2014"), 75.99M); List <Dividend> divCurve = new List <Dividend>() { d1, d2, d3, d4, d5, d6, d7, d8, d9, d10 }; var stockObject0 = new Stock(today, 3840, "BHP12JUN4100P.WY", "BHP_Vanilla_ETO_Jun12_41.00_Put", rc, divCurve); double vol = OptionHelper.GetImpliedVol(stockObject0, DateTime.Parse("28-Jun-2012"), 4100, false, "American", 719, 120); }
public void TestImpliedVolPut() { DateTime date0 = DateTime.Today; DateTime exp = date0.AddDays(90); DateTime ex = date0.AddDays(20); double spot = 100; double strike = 100; double vol = 0.50; string paystyle = "P"; DateTime[] dates = { date0, exp }; double[] rates = { 0.05, 0.05 }; RateCurve rc = new RateCurve("AUD", "Continuous", date0, dates, rates); List <Dividend> divs = new List <Dividend> { new Dividend(ex, 20) }; AmOptionAnalytics amInstr = new AmOptionAnalytics(date0, exp, spot, strike, vol, "A", paystyle, rc, divs, 120); AmOptionAnalytics euInstr = new AmOptionAnalytics(date0, exp, spot, strike, 2 * vol, "E", paystyle, rc, divs, 120); double am = amInstr.Price(); double eu = euInstr.Price(); AmOptionAnalytics amInstr0 = new AmOptionAnalytics(date0, exp, spot, strike, 0.20, "A", paystyle, rc, divs, 120); AmOptionAnalytics euInstr0 = new AmOptionAnalytics(date0, exp, spot, strike, 0.80, "E", paystyle, rc, divs, 120); double avol0 = amInstr0.OptSolveVol(am, 100); double evol0 = euInstr0.OptSolveVol(eu, 100); Stock stock = new Stock(date0, 100, "dummy", "BHP", rc, divs); double vol1 = OptionHelper.GetImpliedVol(stock, exp, strike, false, "A", am, 120); double vol11 = OptionHelper.GetImpliedVol(stock, exp, strike, false, "American", am, 120); double vol0 = OptionHelper.GetImpliedVol(stock, exp, strike, false, "E", eu, 120); double vol00 = OptionHelper.GetImpliedVol(stock, exp, strike, false, "European", eu, 120); Assert.AreEqual(avol0, 0.50, 0.001); Assert.AreEqual(evol0, 1.00, 0.001); Assert.AreEqual(vol1, avol0, 0.001); Assert.AreEqual(vol11, avol0, 0.001); Assert.AreEqual(vol0, evol0, 0.001); Assert.AreEqual(vol00, evol0, 0.001); }
public void TestImpliedVolLargeDiv() { var mig = TestDataHelper.GetStock("MIG_20091211.xml"); var migStock = TestHelper.CreateStock(mig); double vol = OptionHelper.GetImpliedVol(migStock, new DateTime(2010, 01, 28), 0.30, 110, true, "A", 21, 120); }
public void TestImpliedVolCall() { DateTime date0 = DateTime.Today; DateTime exp = date0.AddDays(90); DateTime ex = date0.AddDays(20); double spot = 100; double strike = 100; double vol = 0.50; string paystyle = "C"; DateTime[] dates = { date0, exp }; double[] rates = { 0.05, 0.05 }; RateCurve rc = new RateCurve("AUD", "Continuous", date0, dates, rates); List <Dividend> divs = new List <Dividend> { new Dividend(ex, 20) }; AmOptionAnalytics amInstr = new AmOptionAnalytics(date0, exp, spot, strike, vol, "A", paystyle, rc, divs, 120); AmOptionAnalytics euInstr = new AmOptionAnalytics(date0, exp, spot, strike, 2 * vol, "E", paystyle, rc, divs, 120); double am = amInstr.Price(); double eu = euInstr.Price(); AmOptionAnalytics amInstr0 = new AmOptionAnalytics(date0, exp, spot, strike, 0.20, "A", paystyle, rc, divs, 120); AmOptionAnalytics euInstr0 = new AmOptionAnalytics(date0, exp, spot, strike, 0.80, "E", paystyle, rc, divs, 120); double avol0 = amInstr0.OptSolveVol(am, 100); double evol0 = euInstr0.OptSolveVol(eu, 100); var stock = new Stock(date0, 100, "dummy", "BHP", rc, divs); DateTime start = DateTime.Now; double vol1 = OptionHelper.GetImpliedVol(stock, exp, 0.3, strike, true, "A", am, 120); DateTime end = DateTime.Now; double x1 = end.Subtract(start).Milliseconds; start = DateTime.Now; double vol11 = OptionHelper.GetImpliedVol(stock, exp, 0.2, strike, true, "American", am, 120); end = DateTime.Now; double x2 = end.Subtract(start).Milliseconds; start = DateTime.Now; double vol0 = OptionHelper.GetImpliedVol(stock, exp, 0.8, strike, true, "E", eu, 120); end = DateTime.Now; double x3 = end.Subtract(start).Milliseconds; start = DateTime.Now; double vol00 = OptionHelper.GetImpliedVol(stock, exp, 0.8, strike, true, "European", eu, 120); end = DateTime.Now; double x4 = end.Subtract(start).Milliseconds; Assert.AreEqual(avol0, 0.50, 0.001); Assert.AreEqual(evol0, 1.00, 0.001); Assert.AreEqual(vol1, avol0, 0.001); Assert.AreEqual(vol11, avol0, 0.001); Assert.AreEqual(vol0, evol0, 0.001); Assert.AreEqual(vol00, evol0, 0.001); Debug.Print("Time 1 : " + x1); Debug.Print("Time 2 : " + x2); Debug.Print("Time 3 : " + x3); Debug.Print("Time 4 : " + x4); }