Пример #1
0
 public Option(OptionInfo optInfo)
 {
     optionInfo = optInfo;
     rnds       = new RndGenerator(optionInfo.NumberOfSteps);
     SS1        = new double[optionInfo.NumberOfSteps + 1];
     SS2        = new double[optionInfo.NumberOfSteps + 1];
 }
Пример #2
0
 public Greeks(OptionInfo optInfo)
 {
     optionInfo      = optInfo;
     Prices          = new double[optionInfo.NumberOfSimulation];
     Asian_Prices    = new double[optionInfo.NumberOfSimulation];
     Digital_Prices  = new double[optionInfo.NumberOfSimulation];
     Lookback_Prices = new double[optionInfo.NumberOfSimulation];
     Range_Prices    = new double[optionInfo.NumberOfSimulation];
     Barrier_Prices  = new double[optionInfo.NumberOfSimulation];
     rnd             = new RndGenerator(optionInfo.NumberOfSteps);
     rnds            = new double[optionInfo.NumberOfSteps];
 }
Пример #3
0
 public Digitaloption(OptionInfo op) : base(op)
 {
     opt = op;
 }
Пример #4
0
 public RangeOption(OptionInfo op) : base(op)
 {
     opt = op;
 }
 public BarrierOption(OptionInfo op) : base(op)
 {
     opt = op;
 }
Пример #6
0
        }  //Calculate the greek values of Range Option.

        public void Calculate_Barrier()
        {
            OptionInfo optionInfo1 = optionInfo.copy();

            // Copy the information from the OptionInfo.

            barrier = new BarrierOption(optionInfo1);

            long   M   = optionInfo1.NumberOfSimulation;
            double eps = optionInfo1.Epslion;

            // double[] rnds = new double[optionInfo1.NumberOfSteps];
            double[] Delta         = new double[M];
            double[] Gamma         = new double[M];
            double[] Vega          = new double[M];
            double[] Theta         = new double[M];
            double[] Rho           = new double[M];
            double[] Standarderror = new double[M];

            for (int i = 0; i <= M - 1; i++)
            {
                rnds = rnd.Normal();
                // Original
                barrier.CalculateOption(rnds);
                Barrier_Prices[i] = barrier.Calculate();


                // Delta
                optionInfo1.UnderlyingPrice *= (1.0 + eps);
                barrier.CalculateOption(rnds);
                value1 = barrier.Calculate();
                optionInfo1.UnderlyingPrice  = optionInfo.UnderlyingPrice;
                optionInfo1.UnderlyingPrice *= (1.0 - eps);
                barrier.CalculateOption(rnds);
                value2   = barrier.Calculate();
                Delta[i] = (value1 - value2) / (2 * eps * optionInfo.UnderlyingPrice);

                // Gamma
                Gamma[i] = (value1 + value2 - 2 * Barrier_Prices[i]) / (eps * eps * optionInfo.UnderlyingPrice * optionInfo.UnderlyingPrice);
                optionInfo1.UnderlyingPrice = optionInfo.UnderlyingPrice;

                // Vega
                optionInfo1.Volatility *= (1.0 + eps);
                barrier.CalculateOption(rnds);
                value1 = barrier.Calculate();
                optionInfo1.Volatility  = optionInfo.Volatility;
                optionInfo1.Volatility *= (1.0 - eps);
                barrier.CalculateOption(rnds);
                value2  = barrier.Calculate();
                Vega[i] = (value1 - value2) / (2 * eps * optionInfo.Volatility);
                optionInfo1.Volatility = optionInfo.Volatility;

                // Rho
                optionInfo1.InterestRate *= (1.0 + eps);
                barrier.CalculateOption(rnds);
                value1 = barrier.Calculate();
                optionInfo1.InterestRate  = optionInfo.InterestRate;
                optionInfo1.InterestRate *= (1.0 - eps);
                barrier.CalculateOption(rnds);
                value2 = barrier.Calculate();
                Rho[i] = (value1 - value2) / (2 * eps * optionInfo.InterestRate);
                optionInfo1.InterestRate = optionInfo.InterestRate;

                // Theta
                optionInfo1.Tenor *= (1.0 + eps);
                barrier.CalculateOption(rnds);
                value1             = barrier.Calculate();
                optionInfo1.Tenor  = optionInfo.Tenor;
                optionInfo1.Tenor *= (1.0 - eps);
                barrier.CalculateOption(rnds);
                value2            = barrier.Calculate();
                Theta[i]          = (value1 - value2) / (2 * eps * optionInfo.Tenor);
                optionInfo1.Tenor = optionInfo.Tenor;
            }

            double totalPrices = 0;
            double totalDelta  = 0;
            double totalTheta  = 0;
            double totalGamma  = 0;
            double totalRho    = 0;
            double totalVega   = 0;

            for (int j = 0; j <= M - 1; j++)
            {
                totalPrices += Barrier_Prices[j];
                totalDelta  += Delta[j];
                totalTheta  += Theta[j];
                totalGamma  += Gamma[j];
                totalRho    += Rho[j];
                totalVega   += Vega[j];
            }

            Barrier_original = totalPrices / M;
            Barrier_delta    = totalDelta / M;
            Barrier_gamma    = totalGamma / M;
            Barrier_theta    = -totalTheta / M;
            Barrier_rho      = totalRho / M;
            Barrier_vega     = totalVega / M;

            double std = 0.0;

            for (int i = 0; i < M; i++)
            {
                std += (Barrier_Prices[i] - Barrier_original) * (Barrier_Prices[i] - Barrier_original);
            }

            Barrier_TOE = Math.Sqrt(std / (M - 1) / M);
        }  //Calculate the greek values of Barrier Option
Пример #7
0
        public void Calculate_European()
        {
            OptionInfo optionInfo1 = optionInfo.copy();

            // Copy the information from the OptionInfo.

            europ = new EuropeanOption(optionInfo1);
            long   M   = optionInfo1.NumberOfSimulation;
            double eps = optionInfo1.Epslion;

            //double[] rnds = new double[optionInfo1.NumberOfSteps];
            double[] Delta         = new double[M];
            double[] Gamma         = new double[M];
            double[] Vega          = new double[M];
            double[] Theta         = new double[M];
            double[] Rho           = new double[M];
            double[] Standarderror = new double[M];


            for (int i = 0; i <= M - 1; i++)
            {
                rnds = rnd.Normal();
                // Original
                europ.CalculateOption(rnds);

                original = europ.Calculate();


                // Delta
                optionInfo1.UnderlyingPrice *= (1.0 + eps);
                europ.CalculateOption(rnds);
                value1 = europ.Calculate();
                optionInfo1.UnderlyingPrice  = optionInfo.UnderlyingPrice;
                optionInfo1.UnderlyingPrice *= (1.0 - eps);
                europ.CalculateOption(rnds);
                value2 = europ.Calculate();
                delta  = (value1 - value2) / (2 * eps * optionInfo.UnderlyingPrice);

                // Gamma
                gamma = (value1 + value2 - 2 * original) / (eps * eps * optionInfo.UnderlyingPrice * optionInfo.UnderlyingPrice);
                optionInfo1.UnderlyingPrice = optionInfo.UnderlyingPrice;

                // Vega
                optionInfo1.Volatility *= (1.0 + eps);
                europ.CalculateOption(rnds);
                value1 = europ.Calculate();
                optionInfo1.Volatility  = optionInfo.Volatility;
                optionInfo1.Volatility *= (1.0 - eps);
                europ.CalculateOption(rnds);
                value2 = europ.Calculate();
                vega   = (value1 - value2) / (2 * eps * optionInfo.Volatility);
                optionInfo1.Volatility = optionInfo.Volatility;

                // Rho
                optionInfo1.InterestRate *= (1.0 + eps);
                europ.CalculateOption(rnds);
                value1 = europ.Calculate();
                optionInfo1.InterestRate  = optionInfo.InterestRate;
                optionInfo1.InterestRate *= (1.0 - eps);
                europ.CalculateOption(rnds);
                value2 = europ.Calculate();
                rho    = (value1 - value2) / (2 * eps * optionInfo.InterestRate);
                optionInfo1.InterestRate = optionInfo.InterestRate;

                // Theta
                optionInfo1.Tenor *= (1.0 + eps);
                europ.CalculateOption(rnds);
                value1             = europ.Calculate();
                optionInfo1.Tenor  = optionInfo.Tenor;
                optionInfo1.Tenor *= (1.0 - eps);
                europ.CalculateOption(rnds);
                value2            = europ.Calculate();
                theta             = (value1 - value2) / (2 * eps * optionInfo.Tenor);
                optionInfo1.Tenor = optionInfo.Tenor;

                Prices[i] = original;
                Delta[i]  = delta;
                Theta[i]  = theta;
                Gamma[i]  = gamma;
                Rho[i]    = rho;
                Vega[i]   = vega;
            }

            double totalPrices = 0;
            double totalDelta  = 0;
            double totalTheta  = 0;
            double totalGamma  = 0;
            double totalRho    = 0;
            double totalVega   = 0;

            for (int j = 0; j <= M - 1; j++)
            {
                totalPrices += Prices[j];
                totalDelta  += Delta[j];
                totalTheta  += Theta[j];
                totalGamma  += Gamma[j];
                totalRho    += Rho[j];
                totalVega   += Vega[j];
            }

            original = totalPrices / M;
            delta    = totalDelta / M;
            gamma    = totalGamma / M;
            theta    = -totalTheta / M;
            rho      = totalRho / M;
            vega     = totalVega / M;

            double std = 0.0;

            for (int i = 0; i < M; i++)
            {
                std += (Prices[i] - original) * (Prices[i] - original);
            }

            TOE = Math.Sqrt(std / (M - 1) / M);
        }   //Calculate the greek values of European Option
 public EuropeanOption(OptionInfo op) : base(op)
 {
     opt = op;
 }
Пример #9
0
 public LookbackOption(OptionInfo op) : base(op)
 {
     opt = op;
 }
 public Thread_values(OptionInfo op)
 {
     opt = op;
 }
Пример #11
0
 public AsianOption(OptionInfo op) : base(op)
 {
     opt = op;
 } //Constructor function