Есть такая CNN, сверточная сеть то бишь. На вход ей подаются картинки, на которых она учится отличать собачек от кошечек. Меня это, относительно применения на фондовой бирже всегда привлекало.
Сначала определимся какие рисунки подносим CNN. В качестве рисунков мы можем подать:
- Сырые ряды: цены, обьемы, индикаторы
- Индикаторы. То есть для каждого значения подсчитать набор тех.индикаторов и красиво оформить их в матрицу. Ведь что такое рисунок? Это всего лишь набор пикселей, каждый пиксель это значение какого то техиндикатора, чем он больше тем пиксель темней. Тут есть даже практическая реализация которой я частично и воспользовался. https://github.com/nayash/stock_cnn_blog_pub
- Представить сырые временные ряды в другой системе координат. Например GramianAngularField, где как пишут авторы больше информации. Так блин и пишут. Набиваете в гугле GramianAngularField и выпадает куча ссылок, но мне лично больше понравилась работа иранских товарищей https://arxiv.org/pdf/1810.08923.pdf
Ну и понятно что есть траблы. Например, если мы используем рисунки по первому типу, может некрасиво получится, ведь они не учитывают важность разных частей рисунка, а кто торгует знает, что последние (правые значения на рисунке) важней чем менее свежие (левые). А CNN это не интересно ей что слева, что справа, что наверху. Рисунки по типу два устраняют эту проблему, но мы получаем урезанную информацию о прошлом. Что может быть как плюсом так и минусом. Зато возникает вопрос: значение какого индикатора в какую ячейку сунуть. Например есть 9 индикаторов, и решили мы засунуть их в картинку 3на3 пикселя. В пиксель с координатами (1,1), какой совать, а рядом с ним какие? Какая разница скажете вы. Но ведь дальше пойдет свертка 2на2 (например), и при неправильном выборе соседства мы можем потерять важное сочетание индикаторов. Это как взять картинку собачек и перемешать все пиксели, за это нейросеть спасибо не скажет и вряд ли справится. Парень чьим кодом я частично пользовался, рассудил что рядом лучше помещать схожие индикаторы, но вот с чего вдруг? Мне это вовсе не кажется логичным.
Ну и третий вид рисунка, самый красивый, но там вообще ни в чем нельзя быть уверенным.
Сразу скажу что успеха при использовании данного вида нейросети я не достиг, поэтому просто предложу насладиться картинками.
Вот преобразования GramianAngularField временно ряда. Случай когда безоткатный рост
А вот тренд вниз
а вот рост но с флетом на концах
А вот просто флет
Человеческий глаз сразу замечает разницу, ну а нейросеть она же умная, она тем более должна. Так я думал. В общем нарезал я под 2000 картиночек, каждой присвоил лейбл, погонял, погонял… попробовал применить к трейдингу, в общем получил какой то профит на out-sample аж в 0,05-0,1% И это в лучшем случаи! На test и train было что то вроде профита 0,25-0,5% на сделку. То есть нейросеть что то нащупывала, но при прогнозировании все скатывалось в унылость.
Что насчет 2 представления рисунков? Тут картинки выглядят не так красиво, по спартански:
Первая соответствует лейблу-рост, вторая -падение, третья-флет. Или наоборот, да не суть. Я взял 256 тех индикаторов и раскидал их в картинку (2 мерную матрицу) 16 на 16. Каждая клеточка на рисунке это индикатор, чем он больше тем цвет насыщенней и наоборот. Как я уже писал, тут важно понять в таком порядке все эти 256 индикаторов разместить, комбинаций как понимаете огромное. Я попробовал потестить пару десятков вариантов, случайным образом определяя порядок техиндикаторов на картинке. И даже как будто нашел 3-4 интересных сочетаний, но по большому счету все это… эээ… сомнительно.
Пока как то так
А кода на пайтон здесь
https://github.com/Taram1980/finance_ML
Если б соображал в программировании — позанимался бы.
Рыл бы скорей всего в сторону поиска этим способом более формализованных паттернов. По крайней мере «сналету» мне так кажется.
Советовал бы не бросать исследования — это просто первый блин.
Супер, спасибо за статью. Для меня сейчас очень релевантный контент. Только знакомлюсь с нейросетями, находить «собачек» на графике, конечно одна из очевидных мыслей, которые хочется протестить (по очевидности конкурирует разве что с RNN).
Да, в CNN понятие «близость» играет роль, хотя возможно, оно нивелируется если юзать несколько этапов свертки и какой-то пулинг между ними, но не уверен. Так же была идея попробовать свертку большего размера, хотя возможно это будет актуальней для меня, я матрицы входные не делаю очень большими.
По мне тут ещё один актуальный вопрос, не знаю, кстати, почему он не затронут — разметка. Если просто размечать приращениями (там, через 10 свечей, например), то это то же самое что взять дата-сет со 1000 разных видов животных, а разметку сделать самец-самка).
Отдельное спасибо за ссылку на гит-проекта).
1. В качестве признака добавляют значении номера позиции пропущенное через embedding слой (редко используется)
2. Формируют набор признаков Sin(номер позиции * k) для разных k
Со звуком совсем особая история — одна секунда звука содержит почти сто тысяч значений, а анализируют записи длинной в несколько десятков секунд. По сути преобразование в картинку — это форма сжатия/понижения размерности. Для котировок такой проблемы нет. Ну и в принципе звук вполне анализируют с помощью conv1d — WaveNet, как вариант.
Почему оно вдруг полезно для анализа котировок? Почему сеть, которая является универсальным апроксиматором, не может выучить это преобразование на исходном сигнале, если это преобразование достаточно полезно? Подскажите статьи, где эти темы раскрыты.
тут и про скорость и про то что работают по разному. сверточная ищет паттерны, что кстати соответствует моему виденью рынка. рынок для меня как погода-предсказывать на каждый день вперед невозможно, однако есть паттерны, когда варианты будущего резко сужаются, и будущее можно предсказать с более менее хорошей точностью
мне нравится вот
https://www.researchgate.net/publication/333081391_Deep_Learning_Neural_Networks_based_Algorithmic_Trading_Strategy_using_Tick_by_Tick_and_Order_Book_Data
а тут сами авторы
https://pyts.readthedocs.io/en/latest/auto_examples/image/plot_gaf.html
но вообще в нашем деле ни в чем уверенным быть нельзя, пробовать нужно. вот мой текущий опыт говорит что для котировок нейросети нафик не нужны, и старый добрый RF/GB получше будет и многим причинам. ну или нужно специальным образом смоделировать нейросеть, залез глубоко в мануал keras или pytorch. а иначе, использование нейросетей как его использую математики, кроме бреда ничего выдавать не будет
Еще одно: насколько я понимаю, чтобы получить предсказательную способность, надо привести изначальный ряд к стационарному, здесь же ничего похожего я не увидел
Alexander Ostrovskiy, а при чем тут CNN и стационарность временного ряда?