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

 
Alexey Burnakov:

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

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

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

 
Renat Fatkhullin:

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

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


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

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

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

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

Уважаемый Ренат!

По Вашим последним постам у меня возникли следующие вопросы, которые для меня носят принципиальный характер:

1. Судя по дате публикации статьи - это 2003 год. Совершенно естественно, что в R, как и в любой другой программной системе имеются ошибки и при публикации релизов всегда публикуется список исправлений. При этом R всегда подчеркивало, что  в качестве достоинства R - это низкий уровень багов за счет чрезвычайно большого количества пользователей. А тут с 2003 года на уровне публикации выявлен баг в алгоритме и не исправлено. Мне это не понятно.

Делали ли Вы запрос в R по этому вопросу?

 

2. Хотелось бы увидеть код,  по которому сравнивалось быстродействие R и MQL5.

 

Заранее признателен. 

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

Уважаемый Ренат!

По Вашим последним постам у меня возникли следующие вопросы, которые для меня носят принципиальный характер:

1. Судя по дате публикации статьи - это 2003 год. Совершенно естественно, что в R, как и в любой другой программной системе имеются ошибки и при публикации релизов всегда публикуется список исправлений. При этом R всегда подчеркивало, что  в качестве достоинства R - это низкий уровень багов за счет чрезвычайно большого количества пользователей. А тут с 2003 года на уровне публикации выявлен баг в алгоритме и не исправлено. Мне это не понятно.

Это элементарно и абсолютно понятно.

Все делают ошибки - такова суть разработчиков. Мы делаем ошибки тоннами и не унываем.

Данная ошибка в R просто от небрежности и доверия к одной базовой функции, которая испортила другие. Поправят.

Делали ли Вы запрос в R по этому вопросу?

Мы провели испытания, детально во всем разобрались во время написания библиотеки, постоянно сравнивали результаты MQL5 - Wolfram Alpha - R, показали свои результаты и готовы отвечать за них публично. Конечно, мы приложили в свой математический пакет(который весь в исходниках) три больших скрипта с контрольными юнит-тестами и бенчмарком.

Уверен, что @Quantum напишет багрепорт в R. Обновленную статью выпустили всего пару часов назад.


2. Хотелось бы увидеть код,  по которому сравнивалось быстродействие R и MQL5.

Бенчмарк код на MQL5 лежит в \Scripts\UnitTests\Stat\TestStatBenchmark.mq5, а код на R приведен в конце статьи Статистические распределения в MQL5 - берем лучшее из R и делаем быстрее в разделе "Приложение. Результаты измерения времени расчета статистических функций".

Обязательно обновитесь до MetaTrader 5 build 1467, подключившись к серверу MetaQuotes-Demo, пожалуйста. Именно в эту бета-версию мы включили новую библиотеку и все скрипты тестирования.

 
Renat Fatkhullin:

Это элементарно и абсолютно понятно.

Все делают ошибки - такова суть разработчиков. Мы делаем ошибки тоннами и не унываем.

Данная ошибка в R просто от небрежности и доверия к одной базовой функции, которая испортила другие. Поправят.

Мы провели испытания, детально во всем разобрались во время написания библиотеки, постоянно сравнивали результаты MQL5 - Wolfram Alpha - R, показали свои результаты и готовы отвечать за них публично. Конечно, мы приложили в свой математический пакет(который весь в исходниках) три больших скрипта с контрольными юнит-тестами и бенчмарком.

Уверен, что @Quantum напишет багрепорт в R. Обновленную статью выпустили всего пару часов назад.


Бенчмарк код на MQL5 лежит в \Scripts\UnitTests\Stat\TestStatBenchmark.mq5, а код на R приведен в конце статьи Статистические распределения в MQL5 - берем лучшее из R и делаем быстрее в разделе "Приложение. Результаты измерения времени расчета статистических функций".

Обязательно обновитесь до MetaTrader 5 build 1467, подключившись к серверу MetaQuotes-Demo, пожалуйста. Именно в эту бета-версию мы включили новую библиотеку и все скрипты тестирования.

Пока не могу сформировать свое мнение по поводу сравнения быстродействия. Причем это носит принципиальный характер.

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

 

ПС.

Вы используете устаревшую версию R. Надо брать R version 3.3.1 (2016-06-21) с сайта MRAN -  Microsofn R Open. При этом обязательно устанавливать MKL. Майкрософт в указанном релизе R утверждал, что сумел повысить скорость исполнения некоторых пакетов и функций до 50 (!) раз.   

Microsoft R Open: The Enhanced R Distribution · MRAN
  • Microsoft Corporation
  • mran.revolutionanalytics.com
Microsoft R Open, formerly known as Revolution R Open (RRO), is the enhanced distribution of R from Microsoft Corporation. It is a complete open source platform for statistical analysis and data science. The current version, Microsoft R Open 3.3.1, is based on (and 100% compatible with) R-3.3.1, the most widely used statistics software in the...
 
СанСаныч Фоменко:

Пока не могу сформировать свое мнение по поводу сравнения быстродействия. Причем это носит принципиальный характер.

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

Мы методично переводим возможности R в MQL5. Причем так, что суть вызовов функций получается очень близкой.

Вот например, пример соответствия из статьи:


Распределение
Функции MQL5
Функции языка R
 1Нормальное
MathProbabilityDensityNormal
MathCumulativeDistributionNormal
MathQuantileNormal
MathRandomNormal
dnorm
pnorm
qnorm
rnorm
 2Бета
MathProbabilityDensityBeta
MathCumulativeDistributionBeta
MathQuantileBeta
MathRandomBeta
dbeta
pbeta
qbeta
rbeta
3Биномиальное
MathProbabilityDensityBinomial
MathCumulativeDistributionBinomial
MathQuantileBinomial
MathRandomBinomial
dbinom
pbinom
qbinom
rbinom
4
Коши
MathProbabilityDensityCauchy
MathCumulativeDistributionCauchy
MathQuantileCauchy
MathRandomCauchy
dcauchy
pcauchy
qcauchy
rcauchy
5Хи-квадрат
MathProbabilityDensityChiSquare
MathCumulativeDistributionChiSquare
MathQuantileChiSquare
MathRandomChiSquare
dchisq
pchisq
qchisq
rchisq
6Экспоненциальное
MathProbabilityDensityExponential
MathCumulativeDistributionExponential
MathQuantileExponential
MathRandomExponential
dexp
pexp
qexp
rexp
7F Фишера
MathProbabilityDensityF
MathCumulativeDistributionF
MathQuantileF
MathRandomF
df
pf
qf
rf
8Гамма
MathProbabilityDensityGamma
MathCumulativeDistributionGamma
MathQuantileGamma
MathRandomGamma
dgamma
pgamma
qgamma
rgamma
9Геометрическое
MathProbabilityDensityGeometric
MathCumulativeDistributionGeometric
MathQuantileGeometric
MathRandomGeometric
dgeom
pgeom
qgeom
rgeom
10Гипергеометрическое
MathProbabilityDensityHypergeometric
MathCumulativeDistributionHypergeometric
MathQuantileHypergeometric
MathRandomHypergeometric
dhyper
phyper
qhyper
rhyper
11
Логистическое
MathProbabilityDensityLogistic
MathCumulativeDistributionLogistic
MathQuantileLogistic
MathRandomLogistic
dlogis
plogis
qlogis
rlogis
12Логнормальное
MathProbabilityDensityLognormal
MathCumulativeDistributionLognormal
MathQuantileLognormal
MathRandomLognormal
dlnorm
plnorm
qlnorm
rlnorm
13Отрицательное биномиальное
MathProbabilityDensityNegativeBinomial
MathCumulativeDistributionNegativeBinomial
MathQuantileNegativeBinomial
MathRandomNegativeBinomial
dnbinom
pnbinom
qnbinom
rnbinom
 14Нецентральное бета
MathProbabilityDensityNoncentralBeta
MathCumulativeDistributionNoncentralBeta
MathQuantileNoncentralBeta
MathRandomNoncentralBeta
dbeta
pbeta
qbeta
rbeta
15Нецентральное хи-квадрат
MathProbabilityDensityNoncentralChiSquare
MathCumulativeDistributionNoncentralChiSquare
MathQuantileNoncentralChiSquare
MathRandomNoncentralChiSquare
dchisq
pchisq
qchisq
rchisq
16
Нецентральное F
MathProbabilityDensityNoncentralF()
MathCumulativeDistributionNoncentralF()
MathQuantileNoncentralF()
MathRandomNoncentralF()
df
pf
qf
rf
17Нецентральное T Стьюдента
MathProbabilityDensityNoncentralT
MathCumulativeDistributionNoncentralT
MathQuantileNoncentralT
MathRandomNoncentralT
dt
pt
qt
rt
18Пуассона
MathProbabilityDensityPoisson
MathCumulativeDistributionPoisson
MathQuantilePoisson
MathRandomPoisson
dpois
ppois
qpois
rpois
19T Стьюдента
MathProbabilityDensityT
MathCumulativeDistributionT
MathQuantileT
MathRandomT
dt
pt
qt
rt
20
Равномерное
MathProbabilityDensityUniform
MathCumulativeDistributionUniform
MathQuantileUniform
MathRandomUniform
dunif
punif
qunif
runif
21Вейбулла
MathProbabilityDensityWeibull
MathCumulativeDistributionWeibull
MathQuantileWeibull
MathRandomWeibull
dweibull
pweibull
qweibull
rweibull

Стараемся сделать так, что код из R был близко идентичен по затрачиваемому времени написания и размеру в MQL5.

Завтра выпустим в бету графическую библиотеку и продемонстрируем одинаково близкие по размеру куски кода в R и MQL5 вместе с изображениями.



Вы используете устаревшую версию R. Надо брать R version 3.3.1 (2016-06-21) с сайта MRAN -  Microsofn R Open. При этом обязательно устанавливать MKL. Майкрософт в указанном релизе R утверждал, что сумел повысить скорость исполнения некоторых пакетов и функций до 50 (!) раз.   

Сомневаюсь, что штатная версия R может неожиданно ускориться - код там не сильно меняется. Понятно, что некоторые функции можно ускорить, а особенно матричные. Причем ваше утверждение подтверждает мое мнение, что код в R написан достаточно небрежно в плане производительности.

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

Расчеты производились на Intel Core i7-4790, CPU 3.6 Ghz, 16 GB RAM, Windows 10 x64. Результаты измерения времени расчетов в микросекундах


Распределение
MQL5 время
расчета PDF (мкс)
 R время
расчета PDF (мкс)
PDF
R/MQL5 
MQL5 время
расчета CDF (мкс)
R время
расчета CDF (мкс)
CDF
R/MQL5
MQL5 время расчета
квантилей (мкс)
 R время расчета
квантилей (мкс)
Quantile
R/MQL5
 MQL5 время генерации
случайных чисел (мкс)
R время генерации
случайных чисел (мкс)  
Random
R/MQL5
1
 Binomial
4.39
11.663
2.657
13.65
25.316
1.855
50.18
66.845
1.332
318.73
1816.463
5.699
2
 Beta
1.74
17.352
9.972
4.76
15.076
3.167
48.72
129.992
2.668
688.81
1723.45
2.502
3
 Gamma
1.31
8.251
6.347
8.09
14.792
1.828
50.83
64.286
1.265
142.84
1281.707
8.973
4
 Cauchy
0.45
1.423
3.162
1.33
15.078
11.34
1.37
2.845
2.077
224.19
588.517
2.625
5
 Exponential
0.85
3.13
3.682
0.77
2.845
3.695
0.53
2.276
4.294
143.18
389.406
2.72
6
 Uniform
0.42
2.561
6.098
0.45
1.423
3.162
0.18
2.846
15.81
40.3
247.467
6.141
7
 Geometric
2.3
5.121
2.227
2.12
4.552
2.147
0.81
5.407
6.675
278
1078.045
3.879
8
 Hypergeometric
1.8511.095
5.997
0.9
8.819
9.799
0.75
9.957
13.28
302.55
880.356
2.91
9
 Logistic
1.27
4.267
3.36
1.11
4.267
3.844
0.71
3.13
4.408
178.65
626.632
3.508
10
 Weibull
2.99
5.69
1.903
2.74
4.268
1.558
2.64
6.828
2.586
536.37
1558.472
2.906
11
 Poisson
2.91
5.974
2.053
6.26
8.534
1.363
3.43
13.085
3.815
153.59
303.219
1.974
12
 F
3.86
10.241
2.653
9.94
22.472
2.261
65.47
135.396
2.068
1249.22
1801.955
1.442
13
 Chi Square
2.47
5.974
2.419
7.71
13.37
1.734
44.11
61.725
1.399
210.24
1235.059
5.875
14
 Noncentral ChiSquare
8.05
14.223
1.767
45.61
209.068
4.584
220.66
10342.96
46.873
744.45
1997.653
2.683
15
 Noncentral F
19.1
28.446
1.489
14.67
46.935
3.199
212.21
2561.991
12.073
1848.9
2912.141
1.575
16
 Noncentral Beta
16.3
26.739
1.64
10.48
43.237
4.126
153.66
2290.915
14.909
2686.82
2839.893
1.057
17
 Negative Binomial
6.13
11.094
1.81
12.21
19.627
1.607
14.05
60.019
4.272
1130.39
1936.498
1.713
18
 Normal
1.15
4.267
3.71
0.81
3.983
4.917
0.7
2.277
3.253
293.7
696.321
2.371
19
 Lognormal
1.99
5.406
2.717
3.19
8.819
2.765
3.18
6.259
1.968
479.75
1269.761
2.647
20
 T
2.32
11.663
5.027
8.01
19.059
2.379
50.23
58.596
1.167
951.58
1425.92
1.498
21
 Noncentral T
38.47
86.757
2.255
27.75
39.823
1.435
1339.51
1930.524
1.441
1550.27
1699.84
1.096
   <PDF R/MQL5>
3.474   <CDF R/MQL5>
3.465
    <Quantile R/MQL5>
7.03
    <Random R/MQL5>
3.13



Но указанную версию конечно проверим. Как на скорость, так и на производительность.

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

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

...

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

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

 

С арксинусом интересный пример кстати.
mql -
MathArcsin(1) = MathArcsin(2) = -nan(ind)

Wolfram - 
Arcsin(1) = Pi/2
Arcsin(2) = что-то комплексное. Решения с действительным результатом нету. 

R - 
asin(1) = Pi/2
asin(2) = nan (ответ для действительных чисел)
asin(2+0i) = что-то комплексное, как и в wolfram

wiki говорит что asin(1) всё-таки дефинирован (https://en.wikipedia.org/wiki/Inverse_trigonometric_functions), можно в сервисдеск багрепорт писать.
а вот asin(2) это уже недефинированная область, с этим всё норм и везде совпадает.

 

И ещё раз насчёт прошлого поста - делить на 0 в простой математике нельзя, поэтому логично что mql скрипт вылетает с ошибкой, тут багов нету. Но очень странно видеть такую дотошность к точности результатов до 16 знаков после запятой, а вернуть nan или Inf при делении на ноль почему-то нельзя. Имхо нужно вернуть Inf и не мучать девелоперов внезапными вылетами их скриптов.

 
Ренат, неужели этот перевод нескольких функций с R на mql и был тем сюрпризом о котором вы говорили когда то?
 

Для отключения контроля за делением вещественных на ноль, используйте параметр FpNoZeroCheckOnDivision=1 в разделе [Experts] файла metaeditor.ini

При наличии данного параметра, следующий код выдаст inf

void OnStart()
  {
   double x=0;  
   Print(1/x);
  }

Естественно, наличие данного параметра не избавит от ошибки компиляции при делении на константу 0.0
Print(1/0.0);

'0.0' - division by zero in the constant expression    s1.mq5    8    12
 
mytarmailS:
Ренат, неужели этот перевод нескольких функций с R на mql и был тем сюрпризом о котором вы говорили когда то?

Нет.

Сюрприз не имеет смысла, мы все будем делать в рамках MQL5 и MetaTrader 5.

 
Renat Fatkhullin:

При наличии данного параметра, следующий код выдаст inf

Спасибо, очень правильная настройка. А если поделить ноль на ноль, то получается уже не inf, а nan, и это ещё правильнее, я даже не ожидал такой точности!
Причина обращения: