3Qu
3Qu личный блог
25 апреля 2026, 14:40

Нейросеть в качестве стратегии. Очередная попытка.

Раз в несколько лет мне надоедает писать стратегии. Дело это, в общем, несложное, но, уж, очень долгое. А хочется, чтобы загрузил историю, прогнал, через нейросеть (НС) и пользуйся. Уже несколько раз пробовал — ничего путного из этого не получается, и, видимо, и не получится. Но, все же, раз в несколько лет бывают обострения, и, после длительного перерыва решил попробовать еще раз, на новом (для меня) софте — PyTorch, с новыми фишками и возможностями, которых не было у предыдущих софтов проектирования НС. Надежд, немного, но, как и в прошлые попытки, много времени на это тратить не собираюсь.
Естественно, побеседовал на эту тему с ИИ. Наконец, после нескольких продолжительных и безуспешных попыток, в результате совместного творчества пришли к структуре НС под задачу автоматического формирования стратегии. Требования были незамысловаты: если для реализации стратегии требуется где-то не более 10-20 if, и эти if прекрасно справляются со своими задачами, то и НС должна быть несложной. На входы же НС мы подаем сами цены, текущие параметры индикаторов — в общем, все то, что обсчитывает наша рабочая стратегия. Естественно, ожидаем, что НС сама построит стратегию из исходных данных, и результаты будут эквиваленты(а, желательно, и лучше) стратегии, написанной руками.
Ну, а чтобы ИИ не зацикливался на рынке и стандартных методах, которые пробуют все кому не лень, мы с ним занимались прогнозированием дождя на Марсе, о которых мы вообще ничего не знаем.) Вроде, их, дождей, на Марсе вообще не бывает.) Но мы их сделаем из рыночных данных. Было бы желание.)
В итоге, получилась вот такая конструкция НС:

class MarsRainNet(nn.Module):
    def __init__(self, input_size, hidden_size=64):
        super(MarsRainNet, self).__init__()
        # input_size — это общее кол-во фичей (датчики + производные)
        self.gru = nn.GRU(input_size, hidden_size, num_layers=2, 
                          batch_first=True, dropout=0.2)
        
        self.classifier = nn.Sequential(
            nn.Linear(hidden_size, 32),
            nn.ReLU(),
            nn.Dropout(0.2),
            nn.Linear(32, 1),
            nn.Sigmoid() # На выходе вероятность 0...1
        )
        
    def forward(self, x):
        # x shape: [batch, 24, features]
        # Нам нужен выход GRU только с последнего временного шага
        _, h_n = self.gru(x)
        # h_n имеет форму [num_layers, batch, hidden_size]
        # Берем последний слой:
        last_hidden = h_n[-1] 
        return self.classifier(last_hidden)
Собственно, остальное — обучение, работа и пр. — стандартные процедуры, не заслуживающие внимания.
Как видите, вот, собственно, и вся стратегия. Все получилось очень простенько, как и требовалось.
Теперь качаем историю, готовим данные для обучения и посмотрим, что в итоге получится из нашего безнадежного дела. Наверное, через пару недель получим результаты. Думаю, скорее, отрицательные, но чем черт не шутит.
Данная публикация является личным мнением автора. Мнение владельца сайта может не совпадать с мнением автора.
50 Комментариев
  • Михаил Михалев
    25 апреля 2026, 14:57
    Но, все же, раз в несколько лет бывают обострения
    Может просто один раз объяснить себе, почему не должно ничего получиться?:)
    На первый вгляд такая простая нейросеть, но она имеет чудовищную ёмкость и ей проще запомнить, чем создать внутри себя аналитические структуры… но неинструментированная нейросеть не может в принципе провести статистический аналилиз, сделать выводы, схитрить, провести бэктесты, измерить деградации стратегий и т.п.
  • Vkt
    25 апреля 2026, 14:58
    И что в итоге делает этот код, в чем идея не очень понятно.
    • Михаил Михалев
      25 апреля 2026, 15:02
      Vkt, Да это просто нейросеть, которая предсказывает вероятность дождя на Марсе:)
      • Vkt
        25 апреля 2026, 15:05
        Михаил Михалев, какой тип НС, какие и в каком виде ей нужны данные для предсказания дождя, на сколько дней/часов делает свое предсказание эта НС?
        • Михаил Михалев
          25 апреля 2026, 15:13
          Vkt, Там всё видно по коду: 2 слоя GRU, 2 полносвязных слоя. Всё остальное — только автор знает:)
  • Михаил
    25 апреля 2026, 15:24
    А чем какие тут новые фишки и возможности? Кажется это все давно устаревшие решения, которыми никто не пользуется
  • А. Г.
    25 апреля 2026, 15:44
    Цены лучше не подавать, а индикаторы перед подачей проверить на стационарность. Иначе на обучении получите «круто», а на реальной торговле ерунду. 
      • А. Г.
        25 апреля 2026, 16:15
        3Qu, на вход нейросетей нельзя подавать случайные нестационарные последовательности. А цены как раз такие. 
          • А. Г.
            25 апреля 2026, 16:27
            3Qu, подавать то можно, но то, что на выходе будет глупость — это доказано математиками ещё в 80-х годах прошлого века. 
              • А. Г.
                25 апреля 2026, 16:57
                3Qu, не читают они великих математиков 20 века, а занимаются прибылями от продаж :)

                Правда, я тоже только в 1995-м это нашёл, когда предложили нейросетями цены на фьючерсы прогнозировать.

                А в книге, про которую написали, хоть одну формулу в доказательстве этого утверждения видели? 
                • Михаил Михалев
                  25 апреля 2026, 16:56
                  А. Г., Да нейросеть вполне себе может подогнать найти преобразование, которое сделает распределение более стационарным. Но проблема в том, что это преобразование обычно весьма нетривиально и нейросети проще запомнить, чем обобщить, даже если всё обложить регуляризаторами.
                  • А. Г.
                    25 апреля 2026, 17:00
                    Михаил Михалев, вот о том и речь. Та теорема, о которой я написал и утверждает, что по любой формуле оптимизации вероятность правильного ответа равна вероятности выбора стационаризирующей функции «бросанием монетки».
                  • А. Г.
                    25 апреля 2026, 17:11
                    3Qu, ну дайте ссылку. Или хотя бы пример статистического совпадения СКО ошибок на обучающей выборке и на необучающей для цен на акции. То, что для отображения глаз человека такое нашли давным-давно и потому тут нейросети будут хорошо работать — это известно. 
                    • Jkrsss
                      25 апреля 2026, 18:50
                      А. Г., применив метод вложения такенса, обойдете классическое требование стационарности, заменив на более мягкое -существования устоичевых топологических признаков(неровностей, циклов). 
                      • А. Г.
                        25 апреля 2026, 20:05
                        Jkrsss, может быть. Я то говорю в том числе о своих экспериментах предсказания знака дневного изменения цены РАО ЕЭС на основе подачи на вход нейросети дневных приращений за 20 предыдущих дней цен РАО, Лукойла, Газпрома и S&P500. Эксперимент сразу показал, что СКО ошибки на обучающей выборке в разы меньше, чем на той, которую нейросеть не видела. А это означает, что её можно выбрасывать. 

                        Поэтому и стал копаться в научной литературе и нашёл то, что написал выше.

                        Я и в этом то обсуждении только и сказал, что на вход не надо подавать цены. А вот при подаче на вход нейросети каких-то индикаторов от них может что-то хорошее и получится. Это я не оспариваю.
                  • А. Г.
                    25 апреля 2026, 17:12
                    3Qu, ARIMA — это метод стационаризации для одного вида нестационарности и не более того. А этих видов нестационарности огромное количество. 
                      • Михаил Михалев
                        25 апреля 2026, 17:19
                        3Qu, Эта тварь имеет привычку подлизываться и выдавать ответ, который пользователь ожидает. Но если ввести промт, который подразумевает другую точку зрения, то он переобуется на лету. Попробуйте:

                        Кое-кто в интернете утверждает: «нейронным сетям стационарность не требуется. Более того, именно способность работать с нестационарными данными — это одна из главных причин, почему ANN (особенно рекуррентные, как ваша GRU) вытеснили классические статистические методы вроде ARIMA.»

                        Где он может быть не прав? Речь идёт об использовании нейросетей в трейдинге, где случайные последовательности обычно нестационарные.
                      • А. Г.
                        25 апреля 2026, 17:24
                        3Qu, зачем мне дискутировать с рекламщиком? 
  • Alexey Manin
    25 апреля 2026, 15:57

    А если так?

    Берем значение индикатора(ов) и скалируем его от -10 до 10.
    Строим гипотезу, что в следующие 15 мин.(час, день) будет падение если значение ниже 0 и рост если значение выше 0 (это основная стратегия, покупаем если выше 0, продаем если ниже 0).
    Прогоняем на истории основную стратегию и получаем сгруппированные данные статистик для значений от -10 до +10 по количеству положительных, отрицательных и суммарному pnl, при условии что следовали основной стратегии.
    Смотрим на pnl, если положительный то follow, если отрицательный то invert, относительно основной стратегии. Это уже правила, для основной стратегии.
    Прогоняем на истории основную стратегию с правилами. Строим график equity, если равномерный восходящий тренд, то гут. Можно попробовать прогнать на оставшейся части истории, которая не участвовала в определении правил.

    Там еще можно много чего прикрутить, типа проводить группировку в зависимости от времени торговой сессии и т.д.
    В итоге получаем, что подтвердилась или опроверглась гипотеза, не имеет значения )))

    • Михаил Михалев
      25 апреля 2026, 16:02
      Alexey Manin, 
      Берем значение индикатора(ов) и скалируем его от -10 до 10.
      Шкалирование по всей истории — это плохая идея. Это «подсмотреть в будущее»:)  Будет хорошо работать на истории, а на Out-Of-Sample — потерпит фиаско.
        • Михаил Михалев
          25 апреля 2026, 16:08
          3Qu, Шкалировать на истории — это методологически неверно, т.к. текущие значения будут зависеть от будущих.
            • Михаил Михалев
              25 апреля 2026, 16:18
              3Qu, Шкалировать можно, но только на тех данных, которые модель «уже видела», например скользящим окном. Я же написал изначально «Шкалирование по всей истории — это плохая идея.». по всей истории нельзя.
                • Михаил Михалев
                  25 апреля 2026, 16:43
                  3Qu, Таким образом в параметры шкалера попадут данные из будущего. Какие-нибудь стратегии работы в канале будует замечательно работать на истории, а в реальности слить. Масштаб должен быть статическим и не подогнанным под историю, например нормализация через tanh, у которого пределы от -1 до 1. Или (x-y)/(x+y) — тоже имеет пределы от -1 до 1. В крайнем случае использовать логарифмы, но это скользкая дорожка:)
                    • Михаил Михалев
                      25 апреля 2026, 16:50
                      3Qu, Это если ты работаешь например с физической величиной, где есть физический предел, например температура воды при нормальном давлении. Можно шкалировать какую-то статистическую характеристику, которая имеет математический предел.  А если так нормализовать, например, цену — это будет провал ( проверено:) ) 
                    • Иван Портной
                      25 апреля 2026, 19:45
                      3Qu, 
                      Пусть на истории данные были в диапазоне 0-100. Для согласования, делим все на 100 — получаем диапазон 0-1.
                      А как вы будете шкалировать на OOS? Вдруг на OOS цена будет больше 100, входные данные превысят 1, и всё сломается.
          • Alexey Manin
            25 апреля 2026, 16:14
            Михаил Михалев, Значит вам это методологически не подходит ) По вашему мнению, шкалирование вообще применять нельзя?

      • Alexey Manin
        25 апреля 2026, 16:07
        Михаил Михалев, на всей не надо, а только на той, что участвовала в определении правил, но тут конечно встает вопрос как совместить шкалы разных исторических отрезков, но на это есть ИИ.
        • Михаил Михалев
          25 апреля 2026, 16:12
          Alexey Manin, Можно только на прошлых данных, например расширяющимся или скользящим окном, но «заглядывать в будущее» категорически нельзя.
  • Alexey Manin
    25 апреля 2026, 16:23
    Вот как пример, веер МА, если все выстроились последовательно вверх значит +10, если все последовательно вниз — значит -10 ну и промежуточные варианты если не последовательно.
  • ZabanenZaPravdu
    25 апреля 2026, 17:54
    Люди, как вы не можете понять — случайность нельзя запрограммировать! Движения рынка всегда случайны именно из-за того, что в любой момент времени никто не знает куда двинется цена в следующий момент.
      • Михаил Михалев
        25 апреля 2026, 18:26
        3Qu, У меня в блоге последний пост немного затрагивает эту тему:

    • Евгений Гуревич
      25 апреля 2026, 18:34
      ZabanenZaPravdu, ну, Джим Саймонс с его «Renaissance Technologies» рубил бабло весьма успешно. Да и наш Алекс Герко в Лондоне тоже в хороших прибылях.

      Значит, таки, можно поймать удачу за хвост?
    • SergeyJu
      25 апреля 2026, 19:45
      ZabanenZaPravdu, случайности бывают разные. Возможно, в школе Вам это еще не объяснили.
  • Jkrsss
    25 апреля 2026, 19:05
     Прикольная тема, можно использовать в своих изысканиях. По стационарности я выше описал. Хотя я ценновой ряд напрямую не использую, а инструменты которые я использую уже стационарные. 
  • Sergey Grigoryev
    26 апреля 2026, 10:44
    Смешно. «Я взял школьный угольник и буду строить город!» 
    ЗЫ: все крупные игроки занимаются разработкой и обучением НС. У них огромные объемы данных, причём прилично размеченных. Такие нейронки они используют в качестве тестов :-)))) 

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

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