public static double GetPayOff(string cpflg, double[] Wgt, double[] S, double X, double T, double r, double[] b, double[] v, Matrix <double> cholesky, int p)
        {
            double option_price = double.NaN;
            int    num          = S.Length;

            double[] ST0_vec            = new double[num];
            double[] ST0_antithetic_vec = new double[num];
            double   ST0_sum            = 0;
            double   ST0_antithetic_sum = 0;

            double[] fi_vec = new double[num];

            //double b = Normal.Sample(new MersenneTwister(), 0.0, 1.0);
            //double[] c = new double[num];
            //Normal.Samples(c, 0.0, 1.0);
            Halton ht = new Halton(num, p + 1);

            double[] c = ht.GetNextGaussian();
            for (var i = 0; i < num; i++)
            {
                double _fi = 0;
                for (var j = 0; j < num; j++)
                {
                    _fi = _fi + cholesky[i, j] * c[j];
                }
                fi_vec[i]             = _fi;
                ST0_vec[i]            = Wgt[i] * GetST0(S[i], T, b[i], v[i], _fi);
                ST0_antithetic_vec[i] = Wgt[i] * GetST0_Antithetic(S[i], T, b[i], v[i], _fi);
                ST0_sum            = ST0_sum + ST0_vec[i];
                ST0_antithetic_sum = ST0_antithetic_sum + ST0_antithetic_vec[i];
            }
            if (cpflg == "c")
            {
                option_price = (Math.Max(ST0_sum - X, 0) + Math.Max(ST0_antithetic_sum - X, 0)) / 2.0;
            }
            else if (cpflg == "p")
            {
                option_price = (Math.Max(-ST0_sum + X, 0) + Math.Max(-ST0_antithetic_sum + X, 0)) / 2.0;
            }
            else
            {
                option_price = double.NaN;
            }
            return(option_price);
        }
Пример #2
0
        public static double GetPayOff(string BestOrWorstFlg, double[] S, double[] X, double T, double r, double[] b, double[] v, Matrix <double> cholesky, int p)
        {
            double option_price = double.NaN;
            int    num          = S.Length;

            double[] ST0_vec            = new double[num];
            double[] ST0_antithetic_vec = new double[num];
            double[] po     = new double[num];
            double[] fi_vec = new double[num];

            //double b = Normal.Sample(new MersenneTwister(), 0.0, 1.0);
            //double[] c = new double[num];
            //Normal.Samples(c, 0.0, 1.0);
            Halton ht = new Halton(num, p + 1);

            double[] c = ht.GetNextGaussian();
            for (var i = 0; i < num; i++)
            {
                double _fi = 0;
                for (var j = 0; j < num; j++)
                {
                    _fi = _fi + cholesky[i, j] * c[j];
                }
                fi_vec[i]  = _fi;
                ST0_vec[i] = GetST0(S[i], T, b[i], v[i], _fi);
                //ST0_antithetic_vec[i] = (GetST0_Antithetic(S[i], T, b[i], v[i], _fi) + GetST0(S[i], T, b[i], v[i], _fi))/2;
                po[i] = Math.Max(ST0_vec[i] - X[i], 0);
                //po[i] = Math.Max(ST0_antithetic_vec[i] - X[i],0);
            }
            if (BestOrWorstFlg == "b")
            {
                option_price = po.Max();
            }
            else if (BestOrWorstFlg == "w")
            {
                option_price = po.Min();
            }
            else
            {
                option_price = double.NaN;
            }
            return(option_price);
        }