Блог им. 3Qu
Вначале о грустном. Не понимая теорию нейросетей (НС) у вас вряд ли получится построить на ней ТС. Поэтому лучше для начала почитать теорию, например, Хайкин Саймон. «Нейронные сети. Полный курс». Книга уже достаточно старая и в ней нет новомодных веяний, но она дает базовые представления о НС.
И второе, мы будем далее для построения систем использовать пакет scikit-learn для Python. рекомендую ознакомиться. Есть и более продвинутые пакеты, скажем, TensorFlow и др., но их использовать мы не будем, и ограничимся более простым scikit-learn.
Теперь о том, чего здесь не будет. Здесь не будет теории НС, разве эпизодически и оч кратко. Здесь не будет описания пакетов Python, работы с графикой и пр. Обо всем этом вы можете прочесть в интернете, книгах, и документации Python.
В топике мы будем обсуждать только применение НС к ТС и их построению.
Так как тема достаточно велика, в один топик не влезет, сегодня мы займемся самыми общими вопросами. Следующая часть будет недели через две, раньше не получается.
Применением НС в ТС я заинтересовался года три назад. Интерес был достаточно абстрактным, и я эпизодически почитывал в инете сайты, типа, Хабр и прочую популярщину. Я ранее немного сталкивался с НС и МО, и, в общем, ничего нового это мне не дало, разве, посмотрел какие-то простые реально работающие экземплы, что, в общем тоже неплохо.
Потом нашел книгу Хайкина, и месяца три ее читал, поняв наконец, что и как делают нейросети, как это работает и как НС обучаются. Книга замечательная, но как применить это в ТС осталось загадкой.
Стал смотреть в инете, как люди применяют МО к рыночным данным. Подбираются некие предикторы, с помощью них строятся модели, выясняется, что модели ничего не дают, после чего выбираются другие предикторы. И так до бесконечности.
Теперь разберемся — что есть предиктор. Предиктор — это некая предобработка рыночных данных, а по простому, это всего навсего индикатор, пусть даже сложный, но все равно индикатор. Если мы вспомним, что нейрон НС представляет собой сумматор с коэффициентами, типа y = a0x1 + a1x2 +… + anxn, а выход нейрона нелинеен, т.к. на выходе стоит сигмоид или другая нелинейная функция, т.е. выход нейрона Y = Fnl(y), то совокупность таких нейронов вполне может при обучении самостоятельно построить любой даже очень сложный предиктор. Т.е. предикторы, как таковые, не нужны. Можно просто добавить к НС немного нейронов или слоев нейронов, и нейросеть прекрасно самостоятельно справится с построением предикторов.
Так родилась идея подавать на входы НС непосредственно значения ценового ряда.
Скажем, для обработки НС нам нужно n отсчетов истории. Формируем вектор C =[c0,c1,c2,....,cn] отсчетов, берем НС с n входами, и подаем на них наш вектор. Вроде все.
Однако не все Сегодня цена актива 100р, завтра 130р, послезавтра уже 200р. НС обученная на 100р не сможет адекватно реагировать на 130, а тем более на 200р. Это уже другой диапазон значений. Стало быть, не зависимо от цены актива, значения ценового ряда должны всегда находиться в одном диапазоне.
Делаем просто. Пусть c0 — текущая цена актива. Преобразуем наш вектор к виду: xi = (ci — c0)/c0, получим новый вектор X =[x0,x1,x2,.....xn], который мы и будем подавать на входы НС. Это всего навсего нормирование. Теперь все изменения цены лежат в одном диапазоне и считаются относительно текущего значения. Можно все значения нашего вектора умножить на какой либо постоянный коэффициент, чтобы привести его значения к динамическому диапазону нейрона. Вот теперь точно все!
Ан нет, опять не все. Допустим в ценовом ряду появилась «шпилька» — резкий выброс значения. Теперь на протяжение времени n эта шпилька будет попадать на входы нейронов и засвечивать их, примерно аналогично пересвету при фотографировании. С одной стороны, шпильку надо убрать, с другой стороны лучше бы оставить, причем, таким образом, чтобы шпилька лежала в динам диапазоне НС. Имхо, шпильки, да и вообще, выбросы, лучше ограничивать тем же сигмоидом, пропустив через него все компоненты вектора Х.
Вот теперь точно все. Мы знаем что и как подавать на входы НС. Правда, что с этим делать дальше пока неизвестно, и пока мы эти вопросы не решим к НС близко можно не подходить — без толку.
Кстати, во многих реальных системах (не ТС) это именно так прекрасно работает.
3Qu, конечно справятся, если обучить данных хватит. Только засада в том что нет столько данных, это фоток с котами можно нащёлкать сколько угодно, а на рынке данных только столько сколько есть, а относительно недавних и актуальных и того меньше.
Большая сетка многослойная просто радостно и легко это всё запомнит, а небольшая и немногослойная тоже попытается запомнить, только плохо ))
Про котов улыбнуло.))
У меня немного другой подход. Я не учу НС всякой ерунде, и потом не заставляю ее с ней работать. Т.е., предобработка все таки есть.) В итоге, либо НС можно упростить, либо научить большему за счет исключения из обучения и последующей работы всякой ахинеи.
Если НС решает конкретные задачи, то переусложнять ее нет необходимости. А подобные задачи в составе систем как раз хорошо решаются НС. Это их классическое применение.
ResNet50 — очень простая сеть по сегодняшним меркам, учится дома на GTX1080 и состоит из 50 слоев.
Учат в облаке, потому-что это часто дешевле арендовать компьютер под обучение, которое длится не так долго, чем покупать и постоянно держать свой комп.
Не стоит аренда компьютера миллионов долларов в месяц. Зайдите на Яндекс облако и посмотрите, сколько стоит аренда компьютера с Tesla v100 — 130 тыс рублей в месяц.
Но и последний важный момент, что количество слоев очень мало говорит, об времени обучения — кроме количества слоев играет роль архитектура и количество параметров и обучающих примеров. У меня сети глубокие, но достаточно легковесные до 1 млн параметров. В том же ResNet50 25 млн параметров.
Возражения были про ваши крайне далекие от реальности представления о сложности обучения глубоких сетей. Нет никакой технической проблемы обучить сеть глубиной в сотню слоев на вполне домашнем железе. Можно и часто даже нужно использовать облачные компы с мощными GPU и TPU, но для это не нужно миллионов долларов в месяц.
Будет ли из этого толк — сильно зависит от обучающего, как и при использовании любого другого метода. Нейронные сети совсем не панацея и не гарантирует толкового результата.
Создать не готов, так как не эксперт в ретейле. Обучить готов, если это не NLP на трансформерах.
Вот вам пример от очень известных людей в этой области
www.fast.ai/2018/08/10/fastai-diu-imagenet/
ResNet 50 учится за 18 минут на 16 серверах с 8 Теслами за 40 долларов.
Но на самом деле учить с нуля многие сетки не нужно, за счет transfer learning можно обучить ResNet 50 под свою задачу за несколько минут на консьюмерском GPU.
>>«Так родилась идея подавать на входы НС непосредственно значения ценового ряда.»
По-моему эта идея со старта у всех раждается), во влажных фантазиях когда трейдер видит какие нейросети умеют делать крутые штуки в разных областях, тут же возникает идея, а что если… подать на вход голые котировки).
Не знаю пока как нейросети (подозреваю, что так же), но другие алгоритмы ML вполне конкретно реагируют на качество входящего признакового пространства, качество в смысле насколько признаки сами по себе имеют предиктивную силу. Вообще предобработка данных и генерация более интересного признакового пространства — не рокет-саенс, но творческий процесс, а на результат способно повлиять драматически! Вот думаю, что с нейросетями все точно так же будет.
Могу высказать только чисто теоретические соображения — доходность скейлится пропорционально времени, а СКО, как корень времени, поэтому на более коротких интервалах соотношение шум к сигналу хуже примерно, как корень времени. Из этого я бы предположил, что данных нужно больше, чтобы чему-то научиться на минутках. Грубо если у меня завелось на 100 тыс, то тут бы я ожидал бы результата в районе 2 млн примеров.
Про долю положительных примеров ничего из общих соображений в голову не лезет, кроме обще известного, что сильный дисбаланс классов вызывает кучу проблем:)
Михаил, А, ну вообще регрессия в общем смысле видится уместней, конечно, просто у меня с регрессией не получилось вменяемых результатов, а с классификацией что-то есть. Правда я пока простые методы ML использую. Модели у меня на вскидку более менее одинаково хорошо обучаются на минутках и на дневках, видимо из-за описанного вами критерия про объем данных, но на маленьких TF кроме, как вы сказали, более высокой доли шума ещё более высокая доля издержек на трейд в средней сделке, поэтому там идти против ветра сложнее при прочих равных — ветер сильнее)).
В общем я пока на дневках тоже, в пнд. планирую попробовать первые сигналы моделей в бою начать торговать).
Подсмотреть реализацию можно здесь:
arxiv.org/abs/1906.05264
gluon-ts.mxnet.io
Но в любом случае сети не панацея, если работают более простые методы, то смысла лезть в сети нет. Область быстро развивается и надо прикладывать много усилий, чтобы следить за последними достижениями.
Тут скорее вопрос не принципиальной применимости, а реальных преимуществах и недостатках по сравнению с какими-то другими методами в конкретных условиях.
У сетей хватает недостатков. Им нужно гораздо больше данных и вычислительных мощностей. Специалисту, который их использует, нужны специальные знания об современных архитектурах — почему они возникли и какие проблемы решают, почему простые (неглубокие и полносвязный) сети не работают в реальных задачах и т.д. Так как область развивается на глазах, то таких специалистов немного.
Есть и преимущества — основное, что отсутсвует потребность в фичеинжиниринге.
Тут каждый сравнивает и выбирает.
Во всех областях (а их по сути две — компьютерное зрение и NLP), где сети достигли практических успехов не используется фичеинжиниринг и не используются полносвязные сети, а на вход подается сырой сигнал, характерный для области (трехмерный массив яркости для картинок высота х ширина х три цветовых канала и вектор с номерами слов).
В компьютерном зрении ключевая архитектура ResNet (есть другие варианты, но они по сути какие-то мелкие твики по верх идей ResNet). Тут можно глянуть достаточно подробный разбор, как устроен ResNet
towardsdatascience.com/an-overview-of-resnet-and-its-variants-5281e2f56035
В NLP — ключевые архитектуры основаны на сетях внимания/трансформерах.
medium.com/inside-machine-learning/what-is-a-transformer-d07dd1fbec04
jalammar.github.io/illustrated-transformer/
В конце стоит глобальный пулинг, который свертывает тензор до размера 1х1хчисло каналов на выходе (грубо тысяча). После которого стоит софтмакс слой, который собственно выдает решение сети. Стандартный сет, на котором сейчас учат ImageNet содержит 1000 классов предметов. Соответсвенно должно быть 1000 выходов с вероятностью принадлежности к классу.
То есть по мере погружения в глубь постепенно уменьшаются физические размеры тензора в итоге до 1х1, но растет число каналов с 3 до сотен или тысяч.
Это грубо — в ResNet присутствуют скип-соеденения для лучшего протекания градиентов сквозь десятки слоев и вместо сверток 3х3 используются трехслойные миниблоки из сверток 1х1+3х3+1х1 и везде используется мини-батч нормализация.
А по статье так и не понял как применять сие ноу-хау в трейдинге. Это сколько ж ценовых данных нужно скормить, чтобы хоть что-то похожее на реальную торговлю получилось на выходе? Или можно на генератору случайного блуждания научить?
Причем по факту опять пляшем от цены, жуя и пережевывая её вдоль и поперек, пытаясь найти… что? А, точно, Грааль.
была у меня дипломная работа — тоже нейросеть обучал, простую в 2 слоя всего. Обучал по результатам мат.модели одной. Скормил ей пару сотен расчетов с небольшим шагом изменений входных данных. Модель стала устойчиво показывать верный результат: такой же как выдавала сама мат.модель. Но как только входные результаты сущ. изменились, нейросеть стала выдавать ерунду сильно отличную от результата мат.модели эталона. Итого как в примере с котятами модель говорит что это «Котенок» видя белую рамку монитора, т.к. всех котят до этого видела на рабочих столах белых мониторов и обучалась на этом.
Имхо. Загоняя цену в качестве исходной информации мы заранее обречены на провал, т.к. цена это всегда следствие — результат а НС нужны причины для расчета связи между вход-выход.
НУ зачем вы это делаете?
Судя по тексту вы ооочень далеки от этого понимания. Вы пишете чтобы вам указали путь для дальнейшего движения?
В качестве топика — как пустить народ по ложному следу — он прекрасен.
На истории результаты были очень неплохие; в реале принцип прогнозирования — завтра будет то же что сегодня ))
На тренде такой подход работает, на флэте жестко сливает...
Что то типа как в 3д графике из полигонов треугольников строится любая фигура
Так вот, не возможно сделать ТС чисто на сетях. Необходимо применять смешанные подходы.
Никто же не учил самолеты летать нейронными сетями? А металлы смешивать, чтобы искать оптимальную прочность и гибкость? Ракеты запускать? Это всё уже давно описано формулами, и эти формулы работают, так надежно как молоток и гвозди. И они на 100% применимы на финансовых рынках.
«низкополигональным» рубленым он был потому что мощностей тогдашних компов не хватало на нормальный расчет поверхностей
?t=328
В любом случае, учили летать его с помощью нейросетки, и таки да, для этого даже оказались не нужны какие-то очень мощные компы, как мы видим и тогдашних хватило.
https://www.amazon.co.uk/Hands-Machine-Learning-Scikit-Learn-TensorFlow/dp/1492032646/ref=sr_1_1?crid=3BSP71VXVMZ6G&dchild=1&keywords=hands+on+machine+learning+with+scikit-learn+and+tensorflow+2&qid=1593162671&s=books&sprefix=machine+learning+and+te%2Cstripbooks%2C178&sr=1-1
а для тех кто не проходит нейронные сети в университетах вот эта книга просто золото, что бы понять что это вообще такое:
https://www.amazon.co.uk/Make-Your-Own-Neural-Network/dp/1530826608/ref=sr_1_1?crid=1WMN3Q9CCQW6B&dchild=1&keywords=neural+network&qid=1593162851&s=books&sprefix=neural+ne%2Cstripbooks%2C165&sr=1-1
ибо тут мне кажется допущена опечатка Данный пакет только ML реализует.
scikit-learn.org/stable/modules/classes.html#module-sklearn.neural_network
Вот простой пример: предположим, есть временной ряд ts=(1,4,7,2,5,8,3,6,9,4,7,10,5,8,11,6,9) Обучим НС на кусочке этой последовательности с 1 по 7 член ряда. Потом используем другую часть этой последовательности с 8 по 14 член, в качестве теста.
На графике показаны: ts – временной ряд.
P1 — single-step predictions, P2 — multi-step predictions, горизонт прогнозов 7
Выглядит красиво, а если продолжить с ценовым рядом, то НС анализирует ценовой ряд, строит какую- то модель, но для другого участка цены эта модель не будет подходить, там совершенно другая модель будет. В результате предсказания не сответствуют реальности. Правильно замечено: мусор на входе, мусор на выходе.
Если я правильно помню, вроде бы Михаил использует сети для долгосрочных прогнозов и отбора наилучших кандидатов.
Опять же, можно не только предсказывать будущую цену, можно кластерезировать или находить паттерны. Стоит так же покопать в обучение с подкреплением, но во всем этом как не крути мы всегда зависим от данных.