Я уже писал о попытке применить нейросети, и вердикт был неутешительным, с точки зрения практического трейдинга. Я усердно (более менее) прокачивал свои скилы в машинном обучении, учился программировать, в качестве данных используя котировочки, но особой перспективы не видел. Но я оказался не прав, и в конечном итоге, у меня в нейросеть на фондовом рынке получилось.
Но давайте не сразу к прогнозированию и зарабатыванию денег, сначала рассмотрим другой вариант практического применения нейросетей.
Нейросеть как черный ящик.
Допустим есть у вас рабочий алгоритм, который показал свою эффективность на протяжении 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). Ну так на рынке тоже существуют такие логические массивы — например день, неделя итп итд. Происходящее внутри дня имеет свою структуру, наступает следующий день и все повторяется вновь. Например, из-за дня в день объёмы торгов в первый час и последний максимальные. Поэтому мне кажется весьма логичным подавать данные имеющие внутреннюю структуру, и возможно, те у кого не получается использовать трансформеры на фондовых рынках упускают этот момент.
На этом закончу, в следующей части выложу результаты использования трансформеров для прогнозирования акция на мосбирже и почему это не подгонка, а нечто более интересное
какой актив торгует НС
сразу надо посмотреть сколько сделок сделала его нейросеть… что было ясно есть статистика или неет… может у него 50 сделок за 10 лет… что крайне мало и 100% переоптимизация...
кроме того есть методы оценки стабильности алгоритма… а вот с нейросетью тебе не оценить стабильность никак
С такими аргументрованно невозможно спорить, только улыбнуться, да руками развести.
В наших данных много шума. Что есть сигнал мы не знаем, но предположим, что он есть. Если предположить, что наши параметры дают проекции шума на одномерные пространства и доля мощности шума в этих проекциях одинакова, то отношение сигнал/помеха в них будет определяться долей сигнала, который достается проекции.
С сигналом, имхо, все не так, как с шумом. Первый признак выедает существенную его долю, на второй и последующий достается все меньше и меньше. Чтобы получить то же соотношение сигнал, помеха, нужно больше данных. И тут вопрос, как мы вычерпываем сигнальную компоненту и от ответа на него получим, какой рост выборки в зависимости от роста числа параметров.
Эмпирически получается зависимость от линейной до степенной.
Поэтому на мой взгляд, нет никакой проблемы в большом количестве параметров, скорее ваши аргументы объясняют, что добавление дополнительных параметров во многих случаях не ведет к повышению качества.
Но во многих случаях добавление параметров оправдано, так как «проекции» содержат не сильно меньше сигнала, чем в предыдущих «проекциях». Когда лучше остановиться можно тестами проверить.
Ха, признаки через нейросеть кодировать — это интересно. Нейросети, конечно, огромнейший диапазон возможностей предлагают, иногда тебя может затянуть в топь теоретических изысканий. Идея, действительно, любопытная — возникла задумка, как это можно и для непосредственно принятия торговых решений применить.
Трансформеры, говоришь… Не, пока бустингом не наемся, не вернусь к нейросетям. Да, потенциал и возможности нейросетей богаче, но малыми усилиями получать эффект все-таки мне проще от обычного бустинга. Пока так.
А признаки да, трейдерские признаки решают, быстро к этому пришел).
Своим глазом я вижу и понимаю каждое движение цены.Вижу когда лучше не лезть в рынок и уменьшить участие.Мне нравятся подробности в 1 мин графике.Из него растут все движения больших таймов.
Отдельно скажу про изчезнувшие и убегающие коррекции.Вряд ли когда то нейро или другие сети научатся понимать такое.
Успех в торговле зависит от самоограничения .1- полюби убыток.2-разлюби прибыль.