示例#1
0
        //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);
        }