예제 #1
0
        public void testMultiPathGenerator()
        {
            //("Testing n-D path generation against cached values...");

            //SavedSettings backup;

            Settings.setEvaluationDate(new Date(26, 4, 2005));

            Handle <Quote> x0 = new Handle <Quote> (new SimpleQuote(100.0));
            Handle <YieldTermStructure>    r     = new Handle <YieldTermStructure> (Utilities.flatRate(0.05, new Actual360()));
            Handle <YieldTermStructure>    q     = new Handle <YieldTermStructure> (Utilities.flatRate(0.02, new Actual360()));
            Handle <BlackVolTermStructure> sigma = new Handle <BlackVolTermStructure> (Utilities.flatVol(0.20, new Actual360()));

            Matrix correlation = new Matrix(3, 3);

            correlation[0, 0] = 1.0; correlation[0, 1] = 0.9; correlation[0, 2] = 0.7;
            correlation[1, 0] = 0.9; correlation[1, 1] = 1.0; correlation[1, 2] = 0.4;
            correlation[2, 0] = 0.7; correlation[2, 1] = 0.4; correlation[2, 2] = 1.0;

            List <StochasticProcess1D> processes = new List <StochasticProcess1D>(3);
            StochasticProcess          process;

            processes.Add(new BlackScholesMertonProcess(x0, q, r, sigma));
            processes.Add(new BlackScholesMertonProcess(x0, q, r, sigma));
            processes.Add(new BlackScholesMertonProcess(x0, q, r, sigma));
            process = new StochasticProcessArray(processes, correlation);
            // commented values must be used when Halley's correction is enabled
            double[] result1 =
            {
                188.2235868185,
                270.6713069569,
                113.0431145652
            };
            // Real result1[] = {
            //     188.2235869273,
            //     270.6713071508,
            //     113.0431145652 };
            double[] result1a =
            {
                64.89105742957,
                45.12494404804,
                108.0475146914
            };
            // Real result1a[] = {
            //     64.89105739157,
            //     45.12494401537,
            //     108.0475146914 };
            testMultiple(process, "Black-Scholes", result1, result1a);

            processes[0] = new GeometricBrownianMotionProcess(100.0, 0.03, 0.20);
            processes[1] = new GeometricBrownianMotionProcess(100.0, 0.03, 0.20);
            processes[2] = new GeometricBrownianMotionProcess(100.0, 0.03, 0.20);
            process      = new StochasticProcessArray(processes, correlation);
            double[] result2 =
            {
                174.8266131680,
                237.2692443633,
                119.1168555440
            };
            // Real result2[] = {
            //     174.8266132344,
            //     237.2692444869,
            //     119.1168555605 };
            double[] result2a =
            {
                57.69082393020,
                38.50016862915,
                116.4056510107
            };
            // Real result2a[] = {
            //     57.69082387657,
            //     38.50016858691,
            //     116.4056510107 };
            testMultiple(process, "geometric Brownian", result2, result2a);

            processes[0] = new OrnsteinUhlenbeckProcess(0.1, 0.20);
            processes[1] = new OrnsteinUhlenbeckProcess(0.1, 0.20);
            processes[2] = new OrnsteinUhlenbeckProcess(0.1, 0.20);
            process      = new StochasticProcessArray(processes, correlation);
            double[] result3 =
            {
                0.2942058437284,
                0.5525006418386,
                0.02650931054575
            };
            double[] result3a =
            {
                -0.2942058437284,
                -0.5525006418386,
                -0.02650931054575
            };
            testMultiple(process, "Ornstein-Uhlenbeck", result3, result3a);

            processes[0] = new SquareRootProcess(0.1, 0.1, 0.20, 10.0);
            processes[1] = new SquareRootProcess(0.1, 0.1, 0.20, 10.0);
            processes[2] = new SquareRootProcess(0.1, 0.1, 0.20, 10.0);
            process      = new StochasticProcessArray(processes, correlation);
            double[] result4 =
            {
                4.279510844897,
                4.943783503533,
                3.590930385958
            };
            double[] result4a =
            {
                2.763967737724,
                2.226487196647,
                3.503859264341
            };
            testMultiple(process, "square-root", result4, result4a);
        }
예제 #2
0
 public Dynamics(Parameter fitting, double a, double sigma)
 {
     Process = new OrnsteinUhlenbeckProcess(a, sigma);
     Fitting = fitting;
 }