Advertisement
Guest User

Untitled

a guest
May 18th, 2020
215
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.14 KB | None | 0 0
  1. //a-нижний предел интеграла (равен 0)
  2. //b - верхний предел интеграла. Выбирается значение от 100 до 200, в зависимости от нужной точности
  3. //delta - вычисляется грек дельта, который равен значению Р1
  4. double BatesCallGaussLegendre(double S, double K, double T, double r, double kappa, double theta,
  5.                               double sigma, double lambda, double v0, double rho,
  6.                               double a, double b, double muJ, double vJ, ref double delta)
  7.         {
  8.             // Числовое интегрирование
  9.             double[] int1 = new double[32];
  10.             double[] int2 = new double[32];
  11.             double y;
  12.             Complex om;
  13.             Complex i = new Complex(0.0, 1.0);
  14.             Complex Xk = new Complex(K, 0.0);
  15.            
  16.             for (int k = 0; k <= 31; k++)
  17.             {
  18.                 y = (a + b) / 2.0 + (b - a) / 2.0 * X[k];
  19.                 om = new Complex(y, 0.0);
  20.                 int1[k] = W[k] * (Complex.Exp(-i * Complex.Log(Xk) * om) * BatesCF(om - i, S, T, r, 0, v0, theta, rho, kappa, sigma, lambda, muJ, vJ) / (i * om * S)).Real;
  21.                 int2[k] = W[k] * (Complex.Exp(-i * Complex.Log(Xk) * om) * BatesCF(om, S, T, r, 0, v0, theta, rho, kappa, sigma, lambda, muJ, vJ) / (i * om)).Real;
  22.             }
  23.  
  24.             // Вектора интегральной суммы
  25.             double I1 = VectorSum(int1);
  26.             double I2 = VectorSum(int2);
  27.  
  28.             // Определение P1 и P2
  29.             double P1 = 0.5 + 1.0 / Math.PI * I1 * (b - a) / 2;
  30.             double P2 = 0.5 + 1.0 / Math.PI * I2 * (b - a) / 2;
  31.             delta = P1;
  32.  
  33.             // Цена колл опциона
  34.             return S * P1 - K * P2;
  35.         }
  36.  
  37.         private Complex BatesCF (Complex phi ,double Spot, double T , double Rate, double Divd,double V ,double Theta , double Rho ,double Kappa, double Sigma ,
  38.             double Lambda , double MuJ , double VJ)
  39.         {
  40.             Complex      S=new Complex(Spot  , 0.0);    // Цена базового актива
  41.             Complex      r=new Complex(Rate  , 0.0);    // Безрисковая ставка (для маржируемых опционов =0)
  42.             Complex    tau=new Complex(T     , 0.0);    // Период до экспирации в долях года
  43.             Complex      i=new Complex(0.0   , 1.0);    // мнимая часть комплексной переменной
  44.             Complex    rho=new Complex(Rho   , 0.0);    // Параметр Бейтса: корелляция
  45.             Complex      k=new Complex(Kappa , 0.0);    // Параметр Бейтса: скорость возврата к средней
  46.             Complex     vT=new Complex(Theta , 0.0);    // Параметр Бейтса: уровень возврата
  47.             Complex lambda=new Complex(Lambda, 0.0);    // Параметр Бейтса: интенсивность скачков
  48.             Complex  sigma=new Complex(Sigma , 0.0);    // Параметр Бейтса: среднеквадратичное отклонение волатильности
  49.             Complex     v0=new Complex(V     , 0.0);    // Параметр Бейтса: текущая волатильность
  50.             Complex    two=new Complex(2.0   , 0.0);    // Число 2.0 в комплексной форме
  51.             Complex one = new Complex(1.0, 0.0);        // Число 1.0 в комплексной форме
  52.             Complex  muJ=new Complex(MuJ     , 0.0);    // Параметр Бейтса: средняя скачков ( в тексте k с верхним подчеркиванием)
  53.             Complex    vJ=new Complex(VJ     , 0.0);    // Параметр Бейтса: дисперсия скачков
  54.             Complex   q=new Complex(Divd     , 0.0);    // дивиденды (для опционов на фьючерсы =0)
  55.             Complex d = Complex.Sqrt (Complex.Pow(( rho * sigma * i*phi - k),2)  + sigma*sigma * (i*phi + phi * phi));
  56.             Complex g2 = (k - rho* sigma *i*phi - d) / (k - rho* sigma *i*phi + d);
  57.             Complex cf1 = i*phi * (Complex.Log(S) + (r - q) * tau);
  58.             Complex cf2 = vT * k / ( sigma *sigma) * ((k - rho* sigma *i*phi - d) * tau - two * Complex.Log ((one - g2 * Complex.Exp(-d * tau)) / (one - g2)));
  59.             Complex cf3 = v0 / sigma *sigma * (k - rho* sigma *i*phi - d) * (one - Complex.Exp(-d * tau)) / (one - g2 * Complex.Exp(-d * tau));
  60.             // Составляющая для скачков цены:
  61.             Complex cf4 = -lambda*muJ *i*tau*phi + lambda*tau *( Complex.Pow((one+ muJ) ,(i*phi)) * Complex.Exp( vJ *(i*phi /two) * (i*phi -one) ) -one );
  62.             Complex cf = Complex.Exp(cf1 + cf2 + cf3 + cf4);
  63.             return cf;
  64.         }
  65.  
  66.         //Функция суммирования элементов вектора
  67.         double VectorSum(double[] A)
  68.         {
  69.             double sum = 0;
  70.             double n = A.Length;
  71.             for (int i = 0; i <= n - 1; i++)
  72.                 sum += A[i];
  73.             return sum;
  74.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement