Идея коротко
Andrea Unger торгует портфель из многих небольших фьючерсных систем и раз в месяц решает, какие из них работают. Его программа Zeus отключает систему навсегда при одном из двух условий. Просадка вне выборки превысила историческую максимальную просадку в 1.5 раза. Или система слишком долго не обновляет максимум, длительность этого флэта он не назвал.
Отключённая система не возвращается. Unger не подбирает ей новые параметры: по его опыту, через несколько месяцев исходная версия работала лучше исправленной. Если идея ещё выглядит здоровой, он берёт её исходный принцип, отбрасывает фильтры и строит стратегию заново.
Это правило жизненного цикла, а не сделки. Оно встраивается в любую систему, у которой есть бэктест. Главная ловушка в базовой величине: историческая просадка из бэктеста почти всегда меньше той, что стратегия покажет в торговле.
Почему это может работать
Объяснение автора практическое. Система, которая никуда не ведёт, занимает маржу и держит риск, а место в портфеле можно отдать другой. Порог нужен заметно больше исторической просадки: обычная для системы просадка не должна её убивать. Unger допускает 40-60% вместо 50%, но подбирать порог по истории считает ненадёжным, и сами правила выключения сознательно не оптимизирует.
Запрет на «ботокс» тоже от автора. Переподобранные параметры подгоняются под последний неудачный участок. Новая стратегия с нуля хотя бы проходит полный цикл разработки и проверки вне выборки.
Почему историческая просадка занижена (объяснение Finetiq):
- Бэктест это одна траектория. Те же сделки в другом порядке дают другую просадку, и фактическое значение из истории редко оказывается худшим из возможных.
- Максимальная просадка растёт с длиной периода. За пять лет торговли её ожидаемая глубина больше, чем за три года бэктеста, даже если стратегия не изменилась.
- Параметры подбирались на той же истории. Отбор среди вариантов предпочитает гладкие кривые, и просадка на выборке смещена вниз.
- Сам Unger разрабатывает системы на одном контракте без издержек и добавляет их позже. Просадка, снятая до издержек, меньше торговой.
Отсюда следствие. Порог 1.5× от заниженной базы будет чаще отключать здоровые стратегии, чем кажется. Зато медленно умирающую систему без глубоких просадок ловит только второй триггер, по длительности флэта.
Правила
Базовые величины (автор, расчёт Finetiq)
// до запуска, по бэктесту с издержками и тем же размером позиции, что в торговле
HistMaxDD = максимальная просадка дневной кривой капитала, в деньгах
// автор: «историческая просадка»; Finetiq: по дневной кривой с открытыми позициями
HistMaxFlat = самый длинный период без нового максимума кривой, в торговых днях // Finetiq
// Finetiq: осторожная база вместо одного числа
FOR i = 1 TO 1000
собрать кривую из дневных P&L бэктеста, переставленных блоками по 20 дней
MaxDD_i = максимальная просадка на отрезке длиной с планируемый живой период
HistMaxDD_MC = 95-й перцентиль MaxDD_i
Отключение (автор, второй порог Finetiq)
// на закрытии каждого дня после запуска
Peak = максимум кривой капитала с даты запуска // Finetiq: считаем только живой период
LiveDD = Peak - Equity
IF LiveDD > 1.5 * HistMaxDD // автор: превышение на 50%
KILL
IF торговых дней с последнего максимума > 1.5 * HistMaxFlat // автор: долгий флэт; Finetiq: 1.5
KILL
KILL = закрыть позиции, отменить ордера, больше не включать // автор: «никогда не играет снова»
// автор: множитель 1.4-1.6 допустим, подбор по истории ненадёжен
После отключения (автор)
// не менять параметры отключённой системы
IF принцип системы ещё выглядит рабочим
новая разработка с нуля: исходная идея без фильтров, новая проверка вне выборки
// на место отключённых добавлять новые независимые системы, ориентир автора: за ~6 месяцев
Вариант B. Titan: временное отключение по результату кривой (автор)
// раз в месяц, по «теневой» кривой: выключенная система продолжает считаться, но не торгуется (автор)
Perf9 = результат за последние 9 месяцев
Perf2 = результат за последние 2 месяца
ON = Perf9 > 0 AND Perf2 > 0 AND Perf2 / 2 > Perf9 / 9
// автор: 2 месяца «в среднем лучше» 9; Finetiq: сравниваем средний месячный результат
// в следующем месяце торгуются системы с ON, лучшие по результату (автор)
// автор сам пишет пороги как пример, их можно менять
Применение к карточке drift-vwap-pullback
// автор той карточки подобрал параметры на 2020–2024 и называет 2024–2026 вне выборки
HistMaxDD = максимальная просадка 2020–2024 на 1 NQ с издержками // Finetiq
с первого дня 2024 года:
IF LiveDD > 1.5 * HistMaxDD THEN KILL
// вопрос для проверки: была бы стратегия отключена на собственном out-of-sample участке и когда
Параметры
| Параметр | Значение | Откуда |
|---|---|---|
| База | максимальная просадка бэктеста | автор |
| Порог просадки | 1.5 × базы | автор |
| Допустимый диапазон порога | 1.4-1.6 | автор |
| Второй триггер | флэт дольше нормы | автор |
| Длина флэта | 1.5 × самого длинного флэта в бэктесте | Finetiq |
| Отсчёт живой просадки | от максимума после запуска | Finetiq |
| Повторное включение | никогда | автор |
| Осторожная база | 95-й перцентиль перестановок блоками по 20 дней | Finetiq |
| Частота пересмотра портфеля | раз в месяц | автор |
| Вариант B: окна результата | 9 и 2 месяца | автор |
| Вариант B: условие | оба положительные, 2 месяца в среднем лучше 9 | автор |
Что проверить
- Ложные отключения. Нарежьте историю на окна: 3 года разработки, 2 года торговли. Для каждой своей стратегии посчитайте, срабатывал ли порог и что стратегия делала после. Сравните множители 1.3, 1.5 и 2.0 по доле отключений, после которых стратегия восстановилась.
- Какая база. Одно число из бэктеста без издержек, с издержками и 95-й перцентиль перестановок. Посмотрите, насколько сдвигается дата отключения.
- Навсегда против временно. Портфель своих стратегий в трёх режимах: всё всегда включено, отключение навсегда, помесячное включение по правилу Titan на теневой кривой.
- Порог флэта. 1, 1.5 и 2 самых длинных флэта бэктеста. Для стратегий с редкими сделками флэт может длиться годами без всякой деградации.
- Портфель без замены. Прогон, где отключённые стратегии ничем не заменяются. Если у вас 2-3 системы, а не 30 из 100, как у Unger, правило быстро оставит портфель пустым.
- Out-of-sample чужой стратегии. Схема из блока «Применение» на
drift-vwap-pullbackи на любой карточке, где автор назвал период подбора параметров.
Особенности платформ
TradingView (Pine Script)
strategy.risk.max_drawdown(value, type)после достижения просадки закрывает позиции и запрещает новые ордера до конца теста. Просадка считается по всей истории теста, включая участок, с которого вы взяли базу. Для отсчёта от даты запуска нужен свой счётчик наstrategy.equityи входной параметр с датой.- Базу удобно снять отдельным прогоном на участке разработки:
strategy.max_drawdownв конце этого прогона. - Отключение в бэктесте означает, что до конца графика сделок нет. Чтобы увидеть, что было бы дальше, нужен второй экземпляр стратегии без правила.
- Pine видит кривую одной стратегии на одном символе. Портфель из многих систем и правило Titan здесь не собрать.
MultiCharts и TradeStation (EasyLanguage)
- Кривая стратегии:
NetProfit + OpenPositionProfit. Максимум и флаг отключения храните в переменных, дату запуска и базу задайте входами. - При включении стратегия пересчитывается по всей истории. С датой запуска и базой во входах отключение воспроизводится, но по теоретическим, а не реальным исполнениям. Решение принимайте по отчёту реальных сделок.
- Сам Unger считает ротацию вне платформы: выгружает из MultiCharts дневной P&L каждой системы и собирает матрицу в своей программе на MATLAB. Для портфеля из десятков стратегий это ближе к его практике, чем код внутри одной стратегии.
MetaTrader 5 (MQL5)
ACCOUNT_EQUITYобщий для всех советников на счёте. Кривую одной стратегии собирайте из истории сделок по magic:HistorySelect,HistoryDealGetInteger(ticket, DEAL_MAGIC),HistoryDealGetDoubleдляDEAL_PROFIT,DEAL_COMMISSION,DEAL_SWAP, плюс плавающая прибыль открытых позиций.- Флаг отключения храните вне памяти советника, в глобальной переменной терминала или в файле. Иначе перезапуск терминала вернёт систему в торговлю.
- Своп и комиссия в MT5 идут отдельными полями сделки. Если база снята в тестере без них, живая просадка будет систематически глубже.
Где идея может сломаться
- Порог 1.5 это эвристика одного трейдера. Unger сам называет подбор порога ненадёжным и не приводит статистики, как часто отключения оказывались верными.
- База из бэктеста занижена по причинам выше. Без поправки правило отключает часть стратегий, которые просто попали в обычную для себя, но не встреченную в истории просадку.
- У системы с редкими сделками просадка вне выборки набирается годами. Правило срабатывает поздно, когда основные потери уже случились.
- Отключение навсегда исключает восстановление. Если стратегия циклична, вариант Titan с теневой кривой может оказаться лучше, но и он требует проверки.
- Правило рассчитано на конвейер разработки. У Unger сотня стратегий на выбор и регулярная замена. С одной-двумя системами оно превращается в решение «перестать торговать».
- Длительность флэта автор не назвал. Второй триггер в карточке целиком наша формализация.