Таки собрался дописать вторую часть своих результатов применения трансформеров для предсказания на российском фондовом рынке. Может и хорошо что не спешил, так как пафос первой части о трансформерах дающих какие то уникальные результаты по сравнению с другими архитектурами нейросетей, оказался несколько преувеличенным, по крайней мере LSTM дал вполне сравнимый результат с трансформерами. Потом я попробовал градиентный бустинг, дерево решений и вновь получил схожий результат. Так что подавайте в нейросеть правильные признаки и многие модели покажут положительный результат. Тем не менее, раз я начал с трансформерах, и так как их архитектура хорошо отражает рынкок, о них и продолжу.
Для любителей вопросов о «таймфреймах, на чем обучал, какие акции, что в качестве таргета, какие параметры, время удержании позиции» итп итд. Акции МосБиржы, из числа наиболее ликвидных. Данные у меня с 2011 до 2021 (и это увы необходимость, так как именно с 2011 года время работы биржи стало 9 часов). Прогнозы строил следующим образом — выкидывал один год (это out-sample), а из оставшихся делал разбивку на train и test. Таким образом получил 10 одногодичных прогнозов. Для меня важно получить доходность на сделку пусть поменьше, но чтобы прибыльность подтверждалась на как можно большем диапазоне, и на всех акциях. Такое чтобы для каждой акции своя модель — для меня неприемлемо. И само собой никаких убыточных годов, как минимум. Знаю многие меняют системы каждые 3 года и для них это нормально, я предпочитаю вылавливать аномалии которые работают десятилетиями. Тут я никого не учу, рынок сам рассудит.
Cтал потихоньку видеть разницу между американским и российским рынком. Понятие интуитивное и наверно наивное и может даже не верное, так как опыт у меня исключительно внутрироссийский. Успешный трейдинг в Америке — это найти фишку которая выстрелит и сидеть на ней. Все эти неэффективности которые кто то пытается выловить техиндикаторами или линиями или еще чем то еще — давно уже там уничтожены с точки зрения эффективного трейдинга. Эффективного в смысле дающего заработать на хлеб с маслом. На росбирже торгуется определенное число фишек, никто особо не выстреливает из ниоткуда и не падает в ноль, то есть искать какие то новые компании, которые взлетят, негде, да и незачем (пишу сие на фоне позавчерашнего взлета ТМК хехе), зато в наших 20+ более менее ликвидных фишках есть неэффективности, из которых можно извлекать прибыль. Поэтому мой российский подход для американского не годится (хотя допускаю что для определенной категории акций, не очень проторгованных, какие то хорошие неэффективности и можно найти). Хорошо, как найти это фишку которая выстрелит? А тут уж как вам душа скажет, хотите ковыряйте фундамент, хотите теханализ, хотите читайте отчеты и пытайтесь понять зайдет или нет новая услуга, хотите еще что, благо биржевая инфраструктура в США развита как нигде в мире и вы можете найти любую информацию о любой компании, в структурированной и удобной для анализа форме. И получив эту гору информации, перед вами свободное творчество — запускайте свои нейросетки и ищите, ищите, ищите, нечто что позволит вам выйти на истории, в привлекательную для вас кривую equty, а затем помолясь и перекрестившись пробуйте использовать сие в реальной торговле. И такой подход большой плюс для тех кто хочет побольше изучить всякие методы машинного обучения, то есть для меня.
Пока я в NLP, это значит берем текст: отчеты, мнения, твиты, итд итп и получаем его количественные оценки, с точки зрения сантиментов например, или схожести одного текста к другому. Ну а дальше по схеме — фичи есть, прикручиваем какой то инструмент машингленинга. И самое неожиданное, применив даже самый наивный подход оценки сантиментов, я получил положительный результат.
В последний раз, получив положительный результат для 7 раздела отчета К-10, я решил увеличить выборку, и плюнув, начал прогонять К-10 полностью, увеличив выборку с 2000 отчетов до 4000. Ну и получил примерно такой же, соотносящийся с логикой результат: если в отчете негатива побольше, компании растут поменьше и наоборот. Заодно получил ответ на странную зависимость доходности от размера отчета — в значительной части это обьясняется тем что компании сектора Information Technology или Health Care имеют склонность писать небольшие отчеты, а например сектора Materials или Financials побольше, только вот так получилось что за последние 10 лет первые вырастали в среднем на +20% а последние на +15%. Если учесть секторальную принадлежность, то все равно окажется что компании меньше льющие воду в 7 разделе 10-К, имеют динамику акций лучше, но это будет уже разница не в 7%, а в 2%.
Все это я получил используя National Research Council Canada (NRC) affect lexicon. Напомню такой лексический подход до жути прост, берется текст и считается сколько в нем позитивных слов, негативных, «слов доверия», «слов страха» итп итд Но помимо него есть другие библиотеки слов, Lexicon Loughran and McDonald. Его минус, в том что там в нет словарей по 8 эмоциям, а только по 2 — позитив/негатив (ну почти), а я уже выяснил что ловить по этим признакам нечего. Так что Loughran and McDonald пролетели мимо.
Дальше решил попробовать Bert, очень популярная моделька, которая переписала рекорды в распознавание сантиментов в тексте. Но это уже другой подход, тут уже в чистом виде машинное обучение. Я попробовал и базовый Bert и finBert, получил оценки по шкале позитив/негатив, и на 10К и на 10Q. Не берусь судить насколько точно они оценили сантименты, но не обнаружил что из позитивных отчетов следует позитивная динамика акций, а из негативных -негативные.
Ну и наконец попробовал третий вариант: представляем текст в векторном виде (превращаем его в цифры), ставим лейблы в зависимости от динамики в течении следующего дня: (Close/Open -1)*100 ну а дальше любой метод из машинного обучения. В чем отличие от finBert? Ведь и там и там мы текст превращаем в цифры мосле чего используем машинное обучение.
Ну вот например у нас есть твит: «Охренеть, завтра Гугл попрет как ракета!». Ожидания написавшего явно позитивные, но рынку в общем то плевать, и мы практикующие трейдеры это отлично знаем. Ну а Bert плевать что там на рынке в реальности, он тупо оценивает сантименты текста. Оценивает умно, с учетом контекста, преодолевая игру слов, сленг итп итд. И обучился Bert оценивать тональность текста на примерах где в качестве лейблов использовались оценки человека — позитивный текст или негативный. Для finBert брались финансовые тексты, где лейблы проставляли видные экономисты, я использовал вариант finBert, которая обучалась на 10К (ну как утверждал ее автор). Так вот, вся разница в лейблах. Я в качестве лейбла взял реакцию рынка, поэтому твит: «Охренеть, завтра Гугл попрет как ракета!», этот сверх позитивный твит, получит отметку негативного, если на следующий день акции Гугла упадут. И получив на трейне лейбл «негативный», он на тесте будет все схожее с такого рода твитом оценивать как негативное для роста завтра. Вот и вся разница. Ну и плюс в том что Bert очень мощный инструмент, действительно оценивающий контекст, а я взял просто по пролетарски — TFID + sklearnкий MultinomialNB, то бишь наивный Байес. Дешево и сердито. Да тут можно было что то посолидней, типа LSTM, да что угодно, но думаю думаю смысла усложнять не было. По идее можно было даже создать свой «MaratBert», обучив монстра на рыночных лейблах...
Помимо использования разных подходов я конечно химичил и с разными базами данных. Например решив увеличить выборку, взяв отчеты 10Q, это то же что и 10K но квартальный. Попробовал брать из отчетов только предложения где есть отсылка на ожидания, риски итп итд. Попробовал вместо отчетов SEC взять stocktweets.
Много что перебирал, но в конечном счете самое интересно получил оценивая stocktweets наивным Байесом. Еще раз подчеркиваю, оценивал не сантименты. Нашел в сети базу stocktweets для 5 фишек. И получил такой вот результат на тесте:
Займемся бессмыслицей. Никакого прогнозирования, просто попробуем методами вейвлет преобразований и CNN ответить на вопрос — есть или нет разница в цикличности при росте фишки и падении? Эллиот чертил 3 волны вверх и 2 вниз. Давайте почертим и мы.
Данные я взял недельные, от понедельника до пятницы, но с разбивкой по 15 минуткам, итого ряд в 175 элементов. Судя по прошлым результатам, мизерная длина, и никакой цикличности там нет. Но...«а вдруг?!». Ну а разбивка недельная, в надежде уловить недельную цикличность, все таки понедельник это «день тяжелый», пятница это «тяпницы», четверг это маленькая пятница. В общем каждый день недели уникален и помню какие то корреляции/антикорреляции даже были, вроде пятница и понедельник шли вразрез, а четверг и пятница шли вместе. Впрочем точно не помню.
Каждому ряду в 175 отчетов я присвоил лейбл (1 рост, 0 падение). Ряд прогнал через вейлет преобразование, получив квадратную картинку. Все это добро загнал в CNN и стал ждать чего нейросеть намутит. В теории, после вейвлет преобразования, на полученной картинке, не должно быть никакого намека на то росла фишка или нет. Следы наличия тренда присутствуют, но какого именно не указывается. Хотя это не точно. А вот точно что должны быть следы цикличности, и если при росте и падении цикличность разная то точность классификации должна быть больше 0,5… Хотя это не точно. Ну нам жалко чтоли, попробовать? Пуская нейросетка крутит колесико. Крутило колесико нейросеть долго....: