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

 
Dr.Trader:

Я ещё одну ошибку в R нашёл. R неправильно на 0 делит.

Вот скрипт:

//+------------------------------------------------------------------+
//|                                                         test.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#property script_show_inputs

input double div = 0.0;

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   Print(1.0/div);
  }
//+------------------------------------------------------------------+

Правильный ответ, в mql -
zero divide in 'test.mq5' (20,13)
с остановкой скрипта

Неприавильный, в R:
> 1/0
Inf
с продолжением работы скрипта

 

Я это веду к тому же что и Алексей - поведение программ в неопределённых условиях может отличаться, и это не ошибка. Как архитектурой положено, такой результат и будет.


Вы ошибаетесь по поводу "не правильный ответ"

Ответ в R совершенно правильный и очень удобный. Дело в том, что в R доведено до своего логического завершения понятие "значение переменной" и имеется три специфических значения для переменной: NA (значение есть,  но оно не известно),  NaN (числового значения нет) и Inf - бесконечность. Это такое значение и совершенно неправильно прерывать работу программы. Если учесть ограничения компа по реальной точности, то Inf может иметь  вполне конечное значение. И совершенно естественно продолжить работу и аккуратно написанная программа должна проверять такие результаты, если они предполагаются. 

Например, в документации по MQL приводится пример по арксинусу и утверждается, что арксинус(2) = бесконечность. Это не точно.  Точно: арксинус(2) = NaN, т.е. нет числового значения, арксинус(1) = Inf, а вот пропуск котировок во время торгов = NA, т.е. должно быть (или могло быть в выходные дни), а их нет. 

 
Alexey Burnakov:

То, что Wolfram говорит 0 - это не истина в последней инстанции. Я про то, что слово "ошибка" в формулировке излишнее...

Тут дело не в Wolfram. Интеграл от ненулевых положительных значений не может быть нулевым.

В процессе проверок были также обнаружены ошибки в алгоритмах.

Например, для нецентрального t-распределения не обращаются квантили:


> n <- 10
> k <- seq(0,1,by=1/n)
> nt_pdf<-dt(k, 10,8, log = FALSE)
> nt_cdf<-pt(k, 10,8, log = FALSE)
> nt_quantile<-qt(nt_cdf, 10,8, log = FALSE)
> nt_pdf
 [1] 4.927733e-15 1.130226e-14 2.641608e-14 6.281015e-14 1.516342e-13 3.708688e-13 9.166299e-13
 [8] 2.283319e-12 5.716198e-12 1.433893e-11 3.593699e-11
> nt_cdf
 [1] 6.220961e-16 1.388760e-15 3.166372e-15 7.362630e-15 1.742915e-14 4.191776e-14 1.021850e-13
 [8] 2.518433e-13 6.257956e-13 1.563360e-12 3.914610e-12
> k
 [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
> nt_quantile
 [1]           -Inf -1.340781e+154 -1.340781e+154 -1.340781e+154 -1.340781e+154 -1.340781e+154
 [7] -1.340781e+154   7.000000e-01   8.000000e-01   9.000000e-01   1.000000e+00


Здесь неправильно вычислены квантили 0-0.6.

Пример аналогичного расчета в MQL5:

2016.11.10 17:53:32.645    TestStatNCT (EURUSD,H1)    Unit tests for Package Stat
2016.11.10 17:53:32.645    TestStatNCT (EURUSD,H1)   
2016.11.10 17:53:32.645    TestStatNCT (EURUSD,H1)    Noncentral T distribution test started
2016.11.10 17:53:32.645    TestStatNCT (EURUSD,H1)    Noncentral T distribution test: Test 1: Calculations for single values
2016.11.10 17:53:32.645    TestStatNCT (EURUSD,H1)    1 0, PDF=4.92773299108629100851e-15, CDF=6.23274905782904190070e-16, Q=1.51119154775858715131e-18,
2016.11.10 17:53:32.646    TestStatNCT (EURUSD,H1)    1 1, PDF=1.13022616309487516453e-14, CDF=1.38993895779573769266e-15, Q=9.99999999999989369615e-02,
2016.11.10 17:53:32.647    TestStatNCT (EURUSD,H1)    1 2, PDF=2.64161256619123119969e-14, CDF=3.16755115913693189175e-15, Q=2.00000000000004840572e-01,
2016.11.10 17:53:32.648    TestStatNCT (EURUSD,H1)    1 3, PDF=6.28106243570810575054e-14, CDF=7.36381790305861902898e-15, Q=2.99999999999998601119e-01,
2016.11.10 17:53:32.648    TestStatNCT (EURUSD,H1)    1 4, PDF=1.51636983962646374250e-13, CDF=1.74303935907449069191e-14, Q=4.00000000000005184742e-01,
2016.11.10 17:53:32.648    TestStatNCT (EURUSD,H1)    1 5, PDF=3.70864175555731463525e-13, CDF=4.19192812277470617962e-14, Q=5.00000000000000000000e-01,
2016.11.10 17:53:32.649    TestStatNCT (EURUSD,H1)    1 6, PDF=9.16615229573755101565e-13, CDF=1.02187737277044947465e-13, Q=5.99999999999998867573e-01,
2016.11.10 17:53:32.651    TestStatNCT (EURUSD,H1)    1 7, PDF=2.28327725393015114329e-12, CDF=2.51850847368662607692e-13, Q=6.99999999999999289457e-01,
2016.11.10 17:53:32.652    TestStatNCT (EURUSD,H1)    1 8, PDF=5.71609303970751591223e-12, CDF=6.25821417361289428232e-13, Q=7.99999999999999267253e-01,
2016.11.10 17:53:32.653    TestStatNCT (EURUSD,H1)    1 9, PDF=1.43395037240077606742e-11, CDF=1.56338059375202603523e-12, Q=8.99999999999998578915e-01,
2016.11.10 17:53:32.655    TestStatNCT (EURUSD,H1)    1 10, PDF=3.59391445912256345050e-11, CDF=3.91468724033560601170e-12, Q=9.99999999999998889777e-01,
2016.11.10 17:53:32.655    TestStatNCT (EURUSD,H1)    Noncentral T distribution test: Test 2: Calculations on arrays
2016.11.10 17:53:32.665    TestStatNCT (EURUSD,H1)    2 0, PDF=4.92773299108629100851e-15, CDF=6.23274905782904190070e-16, Q=1.51119154775858715131e-18,
2016.11.10 17:53:32.665    TestStatNCT (EURUSD,H1)    2 1, PDF=1.13022616309487516453e-14, CDF=1.38993895779573769266e-15, Q=9.99999999999989369615e-02,
2016.11.10 17:53:32.665    TestStatNCT (EURUSD,H1)    2 2, PDF=2.64161256619123119969e-14, CDF=3.16755115913693189175e-15, Q=2.00000000000004840572e-01,
2016.11.10 17:53:32.665    TestStatNCT (EURUSD,H1)    2 3, PDF=6.28106243570810575054e-14, CDF=7.36381790305861902898e-15, Q=2.99999999999998601119e-01,
2016.11.10 17:53:32.665    TestStatNCT (EURUSD,H1)    2 4, PDF=1.51636983962646374250e-13, CDF=1.74303935907449069191e-14, Q=4.00000000000005184742e-01,
2016.11.10 17:53:32.665    TestStatNCT (EURUSD,H1)    2 5, PDF=3.70864175555731463525e-13, CDF=4.19192812277470617962e-14, Q=5.00000000000000000000e-01,
2016.11.10 17:53:32.665    TestStatNCT (EURUSD,H1)    2 6, PDF=9.16615229573755101565e-13, CDF=1.02187737277044947465e-13, Q=5.99999999999998867573e-01,
2016.11.10 17:53:32.665    TestStatNCT (EURUSD,H1)    2 7, PDF=2.28327725393015114329e-12, CDF=2.51850847368662607692e-13, Q=6.99999999999999289457e-01,
2016.11.10 17:53:32.665    TestStatNCT (EURUSD,H1)    2 8, PDF=5.71609303970751591223e-12, CDF=6.25821417361289428232e-13, Q=7.99999999999999267253e-01,
2016.11.10 17:53:32.665    TestStatNCT (EURUSD,H1)    2 9, PDF=1.43395037240077606742e-11, CDF=1.56338059375202603523e-12, Q=8.99999999999998578915e-01,
2016.11.10 17:53:32.665    TestStatNCT (EURUSD,H1)    2 10, PDF=3.59391445912256345050e-11, CDF=3.91468724033560601170e-12, Q=9.99999999999998889777e-01,
2016.11.10 17:53:32.665    TestStatNCT (EURUSD,H1)    Noncentral T distribution test: Test 3: R-like overloaded functions
2016.11.10 17:53:32.676    TestStatNCT (EURUSD,H1)    3 0, PDF=-3.29438973521509552711e+01, CDF=-3.50115439911437320575e+01, Q=9.32008491370933962264e-15,
2016.11.10 17:53:32.676    TestStatNCT (EURUSD,H1)    3 1, PDF=-3.21137735448868468779e+01, CDF=-3.42095165639872504926e+01, Q=9.99999999999992561506e-02,
2016.11.10 17:53:32.676    TestStatNCT (EURUSD,H1)    3 2, PDF=-3.12648017507063613607e+01, CDF=-3.33858176105613679852e+01, Q=2.00000000000004563017e-01,
2016.11.10 17:53:32.676    TestStatNCT (EURUSD,H1)    3 3, PDF=-3.03986521580849320401e+01, CDF=-3.25421978598387227066e+01, Q=2.99999999999998490097e-01,
2016.11.10 17:53:32.676    TestStatNCT (EURUSD,H1)    3 4, PDF=-2.95172869939179705057e+01, CDF=-3.16805609544090991392e+01, Q=4.00000000000005240253e-01,
2016.11.10 17:53:32.676    TestStatNCT (EURUSD,H1)    3 5, PDF=-2.86229405029589081266e+01, CDF=-3.08030305013295588878e+01, Q=5.00000000000000000000e-01,
2016.11.10 17:53:32.676    TestStatNCT (EURUSD,H1)    3 6, PDF=-2.77180886076848480570e+01, CDF=-2.99119647118446110312e+01, Q=5.99999999999998756550e-01,
2016.11.10 17:53:32.676    TestStatNCT (EURUSD,H1)    3 7, PDF=-2.68054093129466934897e+01, CDF=-2.90099393581479034765e+01, Q=6.99999999999999400480e-01,
2016.11.10 17:53:32.676    TestStatNCT (EURUSD,H1)    3 8, PDF=-2.58877355789277032727e+01, CDF=-2.80997113402901490531e+01, Q=7.99999999999999489297e-01,
2016.11.10 17:53:32.676    TestStatNCT (EURUSD,H1)    3 9, PDF=-2.49680028891657173062e+01, CDF=-2.71841705920503962091e+01, Q=8.99999999999998689937e-01,
2016.11.10 17:53:32.676    TestStatNCT (EURUSD,H1)    3 10, PDF=-2.40491940358795979193e+01, CDF=-2.62662856772029869035e+01, Q=9.99999999999998889777e-01,
2016.11.10 17:53:32.676    TestStatNCT (EURUSD,H1)    Noncentral T distribution test: Test 4: Generators of random values
2016.11.10 17:53:32.683    TestStatNCT (EURUSD,H1)    Noncentral T distribution test passed
2016.11.10 17:53:32.683    TestStatNCT (EURUSD,H1)    Noncentral T distribution test: PDF max error          : 1.48634016318122160328e-25
2016.11.10 17:53:32.683    TestStatNCT (EURUSD,H1)    Noncentral T distribution test: CDF max error          : 2.75966439373922392108e-18
2016.11.10 17:53:32.683    TestStatNCT (EURUSD,H1)    Noncentral T distribution test: Quantile max error     : 5.16253706450697791297e-15
2016.11.10 17:53:32.683    TestStatNCT (EURUSD,H1)    Noncentral T distribution test: PDF correct digits     : 24
2016.11.10 17:53:32.683    TestStatNCT (EURUSD,H1)    Noncentral T distribution test: CDF correct digits     : 17
2016.11.10 17:53:32.683    TestStatNCT (EURUSD,H1)    Noncentral T distribution test: Quantile correct digits: 14
2016.11.10 17:53:32.683    TestStatNCT (EURUSD,H1)   
2016.11.10 17:53:32.683    TestStatNCT (EURUSD,H1)    1 of 1 passed

Результат скрипта TestStatNCT.mq5 (тест из TestStat.mq5, в тестовую функцию TestNoncentralTDistribution добавлен вывод рассчитанных значений)

Как видно, квантили обращаются и тесты проходят.

Что касается погрешностей, то они такие:

//--- precision
double calc_precision_pdf=10E-15;
double calc_precision_cdf=10E-15;
double calc_precision_quantile=10E-14;

В статье Denise Benton, K. Krishnamoorthy, "Computing discrete mixtures of continuous distributions: noncentral chisquare, noncentral t and the distribution of the square of the sample multiple correlation coefficient" было показано, что у алгоритма AS 243 есть ошибки:


Таким образом, ошибки в R есть и их вероятная причина в алгоритме AS 243, который используется при расчете CDF.

Файлы:
TestStatNCT.mq5  16 kb
 
Quantum:

1)Тут дело не в Wolfram. Интеграл от ненулевых положительных значений не может быть нулевым.

2)В процессе проверок были также обнаружены ошибки в алгоритмах.

3)Например, для нецентрального t-распределения не обращаются квантили:


1 - Если вы тоже пишете об ошибке касательно гамма-распределения, значит я свою претензию адресую вам. Некорректно говорить, что в R это с ошибкой. Я вижу в этом сообщении какие-то попытки навешивания ярлыков. Видимо, вы не советовались с учеными, которые используют пакеты и не видят там ошибок. Функция в Python также выдает 1 плотность в нуле.

 Еще раз. Значение плотности не определено в нуле. Вольфрам считает, что оно 0 и вы просто с этим соглашаетесь, не приводя самостоятельных измышлений. 

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

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

2 - Это можно дополнительно проверить и установить, например, ошибку в алгоритме.

3) например, это можно проверить.

 
Quantum:


Например, для нецентрального t-распределения не обращаются квантили:


Здесь неправильно вычислены квантили 0-0.6.

> n <- 10
> k <- seq(0,1,by=1/n)
> nt_pdf<-dt(k, 10,8, log = FALSE)
> nt_cdf<-pt(k, 10,8, log = FALSE)
> quantile<-qt(nt_cdf, 10,8, log = FALSE)
> nt_pdf
 [1] 4.927733e-15 1.130226e-14 2.641608e-14 6.281015e-14 1.516342e-13 3.708688e-13 9.166299e-13
 [8] 2.283319e-12 5.716198e-12 1.433893e-11 3.593699e-11
> nt_cdf
 [1] 6.220961e-16 1.388760e-15 3.166372e-15 7.362630e-15 1.742915e-14 4.191776e-14 1.021850e-13
 [8] 2.518433e-13 6.257956e-13 1.563360e-12 3.914610e-12
> k
 [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
> nt_quantile
 [1]           -Inf -1.340781e+154 -1.340781e+154 -1.340781e+154 -1.340781e+154 -1.340781e+154
 [7] -1.340781e+154   7.000000e-01   8.000000e-01   9.000000e-01   1.000000e+00
Простите, а где в вашем коде инициализируется переменная nt_quantile? то есть, откуда она идет?
 

1) Как можно объяснить, что в точке cdf=0, при этом pdf ненулевое?

> n <- 5
> k <- seq(0,1,by=1/n)
> gamma_pdf<-dgamma(k, 1,1, log = FALSE)
> gamma_cdf<-pgamma(k, 1,1, log = FALSE)
> k
[1] 0.0 0.2 0.4 0.6 0.8 1.0
> gamma_pdf
[1] 1.0000000 0.8187308 0.6703200 0.5488116 0.4493290 0.3678794
> gamma_cdf
[1] 0.0000000 0.1812692 0.3296800 0.4511884 0.5506710 0.6321206

2) как можно объяснить, что квантили не совпали с исходными?

> n <- 10
> k <- seq(0,1,by=1/n)
> nt_pdf<-dt(k, 10,8, log = FALSE)
> nt_cdf<-pt(k, 10,8, log = FALSE)
> nt_quantile<-qt(nt_cdf, 10,8, log = FALSE)
> nt_pdf
 [1] 4.927733e-15 1.130226e-14 2.641608e-14 6.281015e-14 1.516342e-13 3.708688e-13 9.166299e-13
 [8] 2.283319e-12 5.716198e-12 1.433893e-11 3.593699e-11
> nt_cdf
 [1] 6.220961e-16 1.388760e-15 3.166372e-15 7.362630e-15 1.742915e-14 4.191776e-14 1.021850e-13
 [8] 2.518433e-13 6.257956e-13 1.563360e-12 3.914610e-12
> k
 [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
> nt_quantile
 [1]           -Inf -1.340781e+154 -1.340781e+154 -1.340781e+154 -1.340781e+154 -1.340781e+154
 [7] -1.340781e+154   7.000000e-01   8.000000e-01   9.000000e-01   1.000000e+00
 
Alexey Burnakov:
Простите, а где в вашем коде инициализируется переменная nt_quantile? то есть, откуда она идет?

Прошу прощения, в скрипте была опечатка, исправил.

Скрипт такой:

> n <- 10
> k <- seq(0,1,by=1/n)
> nt_pdf<-dt(k, 10,8, log = FALSE)
> nt_cdf<-pt(k, 10,8, log = FALSE)
> nt_quantile<-qt(nt_cdf, 10,8, log = FALSE)
> nt_pdf
 [1] 4.927733e-15 1.130226e-14 2.641608e-14 6.281015e-14 1.516342e-13 3.708688e-13 9.166299e-13
 [8] 2.283319e-12 5.716198e-12 1.433893e-11 3.593699e-11
> nt_cdf
 [1] 6.220961e-16 1.388760e-15 3.166372e-15 7.362630e-15 1.742915e-14 4.191776e-14 1.021850e-13
 [8] 2.518433e-13 6.257956e-13 1.563360e-12 3.914610e-12
> k
 [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
> nt_quantile
 [1]           -Inf -1.340781e+154 -1.340781e+154 -1.340781e+154 -1.340781e+154 -1.340781e+154
 [7] -1.340781e+154   7.000000e-01   8.000000e-01   9.000000e-01   1.000000e+00
 
Quantum:

1) Как можно объяснить, что в точке cdf=0, при этом pdf ненулевое?

2) как можно объяснить, что квантили не совпали с исходными?

Я подумаю и вам отвечу. А Вы всегда на вопрос вопросом отвечаете? Ваши собственные стат.мысли где?
 
Alexey Burnakov:

Дело в том, что @Quantum в чистом виде занимается реализации и полной проверкой аналога математических библиотек R в MQL5.

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


Не надо априори считать, что в R все правильно. Я бы сказал наоборот, что там даже при наличии С++ реализации функций, все достаточно примитивно реализовано. И по скорости видно, как MQL5 библиотека в исходниках на нашем компиляторе выигрывает в среднем в 3 раза.

Мы потрудились перепроверить все и нашли явные ошибки. Эти ошибки подтверждены:

Для расчета вероятности нецентрального T-распределения Стьюдента в языке R используется алгоритм AS 243, предложенный Lenth [Lenth, R.V., "Cumulative distribution function of the noncentral t distribution", Appled Statistics,  vol. 38 (1989), 185–189]. Достоинством этого метода является быстрый рекуррентный расчет членов бесконечного ряда с неполной бета-функций. Но в статье [D. Benton, K. Krishnamoorthy, "Computing discrete mixtures of continuous distributions: noncentral chisquare, noncentral t and the distribution of the square of the sample multiple correlation coefficient",  Computational Statistics & Data Analysis, 43, (2003), 249-267] было показано, что из-за ошибки оценки точности при суммировании членов ряда данный алгоритм приводит к ошибкам (таблица 3 в статье), особенно для больших значений параметра нецентральности delta. Авторы статьи предложили скорректированный алгоритм рекуррентного расчета вероятности нецентрального T-распределения.

У нас в в статистической библиотеке MQL5 используется правильный алгоритм для расчета вероятностей из статьи [D. Benton, K. Krishnamoorthy, "Computing discrete mixtures of continuous distributions: noncentral chisquare, noncentral t and the distribution of the square of the sample multiple correlation coefficient",  Computational Statistics & Data Analysis, 43, (2003), 249-267] , что дает точные результаты.

Чтобы быть уверенными в точности расчетов и дать возможность сторонним разработчикам проверить качество библиотеки, мы включили несколько unit test скриптов в поставку. Их можно найти в каталоге /Scripts/UnitTests/Stat.

Посмотрите на даты публикаций, пожалуйста. Увидите, как идет работа с советами ученых.

Кроме того, ошибкой будет не считать @Quantum ученым.

 

Прокомментируйте тогда в порядке буквоедства, как для равномерного непрерывного распределения плотность в крайней точке положительная, а интеграл равен нулю: https://en.wikipedia.org/wiki/Uniform_distribution_(continuous) 

 
Renat Fatkhullin:

Дело в том, что @Quantum в чистом виде занимается реализации и полной проверкой аналога математических библиотек R в MQL5.

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


Не надо априори считать, что в R все правильно. Я бы сказал наоборот, что там даже при наличии С++ реализации функций, все достаточно примитивно реализовано. И по скорости видно, как MQL5 библиотека в исходниках на нашем компиляторе выигрывает в среднем в 3 раза.

Мы потрудились перепроверить все и нашли явные ошибки. Эти ошибки подтверждены:

Посмотрите на даты публикаций, пожалуйста. Увидите, как идет работа с советами ученых.

Кроме того, ошибкой будет не считать @Quantum ученым.

 

Про это ошибку я ничего не говорил. Есть так есть.

 

Про гамма распределение - я так и понял, что он занимается у вас реализацией. И я повторю, что его претензии по этому поводу - чистое буквоедство. 

Причина обращения: