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

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

И всегда вижу, что такие системы не работают на рынке. Мониторинги идут либо в ноль, либо в минус.
Но зато в соседней теме, кто-то зарабатывает советником на двух скользящих. И зарабатывает хорошо.

Вопрос, есть ли смысл в этом всём?
Потому, что на моем опыте, чем проще и понятнее система, тем она прибыльней.

Вы случайно не клерк в брокерской канторе старого образца?

Просветите пожалуйста "как надо", полагаю Ваш "секретный метод" это торговать машки(рандом) и удваиваться при проигрыше, так?)))

 

На комиссию жить придется господа, только на комиссию...

 
Dr.Trader:

Создание комитета, и тестирование:

Есть проблема в том что оригинальные классы типа фактор, а результат в матрице конвертируется в соответствующие факторам порядковые номера. Поэтому в конце сравнение идёт через as.numberic().

Что бы всё работало нормально с факторами, нужно predictionMatrix создавать как data.frame, но после этого у меня функция rbind выдавала варнинги, нужно что-то ещё менять, я не разбирался что там не так.

Несколько мыслей по коду:

1. Не нужно применять конструкцию for() без крайней необходимости. Есть чудесная альтернатива foreach() которая кроме высокой скорости выполнения позволяет распараллелить вычисления между доступными ядрами.

2. Ансамбль моделей имеет смысл и дает результат только если модели имеют значительные отличия. Два варианта: один набор данных - разные модели (RF, DT, SVM); однв модель - разные наборы данных. Пример по последнему варианту ниже

#----------------------------------------------------------------------
require(ranger)
require(foreach)
require(magrittr)
data("iris")
totalModels = 50
res <- list()
Acc <- c()
res <- foreach(i = seq_len(totalModels),
               .packages = c("ranger", "magrittr")) %do% {
          id <- rminer::holdout(y = iris$Species, ratio = 2/3)
          x.test <- iris[id$ts, -ncol(iris)]
          y.test <- iris[id$ts, ncol(iris)]
          model <- ranger(Species~., data = iris[id$tr, ], 
                          write.forest = TRUE)
          pred <- predict(model, x.test)$predictions
          acc <- sum(pred == y.test) / length(y.test)
          list(Acc = acc, mod = model) 
        }
for (i in 1:totalModels) {Acc[i] <- res[[i]]$Acc}
Acc
 [1] 0.9803922 0.9607843 0.9803922 0.9607843
 [5] 0.9607843 0.9215686 1.0000000 0.9411765
 [9] 0.9019608 0.9607843 0.9803922 0.9607843
[13] 0.9803922 0.9215686 0.9607843 0.9215686
[17] 0.9803922 0.8823529 0.9411765 0.9803922
[21] 0.9607843 0.9215686 0.9607843 0.9411765
[25] 0.9411765 0.9607843 0.9411765 0.9607843
[29] 0.8823529 0.9019608 1.0000000 0.9411765
[33] 0.9215686 0.9803922 1.0000000 0.9607843
[37] 0.9411765 0.9803922 0.9607843 0.9215686
[41] 0.9411765 0.9607843 0.9411765 1.0000000
[45] 0.9607843 0.9411765 0.9215686 0.9411765
[49] 0.9803922 0.9607843

Выбираем модели с лучшими показателями и дальше работаем с ними.

Удачи

 
Vladimir Perervenko:

Несколько мыслей по коду:

1. Не нужно применять конструкцию for() без крайней необходимости. Есть чудесная альтернатива foreach() которая кроме высокой скорости выполнения позволяет распараллелить вычисления между доступными ядрами.

2. Ансамбль моделей имеет смысл и дает результат только если модели имеют значительные отличия. Два варианта: один набор данных - разные модели (RF, DT, SVM); однв модель - разные наборы данных. Пример по последнему варианту ниже

Выбираем модели с лучшими показателями и дальше работаем с ними.

Удачи

Хотелось бы видеть Вас почаще. Не пропадайте.
 
Vladimir Perervenko:


Выбираем модели с лучшими показателями и дальше работаем с ними.


Вот тут и кроется беда.

А лучшие показатели на каких данных посчитаны?

Почему спрашиваю, потому что вконты вовсю пытаются понять, как выбрать модель (из множества моделей), используя данные обучения и тестирования. А тут у вас так прямо: берем лучшие показатели и работаем с ними.  

 
Alexey Burnakov:

Вот тут и кроется беда.

А лучшие показатели на каких данных посчитаны?

Почему спрашиваю, потому что вконты вовсю пытаются понять, как выбрать модель (из множества моделей), используя данные обучения и тестирования. А тут у вас так прямо: берем лучшие показатели и работаем с ними.  

Исходный набор делится на train/test стратифицировано. На train обучаем на тест соответственно тестируем. Неужели из кода непонятно?

Удачи

 
СанСаныч Фоменко:
Хотелось бы видеть Вас почаще. Не пропадайте.
К сожалению времени хватает только время от времени просматривать сайт. Работы много.
 
Vladimir Perervenko:

Исходный набор делится на train/test стратифицировано. На train обучаем на тест соответственно тестируем. Неужели из кода непонятно?

Удачи

Попробую rminer::holdout, спасибо за пример. Вообще, из опыта, если подбирать модель и её параметры так чтобы получить лучший результат на тестовой выборке - то модель в итоге будет показывать действительно хороший результат на тестовой выборке. Но при этом результат обычно очень низок на новых данных. Я говорю конкретно о данных с форекса, в других областях это есть вполне нормальный подход. Не надеюсь что rminer::holdout для форекса что-то кардинально изменит.
 
Dr.Trader:
Попробую rminer::holdout, спасибо за пример. Вообще, из опыта, если подбирать модель и её параметры так чтобы получить лучший результат на тестовой выборке - то модель в итоге будет показывать действительно хороший результат на тестовой выборке. Но при этом результат обычно очень низок на новых данных. Я говорю конкретно о данных с форекса, в других областях это есть вполне нормальный подход. Не надеюсь что rminer::holdout для форекса что-то кардинально изменит.
Вот и я о том. А он не понял.

На форексе хороший тест не означает хорошую работу вне выборки. Вот и бьются люди. А тут прямо так - берем лучшие результаты (и мастером подгонку). По-доброму )
 
Dr.Trader:
 то модель в итоге будет показывать действительно хороший результат на тестовой выборке. Но при этом результат обычно очень низок на новых данных. Я говорю конкретно о данных с форекса, 
Alexey Burnakov:
На форексе хороший тест не означает хорошую работу вне выборки. Вот и бьются люди. 

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

 

почему вам так сложно это принять?

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

зачем так сильно концентрироваться на модели если разница в производительности между моделями в пределах от 0,5% до 5%

 

никакая модель тут не поможет ведь суть в самих данных

1 

уже не раз кидал эту картинку, но тем не менее.....

Всмотритесь! это разница кумулятивных прогнозов на бай и на сел от двух сетей   cum(buy.signal)  -  cum(sell.signal), в идеале если наша модель хороша то синий график должен коррелировать с ценой, это значит что сеть хорошо понимает данные и адекватно на них реагирует, по факту что мы видим????????

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

 А теперь скажите мне  какая модель справиться с этим? какая кросвалидацыя тут поможет?  любое обучение модели с последующей проверкой на out of sample (новых данных) будет ничто иное как подгонка модели которая хорошо работает на out of sample и не более того..  И вы при тренировке моделей сами это постоянно видите, что на абсолютно новых данных модель всегда сливает, ну видите же??? согласитесь!! Я вам даю ответ почему так происходит

 

А это график с данными на которых проходило само обучение, или тут только тест на новых данных? Если нарисовать график для обоих периодов времени сразу, и для тренировочного, и для тестового, то на первой (тренировочной) части данных будет полное совпадение синего и серого графика, а с началом новых данных - произойдёт резкий переход в обратную корреляцию?

Если всё было бы так просто, то достаточно обучить любую модель, и просто инвертировать её предсказания. Это не работает к сожалению.
Обучить модель дающую 0% точности на новых данных так-же сложно как и добиться точности 100%. По дефолту, например подбрасывая монетку точность будет 50%, и уйти на пару десятков процентов в любую сторону это задача одинаковой сложности. Проблема не в том что модели дают противоположный результат, а в том что на каких-то барах результат будет правильный, на каких-то других - неправильный, и всё это рандомно и без возможности отфильтровать только правильные результаты.

И почему вы от прогноза B отнимаете прогноз S? Может быть стоит делать наоборот, S-B? Тогда и корреляция внезапно станет правильной.

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