Марат
Марат личный блог
14 января 2022, 09:48

Практическое использование нейросетей на рынке 2. На примере трансформеров.

  Таки собрался дописать вторую часть своих результатов применения трансформеров для предсказания на российском фондовом рынке. Может и хорошо что не спешил, так как пафос первой части о трансформерах дающих какие то уникальные результаты по сравнению с другими архитектурами нейросетей, оказался несколько преувеличенным, по крайней мере LSTM дал вполне сравнимый результат с трансформерами. Потом я попробовал градиентный бустинг, дерево решений и вновь получил схожий результат. Так что подавайте в нейросеть правильные признаки и многие модели покажут положительный результат. Тем не менее, раз я начал с трансформерах, и так как их архитектура хорошо отражает рынкок, о них и продолжу. 
  Для любителей вопросов о «таймфреймах, на чем обучал, какие акции, что в качестве таргета, какие параметры, время удержании позиции» итп итд. Акции МосБиржы, из числа наиболее ликвидных. Данные у меня с 2011 до 2021 (и это увы необходимость, так как именно с 2011 года время работы биржи стало 9 часов). Прогнозы строил следующим образом — выкидывал один год (это out-sample), а из оставшихся делал разбивку на train и test. Таким образом получил 10 одногодичных прогнозов. Для меня важно получить доходность на сделку пусть поменьше, но чтобы прибыльность подтверждалась на как можно большем диапазоне, и на всех акциях. Такое чтобы для каждой акции своя модель — для меня неприемлемо. И само собой никаких убыточных годов, как минимум. Знаю многие меняют системы каждые 3 года и для них это нормально, я предпочитаю вылавливать аномалии которые работают десятилетиями. Тут я никого не учу, рынок сам рассудит.    
  Таймфремы, это уже не важные детали, так как нейросеть может обучиться хорошо на разных внутридневных таймфремах. Прогноз на какой период вперед — это тоже не важные детали, они могут быть разными, но на ночь сделку я переводил, уж так получается что значительная часть динамики на российском рынке заключена в утреннем гэпе. Задачу решал классификации, можно было и регрессии (но конечно не угадывание цены, а return), суть не поменяется. Хотя с точки зрения моего видения рынка, решать задачу нужно именно классификации, но практика показывает что это все не суть. До перебора параметров модели я не дошел, просто не доходят руки так как если прикинуть возможные варианты, то получится нечто слишком долгое. Например данные можно подавать в разных таймрфемах. Признаки: я ограничивал себя работой с 4 признаками, можно подать их по одному, можно подать все 4, можно подать разными парами и тройками. Просто подать все в надежде что нейросеть сама разберется — так не получается. Если мы работаем с более чем одним признаком, то мы получаем матрицу длина_последовательности*число признаков, но мы можем брать эту матрицу транспонированной (получая другие прогнозы, я проверял). В чем смысл такого транспонирования?! Если мы берем матрицу длина_признаков*число признаков, то мы выражаем в трансформерах одни признаки через другие, в случаи обратной матрицы мы выражаем признак на одном временном интервале через тот же признак, на другом временном интервале. Это разные истории и то и другое вполне логично и только практика может подтвердить что удачней. Параметрах модели, это прежде всего размерность Key, Query, Value, число HeadAttantion и EncoderLayer. Это все что касается только части механизма attantion, а ведь дальше идут полносвязные слои у которых свои параметры. А еще можно придумать разные стратегии обучения, брать разное число эпох, разные параметры остановки обучения. Можно использовать разные разбивки датасета на train, test, out_sample. Например чтобы обучиться предсказывать в 2018 году можно использовать все данные за исключением 2018 года, а можно только предыдущие к нему годы. Эти предыдущие годы можно брать все, а можно только последние, как наиболее актуальные. Я пробовал так и так, и в результаты везде положительные.  И это далеко не все, но даже если перемножить описанные варианты, уже получатся тысячи вариантов. Для экономии времени я не стал менять параметры модели, взяв их так сказать из коробки, а для ускорения обучения брал часовики. 
Как видите я широкими мазками накидал все многообразие моделей которые мы можем получить. Из всего этого многообразия переборов кое что я все таки сделал. Существует 3 варианта в ансамблевом подходе: bagging, boosting, stacking. Я простакал модели обученные на разных наборах признаков. Результаты стаканья можно использовать по разному — можно увеличивать число сделок, можно увеличивать профитность на сделку, тут уж как кому нравится, главное, что дисперсия финансовых результатов по годам стал меньше, для меня это важно. Еще обучал модель только на голубых фишках, а уже обученную модель применял для прогноза на всех 40 более менее ликивдных акциях. В чем разница при прогнозировании модели обученной на 6 фишках и 40?! Профитность обученной на 40 фишках выше, но число сделок становится меньше, без неожиданностей. 
  Скромненько и быстренько о результатах. 
  Знаю многие datescientists ищущие на фондовых рынках приложение своих знаний, дальше оценок точности результатов не идут. Получают уcловно говоря 56% accurasy или какой то там ROC-AUC, или прости господи r2 и все. Это само собой не имеет никакого отношения к реальности, многие кстати даже не догадываются насколько и почему. Нас конечно интересует финансовый результат и только он, поэтому я сразу перевожу результаты прогнозов в «количество дней в рынке» со средним профитом этих дней, с разбивкой по годам, и с дальнейшим построением equity.
  Вот табличка:
Практическое использование нейросетей на рынке 2. На примере трансформеров.
  Тут можно комбинировать, увеличивая порог, снижая, тем самым увеличивая или уменьшая сделки (и наоборот доходность на сделку). Понятно дело что если у вас куча других систем, то можно ужесточить условие и тогда по этой модели у вас число дней в рынке сократится в 2 раза, но при этом средний профит в день превысит 1%. 
  А вот кривая equity с комиссией и проскальзыванием в 0,1%, без реинвестирования.
Практическое использование нейросетей на рынке 2. На примере трансформеров.
  Число дней с момента предыдущего максимума equity:
Практическое использование нейросетей на рынке 2. На примере трансформеров.
  Если прищурить то можно увидеть что это 140 дней.

  И MaxDrodown:
Практическое использование нейросетей на рынке 2. На примере трансформеров.
  Очень маленький дродаун, но это во многом потому что без реинвестирования, например о каом большом дродауне можно говорить если (например) в 2020 мы использовали для входа в сделку 25% счета.
  Для тех кто считает что 0,1% мало на комиссию и проскальзывание (кстати соглашусь), вот вам на это 0,25%, но с реинвестированием
Практическое использование нейросетей на рынке 2. На примере трансформеров.
  Тут понятно дело кривая устремилась ракетой вверх, но и форма equity потеряла плавность.
  Численные показатели эффективности системы:
Win_rate 61.5
Прибыль на 1 сделку 0.69
Profit_factor 2.29
Recovery_factor 29.46
Payoff_ratio 1.46

  Месяц, на небольшую сумму торгую по этой системе, в первую очередь чтобы убедиться что не намудрил с кодом. Торговать тяжело, потому что у меня нет никакой связки между питоном и терминалом transaq, поэтому если кто может в этом помочь, с удовольствием приму помощь
  Не буду оценивать систему с точки зрения ее практического использования, так как цель было показать, что если правильно подобрать признаки и правильно их представить, и все это скормить правильной нейросетке, то можно получить нечто, как минимум уверенно обыгрывающее пассивное инвестирование в индекс МосБиржы. Мой личный опыт говорит что на практике результаты систем ухудшаются на 30-50% от того что было получено на истории, поэтому этот результат явно меня удовлетворить не может. Если потенциал для улучшения? Есть, так как я искусственно ограничивал возможности модели, для ускорения работы. 

  А что под капотом?!
Все эти показатели, графики equity это все понятно, но меня всегда больше интересовало что под капотом, возможность понять суть рынка с помощью успешных моделей. Если сравнить какие значения в среднем принимают признаки при сильной уверенности модели в росте и сильной уверенности модели в падении (зеленая линия это динамика признака за прошлые 9 часов при уверенности модели в росте, красная — в падении) 

Практическое использование нейросетей на рынке 2. На примере трансформеров.
то мы увидим нечто напоминающее параболу с вершинами в разную сторону. Усложнив нейросеть можно подогнать что угодно, но и признаки в таком случаи примут хаотический характер, а тут они принимают форму известной функции. И графики довольно гладкие. Конечно, подгонка была бы видна и на плохих результатах на out-sample, но я привел этот график еще и потому, что мне всегда было интересно как именно нейросетка работает с признаками. Тут мы можем наблюдать (с каким то допущением конечно), что если признак (на примере 1 признака) 6 баров рос, а затем на оставшихся 3 припадал, то вероятность роста выше, если нет, то наоборот. Такое бинарное разделение мне нравится, так как я всегда стремлюсь к простоте, чтобы избежать ошибок разброса. А ошибки разброса для рынка, где данные зашумлены легко превращают хорошую модель на истории в нечто невразумительное на практике.
  Можно ли сказать что нейросеть нашла какой то паттерн? В данном случаи мы говорим о средних значениях и тут конечно таится дьявол. Если рассмотреть случаи сильной уверенности нейросети в росте (или падении) отдельно, мы можем увидеть очень сильные отклонения от этого среднего значения (принявшем вид параболы). О чем это говорит? С точки рения алготрейдера — нейросеть нашла несколько паттернов, и тот который рисует на средних параболу — основной, но не единственный. Методы кластеризации говорят о примерно 3-4 паттерна. Все их можно вычленить и переписать в коде которые применяют алготрейдеры, конечно, в каком то приближении. Так что применение нейросетей возможно и такое. 
  Для любителей шортов.
 
Модель позволяет получать прибыль и от шортовых позиций, но доходность раза в 2 меньше лонговых и если совместить лонг и шорт, то показатели эффективности системы становятся чуть хуже. Но если вы сильно хотите, то можно и пошортить.
  О коде.
  Если кого интересует код, то может написать мне в личку, однако у меня нет никакого желания раскрывать свою работу с признаками и сами признаки. А все остальное — код обучения трансформера, использование обученной модели для прогноза и перевод прогноза в финансовый результатах — это я показать могу, хотя сразу предупреждаю что писал для себя, это не продакшн и разобраться в нем будет сложно, а во вторых в нем нет ничего уникального, модель трансформеров для временных рядов я использовал готовую, с сайта keras, а дальше много pd.pivot_table и простой арифметики.
  Вывод: Очень долго машинное обучение вообще не давала ничего нового к моему багажу знаний торговли на фондовой бирже. Даже подавая на вход моделям данные, которые я использую для реальной торговли, модели кривовато находили пороги и комбинации признаков. Мои вычисленные на коленках параметры оказывались лучше, стабильней, с точки зрения финансового результата. В том числе потому что я оптимизировал непосредственно финансовый результат (с учетом стабильности по годам) и минимизируемая нейросеткой CrossEntropyLoss (принимающая минимальные значения при увеличении числа угадываний направлений движения), имеет весьма опосредованное отношение к прибыли. Возможно сейчас что то изменится и я смогу получить что то новое в своем практическом трейдинге благодаря нейросеткам. Но это не точно.
  Однако один позитивный момент нейросетей я уже вижу — в поиске паттернов на рынке я использую 2-3 параметра и таким образом я никак не смогу описать языком алготрединга полученную нейросеткой плавную кривую в форме параболы. А нейросетка может. А возможно именно плавность динамики признака во времени и описывает ту самую ситуацию ны рынке, которая и дает трейдеру статпримущество. 


34 Комментария
  • AndreyG
    14 января 2022, 09:58
    Так вроде нейронку используют для моделей с текстом, фото, видео
    • Артём А
      15 января 2022, 00:05
      AndreyG, ничего не мешает применить специфические архитектуры нейросетей (рекуррентные, сверточные, трансформеры) и к временным рядам. Но есть большие сомнения, что оно может хоть какие-то адекватные результаты давать на реальном счете.
        • Артём А
          16 января 2022, 02:49
          Марат, сомнения в том, что валидация на истории и кровавый продакшн в реальном времени в ML суть две большие разницы.

          Пожелаю вам удачи и будет очень интересно посмотреть на пост с результатами работы системы через год.
  • AndreyG
    14 января 2022, 09:59
     Сейчас захожу в эту тему
  • Мальчик buybuy
    14 января 2022, 10:14
    Не понимаю...

    Почему нельзя хотя бы попробовать решить задачу оптимизации максимума эквити ручками?

    Зачем для этого использовать софт, изначально предназначенный для распознавания любимых котиков на фотографии?

    Или котики так похожи на рыночные котировки?

    С уважением
  • Vadim S
    14 января 2022, 11:51
    Торговать тяжело, потому что у меня нет никакой связки между питоном и терминалом transaq,

     

    так вроде в финаме можно подключить МТ5, а в нем можно работать с кодом питона.

    • Replikant_mih
      14 января 2022, 14:06
      Vadim S, Я сделать API на питоне и там модели хостятся, по API можно из любого приложения туда стучаться за предиктом, сейчас это из C# кода. Но я тоже буду MT5 брать в оборот, но не только из-за Питона.
  • CloseToAlgoTrading
    14 января 2022, 12:59
    56% accurasy или какой то там ROC-AUC

    А расскройте пожалуйста какое значение ROC-AUC?

    Accuracy 56% выглядит не очень для классификации, было бы интересно сравнивать с рандомом который 56% показывает лонг и 44 шорт?



      • CloseToAlgoTrading
        14 января 2022, 13:51
        Марат, мне просто кажется это не очень правильным подходом, но результат положительный, а это главное. 
        А с рандомом не сравнивали?
          • CloseToAlgoTrading
            14 января 2022, 15:09
            Марат, 50% в год это же совсем о другом. Вы написали что у вас точность 56%.
            По тестам вин рейт 61.5%. Сравнивать с рандомной моделью имеет смысл, что бы понять, что ваша модель действительно лучше. Представте, что рандом вам покажет результат выше или такой же, тогда смысла в модели нет. Опять же, всегда хорошо бы посмотреть, какой выход у модели в той или иной ситуации, часто ведь это просто усреднение или уклон в какую либо сторону, например всегда в лонг… или в 90% случаев лонг… Все это просто помогает понять, а действительно ли я что то нашел...

            Но я ни в коем случае Вам ничего не советую, просто было интересно узнать, сравнивали ли вы или нет, и если да то какие отличия. 

              • CloseToAlgoTrading
                14 января 2022, 17:17
                Марат, ах точно, сорри, май фолт :)
  • Replikant_mih
    14 января 2022, 14:34
    Да, с параметрами обучения можно по-всякому играться, но это уже мета-исследования, трудоемко и много времени на вычисления + надо как минимум несколько моделей для репрезентативности результатов. Я прикидочно разные параметры прикинул по несколько вариантов и захардкодил для всех будущих обучений исхдя из этого опыта.
  • Replikant_mih
    14 января 2022, 14:38
     
    Я простакал модели обученные на разных наборах признаков.

    О чем речь? Ансамбль из разных обученных сетей и предикт на основе предиктов от всех них?

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

  • Replikant_mih
    14 января 2022, 14:44
     
    Получают уcловно говоря 56% accurasy или какой то там ROC-AUC, или прости господи r2 и все.

     

    В моих ML флоу даже нет датасаентских метрик щас, тупо считаю трейдерские — винрейты PF и прочие.

  • Replikant_mih
    14 января 2022, 14:51
    нет никакой связки между питоном и терминалом transaq, поэтому если кто может в этом помочь, с удовольствием приму помощь
    Думаю, могу бы поделиться Jupyter тетрадью где у меня API, которое предикты раздает)), если интересна такая схем. Понятно, что при желании можно в обычный питон перевести. У меня API когда запускается только модель импортирует, никакого флоу обработки данных, поэтому на вход должны прилетать уже все предобработанные данные. 115 запросов в секунду обрабатывает (или в минуту… — не, вроде в секунду :)) ).
  • Replikant_mih
    14 января 2022, 14:55
     А эквити это OOS? Я тока OOS смотрю)), не знаю, может какой-то смысл можно извлечь из IS эквити или от их сравнения, надо подумать, щас тока OOS смотрю. Просто у тебя эквити за 10 лет, а ты говоришь, у тебя 1 год чистый OOS? — Или ты нарезаешь так что сначала первый год OOS, потом второй и т.д., потом склеиваешь? У меня кстати завышаются результаты если я OOS беру в прошлом или если рандомно смешиваю данные, так то там тоненький ручеек утечки есть, ну или просто тупо раньше рынок проще был.
    • CloseToAlgoTrading
      14 января 2022, 15:14
      Replikant_mih, есть подозрение что если смешивать временные отрезки, то модель может запоминать некоторые закономерности которые имели место быть в прошлом на протяжении некоторого отрезка. Разделив этот отрезок на трейн и тест, получим что мы имеем одни и теже данные, это ведь все история. И тут конечно сеть очень хорошо все покажет. 
      В реальном же мире, все течет и все меняется… и закономерности появляются новые и не повторяются в том виде в котором были раньше… поэтому и советуют для теста брать участок только по направлению возрастания времени, да еще и гэп делать между тренировочными и тестовыми…
      • Replikant_mih
        14 января 2022, 15:17
        CloseToAlgoTrading, Да, согласен. Я так и делаю, только по направлению, геп правда не делаю, жалко данные терять)).
  • Replikant_mih
    14 января 2022, 15:03
    Если сравнить какие значения в среднем принимают признаки при сильной уверенности модели в росте и сильной уверенности модели в падении (зеленая линия это динамика признака за прошлые 9 часов при уверенности модели в росте, красная — в падении)

    Эту часть, жалко, не понял про эти красные и зеленые графики про что они. Я ничего похожего, кажется, не делаю, а вдруг я бы смог обогатить свой флоу).
      • Replikant_mih
        14 января 2022, 19:53

        Марат, Все равно не понял), может потом в личке узнаю). Мне в частности пока не понятна тема с 9-ю часами.

        По описанию, как будто бы я делаю что-то аналогичное, но для оценки модели в целом.

         

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

  • Replikant_mih
    14 января 2022, 15:15
     Сорри за много комментариев, просто было что откомментировать, чтоб не забыть по ходу чтения сразу комментил. Просто ML важная часть моего алго флоу, поэтому если видишь пост от человека с хотя бы немного похожим подходом и который адекватно машинленит, т.е. понимает и машинленинг и трейдинг, а не тупо загнал цены, предиктим цену), то хочется прокомментировать потому что много релевантной информации.
  • grimm21
    14 января 2022, 21:31
    Я пользовался github.com/moof2k/kerasify
      • grimm21
        15 января 2022, 19:03
        Марат, я то связывал с MT5. Но смысл наверняка тот-же. Всю логику в Dll и наверняка из LUA к Dll можно обращаться.
  • 3owt.com
    15 января 2022, 19:08
    Здорово, успехов.

    Я тоже пришел к выводу, что необходима классификация, поэтому применил классификацию предсказания с 3 состояниями, ДА, НЕ ЗНАЮ, НЕТ, задав граничные значения зон, точнее зоны НЕ ЗНАЮ ( т.е. вне игры). Для гашения ложных целей использовал механизм кворума из трех моделей путем программного подбора лучшей комбинации. Аккуратность достаточно высокая в районе 90% выявления тренда.  Патерны явно видит и не плохо, иногда вообще не понятно, что она видит, ничего не предвещает движения.  Для тестов торгую в тестовом режиме на TradingView пытаюсь выявить направления оптимизации. Получить адекватные сигналы и получить по ним профит, это разные задачи, но в целом и торговый результат не плохой

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн