preview
Нейросети в трейдинге: Поиск устойчивых закономерностей в разнородных рыночных данных (INFNet)

Нейросети в трейдинге: Поиск устойчивых закономерностей в разнородных рыночных данных (INFNet)

MetaTrader 5Торговые системы |
67 0
Dmitriy Gizlyk
Dmitriy Gizlyk

Введение

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

Дополнительная сложность связана с нестационарностью рыночной среды. Характер взаимосвязей между признаками изменяется в зависимости от рыночного режима: трендовые движения, флетовые участки, периоды повышенной и пониженной волатильности. В таких условиях модель, ориентированная на торговые решения, должна извлекать информативные закономерности и сохранять устойчивость к смене распределений данных.

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

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

На этом фоне особый интерес представляют архитектурные подходы, ориентированные на совместное моделирование разнородных признаков и многозадачных зависимостей. В работе «Aggregate and Broadcast: Scalable and Efficient Feature Interaction for Recommender Systems» предложен фреймворк Information Flow Network (INFNet), разработанный в контексте рекомендательных систем. Несмотря на прикладную область оригинального исследования, базовые принципы архитектуры обладают потенциалом для переноса в задачи анализа финансовых временных рядов.

INFNet формализует обработку разнородных признаков в виде структурированного взаимодействия различных типов исходных данных с учетом нескольких целевых задач. Вместо последовательного или изолированного рассмотрения признаков и задач используется согласованная схема их совместного учета в процессе формирования внутренних представлений модели. Это позволяет точнее согласовывать вклад различных источников информации в итоговое решение.

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

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

В статье рассматривается архитектура фреймворка INFNet в исходной постановке. Основное внимание уделяется принципам организации взаимодействия разнородных признаков и логике согласования информации в многозадачной среде. Проводится анализ ключевых свойств подхода с точки зрения использования в задачах финансового анализа. Такой разбор позволяет отделить универсальные элементы архитектуры от специфики рекомендательных систем и сформировать основу для дальнейшей адаптации, которая требует учета особенностей структуры временных рядов и характера рыночных сигналов.…



Алгоритм INFNet

Фреймворк INFNet ориентирован на моделирование взаимодействия разнородных признаков в условиях многозадачного обучения. Архитектура строится вокруг идеи структурированного представления исходных данных и контролируемого формирования зависимостей между ними.

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

Ключевой момент — модель не смешивает всё это в единое представление на старте. Напротив, сохраняется структура данных через два уровня представлений: исходные токены и агрегирующие узлы, которые авторы фреймворка называют hub-токенами.

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

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

Hub-токены — это управляемые точки концентрации информации, через которые проходит взаимодействие. Они позволяют модели сжать пространство признаков за счёт переорганизации структуры.

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

С поведенческими последовательностями подход другой. Здесь важно сохранить временную структуру. Каждый элемент последовательности дополняется позиционной и временной информацией, что позволяет учитывать не только порядок событий, но и интервалы между ними. После этого для каждого типа поведения формируется собственный hub-токен. В финансовом контексте это выглядит как выделение отдельных потоков смысла: ценовая динамика, объемная активность, волатильность. Каждый такой поток агрегируется в свой прототип, отражающий текущее состояние соответствующего аспекта рынка.

Это решение выглядит простым, но даёт важный эффект: модель не теряет различия между типами сигналов. Цена и объем не смешиваются в один вектор — они взаимодействуют, но сохраняют свою семантику.

Группа задач обрабатывается по иной логике. Здесь исходные токены напрямую соответствуют целевым функциям. В торговом приложении это могут быть, например, сигналы входа, фильтры, оценка вероятности достижения тейк-профита. Дополнительно вводятся общие hub-токены, которые аккумулируют информацию, разделяемую между задачами. Это позволяет модели учитывать пересечения: например, те же признаки могут быть важны как для входа в позицию, так и для оценки риска.

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

Если посмотреть на всю схему целиком, становится понятна логика архитектуры. Исходные токены отвечают за сохранение деталей. Hub-токены — за управляемое сжатие и организацию взаимодействий. При этом структура задаётся заранее: разные типы данных обрабатываются по-разному, а не через универсальный механизм.

Для практического трейдера здесь есть важный вывод. Модель изначально строится так, чтобы не терять структуру рынка и не смешивать сигналы раньше времени. При этом она остаётся вычислительно управляемой за счёт ограничения числа взаимодействий через hub-представления. Это создаёт основу для работы с длинными временными окнами и разнородными признаками без резкого роста сложности.

Ключевой элемент архитектуры — блоку INFNet, который задаёт логику движения информации внутри модели. Именно здесь достигается одновременно выразительность и контролируемая вычислительная сложность.

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

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

Механически это реализуется через Cross-Attention. Каждый набор hub-токенов независимо обращается к трём источникам информации: своим исходным токенам, токенам других групп и токенам задач. Таким образом формируется три проекции одного состояния данных.

Представим, что агрегированное представление рыночного контекста (categorical hub) последовательно смотрит:

  • на собственные признаки состояния рынка,
  • на динамику цены и объемов,
  • на целевые задачи, которые стоят перед моделью.

В результате формируется несколько взглядов на рынок:

  • внутренний (что происходит внутри текущего контекста),
  • временной (как развивается динамика),
  • целевой (что важно с точки зрения задачи).

Эти представления не смешиваются напрямую. Сначала они объединяются через обучаемую проекцию, после чего обновляют соответствующий hub-токен. Таким образом каждый hub постепенно накапливает согласованное представление, учитывающее разные источники информации.

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

С точки зрения вычислений здесь происходит принципиальный сдвиг. В классическом Self-Attention каждый токен взаимодействует со всеми, что приводит к квадратичной сложности. В INFNet взаимодействие ограничено% только hub-токены обращаются ко всем данным. Поскольку их количество фиксировано и значительно меньше общего числа токенов, то общая сложность становится линейной по размеру входа.

Это означает вполне конкретную вещь. Модель может работать с длинными временными окнами и большим числом признаков без резкого роста вычислительных затрат. В контексте рынка это даёт возможность учитывать более протяжённую историю и более широкий набор сигналов, не жертвуя производительностью.

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

Таким образом, первая фаза блока INFNet отвечает за формирование глобального понимания состояния данных. Задаёт основу для последующей детализации и обеспечивает масштабируемость архитектуры при работе с большими объемами информации.

Вторая фаза блока INFNet логически завершает цикл обработки информации. Здесь глобальный контекст возвращается к исходным данным и начинает влиять на их локальные представления. Это ключевой момент: модель не ограничивается построением общей картины, а использует её для уточнения каждого отдельного элемента.

После этапа агрегации hub-токены уже содержат согласованное представление данных с учётом разных типов признаков и задач. Теперь задача — передать эту информацию обратно на уровень исходных токенов. Для этого в архитектуре используется единый механизм — Broadcast Gated Unit (BGU).

По своей логике BGU реализует аффинное преобразование признаков. Каждый исходный токен переопределяется с учётом глобального контекста. В отличие от обычных Gating-механизмов, которые могут только усиливать или ослаблять сигнал, здесь добавляется сдвиг. Это позволяет фильтровать информацию и вводить новые смысловые компоненты.

Сначала hub-токены преобразуются в компактное глобальное описание группы. Их представления разворачиваются и проходят через MLP, в результате чего формируются два вектора: коэффициенты масштабирования и коэффициенты сдвига. Эти векторы имеют ту же размерность, что и каналы исходных токенов, и по сути задают, какие признаки следует усилить, а какие — скорректировать.

Далее происходит сама операция распространения. Полученные параметры применяются ко всем токенам внутри группы. Это важный момент: один и тот же глобальный контекст влияет на каждый элемент, но делает это на уровне каналов признаков, а не через попарные взаимодействия. Таким образом достигается единообразная корректировка представлений без роста вычислительной сложности.

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

Обновление токенов происходит по остаточному принципу. К исходному представлению добавляется результат BGU-преобразования, после чего применяется нормализация. Такой подход обеспечивает стабильность обучения и позволяет постепенно уточнять представления от слоя к слою.

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

В результате весь блок INFNet реализует замкнутый цикл обработки:

  • сначала формируется глобальный контекст,
  • затем он используется для уточнения локальных представлений.

Такая схема позволяет одновременно учитывать общую структуру данных и сохранять детализацию на уровне отдельных наблюдений.

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

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

Авторская визуализация фреймворка INFNet



Реализация средствами MQL5

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

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

Категориальные признаки в финансовых задачах выходят за рамки классического описания объекта и фактически формируют контекст принятия решений. В их состав включаются параметры состояния счета, характеристики открытых позиций и признаки временных рамок. Состояние счета отражает текущие ограничения стратегии: доступный капитал, уровень загрузки и просадку. Открытые позиции задают текущую фазу торгового процесса — отсутствие позиции, удержание или сопровождение. Временные признаки описывают структуру торговой активности, связанную с сессиями, днями недели и внутридневной динамикой ликвидности.

Такое объединение формирует целостное описание среды, в которой принимается решение. Один и тот же рыночный сигнал в разных состояниях счета или позиции может иметь различное значение. Следовательно, без учета контекста интерпретация данных будет неполной.

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

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

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

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

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

Такое представление позволяет объединить в одной модели различные уровни принятия решений: от анализа последовательных данных до учета состояния системы и глобальных ограничений. В результате формируется единое пространство, в котором данные и задачи взаимодействуют на равных правах, создавая основу для дальнейшей реализации и адаптации архитектуры к практическим торговым системам.

Здесь важно зафиксировать преемственность. Мы не начинаем реализацию с нуля и не переносим абстрактную архитектуру в пустую среду. В процессе работы над предыдущими проектами был сформирован набор компонентов, которые решают часть задач, заложенных в INFNet, пусть и в иной постановке.

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

Реализован объект CNeuronScenariosToken, который формирует сценарные представления на основе анализа последовательности. Использование двумерной модели пространства состояний позволяет выявлять устойчивые комбинации признаков и интерпретировать их как отдельные сценарии поведения рынка.

Однако авторы фреймворка предлагают использовать различные подходы для генерации сценарных представлений отдельных модальностей. Последовательные данные, контекст и сценарии обрабатываются независимыми компонентами. С точки зрения архитектуры INFNet это создаёт разрыв: отсутствует единая точка, в которой формируются согласованные представления для всех типов данных и задач.

Для устранения этого разрыва вводим обобщающий объект CNeuronINFNetScenarios, объединяющий генерацию сценарных токенов различных типов в рамках единого процесса.

class CNeuronINFNetScenarios  :  public CNeuronBaseOCL
  {
protected:
   CLayer            cSequence;
   CLayer            cContext;
   CLayer            cGlobal;
   //---
   virtual bool      feedForward(CNeuronBaseOCL *NeuronOCL) override;
   virtual bool      updateInputWeights(CNeuronBaseOCL *NeuronOCL) override;
   virtual bool      calcInputGradients(CNeuronBaseOCL *NeuronOCL) override;

public:
                     CNeuronINFNetScenarios(void) {};
                    ~CNeuronINFNetScenarios(void) {};
   //---
   virtual bool      Init(uint numOutputs, uint myIndex, COpenCLMy *open_cl,
                          uint window_in, uint &fields[], uint window_out,
                          uint embed_size, uint candidates, uint topK,
                          ENUM_OPTIMIZATION optimization_type, uint batch);
   //---
   virtual bool      Save(const int file_handle) override;
   virtual bool      Load(const int file_handle) override;
   //---
   virtual int       Type(void) override const  {  return defNeuronINFNetScenarios; }
   virtual void      SetOpenCL(COpenCLMy *obj) override;
   virtual void      TrainMode(bool flag) override;
   virtual void      SetActivationFunction(ENUM_ACTIVATION value) override {  activation = None; }

   //---
   virtual bool      WeightsUpdate(CNeuronBaseOCL *source, float tau) override;
   virtual bool      Clear(void) override;
  };

Структура нового объекта отражает декомпозицию задач, рассмотренную ранее:

  • cSequence — обработка временных последовательностей,
  • cContext — обработка контекстных признаков,
  • cGlobal — формирование глобальных сценариев и ограничений.

Ключевая особенность заключается в том, что все три компонента работают в рамках одного вычислительного графа и формируют согласованные embedding-представления. Это позволяет перейти от набора разрозненных признаков и сценариев к структурированному пространству токенов, совместимому с дальнейшей реализацией INFNet-блоков.

Метод инициализации фактически определяет структуру формирования эмбеддингов сценариев для всех типов данных. На этом этапе фиксируется, какие источники информации будут использоваться, как они будут организованы и в каком виде попадут в модель.

bool CNeuronINFNetScenarios::Init(uint numOutputs, uint myIndex, COpenCLMy *open_cl,
                                  uint window_in, uint &fields[], uint window_out,
                                  uint embed_size, uint candidates, uint topK,
                                  ENUM_OPTIMIZATION optimization_type, uint batch)
  {
//--- Fields require [Sequence, Context, Global]
   if(fields.Size() < 3)
      ReturnFalse;
   uint fields_total = 0;
   for(int i = 0; i < 3; i++)
     {
      if(fields[i] <= 0)
         ReturnFalse;
      fields_total += fields[i];
     }
   if(!CNeuronBaseOCL::Init(numOutputs, myIndex, open_cl, fields_total * window_out, optimization_type, batch))
      ReturnFalse;

Первое, на что стоит обратить внимание — это параметр fields. Он задаёт разбиение данных на три группы: последовательные, контекстные и глобальные признаки. Проверка на наличие трёх компонент не случайна. Изначально предполагается, что решение формируется на пересечении:

  • динамики рынка (Sequence),
  • состояния системы (Context),
  • глобальных ограничений и режимов (Global).

Таким образом, уже на уровне инициализации задаётся многослойная структура данных, соответствующая реальной логике торговли.

Далее суммируется общее количество сценариев, которое с учётом размерности вектора описания одного сценария определяет матрицу результатов. Здесь фиксируется размер пространства, в котором будут формироваться итоговые представления.

После базовой инициализации происходит раздельная настройка трёх подсистем: cSequence, cContext и cGlobal. Несмотря на общую структуру, каждая из них реализует собственную логику обработки.

В блоке последовательностей сначала создаётся базовый нейрон, который выполняет роль буфера исходных данных. Он получает на вход развёрнутую временную последовательность.

   cSequence.Clear();
   cContext.Clear();
   cGlobal.Clear();
   cSequence.SetOpenCL(OpenCL);
   cContext.SetOpenCL(OpenCL);
   cGlobal.SetOpenCL(OpenCL);
   uint index = 0;
//--- Sequence
     {
      CNeuronBaseOCL* neuron = new CNeuronBaseOCL();
      if(!neuron ||
         !neuron.Init(0, index, OpenCL, window_in * fields[0], optimization, iBatch) ||
         !cSequence.Add(neuron))
         DeleteObjAndFalse(neuron);
      neuron.SetActivationFunction(None);

Далее подключается объект CNeuronScenariosToken, который преобразует эту последовательность в набор сценарных представлений.

      index++;
      CNeuronScenariosToken* scen = new CNeuronScenariosToken();
      if(!scen ||
         !scen.Init(0, index, OpenCL, window_in, fields[0], window_out, fields[0],
                            embed_size, candidates, topK, optimization, iBatch) ||
         !cSequence.Add(scen))
         DeleteObjAndFalse(scen);
     }

Здесь происходит ключевая операция — переход от сырых временных рядов к структурированным сценариям, отражающим поведение рынка.

Контекстный блок не ограничивается построением embedding-представлений. В отличие от последовательного блока, где основной акцент сделан на извлечении сценариев из временной динамики, здесь реализована более сложная схема обработки, ориентированная на выявление устойчивых конфигураций состояния системы.

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

//--- Context
     {
      index++;
      CNeuronBaseOCL* neuron = new CNeuronBaseOCL();
      if(!neuron ||
         !neuron.Init(0, index, OpenCL, window_in * fields[1], optimization, iBatch) ||
         !cContext.Add(neuron))
         DeleteObjAndFalse(neuron);
      neuron.SetActivationFunction(None);

Далее применяется объект CNeuronFieldPatternEmbedding. Его роль — проекция признаков в embedding-пространство и выявление устойчивых паттернов в комбинациях контекстных данных. Важно, что параметры инициализации здесь отличаются от последовательного блока. Используется половинное окно результатов, что фактически задаёт сглаживание и уменьшение чувствительности к локальным флуктуациям. Контекст не должен дёргаться на каждом баре — он должен отражать устойчивое состояние.

      index++;
      CNeuronFieldPatternEmbedding* scen = new CNeuronFieldPatternEmbedding();
      if(!scen ||
         !scen.Init(fields[1]*window_out, index, OpenCL, window_in, fields[1], (window_out+1)/2,
                                                      candidates, topK, optimization, iBatch) ||
         !cContext.Add(scen))
         DeleteObjAndFalse(scen);

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

      CNeuronBaseOCL* mix=new CNeuronBaseOCL();
      if(!mix ||
         !mix.Init(0,index,OpenCL,window_out*fields[1],optimization,iBatch) ||
         !cContext.Add(mix))
        DeleteObjAndFalse(mix);
      mix.SetActivationFunction(None);
     }

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

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

//--- Global
     {
      index++;
      CFieldAwareParams* scen = new CFieldAwareParams();
      if(!scen ||
         !scen.Init(0, index, OpenCL, window_out, fields[2], embed_size, candidates, topK, optimization, iBatch) ||
         !cGlobal.Add(scen))
         DeleteObjAndFalse(scen);
      scen.SetActivationFunction(None);
     }
//---
   return true;
  }

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

Метод прямого прохода реализует согласованную обработку трёх типов данных с последующим объединением их в единое представление. Его логика отражает переход от разрозненных источников информации к структурированному набору токенов, готовому для дальнейшего взаимодействия.

bool CNeuronINFNetScenarios::feedForward(CNeuronBaseOCL *NeuronOCL)
  {
   if(!NeuronOCL)
      ReturnFalse;
//---
   CNeuronBaseOCL* sequence = cSequence[0];
   CNeuronBaseOCL* context = cContext[0];
   CNeuronBaseOCL* global = NULL;
//---
   if(!sequence || !context ||
      !DeConcat(sequence.getOutput(), context.getOutput(), NeuronOCL.getOutput(),
                sequence.Neurons(), context.Neurons(), 1))
      ReturnFalse;

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

Далее начинается независимая обработка последовательного и контекстного блоков. Последовательный поток проходит через стек cSequence. Здесь каждый слой последовательно преобразует представление токенов в сценарные эмбеддинги.

//--- Sequemce
   for(int i = 1; i < cSequence.Total(); i++)
     {
      sequence = cSequence[i];
      if(!sequence ||
         !sequence.FeedForward(cSequence[i - 1]))
         ReturnFalse;
     }

Контекстный поток обрабатывается аналогично через cContext, но с иным смыслом.

//--- Contest
   for(int i = 1; i < cContext.Total(); i++)
     {
      context = cContext[i];
      if(!context ||
         !context.FeedForward(cContext[i - 1]))
         ReturnFalse;
     }

Если последовательности отвечают на вопрос: что происходит на рынке? — То контекст отвечает на вопрос в каких условиях принимается решение? 

После прохождения всех слоёв формируется согласованное представление состояния торговой системы.

Глобальный блок обрабатывается отдельно и имеет важное отличие. В режиме обучения он пересчитывается на каждом проходе, что позволяет адаптировать глобальные параметры и сценарии.

//--- Global
   if(bTrain)
     {
      for(int i = 0; i < cGlobal.Total(); i++)
        {
         global = cGlobal[i];
         if(!global ||
            !global.FeedForward((i==0 ? NeuronOCL : cGlobal[i - 1])))
            ReturnFalse;
        }
     }

В режиме инференса используется последнее сохранённое состояние.

   else
     {
      global = cGlobal[-1];
      if(!global)
         ReturnFalse;
     }

Это принципиальный момент: глобальные параметры задают устойчивый режим работы модели.

Такое разделение режимов отражает практическую логику торговли:

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

Финальный этап — объединение всех трёх потоков.

//--- Concatenate
   if(!Concat(sequence.getOutput(), context.getOutput(), global.getOutput(), Output,
              sequence.Neurons(), context.Neurons(), global.Neurons(), 1))
      ReturnFalse;
//---
   return true;
  }

В результате формируется единый тензор представлений, включающий:

  • сценарии поведения рынка (sequence),
  • состояние системы (context),
  • глобальные ограничения и режимы (global).

Это уже структурированные токены, приведённые к единому embedding-пространству.

Такой подход позволяет сохранить структурную независимость различных типов данных и одновременно обеспечить их согласованное использование в рамках единого embedding-пространства.

Объект CNeuronINFNetScenarios выступает связующим звеном между теоретической архитектурой INFNet и практической реализацией. Он объединяет генерацию сценарных токенов различных типов и формирует единое пространство представлений, которое в дальнейшем будет использоваться для построения механизмов взаимодействия и распространения информации внутри модели.



Заключение

Мы познакомились с фреймворком INFNet, предложенным в работе «Aggregate and Broadcast: Scalable and Efficient Feature Interaction for Recommender Systems», и последовательно рассмотрели его архитектуру, преимущества и потенциальную применимость в финансовых задачах.

Главные преимущества предложенного подхода связаны с линейной сложностью по длине последовательности, сохранением структурной целостности признаков и возможностью Task-Aware обработки. Это делает фреймворк особенно интересным для практических систем, где важно работать с длинными последовательностями, не теряя вычислительной устойчивости и не смешивая сигналы преждевременно.

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

В статье сделан первый шаг от оригинальной архитектуры к прикладной реализации средствами MQL5. Сформирована основа для дальнейшей работы. В следующей публикации будет продолжена адаптация фреймворка с акцентом на реализацию механизма взаимодействия токенов и практическое применение подхода Aggregate-and-Broadcast в задачах анализа финансовых рынков.


Ссылки


Программы, используемые в статье

#ИмяТипОписание
1Study.mq5СоветникСоветник офлайн-обучения моделей
2StudyOnline.mq5 Советник Советник онлайн-обучения моделей
3Test.mq5СоветникСоветник для тестирования модели
4Trajectory.mqhБиблиотека классаСтруктура описания состояния системы и архитектуры моделей
5NeuroNet.mqhБиблиотека классаБиблиотека классов для создания нейронной сети
6NeuroNet.clБиблиотекаБиблиотека кода OpenCL-программы

Проект представлен на forge.mql5.io/dng.

Прикрепленные файлы |
MQL5.zip (3716.1 KB)
Тестовые чемпионы против реальных задач оптимизации Тестовые чемпионы против реальных задач оптимизации
Мы анализируем, почему рейтинги могут быть завышены из‑за совпадения траекторий алгоритмов с диагоналями бенчмарков, и дополняем методику тестирования требованием удалять глобальный экстремум от диагоналей. Обновляем Forest и Megacity, проводим RAW‑верификацию и калибровку через VerifyExtremes.mq5. Падение результатов HHO и DOAm служит практическим индикатором ложных лидеров.
От начального до среднего уровня: Указатель на функцию От начального до среднего уровня: Указатель на функцию
Вы, вероятно, уже слышали о указателях, когда речь заходит о программировании. А вы знали, что мы можем использовать данные такого типа здесь, в MQL5? Это, конечно, должно быть сделано так, чтобы мы не теряли контроль и не вызывали странного поведения программы во время её выполнения. Тем не менее, поскольку это ресурс очень специфического назначения и ориентированный на определенные виды деятельности, редко можно услышать, чтобы кто-то обсуждал, что такое указатель и как его использовать в MQL5.
Неопределённость как модель (Часть 5): Основы регрессии Неопределённость как модель (Часть 5): Основы регрессии
Практическое введение в регрессионные модели временных рядов: регрессия на константу и парная регрессия при детерминированном, экзогенном и эндогенном регрессорах. Описаны ключевые шаги диагностики, включая анализ остатков и проверку гипотез, необходимые для обоснованных торговых решений. Приложены MQL5‑скрипты для MetaTrader 5, реализующие тесты и графики на реальных данных.
Статистический арбитраж с использованием коинтегрированных акций (Часть 4): Обновление параметров модели в реальном времени Статистический арбитраж с использованием коинтегрированных акций (Часть 4): Обновление параметров модели в реальном времени
В данной статье описывается простой, но комплексный алгоритм статистического арбитража для торговли корзиной коинтегрированных акций. В него входит полнофункциональный скрипт на языке Python для загрузки и хранения данных; тесты на корреляцию, коинтеграцию и стационарность, а также пример реализации сервиса Metatrader 5 для обновления базы данных и соответствующий советник. Здесь приведены некоторые проектные решения для справки и в целях содействия воспроизведению эксперимента.