Обсуждение статьи "Нейросети в трейдинге: Пространственно-временная модель состояния для анализа финансовых данных (Окончание)"

 

Опубликована статья Нейросети в трейдинге: Пространственно-временная модель состояния для анализа финансовых данных (Окончание):

Представляем адаптацию фреймворк E-STMFlow — современное решение для построения автономных торговых систем. В статье завершаем реализацию подходов, предложенных авторами фреймворка. Результаты тестирования демонстрируют стабильный рост капитала, минимальные просадки и предсказуемое распределение рисков, подтверждая практическую эффективность подхода и открывая перспективы дальнейшей оптимизации стратегии.

Первый этап обучения осуществляется на исторических данных и напоминает репетицию начинающего трейдера на большой биржевой площадке. Представьте график EURUSD с Января 2024 по Июнь 2025 года как полотно, полное скрытых закономерностей. Модель, словно внимательный ученик, всматривается в каждую свечу, отслеживает объёмы, анализирует реакции рынка на индикаторы и выявляет закономерности. Реализованный нами энкодер фреймворка E-STMFlow позволяет одновременно разглядеть малейшие колебания цены и обозначить глобальные тренды. Он формирует информативное состояние для Актёра и Критика, объединяет признаки разных масштабов и обучается вместе с моделью. С каждым новым шагом модель постепенно превращается в уверенного трейдера, способного принимать самостоятельные решения.

Следующий этап — онлайн-обучение в тестере стратегий MetaTrader 5 — это уже не просто репетиция, а интенсивная отработка навыков. Здесь нет удобных исторических данных, каждая свеча — это живой импульс реального рынка. Модель реагирует мгновенно, оценивает шумовые колебания, приспосабливается к резким всплескам и корректирует действия при низкой ликвидности. CNeuronESTMEncoder синхронизирует работу всех блоков, объединяет признаки разных масштабов и продолжает обучение вместе с моделью, формируя гибкое и устойчивое поведение.

Завершающая проверка навыков проходит на данных с Июля по Октябрь2025 года. Здесь нет подсказок и возможности опереться на прошлое — только рынок и решения модели. Каждое движение тренирует способность сочетать признаки разного масштаба, прогнозировать реакции рынка и действовать с точностью. Результаты тестирования показывают, как реализованное решение превращает сложную архитектуру в слаженную, адаптивную и эффективную торговую систему.

Автор: Dmitriy Gizlyk

 
Исходная проблема

Запустил обучение E-STMFlow на 1 месяц данных (3 эпохи). Столкнулся с двумя критическими проблемами:
1. STFS error >1500 — модель не могла предсказывать будущие состояния рынка
2. Actor не открывал позиции (0 из 441 итераций) — выходы застряли около 0.5

Этап 1: Диагностика через логирование

Добавил комплексное логирование для понимания процесса обучения:
- Отслеживание ошибок STFS, Actor, Critic по эпохам
- Логирование действий Actor vs Oracul (эталонная стратегия)
- Мониторинг выходов каждого слоя нейросети
- Статистика по открытым позициям, лотам, TP/SL
- Детальный анализ latent-представлений Encoder

Результат: Выявил, что сырые признаки имели разные масштабы (цены ~1.13, объёмы ~1000+, индикаторы -100..+100), что вызывало коллапс STFS.

Этап 2: Нормализация признаков

Реализовал нормализацию всех входных признаков:

- (Close-Open), (High-Open), (Low-Open), MACD, Signal → делим на ATR
- Volume → делим на 100, ограничиваем до 10
- RSI → преобразуем в диапазон [-1, 1]
- CCI → делим на 100, ограничиваем до [-3, 3]
- ATR → нормализуем относительно цены закрытия

Результат: STFS error упал с ~1600 до 0.42 ✅

Этап 3: Проблема с Actor

Несмотря на исправление STFS, Actor всё ещё не открывал позиции. Глубокое логирование показало:
- VAE слой (Layer 5) коллапсировал: avg=0.5009, std=0.0022
- Выходы Actor: [0.4986, 0.4987, 0.5010, 0.5013, 0.4973, 0.4997]
- Разница между buy_lot и sell_lot = 0.0002 (нужно >0.01 для открытия позиции)

Этап 4: Замена VAE на SpikeConv

Проверил соответствие кода оригинальной статье E-STMFlow. Обнаружил, что VAE слой не является частью концепции E-STMFlow (статья описывает spiking механизмы). Заменил defNeuronVAEOCL на defNeuronSpikeConv.

Результат после 3 эпох:
- SpikeConv: avg=0.5885, std=0.0582 (в 25 раз лучше VAE!)
- Но Actor всё ещё не открывал позиции

Этап 5: Длительное обучение (прорыв!)

Запустил обучение на 30 эпох вместо 3. Результаты к Epoch 23-28:

✅ Actor заработал!
- Позиции: 3012 из 3012 (100% активность)
- Лоты: 0.0152-0.0154 (стабильные размеры)
- SpikeConv3: avg=0.9583, std=0.1382 (отличная вариативность)
- Actor Error: снизился с 0.2487 до 0.2216 (-2.85%)
- Raw Actor: [0.4485, 0.4450, 0.4279, 0.4637, 0.4589, 0.4416] — разброс достаточен для открытия позиций

Текущие проблемы (требуют дообучения):

1. Actor открывает только SELL (0 BUY позиций) — систематическое смещение выходов
2. Overtrading: Actor активен на 100% баров vs Oracul 32% — не научился "не торговать"

Ключевые выводы

1. Нормализация критична — без неё STFS коллапсирует
2. SpikeConv >> VAE — std увеличился с 0.002 до 0.138
3. Минимум 20-30 эпох обязательны — слои "размораживаются" постепенно
4. Логирование спасло проект — без детальной диагностики не нашли бы корень проблемы

---

Вопрос

Учитывая, что проблема была в недостаточном количестве эпох, а не в архитектуре SpikeConv:

Заработает ли оригинальный VAE слой при обучении на 30+ эпох?

Сравнение после 3 эпох:
- VAE: std=0.0022 (почти полный коллапс)
- SpikeConv: std=0.0582 (уже есть вариативность)

Возможно, VAE просто требует ещё больше эпох для "размораживания"? Или его архитектура фундаментально несовместима с задачей генерации торговых действий в E-STMFlow?

Стоит ли вернуть VAE и протестировать на 50-100 эпохах для чистоты эксперимента?
 
Vladimir Sanin #:

---

Вопрос

Учитывая, что проблема была в недостаточном количестве эпох, а не в архитектуре SpikeConv:

Заработает ли оригинальный VAE слой при обучении на 30+ эпох?

Сравнение после 3 эпох:
- VAE: std=0.0022 (почти полный коллапс)
- SpikeConv: std=0.0582 (уже есть вариативность)

Возможно, VAE просто требует ещё больше эпох для "размораживания"? Или его архитектура фундаментально несовместима с задачей генерации торговых действий в E-STMFlow?

Стоит ли вернуть VAE и протестировать на 50-100 эпохах для чистоты эксперимента?
Добрый вечер,
Обучение 3 и даже 30 эпох — это очень мало. В "...\Experts\NeuroNet_DNG\NeuroNet.mqh" задана скорость обучения
#define  lr                1.0e-6f  ///<learning rate
Использование VAE, в отличие от других типов нейронных слоев, позволяет выучить границы распределения значений, а не только среднее.
И да, в E-STMFlow не предусмотрен ни только VAE, но и Актер с Критиком, как таковые.
 
Dmitriy Gizlyk #:
Добрый вечер,
Обучение 3 и даже 30 эпох — это очень мало. В "...\Experts\NeuroNet_DNG\NeuroNet.mqh" задана скорость обучения
Использование VAE, в отличие от других типов нейронных слоев, позволяет выучить границы распределения значений, а не только среднее.
И да, в E-STMFlow не предусмотрен ни только VAE, но и Актер с Критиком, как таковые.
Очень рад вашей обратной связи. Я так полагаю и 100 эпох не даст качественного обучения. Но прикол в том, что даже на арендованном сервере с хорошим GPU процесс обучения идёт крайне медленно. Ни процессор, ни видеокарта не загружаются по полной, а только лишь процентов на 10 в среднем. Чтобы прогнать 1000+ эпох мне придётся на две недели минимум сервак такой гонять... Проблема в том, что код выполняется последовательно на CPU, несмотря на то, что OpenCL инициализирован.

Основные проблемы производительности:

1. Последовательная обработка на CPU вместо батчинга на GPU

Код обрабатывает каждую позицию по очереди в цикле. Для каждого бара выполняется:
  • feedForward для Encoder, STFS, Actor, Critic
  • backProp для каждой сети
  • Это ~1500 баров × 100 эпох = 150,000 итераций последовательно

2. Множественные синхронизации CPU-GPU

Каждый вызов feedForward/backProp требует передачи данных между CPU и GPU, что создает огромный оверхед.

3. Неэффективное использование BatchSize

BatchSize = 1e4 определен, но код обрабатывает по одному примеру за раз вместо батчей.

В итоге, я уже решился попробовать портировать вашу идею на Питон, а за основу беру исходник с оригинальной статьи и правлю его по вашей схеме. Посмотрим, что из этого получится. Или может вы подскажете какое-то решение производительности на MQL5? Или хотя бы направите?

 
Vladimir Sanin #:
Очень рад вашей обратной связи. Я так полагаю и 100 эпох не даст качественного обучения. Но прикол в том, что даже на арендованном сервере с хорошим GPU процесс обучения идёт крайне медленно. Ни процессор, ни видеокарта не загружаются по полной, а только лишь процентов на 10 в среднем. Чтобы прогнать 1000+ эпох мне придётся на две недели минимум сервак такой гонять... Проблема в том, что код выполняется последовательно на CPU, несмотря на то, что OpenCL инициализирован.

Основные проблемы производительности:

1. Последовательная обработка на CPU вместо батчинга на GPU

Код обрабатывает каждую позицию по очереди в цикле. Для каждого бара выполняется:
  • feedForward для Encoder, STFS, Actor, Critic
  • backProp для каждой сети
  • Это ~1500 баров × 100 эпох = 150,000 итераций последовательно

2. Множественные синхронизации CPU-GPU

Каждый вызов feedForward/backProp требует передачи данных между CPU и GPU, что создает огромный оверхед.

3. Неэффективное использование BatchSize

BatchSize = 1e4 определен, но код обрабатывает по одному примеру за раз вместо батчей.

В итоге, я уже решился попробовать портировать вашу идею на Питон, а за основу беру исходник с оригинальной статьи и правлю его по вашей схеме. Посмотрим, что из этого получится. Или может вы подскажете какое-то решение производительности на MQL5? Или хотя бы направите?

...Эх даа,на питоне бы это..