Блог им. KuzmaShevelev
Введение: От алфавита к словам
В первой части мы создали для нашего алгоритма «алфавит» — систему из 153 уникальных состояний, которая ёмко и точно описывает каждый отдельный ценовой бар. Мы научили его «видеть» и понимать рыночную ситуацию на фундаментальном уровне.
Но один кирпичик — еще не стена. Одна буква — еще не слово. Сегодня мы движемся дальше: наша задача — научить алгоритм анализировать составные паттерны, последовательности этих «кирпичиков», и находить в них статистически значимые аномалии, которые могут указывать на высоковероятные сценарии развития событий.
Самая большая сложность, с которой мы сталкиваемся на этом пути, — это экспоненциальный рост количества возможных комбинаций. Это классическая проблема анализа данных, известная как «проклятие размерности».
Если одиночный бар может находиться в одном из 153 состояний, то для паттерна, состоящего всего из 5 баров, теоретическое число возможных комбинаций составит 153⁵ — это астрономическая величина, превышающая 8 миллиардов. Собрать репрезентативную статистику по каждому из таких паттернов на исторических данных попросту невозможно. Подавляющее большинство этих комбинаций никогда не встречались в истории и являются «мёртвыми» вариантами.
Реальное ограничение и практический подход
Наша цель — не описать все теоретически возможные паттерны, а выделить те, которые реально существуют и несут статистическую ценность. Ориентируясь на данные MetaTrader 5 (история EURUSD с 1971 года, что составляет примерно 25 миллионов баров M1), мы можем позволить себе оперировать примерно 1-2 миллионами уникальных комплексных паттернов. Это наш «бюджет» сложности.
Задача, следовательно, формулируется так: нам нужно разработать метрики для описания составных паттернов таким образом, чтобы общее количество их возможных вариаций не превышало этот практический предел. Мы должны быть умными в нашем группировании и классификации, объединяя похожие конфигурации в осмысленные группы. Для этого мы сознательно пойдём на разумное сокращение менее релевантной информации.
Чтобы уложиться в наш вычислительный бюджет, мы применяем три ключевых принципа, основанных на логике трейдинга.
Принцип 1: Отказ от случайного шума в пользу сути
Мы сознательно отказываемся от учёта точных цен открытия и закрытия для исторических баров. Если задуматься, эти значения во многом случайны: закройся бар на минуту раньше или позже — и мы получим другую картину. Гораздо важнее для нас положение текущей цены относительно структуры уже сформированных баров.
Для исторических баров мы сохраняем только информацию об их размере, типе (бычий/медвежий) и взаимном расположении (например, поглощение, внутренний бар). Это их устойчивая, неслучайная характеристика.
Для текущего, формирующегося бара его текущее положение (например, у вершины или у основания) — это крайне важный сигнал. Это уже не шум, а отражение реального баланса сил здесь и сейчас.
Так мы отделяем случайное от закономерного, фокусируясь на том, что действительно имеет значение.
Принцип 2: Иерархическая точность — чем ближе, тем важнее
Наш алгоритм должен быть подобен трейдеру: он чутко реагирует на последние события, в то время как более давние служат лишь общим фоном. Поэтому мы применяем гибкую точность описания для паттернов из 5 последовательных баров.
Мы разбиваем анализ на четыре отношения между соседними барами:
Бар 5 и Бар 4 (фон): Классификация из 4 паттернов. Грубая оценка: был ли рост, падение или консолидация.
Бар 4 и Бар 3 (контекст): Классификация из 30 паттернов. Добавляется больше деталей о силе и типах движения.
Бар 3 и Бар 2 (предыстория): Классификация из 52 паттернов. Детализация увеличивается, мы почти в настоящем.
Бар 2 и Бар 1 (текущая динамика): Классификация из 80 паттернов. Максимально детальное описание самого актуального взаимодействия.
Такой подход позволяет быть максимально чувствительным к недавним событиям, не перегружая систему избыточной информацией о далёком прошлом.
Принцип 3: Масштабируемый взгляд — учёт волатильности
Паттерн из пяти минутных баров и паттерн из пяти часовых — это совершенно разная история. Чтобы наш анализ был универсальным, мы должны учитывать не только взаимное положение баров, но и их временной масштаб относительно друг друга.
Мы можем анализировать бары не только одинакового таймфрейма, но и комбинировать их: например, последний 15-минутный бар на фоне четырёх предыдущих часовых. Это позволяет анализировать структуру рынка одновременно на нескольких уровнях: последний импульс на младшем таймфрейме может быть ключевым сигналом на фоне консолидации на старшем
Применяя три ключевых принципа — отсечение шума, иерархическую точность и масштабируемость — мы радикально сократили пространство поиска с астрономических миллиардов до управляемых полутора миллионов статистически значимых паттернов.
Важно подчеркнуть: мы сделали это не вслепую, а руководствуясь логикой трейдинга. Мы не потеряли информацию — мы сконцентрировали её, создав для алгоритма не просто базу данных, а структурированное смысловое пространство. Теперь он может искать не случайные совпадения, а устойчивые причинно-следственные связи.
Что дальше? Практическая проверка гипотезы
Следующий шаг — превратить эти паттерны в рабочий инструмент. Мы запустим специального советника-сборщика в тестере MetaTrader 5. Его задача — пройти по истории и для каждого обнаруженного паттерна собрать исчерпывающую статистику: где оказывалась цена через N свечей? Каковы были средние цели, просадки, вероятности движения?
Этот сбор данных будет проводиться сразу на нескольких таймфреймах, а результаты записываться в файл для последующего анализа.
От распознавания к прогнозу
На основе собранной статистики мы создадим второго советника — уже прогнозирующего. Его задача — в реальном времени, по мере формирования рынка, идентифицировать паттерны и на основе их исторической эффективности строить прогнозы о вероятном движении цены. Для наглядности мы добавим графические объекты, которые позволят визуально оценить качество и точность его «предсказаний».
Есть ли уже «чуйка»?
Главная задача на текущем этапе — не получить идеальную торговую систему, а увидеть первые признаки жизни. Появилась ли у нашего алгоритма хоть какая-то «чуйка»? Пусть она будет хаотичной, шумной и непостоянной — как и настроение живого трейдера. Но если алгоритм начал показывать хотя бы слабые, но статистически весомые признаки неслучайного поведения — это уже огромный успех и зелёный свет для дальнейшей работы.
Давайте вместе оценим, что отпечаталось в электронных мозгах нашего алгоритма.
Итоги и взгляд вперёд
Лично я вижу, что в данных уже появился первый сигнал. Он, конечно, не всегда точен — в этом он такой же, как и любой трейдер. В нём ещё много шума и хаоса, но важно то, что он есть.
Мы попробовали предсказать будущее — что гораздо сложнее простой генерации торгового сигнала. Мы заставили алгоритм давать прогноз, и он начал это делать. Теперь нам предстоит следующий, не менее интересный вызов: как на основе этого прогноза выработать конкретное торговое решение? Как отделить зёрна от плевел и отфильтровать сильные сигналы от слабых? Возможно мы узнаем это в следующей части.
А ты через топовые ИИ прогонял уже эти концепции? Чего говорят?
Роман Духанин,
Вообще говорят идея хорошая, но имеет больные места, больше паттернов — больше памяти, больше времени на анализ. Нужно искать подходы для очень быстрой работы советников, что бы стало возможным быстро собирать статистику с истории и быстро считать на лету цифры
Вариант кормить непосредственно нейронки паттернами я не рассматривал, процесс обучение нейронки представляет из себя подбор весовых коэффициентов под историю, тогда как я изначально закладывал обратный процесс, вычисление на основе исторических данных, да и производительность у алгоритмов быстрее
Чтобы она была не подгонкой, а «подгонкой», нужно максимально избегать абсолютных значений — оперировать пропорциями.
Пропорции, близкие к Фибо сохраняются на всех рынках,
без разницы — жесткий флет это или сильный тренд.
Кстати, хороший ход — изначально отфильтровать участки жесткого флета, это и объём обработки резко уменьшит, и негативное влияние на статистику нормальных участков устранит.
В идеале сделать то же самое с участками взлетов/обвалов.
Вообще по законам статистики это и так требуется делать,
без моих хитроумных мюслей )
Роман Духанин,
Я думал об этом, но если делать в лоб, просто бычьи и медвежьи бары то тогда теряется какая либо оценка размеров, например после супер пупер роста уже поздно вставать в лонг, движение уже отыграло, но оно бы воспринималось так же как чисто формальный рост в пару пипсов
Рассматривал так же альтернативный вариант — набор последовательных движений типа вырос на 0.5%/ упал на 0.5%, тогда паттерн представлял бы из себя набор растущий движений и падающих, но тогда паттерн содержащий из себя например 20 последовательных движений располагался бы в неограниченном по времени пространстве, это вызывает проблемы с анализом таких паттернов, и на оборот паттерны имеющие фиксированный размер по времени могут отражать неограниченные по размеру ценовые движения, их проще анализировать, и не требуют установки какой то базовой длинны движения
Роман Духанин,
Дело в том, что есть взаимоисключающие случаи, например, бар может на 50% выступать сверху, и при этом он не может выступать на 50% снизу, это позволяет нам произвести объединение в один набор значений, с уменьшением общего числа значений
В том виде как сейчас определяются размер и положение получается максимально компактно
например классификация из 80 паттернов, с точностью до 20% определяет позицию и размер бара, это в непрямом виде отражает бычесть или меджвежесть и силу этого движения с неплохой точностью
а это меньше чем 2 в 8 степени, не уверен что можно подобрать 8 дихотомий так что бы выдать большую точность
Роман Духанин,
Ну если бы это был коммерческий проект, то мне бы оборвали уши за публикацию разработок))
Думаю можно сказать пет проект, хотя в случае успеха я конечно смогу использовать разработки для извлечения прибыли с рынка, так что корыстный интерес имеется
Но разработка это процесс трудоемкий, что бы продвинутся еще на шажок ближе к результату, часто приходится сильно переделать предыдущие наработки
окок, буду следить за развитием ))
это уточнит и места поиска сигналов, и сами сигналы,
и их силу, т.е. улучшит прогнозирование ближайшего будущего.
Как вариант, взять за основу готовые проработки графическиъ паттернов, видел такие индикаторы.
При любом раскладе главной задачей является поиск МЕСТА.
я рассматривал этот вариант, изначально у меня были опасения что мувинги будут полностью игнорировать хаи и лои + сбоить при сильной волатильности туда сюда внутри дня
хотя идея с мувингами конечно сильная, я постараюсь позже рассмотреть её, вполне возможно, что она окажется лучше чем сырые паттерны,
МА даёт истинное направление выбранного масштаба (периода).
Да, с опозданием, но истинное и масштабируемое.
Сорь что повторился, это специально.
Ваши паттерны в привязке к «истинным» двигам будут надежней.
Я ведь предложил не замену, а фильтр.
Схема:
Берёте статистику результатов следующего дня, например, закрытие минус открытие.
Отсекаете края, рост более некого значения и падение более некого значения, достаточной мощности. Всю середину не рассматриваете.
Смотрите какие паттерны текущего дня их вызывали чаще всего. У меня штук 30 всего получалось. А не миллионы.
Далее ждёте появления какого-то из 30 (лучше 2-3 указывающих на экстремальность будущего дня), 'входите'.
Результаты следующих дней оправдывались. Не по размеру, а по направлению. Грубо говоря, если ожидался большой рост, то в 60% случаев был рост, пусть и не большой.
svgr,
Думаю вам нужно занятся разработкой торгового робота