//public spotStar /// <summary> /// /// </summary> /// <param name="myZero"></param> /// <param name="myDivList"></param> private void MakeDivArray(ZeroCurve myZero, DivList myDivList) { double dt = Tau / Gridsteps; if ((myDivList != null) && (myZero != null)) { for (int idx = 0; idx < Gridsteps; idx++) { double temp = 0.0; for (int kdx = 0; kdx < myDivList.Divpoints; kdx++) { if ((myDivList.GetT(kdx) > idx * dt) && (myDivList.GetT(kdx) < Tau)) { temp += myDivList.GetD(kdx) * Math.Exp(-myZero.ForwardRate(idx * dt, myDivList.GetT(kdx)) * (myDivList.GetT(kdx) - idx * dt)); } } SetDiv(idx, temp, dt * idx); } } else //missing either div or zero, load in 0 for _div on tree { for (int idx = 0; idx <= Gridsteps; idx++) { SetDiv(idx, 0.0, dt * idx); } } }
/// <summary> /// /// </summary> /// <param name="spotT"></param> /// <param name="priceT"></param> /// <param name="myZero"></param> /// <param name="myDiv"></param> public void MakeTheta(ITree spotT, Pricer priceT, ZeroCurve myZero, DivList myDiv) { SetParam(spotT, priceT); var type = spotT.GetType(); ITree t1 = (ITree)Activator.CreateInstance(type); ITree t2 = (ITree)Activator.CreateInstance(type); t1.Tau = Tau; t1.Gridsteps = Gridsteps; t1.Sig = Sig; t1.Spot = Spot; t1.MakeGrid(myZero, myDiv); priceT.MakeGrid(t1); double p1 = priceT.Price(); DivList shiftDiv = new DivList { Divpoints = myDiv.Divpoints }; shiftDiv.MakeArrays(); for (int idx = 0; idx < myDiv.Divpoints; idx++) { shiftDiv.SetD(idx, myDiv.GetD(idx), myDiv.GetT(idx) - 1 / 365.0); } double t = Tau - 1.00 / 365.00; t2.Tau = t; t2.Gridsteps = Gridsteps; t2.Sig = Sig; t2.Spot = Spot; t2.MakeGrid(myZero, shiftDiv); priceT.MakeGrid(t2); double p2 = priceT.Price(); Theta = (p2 - p1); }
/// <summary> /// /// </summary> /// <param name="myZero"></param> /// <param name="myDivList"></param> /// <param name="spot"></param> /// <param name="t"></param> /// <returns></returns> 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 spotStar private void MakeSpotStar(ZeroCurve myZero, DivList myDivList) { _spotstar = 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)); _spotstar -= d1 * t1; } } } }
//public spotStar private void MakeSpotZero(ZeroCurve myZero, DivList myDivList) { _spot0 = Spot; _ratio = new double[myDivList.Divpoints]; if (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)); _ratio[idx] = d1 * t1 / _spot0; if (_ratio[idx] > 1) { throw new Exception("Dividend greater than spot"); } _spot0 = _spot0 * (1 - _ratio[idx]); } } } }