Марат
Марат личный блог
24 сентября 2020, 12:33

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
 


22 Комментария
  • VladMih
    24 сентября 2020, 13:21
    Мне кажется тема интересная.
    Если б соображал в программировании — позанимался бы.
    Рыл бы скорей всего в сторону поиска этим способом более формализованных паттернов. По крайней мере «сналету» мне так кажется.
    Советовал бы не бросать исследования — это просто первый блин.
  • Replikant_mih
    24 сентября 2020, 13:23

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

     

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

     

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

     

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

      • Replikant_mih
        24 сентября 2020, 16:52
        Марат, Наверно можно делать аналог аугментации — увеличивать дата-сет за счет пересобранных по разному одних и тех же матриц. Хотя что-то вот сейчас подсказывает, что это будет плохой идеей)), но попробовать можно — не трудоемко.
      • Михаил
        24 сентября 2020, 17:41
        Марат, почитайте статьи про NLP — там это широко используется, так как трансформеры так же ничего не знают о позиции, а позиции важны при анализе речи — ключевое слово positional encoding. Есть два основных варианта:

        1. В качестве признака добавляют значении номера позиции пропущенное через embedding слой (редко используется) 
        2. Формируют набор признаков Sin(номер позиции * k) для разных k
          • Михаил
            24 сентября 2020, 18:25
            Марат, https://pytorch.org/tutorials/beginner/transformer_tutorial.html
              • Михаил
                24 сентября 2020, 18:34
                Марат, к сожалению, нет. Я перестал писать на keras, так как большинство ресечеров сейчас пишет на pytorch. Соответственно гораздо проще находить примеры на нем. 
  • Vladimir Diaditchev
    24 сентября 2020, 13:27
    Преобразовывай цену хоть в картинки, хоть в скульптуры, хоть в многомерные пространства и даже в индикаторы теханализа, все это не предскажет будущего. Но почитать интересно было, сам иногда развлекаюсь но не Пайтоне а в R. Разницы никакой.  
  • Михаил
    24 сентября 2020, 14:09
    Мне вся идея пихать картинки в сети кажется какой-то странной. Почему просто не пихать последовательность цен Conv1D. 
    • Aleksandr Chernikov
      24 сентября 2020, 15:28
      Михаил, потому что есть куча мануалов как обучать сверточные сети на картинках. В итоге даже звук преобразовывают в картинки, а потом героически их распознают
      • Михаил
        24 сентября 2020, 15:53
        Александр Черников, каких-то суровых особенностей в обучении conv2d нет — обычный тренинг луп используется, мало чем отличающийся от обучения других сеток. 

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

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

        Почему оно вдруг полезно для анализа котировок? Почему сеть, которая является универсальным апроксиматором, не может выучить это преобразование на исходном сигнале, если это преобразование достаточно полезно? Подскажите статьи, где эти темы раскрыты.
  • MS
    24 сентября 2020, 14:53
    Очевидно, что на этом этапе человек сильнее т. н. машинного обучения. Если он не видит закономерности и простого логического обоснования под неё, то машина чем поможет? Она лишь оперирует набором таких же простых человеческих мыслей.
  • дилетант иванов
    24 сентября 2020, 14:54
    Основное замечание: я бы начал с обоснования, почему TS может быть приведен к двумерной картинке и чем это полезно.
    Еще одно: насколько я понимаю, чтобы получить предсказательную способность, надо привести изначальный ряд к стационарному, здесь же ничего похожего я не увидел 

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

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