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

 
Dr.Trader:
Продолжайте не доверять importance при использовании для форекс. Ирис это очень простые данные, там есть прямые закономерности между имеющимеся данными и классами. RF достаточно найти минимальный набор предикторов на которых можно определить классы iris - и всё готово. 

 а что RF может ловить не прямые зависимости? мне кажется что для рынка не работает исключительно из за того что предикторы тухлые, были бы нормальные предикторы работало бы как и с ирисами с ошибкой под 95%

 

С ирисами всё просто - если лепесток от такой-то до такой-то длинны то это класс 1, а если от такой-то до такой-то ширины то это уже класс 2, итд. RF тем и занимается что находит интервалы значений предикторов которые лучше всего соответствуют целевым значениям.

Для этой задачи даже лес не нужен, хватит одного дерева для точности 90%:

 Rule number: 2 [Species=setosa cover=33 (31%) prob=1.00]
   Petal.Length< 2.6

 Rule number: 7 [Species=virginica cover=35 (33%) prob=0.00]
   Petal.Length>=2.6
   Petal.Length>=4.85

 Rule number: 6 [Species=versicolor cover=37 (35%) prob=0.00]
   Petal.Length>=2.6
   Petal.Length< 4.85

То есть если конкретному классу соответствует конкретный диапазон значений предикторов или их комбинации, и эти интервалы не пересекаются - то дерево или лес всё решат 100%.

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

 

ForeCA я ещё не смог.

Большая часть времени ушла на то чтобы отсеять предикторы с eigenvalue = 0 после cov() обучающей таблицы (я полагаю что подходят только особым образом коррелирующие между собой предикторы). Спустя сутки, дело дошло до обучения самой ForeCA модели, которая не обучилась потому что ошибка:

unit-variance: Mean relative difference: 3.520041e-06
Error in check_whitened(out$score, FALSE) : Data must be whitened:
         Each variable must have variance 1.

Пакет очень требователен к предикторам, много всяких ограничений. Что значит последняя ошибка даже не знаю, буду дальше разбираться.

 

Дописал позже:
Гугл говорит что удалять предикторы не обязательно. Можно их трансформировать таким образом чтобы они перестали коррелировать, тогда матрица ковариаций будет иметь полный ранг, что требуется для ForeCA. Для whitening есть какие-то функции в самом пакете (с полпинка не заработало, нужно разбираться), плюс теория в ссылках ниже.
Чтобы правильно использовать пакет ForeCA нужно сначала понять и научиться делать это:
http://stats.stackexchange.com/questions/23420/is-whitening-always-good
http://courses.media.mit.edu/2010fall/mas622j/whiten.pdf

 
Dr.Trader:

1) Лес для форекс будет правильно работать только если заранее отсеять неподходящие предикторы и оставить для обучения только нужные. А проблема как раз в том что нужные предикторы ещё нужно как-то определить или найти, и лес в этом не помощник.

 

2) Пакет очень требователен к предикторам, много всяких ограничений. Что значит последняя ошибка даже не знаю, буду дальше разбираться.

1) Я предлагал как мне кажется достаточно хорошую идею как такой отбор сделать, но никому не интересно, а сам реализовать не могу

 2) Только количество данных уменьшите а то сами знаете)

 

в продолжение про ирисы, данные там проще чем на форексе и в то же время информативнее...

нужно что то похожее и с ценами делать, я уже выкладывал этот пост но никто не отреагировал, попробую еще раз, есть такое понятие в ВР как динамическое искривление времени -  dynamic time warping   (DTW), вот с помощью его можно сделать график цены более читабельным, а в следствии более распознаваемым для алгоритма

 

data_driven_time_warp <- function (y) {
  cbind(
    x = cumsum(c(0, abs(diff(y)))),
    y = y
  )
}

y <- cumsum(rnorm(200))+1000

i <- seq(1,length(y),by=10)
op <- par(mfrow=c(2,1), mar=c(.1,.1,.1,.1))
plot(y, type="l", axes = FALSE)
abline(v=i, col="grey")
lines(y, lwd=3)
box()
d <- data_driven_time_warp(y)
plot(d, type="l", axes=FALSE)
abline(v=d[i,1], col="grey")
lines(d, lwd=3)
box()
par(op)

 и все вроде круто но печаль в том что в результате такого преобразования мы получаем две координаты х и у   время(синтетическое) и значения

d
                x        y
  [1,]   0.000000 1001.393
  [2,]   1.081118 1002.474
  [3,]   2.799970 1004.193
  [4,]   3.706653 1005.100
  [5,]   3.867351 1005.260
  [6,]   4.654784 1004.473
  [7,]   5.000202 1004.127
  [8,]   6.665623 1005.793
  [9,]   7.415255 1005.043
 [10,]   7.956572 1005.584
 [11,]   8.403185 1005.138
 [12,]   9.352230 1004.189
 [13,]   9.913620 1004.750
 [14,]  10.249985 1004.414

 вопрос как теперь это преобразование вернуть в обычный вектор что бы оно не потеряло своих свойств

 

вот так выглядит преобразование  - вверху обычный , внизу dtw

 DTW

 
mytarmailS:

1) Я предлагал как мне кажется достаточно хорошую идею как такой отбор сделать, но никому не интересно, а сам реализовать не могу

 2) Только количество данных уменьшите а то сами знаете)

А что предлагаете? Получается что я пропустил? Можно повторить Вашу идею?
 
СанСаныч Фоменко:
А что предлагаете? Получается что я пропустил? Можно повторить Вашу идею?
поищите там где я писал про кластеризацию, я там очень подробно объяснял суть
 
mytarmailS:

вопрос как теперь это преобразование вернуть в обычный вектор что бы оно не потеряло своих свойств

Так что, есть какие то мысли по этому поводу??
 

Сделал ещё один пример с ForeCA, в архиве небольшая таблица для теста, и код для работы с ней.
В этот раз всё сделал правильней.
Таблицу с обучающими данными для модели можете брать и свою, главное она должна быть матрицей, без факторов (обучение с lm, можно только регрессию). Число строк должно быть значительно больше числа предикторов, иначе будут ошибки в ForeCA.
Целевые значения у меня 0 и 1, с другими точность будет определяться неправильно, если что подправьте код в RegressionToClasses01(regr) под свой случай в месте где результат регрессии округляется в классы.
trainData - данные для обучения
trainDataFT - данные для фронттеста

Результат:
lm на исходных данных: точность 75% на обучающих данных и 57% на новых.
lm на всех 14 компонентах из foreCA: 75% на обучающих данных и 61% на новых. Немного лучше, но в данном случае +4% это всего +1 правильный результат, таблица совсем небольшая :)

То есть, если предикторы и так уже заранее отобраны, то после ForeCA хуже быть не должно, может даже пару процентов точности прибавит.

Добавил ещё график, с зависимостью точности от числа ForeCA компонент. Судя по всему чем больше компонент, тем надёжней результат. Максимально допустимое число компонент = число предикторов.


Файлы:
 

Вторая часть эксперимента - 

У меня было 14 ранее отобранных предикторов, добавил к ним ещё 14 с рандомными значениями. Максимально допустимое число ForeCA компонент теперь 28.

Точность предсказания со всеми 28 компонентами на тренировочных данных в обоих случаях (с и без foreCA) 76%, точность на новых данных в обоих случаях 57%.

С мусором в предикторах foreCA по-моему не справился, ожидаемого чуда я не увидел.

 

 
mytarmailS:
Так что??
Это похоже на график ренко. Ренко как-то ведь рисуют в mt5 терминале на барах, тут нужен похожий алгоритм.
Причина обращения: