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

 
mytarmailS:


в чем проблема? помогите пожалуйста  


 

Так работает: 

 

test_vec <- numeric() # тут будем хранить показатели теста 


for(i in 151:ln){

print(i)

idx <- (i-150):i

#проводим линейную регрессию для определения правильного соотношения

x <- data[idx, ]

model <- lm(ri ~ si + 0, x)

#вычисляем разницу цен (спред)

spread <- x$ri - coef(model)[[1]] * x$si

#проводим тест Дики-Фуллера на стационарность

test <- adf.test(as.vector(spread), k = 0)

test_vec[i-150] <- test$p.value

}


plot(test_vec, type = 's')

 
Alexey Burnakov:

Во-первых, R^2 0.55 реально можно достичь, применив к "метафиче" некое небольшое функциональное преобразование. Другое дело, что функция получается сложноватая по своему виду.

И еще - попробуйте взять:

rowMeans(df[, 1:10]) 

... 

Добавил 10 новых колонок, для nnet это ничего не изменило, результаты и кривые обучения остались примерно те-же, модель выбирает прежние предикторы.

Зато дерево внезапно дало гораздо лучший результат. Лес тоже стал получше, но одно дерево само по себе лидирует (pseudo r^2=0.39), вот графики с rattle на новых данных.

Дерево выбрало только rowMeans[,1:50], запомнив его значения из тренировочных данных. Значит есть очень близкая, но нелинейная зависимость между rowMeans[,1:50], и целью. 

 

 

Хотя, если оставить только этих 10 новых предикторов,  то nnet обучится до r^2=0.22, тоже лучше.

 
Dr.Trader:

Добавил 10 новых колонок, для nnet это ничего не изменило, результаты и кривые обучения остались примерно те-же, модель выбирает прежние предикторы.

Зато дерево внезапно дало гораздо лучший результат. Лес тоже стал получше, но одно дерево само по себе лидирует (pseudo r^2=0.39), вот графики с rattle на новых данных.

Дерево выбрало только rowMeans[,1:50], запомнив его значения из тренировочных данных. Значит есть очень близкая, но нелинейная зависимость между rowMeans[,1:50], и целью. 

 

 

Хотя, если оставить только этих 10 новых предикторов,  то nnet обучится до r^2=0.22, тоже лучше.



Точно угадали. mean(1:50). Хорошие результаты. Я теперь попробую немного улучшить аппрлксимацию функции. Если не сложно, выложите scatter plot найденная  фича против смоделированного выхода. Для НС или для рандом форест. Я выложу свою потом. Там должна быть нелинейность.

 

Alexey Burnakov:

Там должна быть нелинейность

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

 

 
Dr.Trader:

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

 

 Спасибо-спасибо.

Да, согласен.

Мои графики:

минимизация rmse 

 

реальная зависимость:

 

модель:

 

реал и модель:

 

Оригинальная задумка чистая:

 

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


Максимально возможное качество моделирования:

 

 
Alexey Burnakov:

Так работает: 

Спасибо, я бы не разобрался..
 
Dr.Trader:

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

 

Надо повести итог задаче и написать, что мы поняли.

Все при условии, что в реальной жизни мы ничего не знаем о виде зависимости.

Я понял так:

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

2) если заранее нагенерить много фичей, то есть немалый шанс, что обычные методы сработают хорошо.

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

4) на множестве потенциальных сгенерированных фичах хорошо работают лес, НС.

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

 

Что добавите, Др? 

 

Я пробовал генерировать фичи когда вы задачу только выложили, алгоритм всю ночь перебирал разные математические комбинации, отбирал лучшие новые предикторы через оценку vtreat. Позитивного результата не вышло, модель даже не могла толком обучиться на новых предикторах. То есть тут либо случайно попадёшь и угадаешь нужные предикторы и математические операции с ними, либо нет. Можно потратить дни на генерацию и перебор вариантов, и всё равно толку не будет. Раз уж свёрточная сеть на оригинальных предикторах получила лучший результат чем обычная сеть вместе с rowmeans - то пожалуй лучше и остановиться на свёрточной сети.

 
Dr.Trader:

Я пробовал генерировать фичи когда вы задачу только выложили, алгоритм всю ночь перебирал разные математические комбинации, отбирал лучшие новые предикторы через оценку vtreat. Позитивного результата не вышло, модель даже не могла толком обучиться на новых предикторах. То есть тут либо случайно попадёшь и угадаешь нужные предикторы и математические операции с ними, либо нет. Можно потратить дни на генерацию и перебор вариантов, и всё равно толку не будет. Раз уж свёрточная сеть на оригинальных предикторах получила лучший результат чем обычная сеть вместе с rowmeans - то пожалуй лучше и остановиться на свёрточной сети.

Спасибо, Др!

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

У меня видите ли есть такое мнение, что для моделирования почти всего (почти!) достаточно взять предикторы вида:

current_price - price(lag1) 

current_price - price(lag2)

...

current_price - price(lag_n)

Это можно трактовать как скользящие суммы (которые легко приводятся к средним) и можно воспроизвести любую конфигурацию тренда: перегибы в разных места, скорость, ускорение.

 

Если говорить про сверточную сеть, то предлагаю попробовать на том коде, что я привел, порешать что-то практическое. И сделать акцент на анализ весов и ядер сети. Ядро покажет вид свертки. Веса могут показать важность и нелинейность.

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

 

Быстрый курс по CNN: http://cs231n.github.io/convolutional-networks/ 

 

Эти видео лекции раньше на ютубе тоже были, потом оттуда убрали, но осталось в archive.org - https://archive.org/details/cs231n-CNNs  

На английском, но очень информативно и полезно. В основном о распознавании избражений свёрточными сетями, но есть много полезного о нейронках вообще.

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