Блог им. afecn19

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

Я уже писал о попытке применить нейросети, и вердикт был неутешительным, с точки зрения практического трейдинга. Я усердно (более менее) прокачивал свои скилы в машинном обучении, учился программировать, в качестве данных используя котировочки, но особой перспективы не видел. Но я оказался не прав, и в конечном итоге, у меня в нейросеть на фондовом рынке получилось.   
Но давайте не сразу к прогнозированию и зарабатыванию денег, сначала рассмотрим другой вариант практического применения нейросетей. 
Нейросеть как черный ящик.
Допустим есть у вас рабочий алгоритм, который показал свою эффективность на протяжении 10 лет реальной торговли. Вопрос как его продать, не раскрывая секреты трейдерской кухни? А почему бы не использовать неинтерпретируемость нейросетей, превратив ее слабости в ее силу? Эта мысль приходила мне раньше, но реализация подкачала, до ума эту мысль я довел недавно, благо потребность возникла. Схема очень простая, у нас есть сырой ряд, из которого нужно посчитать нужные признаки (признаки это и есть мои трейдерские секретики), эти признаки настолько хороши, что подав их в простенькую модель машинного обучения мы получим хороший результат. Но как скрыть алгоритм расчета признаков? А все просто, мы на вход в нейросеть подаем котировочки, а на выход в качестве таргета — наши секретные признаки, таким образом поставив перед нейросетью задачу калькулятора. Подчеркну, тут мы ничего не прогнозируем, признаки находится внутри временного ряда. Это первый этап. На втором этапе мы занимаемся уже прогнозированием, используя полученные признаки. 
Кажется все просто, так как не вызывает сомнения способность нейросети (с возможностью накручивать в ней очень сложные архитектуры) справиться с задачей калькулятора. Но оказалось нет — при том что напрямую признаки считаются простыми арифметическими действиями, для нейросети задача оказалась нетривиальной. Пришлось перебирать разные архитектуры, пока наконец то не сработала схема:  представление котировок изменил с помощью GramianAngularField, и полученные картинки подал в CNN. При этом попадания были далеко не 100%: нейросеть находили 70% признаков (полнота), а точность составляла где то 90%.       
Нейросеть для прогонозирования 
Так получилось что занялся трансформерами. Интересная архитектура, очень сейчас модная. Появившись для решения задач машинного обучения, затем как часто это бывает, такую нейросеть стали применять для решения других задач, на других данных, в частности на временных рядов. Данная архитектура позволяет признакам выражать себя через самих себя и через другие признаки. Звучит странно. Но представьте, загнали мы в модель какие то признаки и пытаемся с их помощь аппроксимировать целевой признак — тут модель ограниченна строгим набором признаков которые вы ей подали. А теперь представим что в процессе обучения, нейросеть может каждый признак представить через себя и через другие признаки с какими то весами, и эти веса настраиваются в процессе обучения. Мы даем нейросети возможность игнорировать признаки (например если признак А мы представим как А*0 + Б*0,4 + В*0,6 то признак А исчезнет, потому что теперь это нечто состоящее из признаков Б и В). Кроме того, таким образом мы устраняем шум в признаке, выражая его через другие признаки, и наоборот, выражая признак через самого себя с весом 0,99, мы как бы подтверждаем что для задачи аппроксимации признак А нужно брать таким как он подается.
Ну и немножко истории, как из задачи машинного перевода мы докатились до трансформеров. При машинном переводе у нас слева стоит предложение на 1 языке, справа на другом, и нужно найти алгоритм который успешно справится с переводом, при этом на входе и выходе число слов в предложении может не совпадать. То есть это модель SeqtoSeq. Логично решать ее с помощью рекуррентных сетей, которые считывают данные как человек читает предложение — последовательно, с каждым новым словом учитывая контекст предложения все лучше и лучше. А предложение сами понимаете, имеет  контекст, где каждое отдельно взятое слово можно выразить через самого себя, но и через другие слова в данном предложении. И вот пробежавшись по всему предложению от первого слова до последнего, наша рекуррентная сеть — кодер, получает какое то скрытое представление h которое подается декодеру который из этого скрытого состояния опять же, слово за словом разматывает его в предложение, но уже на другом языке. Затем додумались, что нужно использовать не только скрытое состояние после прочтения кодером всего предложения, но и скрытые состояния после прочтения каждого нового слова: скрытое состояние после прочтения первого слова, скрытое состояние после прочтения первого слова + второго итп итд, и назвали этот механизм attention. Предоставили нейросети самой определять какой скрытое состояние ей важней для перевода. В конце концов вышла статья что мол «All you need is love», ну то есть «Attention is all you need» в котором вообще отказались от рекуррентных нейросетей, перейдя к полносвязным слоям (кто то иронично называет это реваншем полносвязных слоев), назвав все это transformer. Но идея что в рекурентных сетях с attention что в трансформерах одна — мы даем нейросети в ее жажде что то там аппроксимировать, возможность залезть в наши признаки по локоть и самой выбирать их представление.
А сейчас я попробую провести параллели с фондовым рынком и машинным переводом, чтобы понять почему у трансформеров может получиться в предсказание цен на биржах.   
1. В архитектуре трансформеров есть такое слой как 'position encoding'. Мы как торгующие на бирже отлично понимает что если у нас есть ряд из Close то нельзя его перемешивать, потому что потеряется всяческий смысл. Цена пересекающая среднюю 10 баров назад и на последнем баре это разные вещи, но для сверточной сети это может быть одним и тем же.
2. Трансформеры в процессе обучения могут позволить себе забыть ненужные признаки, сделать более важными нужные, убрать шум из них. Но разве данные на рынке не высокошумовые? Нужных признаков на рынке на самом деле очень мало, и даже они сильно зашумлены, и подав кучу признаков неплохо иметь возможность убрать ненужные, так получается трансформеры идеально вписываются в эту концепцию.
3. Вся это идея с attention появилась из машинного перевода, где на вход подают логический массив — предложение. В чем его внутренняя логичность? Да в том что нельзя в предложении произвольно поменять слово, потому что оно связанно с другими словами, а если мы выкинем слово, то ты можем восстановить его по предложению (кстати на этом строится предобученые модели Bert). Ну так на рынке тоже существуют такие логические массивы — например день, неделя итп итд. Происходящее внутри дня имеет свою структуру, наступает следующий день и все повторяется вновь. Например, из-за дня в день объёмы торгов в первый час и последний максимальные. Поэтому мне кажется весьма логичным подавать данные имеющие внутреннюю структуру, и возможно, те у кого не получается использовать трансформеры на фондовых рынках упускают этот момент.
На этом закончу, в следующей части выложу результаты использования трансформеров для прогнозирования акция на мосбирже и почему это не подгонка, а нечто более интересное


★6
30 комментариев
ждем эквити и таблицу со статистикой 
какой актив торгует НС
avatar
ves2010, идеи важнее таблиц.
avatar
SergeyJu, имхо нейросеть это 100% переоптимизация… т.к слишком много параметров
avatar
ves2010, в большинство архитектур встроена регуляризация, поэтому эффективных параметров гораздо меньше, чем числится номинально. 
avatar
Михаил, какая разница… больше — меньше… один параметр это степень свободы… каждая степень свободы требует увеличения куска тестовых данных вдвое… т.е если на одном параметре чтоб оценить систему надо хотяб 3000 сделок… на 2ух 6000… на 3ех 12000… на 4ех 24000

сразу надо посмотреть сколько сделок сделала его нейросеть… что было ясно есть статистика или неет… может у него 50 сделок за 10 лет… что крайне мало и 100% переоптимизация...

кроме того есть методы оценки стабильности алгоритма… а вот с нейросетью тебе не оценить стабильность никак
avatar
ves2010, откуда Вы взяли 3 000 сделок. И почему Вы думаете, что в других приложениях нейронных сетей все устроено также как на фондовом рынке? 
avatar
SergeyJu,  если система рабочая… то на выходе ее будут сделки представляющие собой стационарный случайный процесс… для оценки которого с точностью 1% надо 10000 сделок… т.е корень квадратный из числа отсчетов… 3000 отсчетов 2% точность… 100 сделок всего 10% точность  
avatar
ves2010, не будет там стационарного ряда. И оценивать с точностью 1% (что именно оценивать у ряда, кстати?) вовсе нет нужды. 
avatar
SergeyJu, очень аргументрованно… продолжай…
avatar
ves2010, вот 3 000 сделок с потолка пульнуть — это точно аргументация? Да еще про 1% непонятно чего  в аргумент записать. 
С такими аргументрованно невозможно спорить, только улыбнуться, да руками развести. 
avatar
ves2010, почему зависимость именно квадратичная от параметров? В большинстве статистических тестов увеличение количество параметров уменьшает эффективный размер выборки на один. Казалось бы зависимость должна быть вида — для одного параметра 3000, для двух 3001, для трех 3002…
avatar
Михаил, если объяснять то получиться долго… вкратце каждый параметр это дополнительная ось координат 1 параметр линия… 2 плоскость… 3 объем... 
avatar
ves2010, можно рассмотреть пример множественной линейной регрессии - при вычислении R-adjusted увеличение параметров влияет линейно на эффективный размер выборки, а вовсе не квадратично, как вы утверждаете. Поэтому хотелось бы какие-то подробности, как и в каких случаях возникает квадратичная зависимость. 
avatar
Михаил, на старом компе у мя была хорошая статья на эту тему и ведь не найти никак (
avatar
Михаил, 1 -х, 2 — 2х, 3 -3х. А вот цена единички, конечно не 3 000. В зависимости от таймфрейма может быть и 100 и 10 000. И уж тем более, надо не в сделках считать, а в исходных отсчетах (но и это не вполне верно). 
avatar
SergeyJu, а вы можете пояснить, почему зависимость пропорционально количеству параметров?
avatar
Михаил, только на пальцах и очень приблизительно. 
В наших данных много шума. Что есть сигнал мы не знаем, но предположим, что он есть. Если предположить, что наши параметры дают проекции шума на одномерные пространства и доля мощности шума в этих проекциях одинакова, то отношение сигнал/помеха в них будет определяться долей сигнала, который достается проекции. 
С сигналом, имхо, все не так, как с шумом. Первый признак выедает существенную его долю, на второй и последующий достается все меньше и меньше. Чтобы получить то же соотношение сигнал, помеха, нужно больше данных. И тут вопрос, как мы вычерпываем сигнальную компоненту и от ответа на него получим, какой рост выборки в зависимости от роста числа параметров. 
Эмпирически получается зависимость от линейной до степенной. 
avatar
SergeyJu, ваше объяснение про проекции хорошо ложится на линейные модели. Но почему-то в линейных моделях (в том же R2-adjusted) корректировка не зависит от уровня шума (не усиливается, когда R маленькая) и имеет форму вычитания из размера выборки количества свободных параметров, а не деления изначальной выборки на количество свободных параметров.

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

Но во многих случаях добавление параметров оправдано, так как «проекции» содержат не сильно меньше сигнала, чем в предыдущих «проекциях». Когда лучше остановиться можно тестами проверить.
avatar
Михаил, если второй параметр почти ортогонален первому, но дает столько же сигнальной компоненты, что и первый, вообще не нужно наращивать и без того большую выборку. Но в моей практике так не бывает, к сожалению. 
avatar
SergeyJu, кстати тут вспомнил, про один известный пример для линейной модели — классификация точек внутри круга на плоскости, когда с малым числом «проекций» получается результат близкий к случайному, но если добавить еще несколько можно получить идеальный классификатор. Как обстоит дело в нашей области, не простой вопрос. 
avatar
ves2010, мир иногда сложнее, чем кажется. 
avatar
SergeyJu, цифры есть? нет… значит пустой разговор… давай поменьше пафоса — побльше цифр… чтоб было хоть о чем поговорить конкретно без философий
avatar
ves2010, начните с себя. 
avatar
Супер!
avatar

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

 

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


А признаки да, трейдерские признаки решают, быстро к этому пришел).

avatar
Наблюдаю с какими усилиями программисты пишут проги которые уже написаны.Проги ВА давно существуют.Они размечают каждое движение цены на графике.Но и у них много недостатков .1- они не учитывают интерес те объем .2- они не учитывают теорию циклов (фракталов ) те свечной анализ .3- они не учитывают фильтр объема те цену закрытия тайма. И тд.
Своим глазом я вижу и понимаю каждое движение цены.Вижу когда лучше не лезть в рынок и уменьшить участие.Мне нравятся подробности в 1 мин графике.Из него растут все движения больших таймов.
Отдельно скажу про изчезнувшие и убегающие коррекции.Вряд ли когда то нейро или другие сети научатся понимать такое.
Успех в торговле зависит от самоограничения .1- полюби убыток.2-разлюби прибыль.
avatar
Достаточно интересная задача! Если будет работать -то вообще круто!
avatar
Да фиг с ней с нейросетью. Абзацы то где? Глаза ломаются и мозг отказывается воспринимать написанное.


теги блога Марат

....все тэги



UPDONW
Новый дизайн