/// <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="spotT"></param> /// <param name="priceT"></param> /// <param name="myZero"></param> /// <param name="myDiv"></param> public void MakeVega(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 = .99 * Sig; t1.Spot = Spot; t1.MakeGrid(myZero, myDiv); priceT.MakeGrid(t1); double p1 = priceT.Price(); t2.Tau = Tau; t2.Gridsteps = Gridsteps; t2.Sig = 1.01 * Sig; t2.Spot = Spot; t2.MakeGrid(myZero, myDiv); priceT.MakeGrid(t2); double p2 = priceT.Price(); if (Sig != 0) { Vega = 0.01 * (p2 - p1) / (2 * 0.01 * Sig); } }
/// <summary> /// /// </summary> /// <param name="spotT"></param> /// <param name="priceT"></param> /// <param name="myZero"></param> /// <param name="myDiv"></param> public void MakeDeltaGamma(ITree spotT, Pricer priceT, ZeroCurve myZero, DivList myDiv) { SetParam(spotT, priceT); var type = spotT.GetType(); ITree treeD = (ITree)Activator.CreateInstance(type); treeD.Gridsteps = Gridsteps + 2; treeD.Spot = Spot; treeD.Sig = Sig; treeD.Tau = Tau * (1 + 2 / Gridsteps); treeD.MakeGrid(myZero, myDiv); priceT.MakeGrid(treeD); double[] s = new double[3]; double[] c = new double[3]; for (int i = 0; i <= 2; ++i) { s[i] = treeD.GetSpotMatrix(2, i); c[i] = priceT.GetPriceMatrix(2, i); } //Delta = (S[0] * (2 * S[1] - S[0]) * (C[1] - C[2]) + // (S[1] * S[1]) * (C[2] - C[0]) + S[2] * (2 * S[1] - S[2]) * (C[0] - C[1])) // / (S[1] - S[0]) / (S[2] - S[0]) / (S[2] - S[1]); //Gamma = 2 * (S[0] * (C[1] - C[2]) + S[1] * (C[2] - C[0]) + S[2] * (C[0] - C[1])) // / (S[1] - S[0]) / (S[2] - S[0]) / (S[2] - S[1]); double u = treeD.GetUp(0); double d = treeD.GetDn(0); double est1 = (c[2] - c[0]) / (s[2] - s[0]); double est2 = (priceT.GetPriceMatrix(4, 4) - priceT.GetPriceMatrix(4, 0)) / (treeD.GetSpotMatrix(4, 4) - treeD.GetSpotMatrix(4, 0)); double est3 = (priceT.GetPriceMatrix(6, 6) - priceT.GetPriceMatrix(6, 0)) / (treeD.GetSpotMatrix(6, 6) - treeD.GetSpotMatrix(6, 0)); double temp = (Math.Pow(u, 2) + Math.Pow(d, 2) + Math.Pow(u, 2) * Math.Pow(d, 2)) * est1 - (Math.Pow(u, 2) + Math.Pow(d, 2) + 1) * est2 + est3; Delta = 1 / Math.Pow(u, 2) / Math.Pow(d, 2) * temp; //Delta = 1/ }
private void SetParam(ITree spotT, Pricer priceT) { if ((spotT != null) && (priceT != null)) { Gridsteps = spotT.Gridsteps; Tau = spotT.Tau; Sig = spotT.Sig; Spot = spotT.Spot; Strike = priceT.Strike; Style = priceT.Style; Payoff = priceT.Payoff; Smoothing = priceT.Smoothing; } }
/// <summary> /// /// </summary> /// <param name="spot"></param> /// <param name="strike"></param> /// <param name="vol"></param> /// <param name="paystyle"></param> /// <param name="today"></param> /// <param name="expiry"></param> /// <param name="zeroDates"></param> /// <param name="zeroRates"></param> /// <param name="q"></param> /// <returns></returns> public static double BlackScholesPricerContDiv(double spot, double strike, double vol, string paystyle, DateTime today, DateTime expiry, DateTime[] zeroDates, double[] zeroRates, double q) { double t = expiry.Subtract(today).Days / 365.0; ZeroCurve myZero = (new Wrapper()).UnpackZero(today, zeroDates, zeroRates); double fwd = Collar.GetATMfwd(myZero, q, spot, t); double r = myZero.LinInterp(t); //create default pricer var myPrice = new Pricer { Strike = strike, Payoff = paystyle }; double pr = myPrice.BSprice(fwd, t, strike, r, vol, paystyle); return(pr); }
/// <summary> /// /// </summary> /// <param name="style"></param> /// <param name="spot"></param> /// <param name="strike"></param> /// <param name="vol"></param> /// <param name="today"></param> /// <param name="expiry"></param> /// <param name="paystyle"></param> /// <param name="zeroDates"></param> /// <param name="zeroRates"></param> /// <param name="divDates"></param> /// <param name="divAms"></param> /// <param name="gridsteps"></param> /// <param name="smoo"></param> /// <param name="flatFlag"></param> /// <returns></returns> public static double[,] BinomialRelativeGetGreeks(string style, double spot, double strike, double vol, DateTime today, DateTime expiry, string paystyle, DateTime[] zeroDates, double[] zeroRates, DateTime[] divDates, double[] divAms, double gridsteps, string smoo, bool flatFlag) { const int arrsize = 4; gridsteps = (gridsteps == 0.0) ? 20 : gridsteps; int nGridsteps = Convert.ToInt32(gridsteps); string smoothing = (smoo.ToLower().Equals("n")) ? "n" : "y"; var retArray = new double[arrsize, arrsize]; double t = expiry.Subtract(today).Days / 365.0; ZeroCurve myZero = (new Wrapper()).UnpackZero(today, zeroDates, zeroRates); DivList myDiv = (new Wrapper()).UnpackDiv(today, expiry, divDates, divAms); //create the tree var myTree = new PropTree(t, vol, spot, nGridsteps, true) { Gridsteps = nGridsteps }; myTree.MakeGrid(myZero, myDiv); //create pricer var myPrice = new Pricer(strike, paystyle, smoothing, style); myPrice.MakeGrid(myTree); myPrice.Price(); var myGreeks = new Greeks(); myGreeks.MakeDeltaGamma(myTree, myPrice, myZero, myDiv); double delta = myGreeks.Delta; double gamma = myGreeks.Gamma; myGreeks.MakeVega(myTree, myPrice, myZero, myDiv); double vega = myGreeks.Vega; myGreeks.MakeTheta(myTree, myPrice, myZero, myDiv); double theta = myGreeks.Theta; retArray[0, 0] = delta; retArray[0, 1] = gamma; retArray[0, 2] = vega; retArray[0, 3] = theta; return(retArray); }
/// <summary> /// /// </summary> /// <param name="myZero"></param> /// <param name="myDiv"></param> /// <param name="orcParams"></param> /// <param name="t"></param> /// <param name="strike"></param> /// <param name="spot"></param> /// <param name="style"></param> /// <param name="paystyle"></param> /// <param name="gridsteps"></param> /// <returns></returns> public static double FindPrice(ZeroCurve myZero, DivList myDiv, double[] orcParams, double t, double strike, double spot, string style, string paystyle, double gridsteps) { //get the atfwd double atFwd = GetATMfwd(myZero, myDiv, spot, t); //unpack the orc paramters //double currentVol = OrcParams[0]; //double slopeRef = OrcParams[1]; //double putCurve = OrcParams[2]; //double callCurve = OrcParams[3]; //double dnCutOff = OrcParams[4]; //double upCutOff = OrcParams[5]; //double refFwd = OrcParams[6]; //double refVol = OrcParams[7]; //double vcr = OrcParams[8]; //double scr = OrcParams[9]; //double ssr = OrcParams[10]; //double dsr = OrcParams[11]; //double usr = OrcParams[12]; //set up the tree var myTree = new DiscreteTree(); var myVol = new OrcWingVol(); int nGridsteps = (gridsteps < 20.0) ? 20 : Convert.ToInt32(gridsteps); myTree.Gridsteps = nGridsteps; myTree.Tau = t; myTree.Sig = myVol.Orcvol(atFwd, strike); myTree.Spot = spot; myTree.MakeGrid(myZero, myDiv); //create pricer var myPrice = new Pricer { Strike = strike, Payoff = paystyle, Smoothing = "y", Style = style }; myPrice.MakeGrid(myTree); double pr = myPrice.Price(); return(pr); }
/// <summary> /// /// </summary> /// <param name="style"></param> /// <param name="spot"></param> /// <param name="strike"></param> /// <param name="vol"></param> /// <param name="today"></param> /// <param name="expiry"></param> /// <param name="paystyle"></param> /// <param name="zeroDates"></param> /// <param name="zeroRates"></param> /// <param name="divDates"></param> /// <param name="divAms"></param> /// <param name="gridsteps"></param> /// <param name="smoo"></param> /// <param name="flatFlag"></param> /// <returns></returns> public static double BinomialRelativePricer(string style, double spot, double strike, double vol, DateTime today, DateTime expiry, string paystyle, DateTime[] zeroDates, double[] zeroRates, DateTime[] divDates, double[] divAms, double gridsteps, string smoo, bool flatFlag) { gridsteps = (gridsteps == 0.0) ? 20 : gridsteps; int nGridsteps = Convert.ToInt32(gridsteps); string smoothing = (smoo.ToLower().Equals("n")) ? "n" : "y"; double t = expiry.Subtract(today).Days / 365.0; var wrapper = new Wrapper(); ZeroCurve myZero = wrapper.UnpackZero(today, zeroDates, zeroRates); DivList myDiv = wrapper.UnpackDiv(today, expiry, divDates, divAms); //create the tree var myTree = new PropTree(t, vol, spot, nGridsteps, true); myTree.MakeGrid(myZero, myDiv); //create pricer var myPrice = new Pricer(strike, paystyle, smoothing, style); myPrice.MakeGrid(myTree); double pr = myPrice.Price(); return(pr); }