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

 
Renat Fatkhullin:

R - потрясающая система, которая лично мне открыла глаза на то, как далеки мы были в MetaTrader/MQL от реальных потребностей "сделать сложные вычисления просто и прям сейчас".

У нас (С++ девелоперов) в крови подход "все можете сделать сами, а мы даем низкоуровневую базу и скорость вычислений". Мы фанатично относимся к производительности и у нас получается - MQL5 на 64 битах великолепен.

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

Поэтому мы сделали резкий поворот и начали апгрейд MetaTrader 5:

  • включили ранее переписанные математические библиотеки Alglib и Fuzzy в стандартную поставку, покрыли юнит-тестами
  • разработали аналог статистических функций из R, провели исследования и покрыли тестами. работа еще продолжается и библиотека расширяется
  • разработали первую бета-версию графической библиотеки Graphics как аналог plot в R. добавили однострочные функции для быстрого вывода
  • начали менять интерфейсы в окнах вывода терминала, чтобы можно было оперировать табличными данными. сменили направление вывода, добавили отключение лишних колонок, заменили шрифт на моноширинный в окне вывода экспертов
  • добавили мощную функцию ArrayPrint для автоматической распечатки массивов, включая структуры
  • добавили функции FileLoad и FileSave для быстрой записи/чтения массивов на диск


Конечно, мы в начале пути, но уже понятен правильный вектор приложения сил.

Мотивация Ваша – великолепна! Если всё именно так как Вы говорите, то быстро обкусаете до костей нинджу c мультичартом)))

Однако, ИМХО, тут придется создавать нечто кардинально новое, то есть помимо того что Вам написал ув. мистер Решетов, нужна именно исследовательская студия, для работы с произвольными датасетами, не только с загружаемыми из рынка, так как многие вещи нужно пробовать на совсем тривиальных, синтетических примерах чтобы понять что происходит, ну Вы меня должны понять как программист программиста)) Графики отрисовать разные, скатеры, хитмапы, распределения и тп. В общем это было бы ооооочень круто, если прямо из метаэдитра было доступно такой набор инструментов, но откровенно говоря даже не надеюсь…

Но вообще конечно тренд Ваших мыслей мне нравится))

 
Renat Fatkhullin:

Это был вежливый ответ без деталей и проверки. И ответ не совпал с Wolfram Alpha и Matlab, что является проблемой.

Уходить в сторону не надо - корневой вопрос был четко обозначен.

Что значит, его ответ не совпал с Wolfram? Не совпал в том, что ответ человека был не "ноль"? Человек ответил, что не считает, что в нулевой точке, где интеграл = 0, плотность должна обязательно быть нулевой (я так поставил ему вопрос). Он прямо так и сказал. И добавил, что значение плотности в любой точке не релевантно (я читаю "нерелевантно" как не относящееся к рассматриваемому вопросу). Это вполне четкое математическое заявление.

В обсуждаемом вопросе важна математика.

Имеем интеграл такой-то функции (функции плотности вероятности гамма распределения). Все уже привыкли, что можно подсунуть в Wolfram уравнение с параметрами: указать область интегрирования и параметры функции, и он сам проинтегрирует и выдаст ответ. А вы задумались, что если бы вы сами сели, посчитали этот интеграл на заданной области, то получили бы 0 в нуле, и 1 на всей области, и какое-то значение [0,1] на какой-то подобласти. Просто решив уравнение!

То, что предел у функции плотности вероятности гамма распределения в крайней точке уходит куда-то в положительную область, это свойство этой функции. Не имеет отношение к тому, что получится интегрированием этой функции. Об этом человек и написал.

Я не уклоняюсь от корневых вопросов. Я еще раз повторю, что Наша точка зрения была подтверждена не зависящим от нас лицом - какая плотность в нуле не важно (не релевантно).

 
Женя:

Мотивация Ваша – великолепна! Если всё именно так как Вы говорите, то быстро обкусаете до костей нинджу c мультичартом)))

Однако, ИМХО, тут придется создавать нечто кардинально новое, то есть помимо того что Вам написал ув. мистер Решетов, нужна именно исследовательская студия, для работы с произвольными датасетами, не только с загружаемыми из рынка, так как многие вещи нужно пробовать на совсем тривиальных, синтетических примерах чтобы понять что происходит, ну Вы меня должны понять как программист программиста)) Графики отрисовать разные, скатеры, хитмапы, распределения и тп. В общем это было бы ооооочень круто, если прямо из метаэдитра было доступно такой набор инструментов, но откровенно говоря даже не надеюсь…

Но вообще конечно тренд Ваших мыслей мне нравится))

Вы этот "выстрел" Решетова имеете в виду??

"Гнильё какое-то этот R - велосипед с квадратными колёсами. Что говорить о каких-то его пакетах, когда сама основа, т.е. ЯП в R кривой и нуждается в серьёзной доработке "драчевым напильником"? Какой может быть авторитет у тех, кто даже не удосужился за столько лет проверить корректность базовых функций в R? Какая может быть "сила" в слабом месте R - некорректности расчётов через него?

Хорошо, что MetaQuotes  открыли глаза некоторым пользователям на то, что на самом деле представляет этот самый R, на фактах и тестах с открытыми исходниками, чтобы каждый мог самостоятельно перепроверить и убедиться, а не голословно. Не всем конечно открыли, т.к. отдельные религиозные фанатики из деструктивной секты R будут продолжать слепо верить в "непогрешимость" расчётов в их кривом языке и пакетах, вместо того, чтобы обратиться к представленным тестам и перепроверить их самостоятельно, а не фанатично гнать пургу, выгораживая кривизну R в качестве "общепринятого стандарта".  

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

За конструктивный подход, тесты и их исходники, а также за выявление "голого короля - R", разработчикам MetaQuotes надо сказать отдельное спасибо! "

 
Vladimir Perervenko:

Вы этот "выстрел" Решетова имеете в виду??

нет, вот это сообщение:

Yury Reshetov:

R, как и многие другие ЯП, пока более удобен для машинного обучения по сравнению с MQL за счёт того, что в нём заведомо предусмотрен функционал для обработки данных в виде массивов. Дело в том, что выборка для машинного обучения - это чаще всего двумерный массив данных, а соответственно необходим функционал для работы с массивами:

  1. Вставка строк и столбцов в виде массивов меньшей размерности в другой массив
  2. Замена строк и столбцов в массиве в виде массивов меньшей размерности
  3. Удаление строк и столбцов из массива (например, для удаления малозначимых предикторов или примеров с явными "выбросами" из выборки).
  4. Деление массивов на части, в результате чего из исходного массива получаются два или более массивов, являющихся его частями (необходимо для деления выборки на обучающие и тестовые части или на большее количество частей, например для Wallking Forward).
  5. Случайное перемешивание строк и столбцов в массиве с равномерным распределением (необходимо, чтобы те или иные примеры из выборки попали в разные части, желательно равномерно распределившись по этим частям).
  6. Различные функции для обработки данных по отдельным строкам или столбцам (например, вычисление среднеарифметического значения по строке или по столбцу, дисперсии, или поиск максимального либо минимального значения в строке для последующей нормировки).
  7. И т.д. и т.п.

А пока в MQL не будет реализован вышеуказанный функционал необходимый для обработки выборок в виде массивов, то значительная часть разработчиков алгоритмов машинного обучения предпочтёт другие ЯП, в которых всё это уже давно имеется в наличии. Или будет пользоваться неприхотливым MLP (алгоритмом 60-х годов прошлого века) из библиотеки AlgLib, в котором, если мне не изменяет память, для удобства двумерные массивы представлены в виде одномерных.

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

 
Vladimir Perervenko:

Вы этот "выстрел" Решетова имеете в виду??

"Гнильё какое-то этот R - велосипед с квадратными колёсами. Что говорить о каких-то его пакетах, когда сама основа, т.е. ЯП в R кривой и нуждается в серьёзной доработке "драчевым напильником"? Какой может быть авторитет у тех, кто даже не удосужился за столько лет проверить корректность базовых функций в R? Какая может быть "сила" в слабом месте R - некорректности расчётов через него?

Хорошо, что MetaQuotes  открыли глаза некоторым пользователям на то, что на самом деле представляет этот самый R, на фактах и тестах с открытыми исходниками, чтобы каждый мог самостоятельно перепроверить и убедиться, а не голословно. Не всем конечно открыли, т.к. отдельные религиозные фанатики из деструктивной секты R будут продолжать слепо верить в "непогрешимость" расчётов в их кривом языке и пакетах, вместо того, чтобы обратиться к представленным тестам и перепроверить их самостоятельно, а не фанатично гнать пургу, выгораживая кривизну R в качестве "общепринятого стандарта".  

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

За конструктивный подход, тесты и их исходники, а также за выявление "голого короля - R", разработчикам MetaQuotes надо сказать отдельное спасибо! "

А Вы уже удалили свой пост про "норковый MQL"? Трёте свои посты так же, как радовские деятели трут свои фейсбуки после избрания Трампа.

 

 

Вот вам для развлечения пример с гамма распределением в Wolfram Alpha.

Ему задана функция, немного упрощенная функция плотности гамма распределения.

Суть - в знаменателе x. Предел справа, как вы можете видеть, при x->0 Wolfram оценивает правильно: inf.

То есть в пределе справа плотность в нулевой точке в бесконечности (это в точности ответ dgamma).

 

Проинтегрируем эту функцию на большом саппорте:

 

Интеграл равен 1 (округленно, конечно, потом что взят не полный саппорт).

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

 
Alexey Burnakov:

Вот вам для развлечения пример с гамма распределением в Wolfram Alpha.

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

Спасибо за пример, вы правы. Этот интеграл сходится.

Предельные значения в точке x=0 также можно использовать для определения плотности и это не приведет к расходимостям.

 
Quantum:

Спасибо за пример, вы правы. Этот интеграл сходится.

Предельные значения в точке x=0 также можно использовать для определения плотности и это не приведет к расходимостям.


Спасибо! Уважаю. 

 

Пример по R с пакетами для быстрой обработки.

 

library(data.table)

library(ggplot2)


start <- Sys.time()


set.seed(1)

dummy_coef <- 1:9


x <- as.data.table(matrix(rnorm(9000000, 0, 1), ncol = 9))

x[, (paste0('coef', c(1:9))):= lapply(1:9, function(x) rnorm(.N, x, 1))]


print(colMeans(x[, c(10:18), with = F]))


x[, output:= Reduce(`+`, Map(function(x, y) (x * y), .SD[, (1:9), with = FALSE], .SD[, (10:18), with = FALSE])), .SDcols = c(1:18)]


x[, sampling:= sample(1000, nrow(x), replace = T)]


lm_models <- x[, 

{

lm(data = .SD[, c(1:9, 19), with = F], formula = output ~ . -1)$coefficients

}, 

by = sampling]


lm_models[, coefs:= rep(1:9, times = 1000)]


avg_coefs <- lm_models[, mean(V1), by = coefs]

plot(dummy_coef, avg_coefs$V1)


lm_models[, 

  print(shapiro.test(V1)$p.value)

  , by = coefs]


ggplot(data = lm_models, aes(x = V1)) +

geom_histogram(binwidth = 0.05) +

facet_wrap(~ coefs, ncol = 3)


Sys.time() - start

 Время работы: 5 сек. Построено 1000 линейных моделей. Каждая на 1000 наблюдениях.

[1] 0.8908975

[1] 0.9146406

[1] 0.3111422

[1] 0.02741917

[1] 0.9824953

[1] 0.3194611

[1] 0.606778

[1] 0.08360257

[1] 0.4843107

 Все коэффициенты распределены нормально.

И ggplot-ик для визуализации. 

 

 

И еще примерчик. Тоже соотносится с ворочанием большими выборками на предмет симуляции статистики.

########## simulate diffference between mean density with different sample size


library(data.table)

library(ggplot2)


rm(list=ls());gc()


start <- Sys.time()


x <- rnorm(10000000, 0, 1)

y <- rnorm(10000000, 0, 1)


dat <- as.data.table(cbind(x, y))

dat[, (paste0('sampling_', c(100, 1000, 10000))):= lapply(c(100, 1000, 10000), function(x) sample(x, nrow(dat), replace = T))]


dat_melted <- melt(dat, measure.vars = paste0('sampling_', c(100, 1000, 10000)))


critical_t <- dat_melted[, 

   {

    mean(x) - mean(y)

   }

   , by = .(variable, value)]


ggplot(critical_t, aes(x = V1, group = variable, fill = variable)) + 

stat_density(alpha = 0.5)


Sys.time() - start


gc()

 Время работы 3.4 секунды.

Создаются нормально распределенные с центром в нуле выборки:

1000 по 10 000 пар значений

10 000 по 1000 пар значений

100 000 по 100 пар значений

 

Считается разница между средними (МО == 0) для каждой выборки.

Выводятся плотности распределения выборочных средних для выборок разного размера.

 

Только тут sampling_100 означает, что нужно 10 000 000 / 100, чтобы получить размер выборки. То есть для выборок меньшего размера стандартная ошибка больше... 

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