Exemple #1
0
        public double[,] Analytic(Parameters parameters, Types.OptionType optionType)
        {
            var pVArray = default(double[, ]);

            switch (optionType)
            {
            case Types.OptionType.Vanilla:
                pVArray =
                    OptionVanilla.MakeAnalyticPVArray(
                        new double[parameters.TNum, parameters.XNum[0]],
                        parameters.BoundaryPrice,
                        parameters.Strike,
                        parameters.Maturity,
                        parameters.DomesticRate,
                        parameters.ForeignRate,
                        parameters.Volatility,
                        parameters.IsCall);
                break;

            case Types.OptionType.Barrier:
                pVArray =
                    OptionBarrier.MakeAnalyticPVArray(
                        new double[parameters.TNum, parameters.XNum[0]],
                        parameters.BoundaryPrice,
                        parameters.Strike,
                        parameters.Maturity,
                        parameters.DomesticRate,
                        parameters.ForeignRate,
                        parameters.Volatility,
                        parameters.Barrier,
                        parameters.IsCall);
                break;
            }
            return(pVArray);
        }
Exemple #2
0
        public double[,] FDM(Parameters parameters, Types.OptionType optionType, Types.MethodType methodType)
        {
            var pVArray = default(double[, ]);

            switch (optionType)
            {
            case Types.OptionType.Vanilla:
                pVArray =
                    OptionVanilla.SetInitialCondition(
                        new double[parameters.TNum, parameters.XNum[0]],
                        parameters.BoundaryPrice,
                        parameters.Strike,
                        parameters.IsCall);

                pVArray =
                    OptionVanilla.SetBoundaryCondition(
                        pVArray,
                        parameters.BoundaryPrice,
                        parameters.Strike,
                        parameters.IsCall);

                pVArray =
                    MethodTheta.CalculatePVArray(
                        methodType,
                        pVArray,
                        parameters.BoundaryPrice,
                        parameters.Maturity,
                        parameters.DomesticRate,
                        parameters.ForeignRate,
                        parameters.Volatility);
                break;

            case Types.OptionType.Barrier:
                pVArray =
                    OptionBarrier.SetInitialCondition(
                        new double[parameters.TNum, parameters.XNum[0]],
                        parameters.BoundaryPrice,
                        parameters.Strike,
                        parameters.Barrier,
                        parameters.IsCall);

                pVArray =
                    OptionBarrier.SetBoundaryCondition(pVArray);

                pVArray =
                    MethodTheta.CalculatePVArray(
                        methodType,
                        pVArray,
                        parameters.BoundaryPrice,
                        parameters.Maturity,
                        parameters.DomesticRate,
                        parameters.ForeignRate,
                        parameters.Volatility);
                break;
            }
            return(pVArray);
        }
Exemple #3
0
        public static Parameters[] ForVerification(Types.OptionType optionType)
        {
            var xNumArray       = MakeXNumArray();
            int xNumNum         = xNumArray.GetLength(0);
            var parameters      = Original(optionType);
            var parametersArray = new Parameters[xNumNum];

            for (int j = 0; j < xNumNum; j++)
            {
                switch (optionType)
                {
                case Types.OptionType.Vanilla:
                    parametersArray[j] =
                        new Parameters(
                            parameters.TNum,
                            new int[] { xNumArray[j] },
                            parameters.Maturity,
                            parameters.BoundaryPrice,
                            parameters.Strike,
                            parameters.DomesticRate,
                            parameters.ForeignRate,
                            parameters.Volatility,
                            parameters.IsCall);
                    break;

                case Types.OptionType.Barrier:
                    parametersArray[j] =
                        new Parameters(
                            parameters.TNum,
                            new int[] { xNumArray[j] },
                            parameters.Maturity,
                            parameters.BoundaryPrice,
                            parameters.Strike,
                            parameters.DomesticRate,
                            parameters.ForeignRate,
                            parameters.Volatility,
                            parameters.Barrier,
                            parameters.IsCall);
                    break;

                case Types.OptionType.Exchange:
                    parametersArray[j] =
                        new Parameters(
                            parameters.TNum,
                            new int[] { xNumArray[j] },
                            parameters.Maturity,
                            parameters.BoundaryPrice,
                            parameters.DomesticRate,
                            parameters.ForeignRate,
                            parameters.Volatility,
                            parameters.Correlation);
                    break;
                }
            }
            return(parametersArray);
        }
Exemple #4
0
 private static void MergeIndexAndValue(
     StreamWriter file,
     Types.OptionType optionType)
 {
     WriteIndex(file, optionType);
     WriteError(file, optionType, Types.MethodType.Explicit);
     WriteError(file, optionType, Types.MethodType.Implicit);
     WriteError(file, optionType, Types.MethodType.CrankNicolson);
     file.Close();
 }
Exemple #5
0
        private static void WriteIndex(StreamWriter file, Types.OptionType optionType)
        {
            var parameters = ParametersFactory.Original(optionType);
            var xArray     = ParametersFactory.MakeXArray(parameters);
            int xNum       = xArray.GetLength(0);

            file.Write(",");
            for (int j = 0; j < xNum; j++)
            {
                file.Write(xArray[j] + ",");
            }
            file.WriteLine();
        }
Exemple #6
0
        private static void WriteError(StreamWriter file, Types.OptionType optionType, Types.MethodType methodType)
        {
            var parameters = ParametersFactory.ForVerification(optionType);
            var xNumArray  = ParametersFactory.MakeXNumArray();
            int xNumNum    = xNumArray.GetLength(0);

            file.Write(",");
            for (int j = 0; j < xNumNum; j++)
            {
                var makePVArray   = new MakePVArrayOneAsset();
                var analyticArray =
                    makePVArray.Analytic(parameters[j], optionType);
                var fDMArray =
                    makePVArray.FDM(parameters[j], optionType, methodType);
                double error = CalculateErrorOneAsset.MaxAbsolute(fDMArray, analyticArray);

                file.Write(error + ",");
            }
            file.WriteLine();
        }
Exemple #7
0
        private static void WriteError(StreamWriter file, Types.OptionType optionType, Types.MethodType methodType)
        {
            var parameters = ParametersFactory.Original(optionType);
            var xArray     = ParametersFactory.MakeXArray(parameters);
            int xNum       = xArray.GetLength(0);
            var errorArray = new double[xNum];

            file.Write(",");
            for (int j = 0; j < xNum; j++)
            {
                var makePVArray   = new MakePVArrayOneAsset();
                var analyticArray =
                    makePVArray.Analytic(parameters, optionType);
                var fDMArray =
                    makePVArray.FDM(parameters, optionType, methodType);

                errorArray[j] = CalculateErrorOneAsset.AbsoluteArray(fDMArray, analyticArray)[j];

                file.Write(errorArray[j] + ",");
            }
            file.WriteLine();
        }
Exemple #8
0
        public static Parameters Original(Types.OptionType optionType)
        {
            var parameters = default(Parameters);

            switch (optionType)
            {
            case Types.OptionType.Vanilla:
                parameters =
                    new Parameters(
                        10,                                 // tNum
                        new int[] { 400 },                  // xNum
                        0.4,                                // maturity
                        new double[] { Math.Log(200) },     // boundaryPrice
                        100,                                // strike
                        0,                                  // domesticRate
                        new double[] { 2e-2 },              // foreignRate
                        new double[] { 0.2 },               // volatility
                        true                                // isCall
                        );
                break;

            case Types.OptionType.Barrier:
                parameters =
                    new Parameters(
                        10,                                 // tNum
                        new int[] { 400 },                  // xNum
                        0.4,                                // maturity
                        new double[] { Math.Log(200) },     // boundaryPrice
                        100,                                // strike
                        0,                                  // domesticRate
                        new double[] { 2e-2 },              // foreignRate
                        new double[] { 0.2 },               // volatility
                        110,                                // barrier
                        true                                // isCall
                        );
                break;
            }
            return(parameters);
        }