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

 

Размерность массива X

> dim(X1)
[1] 7000    8
X <- array( c(X1,X2), dim=c(7000, 8, 2) )

В Вашем случае это будет

X <- array( c(X1,...X100), dim=c(7000, 8, 100) )
#или, что равнозначно
X <- array( c(X1,...X100), dim=c(dim(X1), 100) )

Естественно если количество примеров равно 7000 а длина преобразования = 8.

 

Этот пакет "rnn" скорее упражнение в программировании, чем продукт для использования. Смотрите лучше пакет "RSNNS".

Там есть несколько рекурентных сетей. Ну а если более глубоко, то "PyBrain", "keras"   в Pythonе

Удачи

 
спасибо! буду разбираться 
 

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

Мои действия примерно такие: Есть разные индикаторы для eurusd за год. Делю данные рандомно по строкам в отношении 70%/15%/15% для тренировки/валидации/валидации.

Далее, эти данные содержат 9000 предикторов. Генетикой перебираю их варианты, обучаю PCA модель на основе каждого поднабора предикторов. Обучаю модель на тренировочной выборке, определяю ошибку. Проверяю эту же модель на обоих валидационных выборках, определяю ошибку на них.

Итоговый результат фитнесс функции определяю так:
max(error_train,error_validate1,error_validate2) - min(error_train,error_validate1,error_validate2)
суть в том что разница между минимальной и максимальной ошибкой должна быть как можно меньше (так называемый "Критерий Фоменко" :) ). 

Всё вроде хорошо, модель достигает ошибки около 25% на всех трёх выборках. Но, на фронттесте ошибка внезапно вырастает до 40%. Я немного задумался, сменил random.seed для генерации выборок строк (не предикторов, а именно строк), и для определённого ранее набора предикторов (лучшего) получил ошибки тренировка/валидация/валидация уже 25%/35%/35% вместо  25%/25%/25%, и опять теже 40% для фронттеста. Ошибка на валидационных выборках выросла на +10%, очень плохо.

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

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

 
Dr.Trader:

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

(так называемый "Критерий Фоменко" :) ). 

Очень понравился критерий. Спасибо.

Но он не полностью Вами изложен. 

Мой критерий ОБЯЗАТЕЛЬНО  включает фронттест. Если Вы посмотрите все мои посты, то я всегда писал именно о фронттесте, под которым по моим представлениям должен проводится на куске наблюдений, которые по времени (по индексу) отделены от первых трех наборов. 

С этим я столкнулся еще в rattle, который делит предоставленный набор так как это сделали Вы. Получаешь хорошие данные, у меня менее 10% на всех трех выборках, а потом берешь новый файл и Ваши 40% ошибки еще хороший результат! У меня бывало похуже.

Поэтому мой критерий переобученности:

1. исходный набор делим на две части, БЕЗ всяких случайных фокусов, чисто механически, по возрастанию индекса 

2. Первую часть любым из случайных методов делим на три части: обучения тестирования и валидации.

3. Если на этих трех частях ошибка примерно равна, то переходим к п.4

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

 

Если по всем 4 пунктам получили примерно одинаковую ошибку, то модель не переобучена.

Если имеются существенные расхождения, то модель переобучена.Причина - это наличие шумовых предикторов в исходном наборе. В R я не нашел инструментов, которые бы позволили избавиться от шума. Имею свой доморощенный, вот еще статья про РСА.   

 
mytarmailS:

Anton Zverev 

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

Я с вами  солидарен что просто подавать ВР толку мало, нужно максимально сжимать информацию и откидывать лишнее то что мешает принятию правильного решения, в идеале до 0 или 1 те бай/сел , то есть  если у нас есть 10 индикаторов(в которые я не верю) и мы отсеяли из них 9, оставили только к примеру RSI те сжали информацию,  то этого все равно будет мало потому что у инд еще есть диапазон значений и окажется что он абсолютно не работает на значениях от -70 до 70 ,  так что и тут нужно сжимать и так далее и далее..   вопрос как это делать?

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

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

Потом я реализовал типа индикатор, взял кумулятивную  сумму всех прогнозов на бай и также сумму на сел, построил их разницу и получил некий индекс, когда я его сравнил с ценой то оказалось что ходит он практически противоположно с ценами, корреляция была -0.7 до -0.9 , те если по простому то рынок ходит против своей же статистики, тут есть над чем подумать и переосмыслить

to Dr.Trader 

Возможно это вам поможет немного разобраться.....

Я нашел более быстрый и простой способ увидеть этот аффект, если интересно могу  поподробней об этом написать

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

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

Понял ошибку, спасибо. Получается что у вас не 2, а целых 3 валидационные выборки - одна из них берётся строго из последних записей исходного файла, без рандома. Остальные выборки - рандом. Буду пробовать.

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

 

mytarmailS:

Потом я реализовал типа индикатор, взял кумулятивную  сумму всех прогнозов на бай и также сумму на сел, построил их разницу и получил некий индекс, когда я его сравнил с ценой то оказалось что ходит он практически противоположно с ценами, корреляция была -0.7 до -0.9 , те если по простому то рынок ходит против своей же статистики, тут есть над чем подумать и переосмыслить

У вас этот метод работает всегда, на любом временном отрезке? Получается странно конечно, но главное что это работает. У меня были похожие наблюдения на своей недообученной модели. Иногда она давала прогнозируемые результаты строго противоположные реальным. Но иногда - всё-таки работала правильно. На очень долгом тесте, обучая модель и проверяя её на разных временных отрезках я понял что в среднем она даёт правильный ответ в 50% случаев, то есть толку нету, можно подбрасывать монетку для прогноза и получить тот-же результат. После этого для себя я принял правильно что модель должна давать правильный результат без всяких инвертирований, фильтраций, коллективных решений множества других моделей. Иначе можно загнать себя в ловушку, где правит хаос и рандом.

 
Dr.Trader:

У вас этот метод работает всегда, на любом временном отрезке? Получается странно конечно, но главное что это работает. У меня были похожие наблюдения на своей недообученной модели. Иногда она давала прогнозируемые результаты строго противоположные реальным. Но иногда - всё-таки работала правильно. На очень долгом тесте, обучая модель и проверяя её на разных временных отрезках я понял что в среднем она даёт правильный ответ в 50% случаев, то есть толку нету, можно подбрасывать монетку для прогноза и получить тот-же результат. После этого для себя я принял правильно что модель должна давать правильный результат без всяких инвертирований, фильтраций, коллективных решений множества других моделей. Иначе можно загнать себя в ловушку, где правит хаос и рандом.

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

1) это самая типичная ситуация  - если сеть обратно коррелирует то это значит что она таки обучилась иначе обратной корел. бы не было верно?

2) просто рандом - значит сеть ничему не научилась

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

4) И самый  главный вывод (это важно для вас D.Trader) если вы построите прогнозы своей нейросети и она будет ходить в противоход как в выводе №1 то никакая оптимизация, генетика, кросвалидацыя и прочие прелести вам абсолютно НИЧЕМ не помогут подумайте об этом, это же логично и очевидно

 
mytarmailS:

1) это самая типичная ситуация  - если сеть обратно коррелирует то это значит что она таки обучилась иначе обратной корел. бы не было верно?

4) И самый  главный вывод (это важно для вас D.Trader) если вы построите прогнозы своей нейросети и она будет ходить в противоход как в выводе №1 то никакая оптимизация, генетика, кросвалидацыя и прочие прелести вам абсолютно НИЧЕМ не помогут подумайте об этом, это же логично и очевидно

1) стабильная обратная корреляция на разных интервалах обучения это немного странно, но сеть чему-то обучилась, я согласен что результат хороший.

4) а вот с этим не согласен. Если используется бинарная классификация (целевая переменная "0" или "1"), то фитнесс функцию генетики или оптимизатора легко изменить для достижение "обратного" результата, нужно просто отнять текущий результат от 1.
Например генетика подбирает определённый набор предикторов. Я на них обучаю нейронку, делаю кроссвалидацию, нахожу среднюю ошибку. Ошибка получается допустим 0.4. "обратный" результат фитнесс функции можно определить как 1-0.4 = 0.6. Генетика будет пытаться перебором предикторов уменьшить ошибку, с 0.6 до ноля. Получится в итоге набор предикторов со значением фитнесс функции 0. Но это значит что реальная ошибка нейронки при этом была 0+1 = 1. То есть, полученная нейронка ошибается в 100% случаев, и это и есть обратная корреляция.
В общем можно тем-же генетическим алгоритмом и кроссвалидацией обучить нейронку которая будет давать результат противоположный требуемому, получится как у вас, но специально. Но непонятно зачем это делать? :)

Ещё добавлю что при бинарной классификации с целевыми переменными "0" и "1" самая худшая ошибка равна 0.5.
Ошибка == 0 это хорошо.
Ошибка == 1 это и есть ваша нейронка с обратной корреляцией, можно просто перевернуть результат и будет ок. Но лучше разобраться почему так произошло, это очень нетипичная ситуация.
Ошибка 0.5 значит что результат полностью случаен и модель вообще бесполезна.

 

1

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