//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);
                }
            }
        }
Exemple #2
0
        /// <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);
        }
Exemple #3
0
        /// <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;
                    }
                }
            }
        }
Exemple #5
0
 //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]);
             }
         }
     }
 }