Евгений Макеев
Евгений Макеев личный блог
02 ноября 2014, 17:29

HELP! Уравнение плотности нормального распределения

Помогите, кто чем может! Вторые сутки не сплю!

Возникла необходимость расчитывать теор. цену опциона в WealthLab.
Не могу правильно посчитать   плотность стандартного нормального распределения для d1.

Напомню теорию, чтобы было понятнее в чем проблема

Цена опциона:
HELP! Уравнение плотности нормального распределения


d1:

HELP! Уравнение плотности нормального распределения 
Считаем d1, теперь нужно сделать N(d1), т.е. плотность стандартного нормального распределения для d1. Именно тут я на ровном месте выпал в аут.
Формула простая

HELP! Уравнение плотности нормального распределения вместо z, соответственно d1.

В екслеле эта формула  задана оператором НОРМСТРАСП(), с ним у меня все получается и цена опциона получается как на РТС.
Но мне нужно закодить эту формулу в ручную в WealthLab и никак не получается правильно посчитать, оператор НОРМСТРАСП() выдает разные значения с тем что я считаю  вручную. Вроде формула простая, не могу понять в чем ошибка.

НАПРИМЕР:
В ексель для х=1 значение НОРМСТРАСП(1)= 0,841344746

Теперь, что получается у меня (разложу по частям чтоб было понятно что я делаю):

1/корень 2*пи = 0,39894228
  
e = 2,718281828 

-x*x/2 = -1*1/2= -0,5

exp(-x*x/2) = 2,718281828 в степени   -0,5 = 0,60653066

теперь 0,39894228*0,60653066= 0,241970725
в чем проблема-то? Что не так? Не могу понять, что я не так делаю.

ПОМОГИТЕ!


РS
Ребята, какие же Вы молодцы! Большое всем спасибо, вставили мне мозг в правильное место.
SmartLab самый умный сайт в мире!
31 Комментарий
  • Kir
    02 ноября 2014, 17:07
    Оффтоп. Это сайт трейдеров а не математиков.
      • Kir
        02 ноября 2014, 17:18
        Макеев Евгений, это я шутю так :)
  • Anton
    02 ноября 2014, 17:07
    В VBA у меня так считается:

    Public Function d_1(ByVal F As Double, ByVal K As Double, ByVal T As Double, ByVal Sigma As Double) As Double

    d_1 = (Log(F / K) + T * 0.5 * Sigma * Sigma) / (Sigma * Sqr(T))
    End Function

    Public Function nd_1(ByVal d1 As Double) As Double

    nd_1 = Math.Exp(-1 * (d1 ^ 2) * 0.5) / Sqr(2 * PI)
    End Function
  • habanera
    02 ноября 2014, 17:11
    Прямой формулы нет. Но, есть куча численных методов.
    Например вот такой (кусок на C#):
    //------------------------------------------------------------

    double N(double x)
    {
    double y = 0;
    double ax, t, d, p;
    if (x > 10)
    y = 1;
    else if (x < -10)
    y = 0;
    else
    {
    ax = Math.Sqrt(x * x);
    t = 1 / (1 + 0.2316419 * ax);
    d = 0.3989423 * Math.Exp(-0.5 * x * x);
    p = d * t * ((((1.330274 * t — 1.821256) * t + 1.781478) * t — 0.3565638) * t + 0.3193815);
    y = p;
    if (x > 0)
    {
    y = 1 — p;
    }
    else
    {
    y = p;
    }
    }
    return y;
    }

    Думаю разберетесь.
  • Mr. Bean
    02 ноября 2014, 17:18
    вы считаете значение в точке, а эксель плотность считает от минус беск до вашей точки, кажись…
    • Mr. Bean
      02 ноября 2014, 17:20
      Mr. Bean, подставьте 3 вместо 1 и получите 0.99, ну т.е. почти 1, по правилу 3-х сигм
      • Mr. Bean
        02 ноября 2014, 17:24
        Макеев Евгений, короч, если хотите как в экселе но нужно посчитать интеграл от минус бекс. до 1 от вашей f(z)
        • Юрий Гришечкин
          02 ноября 2014, 18:53
          Mr. Bean, взять неберущийся интеграл))
          • Mr. Bean
            02 ноября 2014, 21:33
            Юрий Гришечкин, есть другие варианты?)
  • FonSmirnov
    02 ноября 2014, 17:22
    колайдер, это ты?
  • AlexeyTikhonov
    02 ноября 2014, 17:28
    ошибка здесь
    «теперь нужно сделать N(d1), т.е. плотность стандартного нормального распределения для d1»
  • habanera
    02 ноября 2014, 17:38
    Макеев Евгений, Плотность распределения вероятности и Функция распределения случайной величины, это разные вещи.
    Функция распределения это определенный интеграл плотности распределения, от минус бесконечности до X.
  • Andy Hudson
    02 ноября 2014, 18:47
    Автор, Вы ошибаетесь в утверждении что Excel функция НОРМСТРАСП имеет ту формулу, которую указали f(z)=…

    То, что Вы назвали это уравнение плотности стандартного нормального распределения.

    Вам же надо считать через функцию нормального распределения.

    Тогда имеем:

    Excel:
    =НОРМСТРАСП(1)=0.841344746

    C++ код:

    double NormSdist2(const double& z) {
    if (z > 6.0) { return 1.0; }; // this guards against overflow
    if (z < -6.0) { return 0.0; };

    double b1 = 0.31938153;
    double b2 = -0.356563782;
    double b3 = 1.781477937;
    double b4 = -1.821255978;
    double b5 = 1.330274429;
    double p = 0.2316419;
    double c2 = 0.3989423;

    double a=fabs(z);
    double t = 1.0/(1.0+a*p);
    double b = c2*exp((-z)*(z/2.0));
    double n = ((((b5*t+b4)*t+b3)*t+b2)*t+b1)*t;
    n = 1.0-b*n;
    if ( z < 0.0 ) n = 1.0 — n;
    return n;
    };

    вызов функции:

    double ddd=NormSdist2(1);
    cout<<ddd<<endl;

    0.841345 ******
    Для продолжения нажмите любую клавишу...
  • Юрий Гришечкин
    02 ноября 2014, 18:53
    просто посчитайте интеграл от этой функции. Интеграл неберущийся, но у него есть конкретное значение. Погуглите интеграл от функции Гауса.
  • Wisard
    02 ноября 2014, 19:28
    Уже правильно ответили: ваша формула — это плотность распределения, а считать нужно вероятность, то есть интеграл по плотности от минус бесконечности до вашего значения.

    Этот интеграл (по-английски называется cumulative normal distribution function) не имеет функционального решения, поэтому обычно используют одну из полиномиальных интерполяций, см. здесь (http://stackoverflow.com/questions/5259421/cumulative-distribution-function-in-javascript) и если вдруг ее точности не хватает (что вряд ли), то еще здесь (http://stackoverflow.com/questions/2328258/cumulative-normal-distribution-function-in-c-c), если и этой точности не хватает, тогда только считать в лоб самому.
  • Евгений Черных
    02 ноября 2014, 19:40
    Вот тут есть в роботе расчет цены опционов. Нормальное распределение не надо рассчитывать.
    kbrobot.ru/forum/viewtopic.php?f=2&t=27
    • axweye
      02 ноября 2014, 20:14
      kbrobot.ru, а где именно по ссылке посмотреть формулу расчета опциона? Не смог найти, Заранее большое спасибо
      • Евгений Черных
        02 ноября 2014, 20:19
        bealtrader, На форуме зарегистрируйтесь. Скачайте робота. В нем есть формула. Код открыт.
        • axweye
          02 ноября 2014, 20:33
          kbrobot.ru, спасибо. А насколько сильно отличается цена рассчитанная в вашем роботе от реальной цены опционов? Я находил несколько формул в инете для Амиброкера, на расхождения в ценах были в 2-3 раза между теоретической и биржевой.

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн