Машинное обучение в трейдинге: теория, модели, практика и алготорговля - страница 200

 
Renat Fatkhullin:

Давайте вернемся к исходному утверждению об ошибках R в статье.

Наше мнение остается в силе - ошибки присутствуют и вызваны они небрежностью в реализации.

Ваш специалист не хочет мне отвечать по существу. Ткнул в Вольфрам и все.

Я повторю нашу точку зрения. По гамма распределению ошибки нет. Это вопрос конвенций в математическом сообществе. Есть фраза об ошибке с вашей стороны, которая не корректна.

Вывод нуля для плотности в вашей версии, во-первых, один из возможных вариантов (конвенций). А во-вторых, суть прикладного анализа от выбора этой величины (nan, 0 или 1) ни на что не влияет. Для оценок статистики используются функции распределения. В этой распределение нулевое. И этого достаточно.

По поводу t распределения. я воспроизвел эту ошибку на последней версии R. но в суть алгоритма не вникал. Допускаю, что исправление было реально нужно.

Попробую задать вопрос команде поддержки R.
 

А вы вникните, пересчитайте все, потратьте несколько недель на перепроверки, как сделал это он. Но вместо этого вы даже статью не прочли нашу.

Со своей стороны мы работу сделали. И сделали хорошо. Если для вас и Вольфрам не авторитет, то вы зря затеяли такой способ общения.

Не путайте создателей с пользователями, пожалуйста.

 
Renat Fatkhullin:

А вы вникните, пересчитайте все, потратьте несколько недель на перепроверки, как сделал это он. Но вместо этого вы даже статью не прочли нашу.

Со своей стороны мы работу сделали. И сделали хорошо. Если для вас и Вольфрам не авторитет, то вы зря затеяли такой способ общения.

Не путайте создателей с пользователями, пожалуйста.

Я ваше мнение уважаю. Но почему вы за него отвечаете?

Повторю. 

Вывод нуля для плотности в вашей версии, во-первых, один из возможных вариантов (конвенций). А во-вторых, суть прикладного анализа от выбора этой величины (nan, 0 или 1) ни на что не влияет. Для оценок статистики используются функции распределения. В этой точки распределение нулевое. И этого достаточно.

Добавлю в целом, ускорение расчетов это плюс. То есть объективно реализация функций не хуже и даже лучше, согласно данным вашей статьи. 
 
Я надеюсь, эмоциональная часть прошла..

Пошерстил на предмет 0^0. Это именно пункт разногласий - содержится в уравнении плотности вероятности для гамма распределения при x = 0.


В этой дискуссии прозвучал такой ответ:
0^0 and 0! are equal to 1 because of the empty product rule. The IEEE standard says that 0^0 should evaluate 1. So most computer software will evaluate it that way. There are no situations where evaluating to 0 is helpful.

There are many formulas that assume 0^0=1, e.g. notation for polynomials and power series, cardinal number arithmetic, the binomial theorem, etc., these all assume 0^0=1. For example, substituting x=0 into x^0+x^1+x^2+... = 1/(1-x) shows 0^0 = 1.

 То есть есть стандарт приведения этого выражения к 1. И нет никакой пользы или вреда от приведения выражения к 0.

Думаю, в R hardcoded 1… а у вас 0. 

на этом точка и нет смысла спорить. Компьютер не может рассчитать значение алгебраически.
 
Alexey Burnakov:

Вывод нуля для плотности в вашей версии, во-первых, один из возможных вариантов (конвенций).

Можно исходить из того, что определить функцию означает задать способ ее вычисления.

Приведенное выражение
Alexey Burnakov:

Более того, согласно:

 

https://en.wikipedia.org/wiki/Gamma_distribution 

при x = 0, alpha = 1, beta = 1, в числителе получается неопределенное значение, что приводит всю дробь к неопределенности.

Заявляем, что строго говоря, плотность гамма распределения в точке ноль не определена. А при взятии предела справа плотность равна единице.

В свете этого мы считаем, то формулировка утверждения "ошибки расчетов в R" не является корректной. Точнее, это вопрос конвенций: чем считать равной выражение ноль в степени ноль. Приравнивание плотности гамма распределения к нулю в точке ноль не представляется сколько-либо обусловленной практикой.

не подходит для определения функции, поскольку содержит неопределенность в точке x=0, как Вы указали.

Если вместо x>=0 поставить условие x>0,  то неопределенности не будет и можно будет вычислять значения по этой формуле.

По поводу практики - Mathematica и Matlab можно считать промышленными стандартами инженерных расчетов, они выдают 0, т.е. то выражение справедливо только для x>0.

 
Quantum:

Можно исходить из того, что определить функцию означает задать способ ее вычисления.

Приведенное выражение

не подходит для определения функции, поскольку содержит неопределенность в точке x=0, как Вы указали.

Если вместо x>=0 поставить условие x>0,  то неопределенности не будет и можно будет вычислять значения по этой формуле.

По поводу практики - Mathematica и Matlab можно считать промышленными стандартами инженерных расчетов, они выдают 0, т.е. то выражение справедливо только для x>0.

Правильно. Функция определена на положительной области (0,inf).

Почему у вас все же 0 в точке 0? и почему ошибка это 1?


Кстати, интересно. Вольфрам определяет функцию вероятности гамма распределения на пространстве [0,inf]. И поэтому они дают определенное значение в нуле... Что странно.


 
Quantum:

 Mathematica и Matlab можно считать промышленными стандартами инженерных расчетов

Вы взяли ситуацию для которой нету решения, подсмотрели результат который возвращает именно Wolfram, и назвали все другие результаты неверными. Это не инженерные расчёты, а догма.

А могли бы взять за эталон R, и писать о том что нашли ошибку в Wolfram. Полагаю если взять весь математический софт, и поделить их на две группы по признаку что они возвращают в такой ситуации - будет разделение 50%/50%, сможете в статью о mql добавить ещё десяток софтин которые mql превосходит.

  

За указанные погрешности в AS 243 спасибо. Но не стоит на это сваливать поведение других функций с параметрами для которых нету чёткого решения.
Так и надо было писать в статье о преимуществах mql - вот в R есть такая-то функция, которая имеет погрешность в 15 знаке после запятой. А у нас в mql есть другая функция, которая точнее. Всё былобы культурно и научно, а не догматично как сейчас. 

 
Alexey Burnakov:

Почему у вас все же 0 в точке 0? и почему ошибка это 1?

Рассмотрим пример с параметрами a=0.5, b=1 в точке x=0

> dgamma(0,0.5,1,log=FALSE)
[1] Inf
> pgamma(0,0.5,1,log=FALSE)
[1] 0

Если не исключать точку x=0, то плотность расходится, а с вероятностью все в порядке.

И дальше тоже никаких проблем:

> pgamma(0.00001,0.5,1,log=FALSE)
[1] 0.003568236

Получается, что при расчете CDF R исключает точку x=0, бесконечность куда-то исчезла.

 
Quantum

Уважаемый коллега!

Несколько страниц идет спор по различиях алгоритмов Ваших и R по краям области определения функций. Крайние точки - это крайние точки и на практике различиями можно было бы пренебречь. 

Но в этом случае у меня возникает гораздо более существенный вопрос:

 

Где документация на все Ваши функции?

 

Ранее я считал, что берем Вашу функцию, потом берем документацию на R, так как Ваши функции являются аналогами, и вникаем   в те части документации R, которые либо описывают алгоритмы, либо переходим по ссылкам, указанным R. R имеет очень качественную документацию и справочный аппарат.

В ходе спора я выяснил, что Ваши функции отличаются от R - это некие другие функции, алгоритмы которых опираются на иные источники. В самой статье об этом ничего нет, документации нет. И об этом мы узнаем от Рената совершенно в другом контексте.

На практике следует однозначный вывод, что перенос кода с R на MQL5 невозможен.

И вот почему.

Для меня совершенно очевидно, что если написано "аналог R" и не дана документация на аналог, то это 100% аналог  и я  могу, не заморачиваясь, переносить код из интерпретатора в компилятор. А если это не так, то достаточно одного случая, чтобы поставить крест на идее переноса кода из R в MQL5. Никто не захочет получить совершенно тупиковый головняк, когда при переносе работающего кода в R получаешь не работающий код MQL из-за тонкостей в реализации алгоритмов. 

 
СанСаныч Фоменко:

Где документация на все Ваши функции?

Ранее я считал, что берем Вашу функцию, потом берем документацию на R, так как Ваши функции являются аналогами, и вникаем   в те части документации R, которые либо описывают алгоритмы, либо переходим по ссылкам, указанным R. R имеет очень качественную документацию и справочный аппарат.

В ходе спора я выяснил, что Ваши функции отличаются от R - это некие другие функции, алгоритмы которых опираются на иные источники. В самой статье об этом ничего нет, документации нет. И об этом мы узнаем от Рената совершенно в другом контексте.

На практике следует однозначный вывод, что перенос кода с R на MQL5 невозможен.

И вот почему.

Для меня совершенно очевидно, что если написано "аналог R" и не дана документация на аналог, то это 100% аналог  и я  могу, не заморачиваясь, переносить код из интерпретатора в компилятор. А если это не так, то достаточно одного случая, чтобы поставить крест на идее переноса кода из R в MQL5. Никто не захочет получить совершенно тупиковый головняк, когда при переносе работающего кода в R получаешь не работающий код MQL из-за тонкостей в реализации алгоритмов. 

На текущий момент описание функций есть в статье https://www.mql5.com/ru/articles/2742

Рассмотрим на примере расчета нормального распределения с параметрами mu=2, sigma=1:

n <- 10
k <- seq(0,1,by=1/n)
mu=2
sigma=1
normal_pdf<-dnorm(k, mu, sigma, log = FALSE)
normal_cdf<-pnorm(k, mu, sigma, lower.tail=TRUE,log.p = FALSE)
normal_quantile <- qnorm(normal_cdf, mu,sigma, lower.tail=TRUE,log.p = FALSE)
normal_pdf
normal_cdf
normal_quantile


1) Аналогом R функции dnorm() является функция:

Функция рассчитывает значения функции плотности вероятности нормального распределения с параметрами mu и sigma для массива случайных величин x[]. В случае ошибки возвращает false. Аналог dnorm() в R.

bool MathProbabilityDensityNormal(
  const double   &x[],        // [in]  Массив со значениями случайной величины
  const double   mu,          // [in]  Параметр распределения mean (математическое ожидание)
  const double   sigma,       // [in]  Параметр распределения sigma (среднеквадратическое отклонение)
  const bool     log_mode,    // [in]  Флаг расчета логарифма значения, если log_mode=true, то рассчитывается натуральный логарифм плотности вероятности
  double         &result[]    // [out] Массив для значений функции плотности вероятности
);

2) Аналог pnorm:

Функция рассчитывает значение функции нормального распределения вероятностей с параметрами mu и sigma для массива случайных величин x[]. В случае ошибки возвращает false. Аналог pnorm() в R.

bool MathCumulativeDistributionNormal(
  const double   &x[],        // [in]  Массив со значениями случайной величины
  const double   mu,          // [in]  Математическое ожидание
  const double   sigma,       // [in]  Среднеквадратическое отклонение
  const bool     tail,        // [in]  Флаг расчета, если lower_tail=true, то рассчитывается вероятность того, что случайная величина не превысит x
  const bool     log_mode,    // [in]  Флаг расчета логарифма значения, если log_mode=true, то рассчитывается натуральный логарифм вероятности
  double         &result[]    // [out] Массив для значений функции вероятности
);

3) Аналог qnorm:

Для массива значений вероятности probability[] функция рассчитывает значения обратной функции нормального распределения с параметрами mu и sigma. В случае ошибки возвращает false. Аналог qnorm() в R.

bool MathQuantileNormal(
  const double   &probability[],// [in]  Массив со значениями вероятностей случайной величины
  const double   mu,            // [in]  Математическое ожидание
  const double   sigma,         // [in]  Среднеквадратическое отклонение
  const bool     tail,          // [in]  Флаг расчета, если lower_tail=false, то расчет ведется для вероятности 1.0-probability
  const bool     log_mode,      // [in]  Флаг расчета, если log_mode=true, то расчет ведется для вероятности Exp(probability)
  double         &result[]      // [out] Массив со значениями квантилей
);

Пример их использования:

#include <Math\Stat\Normal.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- arrays for calculated values
   double x_values[];
   double normal_pdf[];
   double normal_cdf[];
   double normal_quantile[];
//--- prepare x values
   const int N=11;
   ArrayResize(x_values,N);
   for(int i=0;i<N;i++)
      x_values[i]=i*1.0/(N-1);
//--- set distribution parameters
   double mu=2.0;
   double sigma=1.0;
//--- calculate pdf, cdf and quantiles
   MathProbabilityDensityNormal(x_values,mu,sigma,false,normal_pdf);
   MathCumulativeDistributionNormal(x_values,mu,sigma,true,false,normal_cdf);
   MathQuantileNormal(normal_cdf,mu,sigma,true,false,normal_quantile);
//--- show calculated values
   for(int i=0;i<N;i++)
      PrintFormat("1 %d, x=%.20e PDF=%.20e, CDF=%.20e, Q=%.20e,",i,x_values[i],normal_pdf[i],normal_cdf[i],normal_quantile[i]);
  }

Результат:

2016.11.11 11:56:46.413    Test (EURUSD,H1)    1 0, x=0.00000000000000000000e+00 PDF=5.39909665131880628364e-02, CDF=2.27501319481792120547e-02, Q=0.00000000000000000000e+00,
2016.11.11 11:56:46.413    Test (EURUSD,H1)    1 1, x=1.00000000000000005551e-01 PDF=6.56158147746765951780e-02, CDF=2.87165598160018034624e-02, Q=1.00000000000000088818e-01,
2016.11.11 11:56:46.413    Test (EURUSD,H1)    1 2, x=2.00000000000000011102e-01 PDF=7.89501583008941493214e-02, CDF=3.59303191129258098213e-02, Q=2.00000000000000177636e-01,
2016.11.11 11:56:46.413    Test (EURUSD,H1)    1 3, x=2.99999999999999988898e-01 PDF=9.40490773768869470217e-02, CDF=4.45654627585430410108e-02, Q=3.00000000000000266454e-01,
2016.11.11 11:56:46.413    Test (EURUSD,H1)    1 4, x=4.00000000000000022204e-01 PDF=1.10920834679455543315e-01, CDF=5.47992916995579740225e-02, Q=3.99999999999999911182e-01,
2016.11.11 11:56:46.413    Test (EURUSD,H1)    1 5, x=5.00000000000000000000e-01 PDF=1.29517595665891743772e-01, CDF=6.68072012688580713080e-02, Q=5.00000000000000222045e-01,
2016.11.11 11:56:46.413    Test (EURUSD,H1)    1 6, x=5.99999999999999977796e-01 PDF=1.49727465635744877437e-01, CDF=8.07566592337710387195e-02, Q=6.00000000000000310862e-01,
2016.11.11 11:56:46.413    Test (EURUSD,H1)    1 7, x=6.99999999999999955591e-01 PDF=1.71368592047807355438e-01, CDF=9.68004845856103440793e-02, Q=7.00000000000000177636e-01,
2016.11.11 11:56:46.413    Test (EURUSD,H1)    1 8, x=8.00000000000000044409e-01 PDF=1.94186054983212952330e-01, CDF=1.15069670221708289515e-01, Q=8.00000000000000044409e-01,
2016.11.11 11:56:46.413    Test (EURUSD,H1)    1 9, x=9.00000000000000022204e-01 PDF=2.17852177032550525793e-01, CDF=1.35666060946382671659e-01, Q=9.00000000000000133227e-01,
2016.11.11 11:56:46.413    Test (EURUSD,H1)    1 10, x=1.00000000000000000000e+00 PDF=2.41970724519143365328e-01, CDF=1.58655253931457046468e-01, Q=1.00000000000000000000e+00,

Результат расчета на R:

> n <- 10
> k <- seq(0,1,by=1/n)
> mu=2
> sigma=1
> normal_pdf<-dnorm(k, mu, sigma, log = FALSE)
> normal_cdf<-pnorm(k, mu, sigma, lower.tail=TRUE,log.p = FALSE)
> normal_quantile <- qnorm(normal_cdf, mu,sigma, lower.tail=TRUE,log.p = FALSE)
> normal_pdf
 [1] 0.05399097 0.06561581 0.07895016 0.09404908 0.11092083 0.12951760 0.14972747 0.17136859
 [9] 0.19418605 0.21785218 0.24197072
> normal_cdf
 [1] 0.02275013 0.02871656 0.03593032 0.04456546 0.05479929 0.06680720 0.08075666 0.09680048
 [9] 0.11506967 0.13566606 0.15865525
> normal_quantile
 [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
Статистические распределения в MQL5 - берем лучшее из R и делаем быстрее
Статистические распределения в MQL5 - берем лучшее из R и делаем быстрее
  • 2016.10.06
  • MetaQuotes Software Corp.
  • www.mql5.com
Рассмотрены функции для работы с основными статистическими распределениями, реализованными в языке R. Это распределения Коши, Вейбулла, нормальное, логнормальное, логистическое, экспоненциальное, равномерное, гамма-распределение, центральное и нецентральные распределения Бета, хи-квадрат, F-распределения Фишера, t-распределения Стьюдента, а также дискретные биномиальное и отрицательное биномиальные распределения, геометрическое, гипергеометрическое и распределение Пуассона. Есть функции расчета теоретических моментов распределений, которые позволяют оценить степень соответствия реального распределения модельному.
Файлы:
Test.mq5  2 kb