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

 
Alexey Burnakov:

Подождите. Я тоже прогоню ваши данные на предмет зависимостей.

 

Один вопрос пока я не начал. Ваши данные включают в себя все бары подряд, или было прореживание баров перед составлением выборок? 

R1, R2, R3 подряд и внутри них также подряд - это временной ряд на Н1.
 
СанСаныч Фоменко:
R1, R2, R3 подряд и внутри них также подряд - это временной ряд на Н1.

Понятно. Ну с вашими данными я примерно понял как работать.

Хочу понять также Dr.Trader. 

 

У меня тоже H1, выборка включает данные из 4 последних баров. open[1]-high[1]-close[1]-...-open[2]-high[2]-close[2]-... итд, Там данные из структур MqlRates и MqlDateTime, плюс есть ещё пара индикаторов и цены закрытия из старших таймфреймов, всё нормализовано в интервал [0..1]. Результат 1 или 0 - это рост или падение цены на следующем баре. Но всего этого явно недостаточно.

Есть проблема, что нужное количество баров неизвествно. Нейронке хватает вообще всего 3 баров чтоб переобучиться до ошибки в 0% (и соответсвенно 50% будет во фронттесте). Или, если обучать её с контролем и вовремя остановится, то ошибка во фронттесте будет уже на пару процентов меньше. Но, можно взять вообще сотни баров, и добиться примерно тогоже результата, хотя каждый новый бар в выборке это огромное количество мусора и соответсвенно понижение качества модели.

 
Dr.Trader:
У меня тоже H1, выборка включает данные из 4 последних баров. open1-high1-close1-...-open2-high2-close2-... итд. Там данные из структур MqlRates и MqlDateTime. Результат 1 или 0 - это рост или падение цена на следующем баре.
Супер. А есть там что-то вроде open1 - open2 ? Возвраты
 

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

 
Dr.Trader:

У меня тоже H1, выборка включает данные из 4 последних баров. open[1]-high[1]-close[1]-...-open[2]-high[2]-close[2]-... итд, Там данные из структур MqlRates и MqlDateTime, плюс есть ещё пара индикаторов и цены закрытия из старших таймфреймов, всё нормализовано в интервал [0..1]. Результат 1 или 0 - это рост или падение цены на следующем баре. Но всего этого явно недостаточно.

Есть проблема, что нужное количество баров неизвествно. Нейронке хватает вообще всего 3 баров чтоб переобучиться до ошибки в 0% (и соответсвенно 50% будет во фронттесте). Или, если обучать её с контролем и вовремя остановится, то ошибка во фронттесте будет уже на пару процентов меньше. Но, можно взять вообще сотни баров, и добиться примерно тогоже результата, хотя каждый новый бар в выборке это огромное количество мусора и соответсвенно понижение качества модели.

Ну, надо делать feature engineering. Это не обязательно использование стандартных индикаторов. Фантазия и понимание процесса нужно. Просто дать черному ящику данные о барах может действительно быть недостаточно. И глубина с которой забирается информация важна. Я, например, видел в своих исследованиях, что нужно подавать симметричную глубину на входе относительно глубины на выходе. Прогнозируем на 3 часа вперед - даем данные за 3 часа назад и позже.

 

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

 http://blog.kaggle.com/2016/02/12/winton-stock-market-challenge-winners-interview-3rd-place-mendrika-ramarlina/comment-page-1/ 

Winton Stock Market Challenge, Winner's Interview: 3rd place, Mendrika Ramarlina
Winton Stock Market Challenge, Winner's Interview: 3rd place, Mendrika Ramarlina
  • 2016.12.02
  • blog.kaggle.com
The Stock Market Challenge, Winton's second recruiting competition on Kaggle, asked participants to predict intra and end of day stock returns. The competition was crafted by research scientist at Winton to mimic the type of problem that they work on everyday. Mendrika Ramarlina finished third in the competition with a combination of simple...
 
Dr.Trader:

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

Это обязательно.

Знаете, что хорошо отрабатывает? Разница последней известной цены со скользящей средней. Окно средней нужно пробовать разное. 

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

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

С логическим смыслом как-то сложнее :)

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

Мысли вслух, раньше не думал об этом: кажется, у меня была неправильная модель, нужно было обучать 3 класса, для купить/продать/закрыть_все_сделки_и_не_торговать. Причём делать или 3 выхода из одной сети, или тренировать 3 отдельные сети. А не одну сеть с одним выходом.

Потом, экспериментируя, я понял что могу взять всего 5 баров а не 200, и ровным счётом ничего не изменится, результат останется тем же. Не думаю что модель учится находить фигуры при такой конфигурации, скорее находит какие-то закономерности во времени. Постепенно решил обучать модель не на зигзаге, а просто на цене закрытия следующего бара. В таком случае уже не нужно фильтровать результат нейронки, меньше проблем при том-же результате, как-то неплохо. Тут логический смысл уже проще -  целевая переменная 0/1 - цена упадёт/вырастет за 1 бар. 

Последние дни изучаю лес, и примеры с этого форума. Если взять тех-же 5 баров, то лес обучится не каким-то абстрактным вещам как нейронка, а выведет вполне конкретные правила. Например лес мог бы вывести правило "пересечение двух MA", или типа того. Мне кажется с таким набором данных лес это гораздо перспективней, буду учиться его использовать. Смысл целевой переменной тот же - 0/1 - цена упадёт/вырастет за 1 бар.

О влиянии предикторов знаю не так много как хотелось бы. Время точно должно быть использовано, час/минута/день недели, наверное что-то одно из этого (час?). Нельзя использовать предикторы с небольшим набором значений, идущих подряд без закольцованности. Например если обучающая выборка содержит данные за год, то нельзя использовать предиктор "месяц". Модель может просто разбить все данные на 12 кусков согласно месяцам, и для каждого куска обучить какую-то свою логику. А логика января 2015 уж точно никак не подойдёт через год для логики января 2016. Но если обучающие данные на 5 лет, то "месяц" уже может подойти. Ещё я не уверен что использование индикаторов оправдано, советники на стандартных индикаторах сливают, будет странно если обученная модель извлечёт из этих данных что-то полезное. Тем более я так понимают что лес сам тоже делает какие-то вычисления, и может в процесса обучения создать свои внутренние индикаторы. Цену тоже нужно использовать, хотя я не очень доверяю ценам открытия и закрытия, мне больше нравится high и low.

Все эти предикторы показывают некое текущее состояние рынка, и смысл модели это определять по предикторам эти самые состояния, и куда в таких случаях идёт цена. Модель должна использовать как можно меньше входных данных, по принципу лезвия Оккама, тогда есть шанс что она описала именно некую зависимость, а не подогналась под примеры. 

 
Dr.Trader:

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

С логическим смыслом как-то сложнее :)

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

Мысли вслух, раньше не думал об этом: кажется, у меня была неправильная модель, нужно было обучать 3 класса, для купить/продать/закрыть_все_сделки_и_не_торговать. Причём делать или 3 выхода из одной сети, или тренировать 3 отдельные сети. А не одну сеть с одним выходом.

Потом, экспериментируя, я понял что могу взять всего 5 баров а не 200, и ровным счётом ничего не изменится, результат останется тем же. Не думаю что модель учится находить фигуры при такой конфигурации, скорее находит какие-то закономерности во времени. Постепенно решил обучать модель не на зигзаге, а просто на цене закрытия следующего бара. В таком случае уже не нужно фильтровать результат нейронки, меньше проблем при том-же результате, как-то неплохо. Тут логический смысл уже проще -  целевая переменная 0/1 - цена упадёт/вырастет за 1 бар. 

Последние дни изучаю лес, и примеры с этого форума. Если взять тех-же 5 баров, то лес обучится не каким-то абстрактным вещам как нейронка, а выведет вполне конкретные правила. Например лес мог бы вывести правило "пересечение двух MA", или типа того. Мне кажется с таким набором данных лес это гораздо перспективней, буду учиться его использовать. Смысл целевой переменной тот же - 0/1 - цена упадёт/вырастет за 1 бар.

О влиянии предикторов знаю не так много как хотелось бы. Время точно должно быть использовано, час/минута/день недели, наверное что-то одно из этого (час?). Нельзя использовать предикторы с небольшим набором значений, идущих подряд без закольцованности. Например если обучающая выборка содержит данные за год, то нельзя использовать предиктор "месяц". Модель может просто разбить все данные на 12 кусков согласно месяцам, и для каждого куска обучить какую-то свою логику. А логика января 2015 уж точно никак не подойдёт через год для логики января 2016. Но если обучающие данные на 5 лет, то "месяц" уже может подойти. Ещё я не уверен что использование индикаторов оправдано, советники на стандартных индикаторах сливают, будет странно если обученная модель извлечёт из этих данных что-то полезное. Тем более я так понимают что лес сам тоже делает какие-то вычисления, и может в процесса обучения создать свои внутренние индикаторы. Цену тоже нужно использовать, хотя я не очень доверяю ценам открытия и закрытия, мне больше нравится high и low.

Все эти предикторы показывают некое текущее состояние рынка, и смысл модели это определять по предикторам эти самые состояния, и куда в таких случаях идёт цена. Модель должна использовать как можно меньше входных данных, по принципу лезвия Оккама, тогда есть шанс что она описала именно некую зависимость, а не подогналась под примеры. 

Во многом наши мысли перекликаются.

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

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