Chief In Quantitative Research
Chief In Quantitative Research личный блог
23 сентября 2019, 07:37

Нейронные сети для трейдеров

Искусственные нейронные сети (ИНС) — это вычислительные системы, основанные на биологических нейронных сетях, составляющих мозг животных.
Нейронные сети для трейдеров

Искусственная нейронная сеть позволяет моделировать некую нелинейную функцию с входными и выходными данными.
Нейронные сети для трейдеров

Нейронная сеть имеет:

· Входной слой, куда подаются входные параметры, ассоциирующиеся с состоянием каждого нейрона входного слоя. Например, для финансового аналитика это могут быть различные индикаторы — макроэкономические, фундаментальные, технически.

· Выходной слой, в котором вычисляются выходные параметры, ассоциирующиеся с состоянием каждого нейрона выходного слоя. Сюда поступает информация, которую мы хотели бы предсказать. Например, это может быть будущий возврат рынка в %, волатильность, ликвидность и т.д.

Нейросеть оперирует цифрами, поэтому любая входная и желаемая выходная информация должна быть оцифрована. Например, если это текст (новости), то нужно этот текст представить в виде массива цифр. Или, если мы пытаемся предсказать куда пойдёт рынок, вверх или вниз, то можно закодировать «вниз» нулём, а «вверх» единицей.

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

Каждый слой связан с соседними слоями с помощью весовых коэффициентов и коэффициентов смещения. Распространение данных от предыдущего слоя к следующему осуществляется по следующему правилу: z = Act(Wy + b), где y — вектор данных на предыдущем слое, z — вектор данных на следующем слое, W — матрица весов перехода от предыдущего слоя к следующему, b — вектор коэффициентов смещения. Act — функция активации, необходимая для устранения линейности. Функций активации существует большое количество. Например, это может быть сигмойда:
Нейронные сети для трейдеров

Обучение нейронной сети с учителем означает, что для заданного набора заранее известных входных и выходных данных, необходимо подобрать оптимальные коэффициенты W и b нейросети так, что квадратичная ошибка между точным выходным значением и выходным значением, полученным посредством распространения входных значений через нейронную сеть, стремилась к минимуму:

Нейронные сети для трейдеров

Например, вы хотите научить предсказывать по прошлой динамике цены акции и динамике индикаторов Simple Moving Average (SMA) и Relative Strength Index (RSI) будущее изменение цены этой акции в процентах. Мы формируем данные для обучения — для каждого исторического момента времени берём данные по индикаторам и цене акции. Это будут входные данные X для нейронной сети. И для каждого исторического момента времени берём будущее изменение цены акции (мы его точно знаем, т.к. речь идёт об исторических данных). Это будут выходные данные Y нейронной сети, которые мы хотим, чтобы нейросеть научилась предсказывать. Для этих данных X и Y и будут подбираться коэффициенты W и b.

Поиск оптимальных коэффициентов производится методом градиентного спуска с использованием метода обратного распространения ошибки:
Нейронные сети для трейдеров
где градиент функционала E для W выражается следующим образом:
Нейронные сети для трейдеров
И аналогично для b:
Нейронные сети для трейдеров

Хочу привести такую аналогию обучения нейронной сети для трейдеров. Надеюсь, она будет вам более понятной, если нет понимания математического аппарата. Представьте, что вы придумали стратегию, у которой очень и очень много параметров. Естественно, вам хотелось бы подобрать наиболее оптимальные параметры для стратегии (как коэффициенты W и b в случае нейросети). Что значит оптимальные? Такие, чтобы максимизировали прибыль или минимизировали просадку или максимизировали коэффициент Шарпа — смотря какой критерий выберете. Далее вы начинаете перебирать эти параметры (обучать, в случае нейронной сети). Можно перебирать с помощью «грубой силы» — т.е. перебирать все возможные комбинации параметров. Но если таких параметров очень много, то вам просто не хватит вычислительной мощности вашей машины и перебор займёт много времени. Поэтому придумано достаточно много оптимизационных алгоритмов. Например, метод градиентного спуска и его вариации или генетический алгоритм, чтобы производить поиск оптимальных параметров быстрее, жертвуя точностью.

У нейронной сети могут быть те же проблемы, которые возникают при оптимизации стратегий. Главная из них — переобучение. Когда всё работает очень хорошо на прошлых данных и плохо работает на данных out-of-sample. Про то, как минимизировать риск переобучения и правильно тестировать стратегии, думаю, поговорим в следующей статье.

В качестве примера, я создал полносвязанную нейронную сеть из входного, выходного и двух скрытых слоёв. Во входном слое я сгенерировал 45 нейронов — туда будем подавать дневные изменения цен S&P 500 за последние 15 дней, значение индикатора SMA за последние 15 дней и значение индикатора RSI за последние 15 дней. Выходной слой состоит из 1 нейрона и будет хранить предсказанное процентное изменение S&P 500 на следующий день. Скрытые слои содержат по 512 нейронов. Обучим нейронную сеть на данных с октября 2019 года по июнь 2019 г. и проверим точность обученной нейронной сети на данных с июля 2019 года по сентябрь 2019 г.

У меня получились следующие результаты. На графике ниже показан дневной возврат S&P 500 c октября 2019 года по июнь 2019 г. (тренировочные данные) — синяя кривая. Если кривая выше нуля, то это значит, что S&P 500 в этот день вырос. Если ниже — упал.
Нейронные сети для трейдеров
Также я наложил оранжевую кривую на синюю. Это предсказанный нейросетью возврат рынка. По прошлой динамике S&P 500, SMA и RSI за последние 15 дней для каждого исторического момента. Точность предсказания (вырастет S&P 500 на следующий день или упадёт) составила 93%. Но это тренировочные данные. На тестовых данных с июля 2019 г. по сентябрь 2019 г. результаты получились намного скромнее:
Нейронные сети для трейдеров
Точность предсказания составила лишь 49%. Нейронная сеть явно переобучена. Но, учитывая простоту модели, вряд ли можно было ожидать более приемлемый результат.

ЗАКЛЮЧЕНИЕ:

1. Искусственная нейронная сеть — это «чёрный ящик», который можно обучить по заданным входным данным выдавать нужные нам выходные данные (например, прогноз чего-либо).

2. С точки зрения трейдинга на вход нейронной сети можно подать различные индикаторы — макроэкономические, фундаментальные и технически и обучить её предсказывать будущий возврат рынка, волатильность, ликвидность, состояния и т.д.

3. Нейронная сеть, как и любая алгоритмическая стратегия трейдинга, может быть переобучена (переоптимизирована). За этим нужно следить как минимум путём деления данных на тренировочные и тестовые.

P.S.: Если Вам нравится подобный формат статей, подпишитесь на телеграм каналы
На русском: https://t-do.ru/extreme_trading_ru
На английском: https://t-do.ru/extreme_trading

29 Комментариев
  • Turbo Pascal
    23 сентября 2019, 08:16
    Ковырял тему. Пока толку не вышло.
  • ivanov petya
    23 сентября 2019, 10:24
    Я конечно профан в этом деле, но многое зависит от корректности входных данных и методах обучения…
      • ivanov petya
        23 сентября 2019, 12:36
        Chief In Quantitative Research, 

        В работе Financial Trading as a Game: A Deep Reinforcement Learning Approach предложили модель Марковского процесса принятия решений (MDP), подходящую для задачи финансовой торговли, с современным алгоритмом с глубокой рекуррентной Q-сетью (DRQN).

         Создатели обучили алгоритм торговле валютными парами и получили положительную статистику торгов.

        https://arxiv.org/abs/1807.02787

      • ivanov petya
        24 сентября 2019, 17:58
        Chief In Quantitative Research, про корректность-я имел ввиду набор данных, которые действительно влияют на ценообразование, а не перерисовывающие индикаторы)… например глубокое обучение с распознаванием паттернов графических фигур, к этому добавить паттерны ленты сделок, чтение новостных лент… такое можно сделать?? в итоге же получится самоторгующий ИИ… почему это сложно реализовать?? из-за требуемых мощностей для всех операций?
  • Glago
    23 сентября 2019, 10:26
    на основе какого сервиса строилась нейросеть или это собственная разработка?
  • SergeyJu
    23 сентября 2019, 10:33
    Переобучение при этом подходе неизбежно. 
  • chizhan
    23 сентября 2019, 10:39
    О хоспади, зачем это старье опять вытащили. Еще с 80-х годов с ними нянчатся, давно бы в форбсе 500 алготрейдеры первые места занимали.
    • (1:10) || algo
      23 сентября 2019, 12:37
      chizhan, как бы вряд ли одиночки это пишут, а компании в форбс мест не занимают.

      Компьютеры в подобных сферах давно головастее людей. В шахматы нет желания меня обыграть? Сам-то я не играю, но знаю несколько движков )
  • Old monk
    23 сентября 2019, 11:03
    Бредни.
  • Cristopher Robin
    23 сентября 2019, 12:42
    прикольный никнейм
  • Влад(и)Мир
    23 сентября 2019, 16:43
    Словосочетание 'точность предсказания' вообще не применимо к тренировочному набору данных.
  • Врач-бондиатОр
    23 сентября 2019, 20:56
    Пробовал когда-то играться с MLP... 
    Принцип ее прогнозирования — завтра будет тоже, что и вчера.
    На трендовых рынках работает :)
  • sis12qw
    23 сентября 2019, 21:59
    мне в качестве прогнозных моделей больше понравились самоорганизующиеся алгоритмы МГУА (GMDH). в них модель наращивается сама от простой к более сложной, в отличие от нейросетей.  Кстати, в качестве базовой модели МГУА можно использовать нейросети ))
    • Михаил
      23 сентября 2019, 22:51
      sis12qw, нейросеть тоже легко наращиваются от простых к ложным. Большинство архитектур могут быть масштабированы как минимум в ширину и в глубину, а многие по степени сложности элементарного блока и степени его параллельности. Можно начать с простого и наращивать при необходимости. Почти всегда так поступают или устраивают байесовскую оптимизацию для поиска оптимальной сложности архитектуры.
      • Михаил
        23 сентября 2019, 22:57
        Михаил, на примере рекуррентных сетей — можно менять число слоев, количество ячеек в слое, количество скрытых состояний в ячейке и сложность ячейки (обычная, gru, lstm + односторонняя или двусторонняя). 
  • Виталий Б.
    23 сентября 2019, 23:25

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

    Но идея хорошая (если только для роботов).

  • MS
    24 сентября 2019, 12:16
    Не ясно причём тут 'обучение'. Вычисление оптимальных параметров для прошлого — да, но обучение означает умение предсказывать оптимальные параметры для будущего. По крайней мере выдавать лучшие результаты по сравнению с уже известными методами.
    • sis12qw
      24 сентября 2019, 17:52
      MS, идея обучения в том, что мы предполагаем, что сеть найдет в прошлом закономерности и эти закономерности будут работать в будущем. Например мы учим сеть 2+2 4, 3+3 6, 5+8 13 — а потом подаём ей 100 и 200 а она в ответ 300. Хотя мы ей такой пример не показывали. Тогда считаем что ее научили сложению.
      • MS
        24 сентября 2019, 18:10
        sis12qw, так в статье результат вверх/вниз не получилось предсказывать.
        Точность 49% означает, что это равносильно подбрасыванию монетки.
        Отсюда и вопрос в чём заключалось обучение.
        • sis12qw
          24 сентября 2019, 19:59
          MS, понял, речь про конкретный пример — автор уже ответил — такая терминология в нейросетях: процесс настройки весовых коэффициентов нейронов называется «обучение».
  • Cyber
    03 ноября 2019, 22:59
    Щас бы на персептронах сетки писать для временных рядов.
  • Евгений Панин
    22 апреля 2020, 16:49
    Основная проблема в таких четках — автокорреляция. 
  • Виталий Шурупов
    02 августа 2020, 02:21
    1. «Обучим нейронную сеть на данных с октября 2019 года по июнь 2019 г.»

    т.е.обучающая выборка состоит из примерно 200 элементов (200 торговых дней), а количество нейронов в одном только скрытом слое 512 !!!!
    сеть тупо запомнила все входные данные и всё…
    ну ладно..
    с учетом данных индикаторов, пусть обучающее множество состоит из 600 элементо
    но это всё равно никак не меняет сути процесса....
    для такого количества обучающих примеров количество нейронов в скрытых слоях должно быть всего несколько единиц (2-6 шт. на вскидку)

    2. «Во входном слое я сгенерировал 45 нейронов — туда будем подавать дневные изменения цен S&P 500 за последние 15 дней, значение индикатора SMA за последние 15 дней и значение индикатора RSI за последние 15 дней.»

    входные данные должны быть линейно независимы !!
    иначе НС это быстро вычислит и результат обучения станет оочень грустным
    Значения индикаторов — это производные от цен, т.е. значения индикаторов и цены между собой увы линейно зависимы…

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

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