Блог им. afecn19

CNN и финансовые TimeSeries

Есть такая CNN, сверточная сеть то бишь. На вход ей подаются картинки, на которых она учится отличать собачек от кошечек.  Меня это, относительно применения на фондовой бирже всегда привлекало.  

Сначала определимся какие рисунки подносим CNN. В качестве рисунков мы можем подать:

  1. Сырые ряды: цены, обьемы, индикаторы
  2. Индикаторы. То есть для каждого значения подсчитать набор тех.индикаторов и красиво оформить их в матрицу. Ведь что такое рисунок? Это всего лишь набор пикселей, каждый пиксель это значение какого то техиндикатора, чем он больше тем пиксель темней. Тут есть даже практическая реализация которой я частично и воспользовался. https://github.com/nayash/stock_cnn_blog_pub
  3. Представить сырые временные ряды в другой системе координат. Например GramianAngularField, где как пишут авторы больше информации. Так блин и пишут. Набиваете в гугле GramianAngularField и выпадает куча ссылок, но мне лично больше понравилась работа иранских товарищей https://arxiv.org/pdf/1810.08923.pdf

Ну и понятно что есть траблы. Например, если мы используем рисунки по первому типу, может некрасиво получится, ведь они не учитывают важность разных частей рисунка, а кто торгует знает, что последние (правые значения на рисунке) важней чем менее свежие (левые). А CNN это не интересно ей что  слева, что справа, что наверху. Рисунки по типу два устраняют эту проблему, но мы получаем урезанную информацию о прошлом. Что может быть как плюсом так и минусом. Зато возникает вопрос: значение какого индикатора в какую ячейку сунуть. Например есть 9 индикаторов, и решили мы засунуть их в картинку 3на3 пикселя. В пиксель с координатами (1,1), какой совать, а рядом с ним какие? Какая разница скажете вы. Но ведь дальше пойдет свертка 2на2 (например), и при неправильном выборе соседства мы можем потерять важное сочетание индикаторов. Это как взять картинку собачек и перемешать все пиксели, за это нейросеть спасибо не скажет и вряд ли справится. Парень чьим кодом я частично пользовался, рассудил что рядом лучше помещать схожие индикаторы, но вот с чего вдруг? Мне это вовсе не кажется логичным.

Ну и третий вид рисунка, самый красивый, но там вообще ни в чем нельзя быть уверенным.

Сразу скажу что успеха при использовании данного вида нейросети я не достиг, поэтому просто предложу насладиться картинками.
Вот преобразования GramianAngularField временно ряда.  Случай когда безоткатный рост
CNN и финансовые TimeSeries



А вот тренд вниз

CNN и финансовые TimeSeries

а вот рост но с флетом на концах

CNN и финансовые TimeSeries

А вот просто флет

CNN и финансовые TimeSeries

Человеческий глаз сразу замечает разницу, ну а нейросеть она же умная, она тем более должна. Так я думал. В общем нарезал я под 2000 картиночек, каждой присвоил лейбл, погонял, погонял… попробовал применить к трейдингу, в общем получил какой то профит на out-sample аж в 0,05-0,1% И это в лучшем случаи! На test и train было что то вроде профита 0,25-0,5% на сделку. То есть нейросеть что то нащупывала, но при прогнозировании все скатывалось в унылость.  

Что насчет 2 представления рисунков? Тут картинки выглядят не так красиво, по спартански:
CNN и финансовые TimeSeries

Первая соответствует лейблу-рост, вторая -падение, третья-флет. Или наоборот, да не суть. Я взял 256 тех индикаторов и раскидал их в картинку (2 мерную матрицу) 16 на 16. Каждая клеточка на рисунке это индикатор, чем он больше тем цвет насыщенней и наоборот. Как я уже писал, тут важно понять в таком порядке все эти 256 индикаторов разместить, комбинаций как понимаете огромное. Я попробовал потестить пару десятков вариантов, случайным образом определяя порядок техиндикаторов на картинке. И даже как будто нашел 3-4 интересных сочетаний, но по большому счету все это… эээ… сомнительно.

Пока как то так

А кода на пайтон здесь https://github.com/Taram1980/finance_ML
 


★3
Мне кажется тема интересная.
Если б соображал в программировании — позанимался бы.
Рыл бы скорей всего в сторону поиска этим способом более формализованных паттернов. По крайней мере «сналету» мне так кажется.
Советовал бы не бросать исследования — это просто первый блин.
avatar

VladMih

Супер, спасибо за статью. Для меня сейчас очень релевантный контент. Только знакомлюсь с нейросетями, находить «собачек» на графике, конечно одна из очевидных мыслей, которые хочется протестить (по очевидности конкурирует разве что с RNN). 

 

Да, в CNN понятие «близость» играет роль, хотя возможно, оно нивелируется если юзать несколько этапов свертки и какой-то пулинг между ними, но не уверен. Так же была идея попробовать свертку большего размера, хотя возможно это будет актуальней для меня, я матрицы входные не делаю очень большими.

 

По мне тут ещё один актуальный вопрос, не знаю, кстати, почему он не затронут — разметка. Если просто размечать приращениями (там, через 10 свечей, например), то это то же самое что взять дата-сет со 1000 разных видов животных, а разметку сделать самец-самка). 

 

Отдельное спасибо за ссылку на гит-проекта). 

avatar

Replikant_mih

Replikant_mih, где то я читал статью что есть слой сетки которая учитывает координаты. но потом потерял текст больше найти не смог
avatar

Марат

Марат, Наверно можно делать аналог аугментации — увеличивать дата-сет за счет пересобранных по разному одних и тех же матриц. Хотя что-то вот сейчас подсказывает, что это будет плохой идеей)), но попробовать можно — не трудоемко.
avatar

Replikant_mih

Марат, почитайте статьи про NLP — там это широко используется, так как трансформеры так же ничего не знают о позиции, а позиции важны при анализе речи — ключевое слово positional encoding. Есть два основных варианта:

1. В качестве признака добавляют значении номера позиции пропущенное через embedding слой (редко используется) 
2. Формируют набор признаков Sin(номер позиции * k) для разных k
avatar

Михаил

Михаил, о точно, спасибо. а есть пример реализации в питоне?

avatar

Марат

Марат, https://pytorch.org/tutorials/beginner/transformer_tutorial.html
avatar

Михаил

Михаил, спасибо в kerase такого не видел
avatar

Марат

Марат, к сожалению, нет. Я перестал писать на keras, так как большинство ресечеров сейчас пишет на pytorch. Соответственно гораздо проще находить примеры на нем. 
avatar

Михаил

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

Vladimir Diaditchev

Мне вся идея пихать картинки в сети кажется какой-то странной. Почему просто не пихать последовательность цен Conv1D. 
avatar

Михаил

Михаил, потому что есть куча мануалов как обучать сверточные сети на картинках. В итоге даже звук преобразовывают в картинки, а потом героически их распознают
Александр Черников, каких-то суровых особенностей в обучении conv2d нет — обычный тренинг луп используется, мало чем отличающийся от обучения других сеток. 

Со звуком совсем особая история — одна секунда звука содержит почти сто тысяч значений, а анализируют записи длинной в несколько десятков секунд. По сути преобразование в картинку — это форма сжатия/понижения размерности. Для котировок такой проблемы нет. Ну и в принципе звук вполне анализируют с помощью conv1d — WaveNet, как вариант. 

avatar

Михаил

Михаил, ну так почитай про GramianAngularField, там больше информации записано, в том числе корреляция между членами ряда
avatar

Марат

Марат, как может быть больше быть записано информации, чем в исходном ряде на котором GramianAngularField считался? Это одно и достаточно странное преобразование.

Почему оно вдруг полезно для анализа котировок? Почему сеть, которая является универсальным апроксиматором, не может выучить это преобразование на исходном сигнале, если это преобразование достаточно полезно? Подскажите статьи, где эти темы раскрыты.
avatar

Михаил

Михаил, вообще я так же примерно думаю. есть в этом какое то извращение-взять цифры, превратить картинки, чтобы опять получить цифры. но про плюсы я читал, один из них это скорость. а так вроде что cnn что lstm добиваются одинаковых результатов. 
avatar

Марат

Михаил, что такого? есть feature engineering. я на примере RandoomForest могу точно сказать, что если засунуть в треню сырятину, получишь уныние, а если немножко поработать с данными, то получается очень даже интересно. а в теории и математике я слаб, я практик. и если поработав с данными я получу улучшение результата, я буду это использовать. а компетенции ответить на вопрос почему вместо жалаемого (сунул timeseries, картинку в нейросеть и вуаля) мы имеем что имеем, я не имею.
avatar

Марат

Михаил, https://www.quora.com/What-is-the-reason-for-applying-convolutional-neural-nets-to-time-series-instead-using-recurrent-neural-nets

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

Марат

Михаил, если вы набьете что то вроде gramian angular field for time series classification  много что вылезет
мне нравится вот
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. а иначе, использование нейросетей как его использую математики, кроме бреда ничего выдавать не будет
 
avatar

Марат

Очевидно, что на этом этапе человек сильнее т. н. машинного обучения. Если он не видит закономерности и простого логического обоснования под неё, то машина чем поможет? Она лишь оперирует набором таких же простых человеческих мыслей.
avatar

MS

Основное замечание: я бы начал с обоснования, почему TS может быть приведен к двумерной картинке и чем это полезно.
Еще одно: насколько я понимаю, чтобы получить предсказательную способность, надо привести изначальный ряд к стационарному, здесь же ничего похожего я не увидел 
avatar

дилетант иванов

Alexander Ostrovskiy, а при чем тут CNN и стационарность временного ряда?

 

avatar

Марат


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

....все тэги



2010-2020
UPDONW