//fill grid forward rates private void FillForwardRate() { int days = Convert.ToInt32(Tau * 365); if (_rawZero != null) { FlatRate = -1 / Tau * Math.Log(Convert.ToDouble(_rawZero.GetDf(days))); for (int idx = 0; idx < Gridsteps; idx++) { SetR(idx, FlatRate); } } }
public decimal GetTailedFutures(int numBasket, int daysToExpiry) { DateTime[] dates = { new DateTime(2009, 9, 10), new DateTime(2009, 10, 10), new DateTime(2009, 12, 10), new DateTime(2010, 3, 10), new DateTime(2010, 9, 10), new DateTime(2011, 3, 10) }; double[] rates = { 0.03, 0.035, 0.04, 0.04, 0.045, 0.05 }; RateCurve rc = new RateCurve("AUD", "Semi-Annual", new DateTime(2009, 9, 9), dates, rates); decimal df = rc.GetDf(daysToExpiry); return(df * Convert.ToDecimal(numBasket)); }
public void TestRateCurve() { DateTime[] dates = { new DateTime(2009, 9, 10), new DateTime(2009, 10, 10), new DateTime(2009, 12, 10), new DateTime(2010, 3, 10), new DateTime(2010, 9, 10), new DateTime(2011, 3, 10) }; double[] rates = { 0.03, 0.035, 0.04, 0.04, 0.045, 0.05 }; RateCurve rc0 = new RateCurve("AUD", "Semi-Annual", new DateTime(2009, 9, 9), dates, rates); double rf0 = Convert.ToDouble(rc0.ForwardRate(0, 365)); double df0 = Convert.ToDouble(rc0.GetDf(101)); Assert.AreEqual(0.98910057, df0, 0.0001); Assert.AreEqual(Math.Pow(1 + 0.044973 / 2, 2) - 1, rf0, 0.0001); RateCurve rc1 = new RateCurve("AUD", "Continuous", new DateTime(2009, 9, 9), dates, rates); double rf1 = Convert.ToDouble(rc1.ForwardRate(0, 365)); double df1 = Convert.ToDouble(rc1.GetDf(101)); Assert.AreEqual(0.98899254, df1, 0.0001); Assert.AreEqual(Math.Exp(0.044973) - 1, rf1, 0.0001); }
private double Bisection(double prem, double fwdPrice) { double right = 0.75; double left = 0.35; double mid; var cp = Payoff.ToLower() == "c" ? 1 : -1; int days = Expiry.Subtract(Today).Days; double t = days / 365.0; var priceClone = (AmOptionAnalytics)Clone(); if (fwdPrice <= 0 || Strike <= 0 || t <= 0 || prem <= 0) { return(0); } double df = Convert.ToDouble(RateCurve.GetDf(days)); if (prem < Math.Max(cp * df * (fwdPrice - priceClone.Strike), 0)) { throw new System.Exception("No solution for volatility"); } do { mid = (right + left) / 2; priceClone.Sig = left; double fleft = priceClone.Price() - prem; priceClone.Sig = right; double fright = priceClone.Price() - prem; priceClone.Sig = mid; double fmid = priceClone.Price() - prem; if (fleft * fmid < 0) { right = mid; } else if (fright * fmid < 0) { left = mid; } } while (Math.Abs(right - left) > 2 * Eps); return(mid); }