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

 
Мне тоже интересно как в пакете foreca определяется зависимость входов и выхода. Может там тривиально, а может и нет.
 
Alexey Burnakov:
Мне тоже интересно как в пакете foreca определяется зависимость входов и выхода. Может там тривиально, а может и нет.

Я лишь через строчку посмотрел, пусть меня поправят или подтвердят, но по моим представления пакет на основе некоторого внутреннего алгоритма оценивает предсказательную способность конкретной случайно величины, т.е. способность к эстраполяции своих значений случайной величины в будущее. Если это трендовый участок, то получим одно, а если это приращения цены, то и получим 0.83%, что для меня совершенно очевидно. И все дело в самом методе и на практике все обстоит с точностью до наоборот, так как приращения предсказываются гораздо лучше - они гораздо ближе к стационарности, чем тренды нестационарных временных рядов. Мы должны понимать сам инструмент и применять этот инструмент к объектам, к которым этот инструмент подходит.

 

Если говорить в общем, то есть ошибки системного анализа.

Ошибка №1.

Применение правильным методов к неправильно поставленной задаче.

В статистике чрезвычайно широко распространена. 

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

Вообще мне кажется, что потеряна первоначальная мысль. По мне эта первоначальная мысль состояла в том, что необходимы методы, которые бы НЕ ЗАВИСИМО ОТ МОДЕЛИ определяли способность каждого из используемых предикторов предсказывать целевую переменную.

Пример отбора независимого от модели - пакет vtreat. Он как-то анализирует данные, а потом выставляет им оценку соответствия целевым значениям.

data(iris)
iris[,5] <- as.numeric(iris[,5]) #пакет не умет факторы, их нужно сконвертировать в числа
iris_rand <- runif(nrow(iris)*10, min(iris[,1:4]), max(iris[,1:4])) #новых 10 предикторов со случайными значениями
dim(iris_rand) <- c(nrow(iris), 10)
colnames(iris_rand) <- paste0("rand_", c(1:10))
iris <- cbind(iris_rand, iris)
library(vtreat)
treatments <- designTreatmentsN(dframe = iris, varlist = colnames(iris)[1:(ncol(iris)-1)], outcomename = colnames(iris)[ncol(iris)], verbose = TRUE)
treatments
format(treatments)
significance <- treatments$scoreFrame[,"sig"]
names(significance) <- treatments$scoreFrame[,"origName"]
barplot(significance)

Для таблицы iris создаётся 10 новых предикторов со случайными значениями. designTreatmentsN оценит каждый предиктор, чем оценка ниже, тем лучше. В этом примере оригинальных 4 предиктора (последние на графике) явно выделяются, имеют почти нулевую оценку, что очень хорошо. При отборе предикторов нужно убирать первым делом то что имеет самые большие значения.
Если целевых значений всего 2 - (0/1, TRUE/FALSE, -1/1, фактор с 2 уровнями, итд..) то для специально такого случая есть функция designTreatmentsC


Ещё этот пакет использовался также в y-aware pca. Пакет vtreat шкалирует предикторы в y-aware интервал, а компоненты дальше создаются почти обычным образом (просто без повторного шкалирования и центрирования). То есть, если хочется, с помощью этого пакета можно делать такие интересные вещи как y-aware randomforest например.
Подробнее тут: https://cran.r-project.org/web/packages/vtreat/vignettes/vtreatScaleMode.html

 
Dr.Trader:

Пример отбора независимого от модели - пакет vtreat. Он как-то анализирует данные, а потом выставляет им оценку соответствия целевым значениям.

Для таблицы iris создаётся 10 новых предикторов со случайными значениями. designTreatmentsN оценит каждый предиктор, чем оценка ниже, тем лучше. В этом примере оригинальных 4 предиктора (последние на графике) явно выделяются, имеют почти нулевую оценку, что очень хорошо. При отборе предикторов нужно убирать первым делом то что имеет самые большие значения.
Если целевых значений всего 2 - (0/1, TRUE/FALSE, -1/1, фактор с 2 уровнями, итд..) то для специально такого случая есть функция designTreatmentsC


Ещё этот пакет использовался также в y-aware pca. Пакет vtreat шкалирует предикторы в y-aware интервал, а компоненты дальше создаются почти обычным образом (просто без повторного шкалирования и центрирования). То есть, если хочется, с помощью этого пакета можно делать такие интересные вещи как y-aware randomforest например.
Подробнее тут: https://cran.r-project.org/web/packages/vtreat/vignettes/vtreatScaleMode.html

Ну, вот, возврат к истокам.

А теперь далее.

Использование любых моделей ТОЛЬКО после обработки для них этими пакетами. Надежда на то, что модели при такой предварительной обработке НЕ будут больны переобучением.  

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

Применение правильным методов к неправильно поставленной задаче.

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

Есть примеры в описании пакета, где он применяется к индексам DAX, SMI, CAC, FTSE, используются именно приращения на D1, то есть и пакет, и задачи правильные.
Небольшой нюанс в том, что в примере временной ряд цен сначала обработан логарифмической функций log(), и только после этого найдены дельты. diff(log(EuStockMarkets[c(100:200),])) * 100
Но я не заметил разницы если использовать или не использовать log(), результат оценки не изменился, это было сделано скорее для более удобного отображения данных на графике.

 
Dr.Trader:

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

Есть примеры в описании пакета, где он применяется к индексам DAX, SMI, CAC, FTSE, используются именно приращения на D1, то есть и пакет, и задачи правильные.
Небольшой нюанс в том, что в примере временной ряд цен сначала обработан логарифмической функций log(), и только после этого найдены дельты. diff(log(EuStockMarkets[c(100:200),])) * 100
Но я не заметил разницы если использовать или не использовать log(), результат оценки не изменился, это было сделано скорее для более удобного отображения данных на графике.

В отношении этого пакета для меня вопрос принципиальный:

  • он дает предсказательную способность отдельного предиктора,
  • или предсказательную способность целевой переменной, использующей предикторы?

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

В отношении этого пакета для меня вопрос принципиальный:

  • он дает предсказательную способность отдельного предиктора,
  • или предсказательную способность целевой переменной, использующей предикторы?

Связи между целевой переменной и предикторами он не ищет. Автор пакета пишет про два применения -

1) оценить временной ряд на то, прогнозируем ли он вообще (по шкале от 0% = "белый шум" до 100%=синусоида) функцией Omega(). Если результат 0%, то пытаться предсказать поведение временного ряда невозможно, какие бы предикторы не использовалась.
2) взять несколько предикторов, оценить их той-же функцией, создать новые предикторы похожим на pca образом дабы у новых предикторов результат Omega() был ещё выше чем у оригинальных. Поможет ли это лучше предсказывать целевые значения, или нет - это уж как повезёт, пакет не интересуется о том что именно нужно предсказать этими предикторами. Смысл как-бы в том, что если предиктор не шум - то модели с его использованием будут предсказывать стабильнее. 

 
Dr.Trader:

Связи между целевой переменной и предикторами он не ищет. Автор пакета пишет про два применения -

1) оценить временной ряд на то, прогнозируем ли он вообще (по шкале от 0% = "белый шум" до 100%=синусоида) функцией Omega(). Если результат 0%, то пытаться предсказать поведение временного ряда невозможно, какие бы предикторы не использовалась.
2) взять несколько предикторов, оценить их той-же функцией, создать новые предикторы похожим на pca образом дабы у новых предикторов результат Omega() был ещё выше чем у оригинальных. Поможет ли это лучше предсказывать целевые значения, или нет - это уж как повезёт, пакет не интересуется о том что именно нужно предсказать этими предикторами. Смысл как-бы в том, что если предиктор не шум - то модели с его использованием будут предсказывать стабильнее. 

Вы предметно подтвердили мои подозрения. 

Спасибо.

Я считаю, что пакет бесполезен для классификации.

Но для предсказания типа экстраполяции может быть полезен.

Например, возьмем пакет forecast. Он разлагает ряд на три составляющие, затем экстраполирует вперед и складывает. Получает прогноз на шаг или несколько вперед.

Теперь вопрос: какую валютную пару взять? Берем  CaretFA и с его помощью вычисляем предсказательную способность нескольких валютных пар. Я подозреваю, что в ограниченном окне такая предсказательная способность меняется при движении окна. Выбрали валютную пару, предсказываем forecast (или другим пакетом - их полно), торгуем, после закрытия всех позиций снова выбираем валютную пару. 

 
Dr.Trader:

Пример отбора независимого от модели - пакет vtreat. Он как-то анализирует данные, а потом выставляет им оценку соответствия целевым значениям.

Для таблицы iris создаётся 10 новых предикторов со случайными значениями. designTreatmentsN оценит каждый предиктор, чем оценка ниже, тем лучше. В этом примере оригинальных 4 предиктора (последние на графике) явно выделяются, имеют почти нулевую оценку, что очень хорошо. При отборе предикторов нужно убирать первым делом то что имеет самые большие значения.
Если целевых значений всего 2 - (0/1, TRUE/FALSE, -1/1, фактор с 2 уровнями, итд..) то для специально такого случая есть функция designTreatmentsC


Ещё этот пакет использовался также в y-aware pca. Пакет vtreat шкалирует предикторы в y-aware интервал, а компоненты дальше создаются почти обычным образом (просто без повторного шкалирования и центрирования). То есть, если хочется, с помощью этого пакета можно делать такие интересные вещи как y-aware randomforest например.
Подробнее тут: https://cran.r-project.org/web/packages/vtreat/vignettes/vtreatScaleMode.html

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

а этот отбор по vtreat, он чем то отличается от  того же importense встроенного в RF? имеется ввиду по эффективности  

 
mytarmailS:

а этот отбор по vtreat, он чем то отличается от  того же importense встроенного в RF? имеется ввиду по эффективности  

Vtreat лучше. Он оценивает всё статистически, насколько в целом предиктор хорош/плох для предсказани целевой переменной, без подгонки под конкретную предсказательную модель. Рекомендуется использовать предикторы с оценкой не больше 1/(кол-во предикторов). Например если есть 200 предикторов - берём из них только те, у которых оценка меньше 1/200. Можно оценить предикторы, и если все оценки выше порога -  вместо безуспешных попыток обучить модель и предсказать новые данные - лучше сразу просто начать искать другие предикторы.

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

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