Блог им. 3Qu

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

    • 25 апреля 2026, 14:40
    • |
    • 3Qu
  • Еще

Раз в несколько лет мне надоедает писать стратегии. Дело это, в общем, несложное, но, уж, очень долгое. А хочется, чтобы загрузил историю, прогнал, через нейросеть (НС) и пользуйся. Уже несколько раз пробовал — ничего путного из этого не получается, и, видимо, и не получится. Но, все же, раз в несколько лет бывают обострения, и, после длительного перерыва решил попробовать еще раз, на новом (для меня) софте — 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)
Собственно, остальное — обучение, работа и пр. — стандартные процедуры, не заслуживающие внимания.
Как видите, вот, собственно, и вся стратегия. Все получилось очень простенько, как и требовалось.
Теперь качаем историю, готовим данные для обучения и посмотрим, что в итоге получится из нашего безнадежного дела. Наверное, через пару недель получим результаты. Думаю, скорее, отрицательные, но чем черт не шутит.
2.6К | ★1
50 комментариев
Но, все же, раз в несколько лет бывают обострения
Может просто один раз объяснить себе, почему не должно ничего получиться?:)
На первый вгляд такая простая нейросеть, но она имеет чудовищную ёмкость и ей проще запомнить, чем создать внутри себя аналитические структуры… но неинструментированная нейросеть не может в принципе провести статистический аналилиз, сделать выводы, схитрить, провести бэктесты, измерить деградации стратегий и т.п.
И что в итоге делает этот код, в чем идея не очень понятно.
avatar
Vkt, Да это просто нейросеть, которая предсказывает вероятность дождя на Марсе:)
Михаил Михалев, какой тип НС, какие и в каком виде ей нужны данные для предсказания дождя, на сколько дней/часов делает свое предсказание эта НС?
avatar
Vkt, Там всё видно по коду: 2 слоя GRU, 2 полносвязных слоя. Всё остальное — только автор знает:)
А чем какие тут новые фишки и возможности? Кажется это все давно устаревшие решения, которыми никто не пользуется
avatar
Цены лучше не подавать, а индикаторы перед подачей проверить на стационарность. Иначе на обучении получите «круто», а на реальной торговле ерунду. 
avatar
А. Г., цену подавать обязательно надо. Это дает положение и динамику цены относительно индикаторов. Несущественную информацию в идеале НС сама выкинет из рассмотрения.
avatar
3Qu, на вход нейросетей нельзя подавать случайные нестационарные последовательности. А цены как раз такие. 
avatar
А. Г., это заблуждение. НС работают с нестационарными последовательностями. Таких ограничений нет.
avatar
3Qu, подавать то можно, но то, что на выходе будет глупость — это доказано математиками ещё в 80-х годах прошлого века. 
avatar
А. Г., в книге начала 2000-х написано обратное.) Причем, явно.
avatar
3Qu, не читают они великих математиков 20 века, а занимаются прибылями от продаж :)

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

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

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

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

А. Г., вот, что ответил ИИ по поводу стационарности для НС

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

avatar
3Qu, ARIMA — это метод стационаризации для одного вида нестационарности и не более того. А этих видов нестационарности огромное количество. 
avatar
А. Г., это только пример от ИИ, не более того.
Ключевая фраза здесь:
нейронным сетям стационарность не требуется. © ИИ
Если есть желание, подискутируйте с ИИ. У него весь инет в качестве мозгов.)
avatar
3Qu, Эта тварь имеет привычку подлизываться и выдавать ответ, который пользователь ожидает. Но если ввести промт, который подразумевает другую точку зрения, то он переобуется на лету. Попробуйте:

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

Где он может быть не прав? Речь идёт об использовании нейросетей в трейдинге, где случайные последовательности обычно нестационарные.

Михаил Михалев, есть такое. Я в курсе. Но на первый вопрос он отвечает, что написано в источниках.
Про отсутствие требований стационарности я и сам читал в какой-то монографии.

avatar
3Qu, зачем мне дискутировать с рекламщиком? 
avatar

А если так?

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

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

avatar
Alexey Manin, 
Берем значение индикатора(ов) и скалируем его от -10 до 10.
Шкалирование по всей истории — это плохая идея. Это «подсмотреть в будущее»:)  Будет хорошо работать на истории, а на Out-Of-Sample — потерпит фиаско.
Михаил Михалев, не обязательно. Если реал в диапазоне, то работать будет штатно.
avatar
3Qu, Шкалировать на истории — это методологически неверно, т.к. текущие значения будут зависеть от будущих.
Михаил Михалев, это не неверно, а необходимо. Другой вопрос, что на тестах и реале шкалирование д.б. идентичным.
avatar
3Qu, Шкалировать можно, но только на тех данных, которые модель «уже видела», например скользящим окном. Я же написал изначально «Шкалирование по всей истории — это плохая идея.». по всей истории нельзя.
Михаил Михалев, 

как идет обучение и работа.

Перед обучением шкалируем всю историю, индикаторы и пр. Сохраняем параметры шкалера.
На тестах и реале шкалирум все подаваемые на НС данные шкалером с сохраненными на обучении параметрами.
Иначе, вообще ничего работать не будет.

avatar
3Qu, Таким образом в параметры шкалера попадут данные из будущего. Какие-нибудь стратегии работы в канале будует замечательно работать на истории, а в реальности слить. Масштаб должен быть статическим и не подогнанным под историю, например нормализация через tanh, у которого пределы от -1 до 1. Или (x-y)/(x+y) — тоже имеет пределы от -1 до 1. В крайнем случае использовать логарифмы, но это скользкая дорожка:)
Михаил Михалев, нет. Такая метода позволит данным оставаться в диапазоне обучения. Не более того. Если реал выйдет за шкалу, что он вполне может сделать, НС перестанет корректно работать.
Пусть на истории данные были в диапазоне 0-100. Для согласования, делим все на 100 — получаем диапазон 0-1.
Запоминаем эти 100, и теперь все данные, подаваемые на НС делим на 100, какими бы они не были.
avatar
3Qu, Это если ты работаешь например с физической величиной, где есть физический предел, например температура воды при нормальном давлении. Можно шкалировать какую-то статистическую характеристику, которая имеет математический предел.  А если так нормализовать, например, цену — это будет провал ( проверено:) ) 
3Qu, 
Пусть на истории данные были в диапазоне 0-100. Для согласования, делим все на 100 — получаем диапазон 0-1.
А как вы будете шкалировать на OOS? Вдруг на OOS цена будет больше 100, входные данные превысят 1, и всё сломается.
Иван Портной, скорее всего, сломается. Наверное, не сразу, но достаточно быстро.
avatar
Михаил Михалев, Значит вам это методологически не подходит ) По вашему мнению, шкалирование вообще применять нельзя?

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

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

Значит, таки, можно поймать удачу за хвост?
ZabanenZaPravdu, случайности бывают разные. Возможно, в школе Вам это еще не объяснили.
avatar
 Прикольная тема, можно использовать в своих изысканиях. По стационарности я выше описал. Хотя я ценновой ряд напрямую не использую, а инструменты которые я использую уже стационарные. 
avatar
Смешно. «Я взял школьный угольник и буду строить город!» 
ЗЫ: все крупные игроки занимаются разработкой и обучением НС. У них огромные объемы данных, причём прилично размеченных. Такие нейронки они используют в качестве тестов :-)))) 
avatar

Читайте на SMART-LAB:
Цены в России не растут вторую неделю подряд
С 14 по 20 апреля рост потребительских цен составил символическую 0,01% после нулевого изменения неделей ранее. Годовая инфляция на 20 апреля...
Пролив на цену не влияет
Продолжаем репортаж с прошедшего Биржевого форума, где вице-президент Норникеля Антон Берлин рассказал о влиянии текущей геополитической ситуации в...
Фото
«Селигдар» объявляет операционные результаты за 1 квартал 2026 года
На 13% вырос объем производства лигатурного золота — 957 кг ⬆️ На 10% вырос объем производства олова в концентрате — 921 тонна ⬆️ На 14%...
Фото
Обновляем стратегию 2026: год трудный, что изменилось, и в каком направлении мы движемся?
Квартальное обновление стратегии. Стратегия Mozgovik была представлена 17 января: https://smart-lab.ru/mobile/topic/1254157/ Что остается в...

теги блога 3Qu

....все тэги



UPDONW
Новый дизайн