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); }
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); }