Блог им. ARANEA

ARANEA: оптимизации стратегий "Что? Где? Когда?" Часть № 2

    • 03 июля 2026, 17:29
    • |
    • ARANEA
  • Еще

 

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

Карта гипотезы — это не красивая картинка для презентации. Это ответ на вопрос, где именно стратегия получает право работать. Например, когда человек говорит: давайте проверим EMA от `20` до `200` с шагом `10`, он часто думает, что проверяет просто периоды средней. На самом деле он меняет площадь рыночного пространства, в котором стратегия вообще может открывать сделки. Чем меняется период EMA, тем меняется линия, зоны выше и ниже этой линии, количество баров в каждой зоне, длительность этих зон и количество мест, где конкретная стратегия получит разрешение на вход.
ARANEA: оптимизации стратегий "Что? Где? Когда?" Часть № 2



При этом мало посчитать только сколько баров, свечей или времени цена была выше или ниже EMA. Нужно учитывать количество включений условия: сколько раз состояние `C > EMA(n)` включалось, сколько раз выключалось, сколько длился каждый отдельный участок и какой у этих участков диапазон от минимума до максимума. Средние значения здесь часто обманывают, потому что две зоны могут иметь одинаковую среднюю длительность, но совершенно разную структуру: в одной будет много коротких включений по `1-2` бара, в другой несколько длинных участков по `30-50` баров. Это как в поговорке: один ел капусту, другой ел мясо, а в среднем все ели голубцы. В исследовании стратегий такая средняя температура бесполезна, если мы не видим распределение. Поэтому информацию нужно раскладывать по каждому диапазону и учитывать не только среднее, но и распределение, минимум, максимум и количество отдельных включений.

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

Где — это не просто актив и таймфрейм

Когда трейдер слышит вопрос где оптимизируем, он часто думает про актив, биржу, таймфрейм или участок истории. Это тоже важно, но здесь я говорю о другом уровне. Где — это область данных, в которой стратегия получает право совершать сделку. Эта область может задаваться индикатором, фильтром, рыночным режимом, временем, волатильностью, направлением движения, фазой отклонения от средней или комбинацией условий.
и в первой статье вопрос что отвечал за объект оптимизации, то здесь вопрос где отвечает за область проверки этого объекта. Мы уже можем знать, что оптимизируем вход, EMA-фильтр, PM и функцию качества. Но дальше нужно спросить: в каких состояниях рынка этот набор правил вообще сравнивается. Иначе мы опять смешиваем разные вещи в одну таблицу и называем это оптимизацией стратегии. Простой пример: `C > EMA(100)` и `C < EMA(100)` — это две разные области данных. В первой цена закрытия находится выше средней, во второй ниже средней. Но даже этого мало. Зона выше EMA тоже неоднородна: цена может только что пересечь среднюю, может удаляться от нее, может быть далеко от нее, может уже возвращаться обратно, а может стоять рядом с ней в боковике. Формально это все еще выше EMA, но торговый смысл у этих состояний разный.

Карта гипотезы на примере EMA

Возьмем закрытие `C_t` и EMA с периодом `n`. Самое простое условие выглядит так: `C_t > EMA_n(t)`. Это значит, что в момент `t` закрытие находится выше EMA с периодом `n`. Обратная зона записывается так: `C_t < EMA_n(t)`.

Если мы проверяем `n = 20..200` с шагом `10`, то фактически строим не одну проверку, а набор зон:
— `C_t > EMA_20(t)` — зона выше быстрой средней, где сигналов обычно будет больше;
— `C_t > EMA_100(t)` — зона выше более сглаженной средней, где структура уже другая;
— `C_t > EMA_200(t)` — зона выше длинной средней, где фильтр может отсекать гораздо больше истории;
— `C_t < EMA_n(t)` — симметричная зона ниже средней для каждого выбранного периода.

Для каждой такой зоны нужно считать не только итоговый PnL. Сначала нужно понять, сколько данных вообще попало в эту область. Это можно записать очень просто: `coverage_above(n) = count(C_t > EMA_n(t)) / count(all bars)`. Эта величина показывает долю баров, где условие выше EMA было истинным. Для нижней зоны аналогично: `coverage_below(n) = count(C_t < EMA_n(t)) / count(all bars)`.

Если `coverage_above(20)` сильно отличается от `coverage_above(200)`, то эти два фильтра разрешают сделки в разных областях рынка. И если при этом стратегия показывает разный результат, нельзя честно сказать только период EMA лучше. Нужно понимать, что изменилось: сама торговая логика, количество входов, длительность разрешенных зон, расстояние цены от средней или просто отрезанный участок истории.

Зона выше EMA тоже делится на части

Самая большая ошибка — считать зону выше средней однородной. Допустим, цена закрытия выше EMA. Что именно происходит? Цена удаляется от средней или возвращается к ней? Она находится чуть выше линии или уже далеко? Состояние длится один бар или двадцать баров подряд? Без этих уточнений фраза выше EMA слишком грубая.

Для описания можно ввести расстояние от цены до EMA: `d_t(n) = C_t — EMA_n(t)`. Если нужно сравнивать разные активы и разные режимы волатильности, лучше нормировать расстояние: `d_atr_t(n) = (C_t — EMA_n(t)) / ATR_t`. Тогда `d_atr_t(n) = 1.5` означает, что закрытие находится примерно на `1.5 ATR` выше EMA.

Дальше появляется фаза движения относительно средней:
— `d_atr_t(n) > 0` — цена выше EMA;
— `d_atr_t(n) < 0` — цена ниже EMA;
— `d_atr_t(n) > d_atr_{t-1}(n)` — цена удаляется от EMA;
— `d_atr_t(n) < d_atr_{t-1}(n)` — цена возвращается к EMA;
— `abs(d_atr_t(n)) < 0.25` — цена находится рядом со средней, зона контакта или шума;
— `abs(d_atr_t(n)) > 1.5` — цена далеко от средней, зона растянутого движения.

То есть даже для одного индикатора EMA вопрос где уже раскладывается на несколько осей: сторона относительно средней, расстояние, фаза удаления или возврата, длительность состояния и волатильность. Для коллег, кто любит копать глубже, можно добавить скорость изменения `d_atr_t(n)`, ускорение и форму возврата. Но эта статья не об этом. Сейчас важнее зафиксировать сам принцип: где — это состояние данных, а не просто строка `C > EMA`.

Почему это быстро превращается в большое пространство

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

Даже маленький пример быстро становится большим: `19` периодов EMA от `20` до `200`, `2` стороны относительно средней, `3` зоны расстояния от EMA, `2` фазы движения относительно EMA и `5` таймфреймов дают `19 * 2 * 3 * 2 * 5 = 1140` областей проверки только для одного семейства условий. И это мы еще не добавили RSI, MACD, ATR, ADX, время удержания, PM и функцию выбора победителя.

ARANEA: оптимизации стратегий "Что? Где? Когда?" Часть № 2Поэтому разговор проверить EMA часто звучит невинно, но на практике означает: построить карту состояний, понять, где стратегия получает право входить, и оценить, какие зоны вообще дают осмысленное поведение. Без такой карты трейдер легко принимает красивую строку за стратегию, хотя на самом деле он просто нашел один удачный кусок в огромном пространстве состояний.

Индикатор — это не магия, а другая форма данных

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

Свеча показывает `O`, `H`, `L`, `C`. EMA показывает сглаженную траекторию цены. RSI показывает соотношение направленных изменений. ATR показывает диапазон движения. ADX пытается отделить силу направленного движения от его направления. Это все разные способы смотреть на одни и те же данные. Проблема не в индикаторах. Проблема в том, что люди не описывают, какую именно область данных они получают через индикатор и зачем она нужна стратегии.

Меня веселит, когда человек берет стратегию на одном таймфрейме, сутками сидит с ИИ, пытается объяснить ему какую-то логику, получает красивый код на Python и оптимизированную таблицу, но при этом сам не понимает, что такое функция `f(x)` и как посчитать площадь круга. Конечно, ИИ ему напишет, что идея интересная, логика разумная, код рабочий. Но если трейдер не знает, где именно он проверяет стратегию, то рабочий код только быстрее приведет его к переоптимизированному результату. Вайб-кодеров я обязательно разберу отдельно, но позже.

Что показывает каждый индикатор в вопросе где

Если индикатор участвует в ТЗ, его нужно описывать не как название, а как карту состояний. Ниже не полный учебник по индикаторам, а пример того, какие вопросы нужно задавать перед оптимизацией.

— `EMA` — показывает положение цены относительно сглаженной траектории. В ТЗ нужно указывать сторону (`C > EMA(n)` или `C < EMA(n)`), расстояние от EMA, фазу удаления или возврата, наклон EMA и длительность состояния. Один и тот же вход может вести себя по-разному рядом с EMA, далеко от EMA и после резкого возврата к EMA.

— `RSI` — показывает состояние направленного изменения цены в ограниченной шкале. В ТЗ важно разделять зоны `RSI < 30`, `30 <= RSI < 50`, `50 <= RSI < 70`, `RSI >= 70`, а также направление самого RSI. Вход при RSI, который падает в зону перепроданности, и вход при RSI, который уже выходит из нее, — это разные области данных.

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

— `ATR` — показывает абсолютный диапазон движения. Сам по себе ATR не говорит вверх или вниз, но говорит, в какой волатильности находится стратегия. В ТЗ можно делить рынок на низкую, среднюю и высокую волатильность, а потом смотреть, где входы вообще имеют смысл.

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

— `AROON` — показывает, насколько давно был максимум или минимум за выбранный период. В ТЗ можно описывать зоны, где `AroonUp` доминирует над `AroonDown`, зоны свежего максимума, зоны свежего минимума и зоны потери направленности. Это не просто трендовый индикатор, а способ описать свежесть экстремума.

— `ADX` — показывает силу направленного движения, но не его сторону. Поэтому `ADX > 25` сам по себе не значит покупать или продавать. В ТЗ его нужно соединять с направлением через `+DI` и `-DI` или с другим правилом направления. Например, `ADX > 25 and +DI > -DI` — одна область, а `ADX > 25 and -DI > +DI` — другая.

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

Где для комбинаций индикаторов

Комбинация `RSI + EMA` — это уже не одна зона, а пересечение зон. Например, можно написать: `C > EMA(100) and RSI(14) < 35`. На языке трейдера это звучит просто: цена выше EMA, но RSI низкий. На языке карты гипотезы это означает: мы ищем входы в области, где цена еще находится выше средней, но краткосрочное движение уже слабое или откатное.

Но и здесь нужно уточнять:
— `C > EMA(100) and RSI < 35` — цена выше средней, RSI в нижней зоне;
— `C > EMA(100) and RSI rising` — цена выше средней, RSI уже разворачивается вверх;
— `C > EMA(100) and d_atr < 0.5 and RSI < 35` — цена выше средней, но рядом с ней, RSI слабый;
— `C > EMA(100) and d_atr > 1.5 and RSI < 35` — цена далеко выше средней, но RSI уже слабый;
— `C < EMA(100) and RSI > 65` — зеркальная зона ниже средней с сильным RSI.

В этих случаях один и тот же вход может иметь разный смысл. В первой зоне стратегия может искать откат внутри движения. Во второй — подтверждение возврата импульса. В третьей — вход рядом со средней. В четвертой — вход после растянутого движения, где риск возврата выше. Если все это назвать просто RSI плюс EMA, ТЗ опять становится мутным.

Какие данные должен показывать ответ на вопрос где

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

ARANEA: оптимизации стратегий "Что? Где? Когда?" Часть № 2
— `bars_count` — сколько баров попало в выбранную область. Если зона занимает слишком маленькую часть истории, красивый результат может быть случайностью.`coverage` — доля истории, где условие было истинным. Это помогает понять, широкий фильтр или узкий, и не превратили ли мы стратегию в редкое событие.
`entries_count` — количество входов стратегии внутри этой области. Можно иметь много баров в зоне, но мало реальных входов, если само событие входа редкое.
`entries_share` — какая доля всех входов попадает в эту область. Если фильтр оставляет `5%` входов, нужно отдельно проверять, не стала ли выборка слишком маленькой.
`avg_bars_in_zone` — средняя длительность непрерывного состояния. Это показывает, зона живет один-два бара или держится долго. — `zone_age_before_entry` — сколько баров условие уже было истинным до входа. Вход сразу после появления зоны и вход на двадцатом баре той же зоны могут быть разными ситуациями.
`distance_to_filter` — расстояние от цены до линии или порога, например `C — EMA(n)` или `(C — EMA(n)) / ATR`. Это помогает отличать вход рядом с границей от входа в растянутой зоне.
`phase` — фаза относительно фильтра: удаление от средней, возврат к средней, пробой, ретест или стояние рядом с границей. Без этого зона выше EMA слишком грубая.
`forward_return_5m`, `forward_return_15m`, `forward_return_30m`, `forward_return_1h`, `forward_return_4h` — отклонение цены от точки входа через разные горизонты без PM. Это один из самых честных способов понять, есть ли у входа первичный смысл до того, как управление позицией начнет спасать или портить сделку.
`MFE_5m..4h` — максимальное благоприятное отклонение после входа на заданном горизонте. Оно показывает, был ли у сделки шанс дать прибыль, даже если итоговый выход выбран плохо.
`MAE_5m..4h` — максимальное неблагоприятное отклонение после входа. Оно показывает, сколько боли стратегия получает до потенциального движения в нужную сторону.
`time_to_mfe` — через сколько времени после входа появляется лучшее благоприятное отклонение. Если максимум возникает через `4h`, а PM закрывает сделку через `15m`, стратегия и PM живут в разных реальностях.
`time_to_mae` — через сколько времени появляется худшее неблагоприятное отклонение. Это помогает понять, где нужен защитный стоп и насколько быстро сделка начинает идти против входа.
`volatility_state` — состояние волатильности через ATR или NATR. Один и тот же вход в низкой и высокой волатильности может иметь разную природу риска.
`trend_state` — состояние тренда через EMA, ADX, AROON или другую карту направления. Это нужно, чтобы не смешивать откат внутри движения и вход против сильного движения.
`neighbor_stability` — устойчивость соседних параметров. Если работает только `EMA(110)`, а `EMA(100)` и `EMA(120)` разваливаются, это не зона, а подозрительный пик.
`filter_drop_map` — сколько входов отсекает каждый фильтр. Это показывает, какой фильтр реально меняет выборку, а какой просто добавлен для красоты.
`cost_sensitivity` — что происходит после комиссии, проскальзывания и спреда. Если зона дает маленькое среднее движение, издержки могут съесть весь смысл.

Отдельно подчеркну пункт про отклонение цены от входа через `5m`, `15m`, `30m`, `1h`, `4h`. Это можно проверять даже без PM. Если после входа цена статистически не дает благоприятного отклонения, то никакая красивая логика выхода не сделает вход хорошим. PM может временно вытянуть отдельные сделки, но он не должен подменять смысл входа.

Как это выглядит в ТЗ

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

Пример блока ТЗ:
— `filter_family = EMA` — исследуем зоны относительно экспоненциальной средней, а не абстрактный фильтр тренда;
— `ema_periods = 20..200 step 10` — задаем конкретную карту периодов, которые можно сравнивать;
— `ema_side = above | below` — отдельно считаем зоны выше и ниже EMA, не смешивая их в один результат;
— `distance = (C — EMA(n)) / ATR` — нормируем расстояние от цены до EMA, чтобы понимать, рядом цена со средней или далеко;
— `distance_bucket = near | mid | far` — делим расстояние на зоны, например `0..0.5 ATR`, `0.5..1.5 ATR`, `>1.5 ATR`;
— `phase = expanding | returning` — отдельно проверяем удаление от EMA и возврат к EMA;
— `zone_age = bars_since_condition_started` — считаем, сколько баров зона уже существует до входа;
— `timeframes = 5m | 15m | 30m | 1h | 4h` — явно задаем таймфреймы, а не переносим результат глазами;
— `forward_horizons = 5m | 15m | 30m | 1h | 4h` — проверяем поведение цены после входа на нескольких горизонтах;
— `outputs = entries_count, coverage, forward_return, MFE, MAE, time_to_mfe, time_to_mae, neighbor_stability` — заранее задаем, какие данные должны выйти из исследования.

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

Ошибка одного таймфрейма

Еще одна частая ошибка — взять стратегию на одном таймфрейме и начать бесконечно объяснять ИИ, какую логику туда надо добавить. Человек спорит с моделью, просит переписать код, добавляет условия, просит сделать умнее, но не строит карту, где эта логика вообще проверяется.

Таймфрейм — это тоже часть вопроса где. Один и тот же вход на `5m`, `15m`, `1h` и `4h` может быть разными событиями. На `5m` это может быть шум около средней. На `1h` — нормальный откат. На `4h` — смена режима. Если все это смешать, стратегия может казаться универсальной только потому, что трейдер не видел, в каком масштабе она реально работает.

Поэтому в нормальном исследовании нужно не просто переносить код между таймфреймами, а строить карту:
— где появляется сигнал на каждом таймфрейме;
— сколько входов дает каждый таймфрейм;
— как меняется среднее отклонение после входа;
— как меняется `MFE` и `MAE`;
— где PM успевает отработать, а где горизонт движения не совпадает с логикой выхода;
— где результат устойчив к соседним параметрам, а где держится на одном случайном периоде.

После такой карты разговор становится предметным. Можно сказать: вход имеет смысл на `15m` и `1h`, но на `5m` его съедают издержки, а на `4h` слишком мало сделок. Это уже исследование. Фраза стратегия работает на EMA ничего не объясняет.

Итог

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

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

Ответ на вопрос что дает объект оптимизации. Ответ на вопрос где дает карту области, в которой этот объект проверяется. Следующий вопрос будет еще жестче: [когда стратегия действительно работала]
Данная публикация является личным мнением автора. Мнение владельца сайта может не совпадать с мнением автора.
405 | ★1

Читайте на SMART-LAB:
Информация о переводе активов клиентов
Уважаемые клиенты! Продолжаем информировать вас о дальнейших действиях, связанных с переводом ценных бумаг клиентов на обслуживание к другим...
⚙️ ЦБ намерен изменить правила IPO. К чему это приведет?
Банк России предложил ужесточить требования для компаний, которые хотят попасть в котировальные списки после IPO. Регулятор считает, что...
Фото
Стратегия на III квартал 2026 года. Экономика
Анастасия Степанцова Инвестиционная стратегия на III квартал 2026 года предлагает ориентиры для управления портфелем. Ведущие аналитики...
Фото
Интер РАО. Цена min за 10 лет. Пора покупать?
Последние месяцы наш фондовый рынок снижается, но я не буду разбираться в причинах (про них говорят все кому не лень), а поговорим по...

теги блога ARANEA

....все тэги



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