Блог им. afecn19

Практическое использование нейросетей на рынке 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 параметра и таким образом я никак не смогу описать языком алготрединга полученную нейросеткой плавную кривую в форме параболы. А нейросетка может. А возможно именно плавность динамики признака во времени и описывает ту самую ситуацию ны рынке, которая и дает трейдеру статпримущество. 


★7
34 комментария
Так вроде нейронку используют для моделей с текстом, фото, видео
avatar
AndreyG, ничего не мешает применить специфические архитектуры нейросетей (рекуррентные, сверточные, трансформеры) и к временным рядам. Но есть большие сомнения, что оно может хоть какие-то адекватные результаты давать на реальном счете.
avatar
Артём А, )) ну вот я выкладываю свои результаты, которые сдается мне для многих алготрейдеров получить ан истории просто несбыточная мечта. что там про большие сомнения?! ))

avatar
Марат, сомнения в том, что валидация на истории и кровавый продакшн в реальном времени в ML суть две большие разницы.

Пожелаю вам удачи и будет очень интересно посмотреть на пост с результатами работы системы через год.
avatar
 Сейчас захожу в эту тему
avatar
Не понимаю...

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

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

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

С уважением
avatar
Торговать тяжело, потому что у меня нет никакой связки между питоном и терминалом transaq,

 

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

avatar
Vadim S, спасибо за инфу
avatar
Vadim S, Я сделать API на питоне и там модели хостятся, по API можно из любого приложения туда стучаться за предиктом, сейчас это из C# кода. Но я тоже буду MT5 брать в оборот, но не только из-за Питона.
avatar
56% accurasy или какой то там ROC-AUC

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

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



avatar
CloseToAlgoTrading, даже не думал считать. зачем он нужен если я результаты прогнозирования перевел в финансовый результат? 
avatar
Марат, мне просто кажется это не очень правильным подходом, но результат положительный, а это главное. 
А с рандомом не сравнивали?
avatar
CloseToAlgoTrading, Хотел бы я посмотреть на рандом который бы мне мог приносить 50% в год

avatar
Марат, 50% в год это же совсем о другом. Вы написали что у вас точность 56%.
По тестам вин рейт 61.5%. Сравнивать с рандомной моделью имеет смысл, что бы понять, что ваша модель действительно лучше. Представте, что рандом вам покажет результат выше или такой же, тогда смысла в модели нет. Опять же, всегда хорошо бы посмотреть, какой выход у модели в той или иной ситуации, часто ведь это просто усреднение или уклон в какую либо сторону, например всегда в лонг… или в 90% случаев лонг… Все это просто помогает понять, а действительно ли я что то нашел...

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

avatar
CloseToAlgoTrading, я не писал что у меня 56%. Рандом он себя рано или поздно покажет
avatar
Марат, ах точно, сорри, май фолт :)
avatar
Да, с параметрами обучения можно по-всякому играться, но это уже мета-исследования, трудоемко и много времени на вычисления + надо как минимум несколько моделей для репрезентативности результатов. Я прикидочно разные параметры прикинул по несколько вариантов и захардкодил для всех будущих обучений исхдя из этого опыта.
avatar
 
Я простакал модели обученные на разных наборах признаков.

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

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

avatar
Replikant_mih, можно было прогнозы одной модели засунуть в качестве признаков в другую. Я сделал проще, в расчет брал только фишки по которым не менее 2 моделей показывали рост 
avatar
 
Получают уcловно говоря 56% accurasy или какой то там ROC-AUC, или прости господи r2 и все.

 

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

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

Эту часть, жалко, не понял про эти красные и зеленые графики про что они. Я ничего похожего, кажется, не делаю, а вдруг я бы смог обогатить свой флоу).
avatar
Replikant_mih, да все просто. Я получаю от модели веренность ее в своем прогнозе. Ведь порог когда омдель выдает 1 или 0 это 0,5. Если больше 0,5 то 1, если меньше то 0. Я считаю фильтрую случаи когда модель показывает больше 0,6, и считаю среднюю по признакам, потом смотрю на среднюю когда модель меньше 0,4. И то что я получил я изобразил на графике. Признаков у меня 4, каждый признак имеет длину 9 (9 часов). ВОт и все
avatar

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

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

 

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

avatar
 Сорри за много комментариев, просто было что откомментировать, чтоб не забыть по ходу чтения сразу комментил. Просто ML важная часть моего алго флоу, поэтому если видишь пост от человека с хотя бы немного похожим подходом и который адекватно машинленит, т.е. понимает и машинленинг и трейдинг, а не тупо загнал цены, предиктим цену), то хочется прокомментировать потому что много релевантной информации.
avatar
Я пользовался github.com/moof2k/kerasify
avatar
grimm21, ну мне нужно связка с quik

avatar
Марат, я то связывал с MT5. Но смысл наверняка тот-же. Всю логику в Dll и наверняка из LUA к Dll можно обращаться.
avatar
Здорово, успехов.

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

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

....все тэги



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