public static double GetATMfwd(ZeroCurve myZero, DivList myDivList, double spot, double t) { double spotstar = spot; //compute the discounted dividends and take off spot if ((myDivList != null) && (myZero != null)) { for (int idx = 0; idx < myDivList.Divpoints; idx++) { if (myDivList.GetT(idx) <= t) { double d1 = myDivList.GetD(idx); double r1 = myZero.LinInterp(myDivList.GetT(idx)); double t1 = Math.Exp(-r1 * myDivList.GetT(idx)); spotstar -= d1 * t1; } } } //gross up to expiry to get atfwd if (myZero != null) { double r = myZero.LinInterp(t); return(spotstar * Math.Exp(r * t)); } return(0); }
public void NonFlatRates() { ZeroCurve myZero = new ZeroCurve(); myZero.Ratepoints = 2; myZero.MakeArrays(); myZero.SetR(0, 0.05, 1.0); myZero.SetR(1, 0.075, 2.0); //test interpolation priot to point 0 double tTime = 0.5; double val = myZero.LinInterp(tTime); Assert.IsTrue(val > 0.0499999999); Assert.IsTrue(val < 0.050000001); //test interpolation prior to point 1 tTime = 1.5; val = myZero.LinInterp(tTime); Assert.IsTrue(val > 0.062499999999); Assert.IsTrue(val < 0.06250000001); //test interpolation post point 1 tTime = 2.5; val = myZero.LinInterp(tTime); Assert.IsTrue(val > 0.07499999999); Assert.IsTrue(val < 0.0750000001); //test forward rates //test interpolation priot to point 0 double tl = 0.25; tTime = 0.5; val = myZero.ForwardRate(tl, tTime); Assert.IsTrue(val > 0.0499999999); Assert.IsTrue(val < 0.050000001); //test interpolation prior to point 1 tTime = 1.5; val = myZero.ForwardRate(tl, tTime); Assert.IsTrue(val > 0.06499999); /// 0.065 Assert.IsTrue(val < 0.065000001); //test interpolation post point 1 tTime = 2.5; val = myZero.ForwardRate(tl, tTime); ///0.077778 Assert.IsTrue(val > 0.0777777); Assert.IsTrue(val < 0.07777778); }
//fill grid forward rates private void FillForwardRate(ZeroCurve myZero) { double dt = Tau / Gridsteps; if (myZero != null) { if (flatFlag) { flatRate = myZero.LinInterp(Tau); } for (int idx = 0; idx < Gridsteps; idx++) { SetR(idx, flatFlag ? flatRate : myZero.ForwardRate(idx * dt, (idx + 1) * dt)); } } }
private void MakeSpotStar(ZeroCurve myZero, DivList myDivList) { SpotStart = Spot; if ((myDivList != null) && (myZero != null)) { for (int idx = 0; idx < myDivList.Divpoints; idx++) { if (myDivList.GetT(idx) <= Tau) { double d1 = myDivList.GetD(idx); double r1 = myZero.LinInterp(myDivList.GetT(idx)); double t1 = Math.Exp(-r1 * myDivList.GetT(idx)); SpotStart -= d1 * t1; } } } }