Beispiel #1
0
        public void TestAsianHybridCliquet5Y()
        {
            // DateTime valueDate = new DateTime(2009, 10, 20);
            //DateTime expiryDate = new DateTime(2015, 04, 19);
            SetUpExampleCliquet();
            int nobsin    = 13;
            int nobsout   = 13;
            int numResets = nobsin + nobsout;

            int[] resetDays = new int[] { 0, 31, 61, 92, 123, 151, 182, 212, 243, 273, 304, 335, 365,
                                          1643, 1673, 1704, 1734, 1765, 1796, 1826, 1857, 1887, 1918,
                                          1949, 1977, 2008 };
            double[] resetAmts = new double[numResets];
            double[] vols      = new double[numResets];
            for (int idx = 0; idx < numResets; idx++)
            {
                resetAmts[idx] = 4861;
                vols[idx]      = 0.35;
            }
            // resetAmts[4] = 6000;
            // resetAmts[5] = 4000;
            // resetAmts[9] = 3500;
            // resetAmts[11] = 4000;
            // resetAmts[12] = 6000;
            double        floor          = 0.0;
            double        cap            = 0.0;
            int           numsimulations = 100000;
            CliquetPricer ah             = new CliquetPricer("AsianHybrid", spot, strike, tau, divdays, dd, rtdays, rtamts, resetDays, resetAmts, vols, floor, cap, numsimulations, nobsin, nobsout, 3151, true);

            double[,] vpr = ah.GetPriceAndGreeks();
            double stderr1 = vpr[0, 1];
            double price   = vpr[0, 0];

            Assert.AreEqual(0.2632689, price, 2 * stderr1);
        }
Beispiel #2
0
        public void TestTaurusCliquet1Y()
        {
            DateTime valueDate  = new DateTime(2009, 08, 28);
            DateTime expiryDate = new DateTime(2009, 12, 15);
            double   t          = System.Convert.ToDouble(expiryDate.Subtract(valueDate).Days) / 365.0;
            double   spot       = 4200;
            double   strike     = 1;

            int[]         ratedays       = new int[] { 1, 2925 };
            double[]      rateamts       = new double[] { 0.034932296, 0.0349322696 };
            int[]         resetDays      = new int[] { -347, -317, -286, -256, -225, -194, -166, -135, -105, -74, -44, -13, 18, 48, 79, 109 };
            double[]      vols           = new double[] { 0.60, 0.60, 0.60, 0.60, 0.60, 0.60, 0.60, 0.60, 0.60, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6 };
            double[]      resetAmts      = new double[] { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 0, 0, 0, 0 };
            int[]         divdays        = new int[] { 0 };
            double[]      divamts        = new double[] { 0.0 };
            int           numsimulations = 100000;
            int           nobsin         = 8;
            int           nobsout        = 8;
            double        floor          = 0;
            double        cap            = 0.067;
            CliquetPricer ah             = new CliquetPricer("TaurusCliquet", spot, strike, t, divdays, divamts, ratedays, rateamts, resetDays, resetAmts, vols, floor, cap, numsimulations, nobsin, nobsout, 3151, true);

            double[,] vpr = ah.GetPriceAndGreeks();
            double price   = vpr[0, 0];
            double stderr1 = vpr[0, 1];

            Assert.AreEqual(0.05207, price, 2 * stderr1);
        }
Beispiel #3
0
        public void TestMonteVanilla()
        {
            DateTime valueDate  = new DateTime(2009, 08, 28);
            DateTime expiryDate = new DateTime(2009, 12, 15);
            double   t          = System.Convert.ToDouble(expiryDate.Subtract(valueDate).Days) / 365.0;
            double   spot       = 4200;
            double   strike     = 4200;

            int[]    ratedays = new int[] { 1, 2925 };
            double[] rateamts = new double[] { 0.034932296, 0.0349322696 };

            int[]    resetDays = new int[] { -347, -317, -286, -256, -225, -194, -166, -135, -105, -74, -44, -13, 18, 48, 79, 109 };
            double[] vols      = new double[] { 0.60, 0.60, 0.60, 0.60, 0.60, 0.60, 0.60, 0.60, 0.60, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6 };
            double[] resetAmts = new double[] { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 0, 0, 0, 0 };

            int[]    divdays = new int[] { 0 };
            double[] divamts = new double[] { 0.0 };

            int numsimulations = 100000;
            int nobsin         = 8;
            int nobsout        = 8;

            double floor = 0;
            double cap   = 0.067;

            CliquetPricer ah = new CliquetPricer("Vanilla", spot, strike, t, divdays, divamts, ratedays, rateamts, resetDays, resetAmts, vols, floor, cap, numsimulations, nobsin, nobsout, 3151, true);

            double[,] vpr = ah.GetPriceAndGreeks();
            double stderr1 = vpr[0, 1];
            double stderr2 = vpr[1, 1];
            double stderr3 = vpr[2, 1];
            double stderr4 = vpr[3, 1];
            double stderr5 = vpr[4, 1];
            double delta   = vpr[1, 0];
            double gamma   = vpr[2, 0];
            double vega    = vpr[3, 0];
            double theta   = vpr[4, 0];
            double rho     = vpr[5, 0];

            Assert.AreEqual(566.1626786, vpr[0, 0], 2 * stderr1);
            Assert.AreEqual(0.57760, delta, 2 * stderr2);
            Assert.AreEqual(0.00028, gamma, 2 * stderr3);
            Assert.AreEqual(0.01 * 898.266, vega, 2 * stderr4);
            Assert.AreEqual(-2.65028, theta, 2 * stderr5);
        }