Идея коротко
У классического пробоя один уровень: максимум за N дней. Здесь уровней два. Donchian отмечает максимум и минимум за N дней, Keltner рисует полосу вокруг средней на расстоянии нескольких ATR. Они по-разному реагируют на волатильность, и в разные дни ближе к цене оказывается то один, то другой. Правило простое: сигнал даёт тот канал, который цена задела первой.
Gary Antonacci и Carlo Zarattini применили это к 48 отраслевым секторам США за сто лет. Вход в лонг на первом касании верхней границы 20-дневного канала. Выход на первом касании нижней границы 40-дневного канала: длину выхода удвоили, чтобы дать сделке место и не плодить оборот. Шортов нет, размер позиции нормирован на волатильность.
Tom Basso использует тот же приём с тремя индикаторами (Donchian, Bollinger, Keltner) и короткой длиной 9 дней. Его версия всегда в рынке и переворачивается в обе стороны.
Почему это может работать
Оба автора объясняют каналы как полосу шума. Внутри неё цена ходит без направления, и торговать там незачем: в боковике получаются только пилы. Выход за полосу Antonacci считает признаком продолжения движения, его гипотеза звучит как «новый максимум четырёх недель обещает продолжение». Basso сравнивает это с термостатом, которому нужен запас в пару градусов, чтобы не щёлкать каждую минуту.
Ширина Keltner и Bollinger зависит от волатильности. В тихом рынке линии сходятся, в нервном расходятся автоматически. Basso считает, что поэтому такие индикаторы выдерживают смену условий лучше фиксированных пересечений средних. Первое касание берёт ту меру шума, которая сейчас ближе к цене. Basso прямо говорит, что ему всё равно, какой из индикаторов поставит ордер: все три измеряют один и тот же шум.
В разложении результата у Antonacci главный вклад в Sharpe дал тайминг, а не выбор секторов. Ведущий Rich Brennan объясняет это тем, что пробои пропускают основную массу мелких движений и работают на хвостах распределения. Эти объяснения не проверены нами.
Правила
Каналы
// дневные бары
DonchianUpper(N) = максимум High за N последних закрытых баров
DonchianLower(N) = минимум Low за N последних закрытых баров
KeltnerUpper(N) = EMA(Close, N) + K * ATR(N)
KeltnerLower(N) = EMA(Close, N) - K * ATR(N)
// Basso описывает Keltner как EMA 21 плюс ATR примерно за 21 день, умноженный на коэффициент.
// Finetiq: у Antonacci длина Keltner равна длине канала (20 или 40), K = 2 как стартовое значение
BollingerUpper(N) = SMA(Close, N) + B * StdDev(Close, N)
BollingerLower(N) = SMA(Close, N) - B * StdDev(Close, N)
// Finetiq: B = 2, ширина в видео не названа
Первое касание
// первым сработает уровень, ближайший к цене
FirstUp(N) = min(DonchianUpper(N), KeltnerUpper(N))
FirstDown(N) = max(DonchianLower(N), KeltnerLower(N))
// Finetiq: полоса Keltner или Bollinger может оказаться за ценой уже на закрытии.
// Тогда касание уже случилось: вход по рынку на следующем открытии, без стоп-ордера
Основная система: Antonacci, только лонг
IF position = FLAT
IF Close > KeltnerUpper(20)
BUY AT NEXT BAR OPEN // Finetiq: уровень пройден на закрытии
ELSE
BUY STOP at FirstUp(20) // автор: первое касание 20-дневного канала
IF position = LONG
IF Close < KeltnerLower(40)
EXIT AT NEXT BAR OPEN // Finetiq
ELSE
SELL STOP at FirstDown(40) // автор: первое касание 40-дневного канала вниз
// шортов нет: у акций восходящий дрейф (автор)
// отдельного стоп-лосса нет, его роль играет выход по 40-дневному каналу
Размер позиции (автор, числа Finetiq)
Vol = StdDev(дневные доходности, 20) * sqrt(252) // Finetiq: окно в видео не названо
Weight = TargetVol / Vol / M // автор: нормировка на волатильность
TargetVol = 10% // автор, по памяти
M = число инструментов в корзине // Finetiq: M = 1 для одного ETF
Weight = min(Weight, 1 / M) // Finetiq: без плеча
// перебалансировка ежедневно (автор)
// корзина: держим все сектора с сигналом, без ранжирования (автор)
Вариант B. Basso: 9 дней, три канала, всегда в рынке
// индексные фьючерсы, всегда лонг или шорт, развороты в обе стороны (автор)
// у Basso та же 9-дневная связка на микро-фьючерсах биткоина и эфира, направление там не уточнено
N = 9 // автор, для всех трёх индикаторов
UpperLevel = min(DonchianUpper(9), BollingerUpper(9), KeltnerUpper(9))
LowerLevel = max(DonchianLower(9), BollingerLower(9), KeltnerLower(9))
// автор: ордер ставит линия, ближайшая к цене, какой индикатор это будет, неважно
IF position = SHORT OR position = FLAT
BUY STOP at UpperLevel
IF position = LONG OR position = FLAT
SELL SHORT STOP at LowerLevel
// Finetiq: то же правило про уровень, пройденный уже на закрытии
// размер: общий принцип Basso
Units = Equity * 0.5% / (|EntryPrice - LowerLevel| * PointValue) // для лонга
// автор: в прибыльной позиции риск может дорасти до 1%, дальше позиция урезается
Вариант C. Basso: трёхдневный Donchian
// около 26–27 фьючерсов, всегда в рынке (автор)
BUY STOP at DonchianUpper(3)
SELL SHORT STOP at DonchianLower(3)
// нижняя линия и есть трейлинг-стоп лонга, отдельный трейлинг не нужен (автор)
// внутренние дни не пробивают канал и игнорируются сами собой (автор)
Параметры
| Параметр | Значение | Откуда |
|---|---|---|
| Канал входа (A) | 20 дней, Donchian и Keltner | автор |
| Канал выхода (A) | 40 дней, Donchian и Keltner | автор |
| Правило срабатывания | первое касание любого канала | автор |
| Направление (A) | только лонг | автор |
| Множитель Keltner K | 2 | Finetiq |
| Середина и ширина Keltner | EMA и ATR той же длины | Finetiq (у Basso EMA 21 и ATR около 21) |
| Размер (A) | нормировка на волатильность, цель около 10% | автор |
| Перебалансировка (A) | ежедневно | автор |
| Окно волатильности | 20 дней | Finetiq |
| Уровень пройден на закрытии | вход по рынку на следующем открытии | Finetiq |
| Длина (B) | 9 дней, три индикатора | автор |
| Ширина Bollinger B | 2 стандартных отклонения | Finetiq |
| Направление (B, C) | всегда в рынке, развороты | автор |
| Длина (C) | 3 дня, только Donchian | автор |
| Риск на позицию (B, C) | 0.5% капитала, до 1% в прибыльной позиции | автор (общий принцип Basso) |
Что проверить
- Первое касание против одного канала. Три прогона варианта A: только Donchian 20/40, только Keltner 20/40, первое касание. Если комбинация не лучше лучшего из двух, второй канал только добавляет сделки.
- Множитель Keltner. K = 1.5, 2, 2.5, 3. При малом K полоса Keltner почти всегда ближе к цене и фактически заменяет Donchian. Запишите, какая линия дала сигнал в каждой сделке, и посмотрите на доли.
- Асимметрия 20/40. Сравните 20/40 с 20/20 и 20/10. Автор удвоил длину выхода ради меньшего оборота. Проверьте, сколько это стоит в отданной прибыли и просадке.
- Ежедневная перебалансировка. Нормировка каждый день против перебалансировки только при отклонении веса больше 20%. Автор признаёт, что ежедневная версия заметно увеличивает число сделок.
- Окрестность 9 дней у Basso. 7, 9, 12, 15 дней на индексном фьючерсе с полными издержками. Система всегда в рынке и переворачивается часто, издержки здесь решают.
- Сектор против индекса. Вариант A на одном секторном ETF против того же правила на S&P 500. Если на широком индексе результат близок, основную работу делает тайминг, как и говорит автор.
- Вход по рынку после закрытия за полосой. Посчитайте долю таких входов и среднее проскальзывание от уровня. На гэпах цена входа заметно хуже, чем в идеальном тесте по уровню.
Особенности платформ
TradingView (Pine Script)
ta.kcсчитает середину и ширину по своей реализации, а реализации Keltner различаются. Для совпадения с правилами соберите полосу сами:ta.ema(close, 20) + k * ta.atr(20).ta.atrсглаживает по Уайлдеру.- Стоп-ордер на покупку ниже текущей цены исполняется на открытии следующего бара. Если полоса Keltner уже под ценой,
strategy.entry(..., stop = firstUp)превращается во вход по рынку. Разделяйте этот случай явно, иначе вход будет выглядеть как пробой уровня. ta.stdevпо умолчанию генеральное стандартное отклонение, какStdDevв EasyLanguage иiBandsв MQL5. Полосы Bollinger на трёх платформах совпадут при одинаковой длине.- Стратегия торгует один символ. Корзину из 48 секторов с общей нормировкой в Pine не протестировать. Вариант A проверяется на одном ETF, корзина собирается вне TradingView.
MultiCharts и TradeStation (EasyLanguage)
- Keltner соберите сами:
XAverage(Close, 20) + K * ATRw, гдеATRwпосчитан по Уайлдеру вручную.AvgTrueRangeэто простое среднее TrueRange, полосы с ним будут другими. Выберите одну версию ATR и держите её на всех платформах. Buy next bar at FirstUp stopживёт один бар. Отправляйте его на каждом баре. Если уровень ниже открытия следующего бара, ордер исполнится по открытию.- Для фьючерсов (варианты B и C) закрытие дневного бара в TradeStation это settlement, у 1440-минутного бара последняя сделка (Kevin Davey, The Algorithmic Advantage #036). Трёхдневный канал на двух видах бара даёт разные уровни почти каждый день.
- Корзина секторов с нормировкой по волатильности тестируется в портфельном модуле: Portfolio Trader в MultiCharts, Portfolio Maestro в TradeStation.
MetaTrader 5 (MQL5)
- Встроенного Keltner нет. Среднюю берите через
iMA(..., MODE_EMA, ...), ATR считайте сами:iATRэто простое среднее TR. - Секторные ETF есть не у каждого брокера. У CFD на ETF начисляется своп, а позиция варианта A держится неделями и месяцами.
- Ежедневная нормировка упирается в шаг лота
SYMBOL_VOLUME_STEP. На небольшом счёте вес меняется ступенями, и часть перебалансировок не происходит. - Для вариантов B и C на неттинговом счёте разворот делается одной сделкой двойного объёма, на хеджинговом старую позицию нужно закрыть явно.
Где идея может сломаться
- Множитель Keltner и ширина Bollinger в видео не названы. От них зависит, какой канал срабатывает первым, то есть суть правила. Antonacci признаёт, что деталей статьи не помнит, точные настройки нужно брать из самой статьи.
- Столетние данные это отраслевые индексы, а не торгуемые бумаги. История секторных ETF короткая, автор проверял их отдельно.
- Автор сам показывает неровность: в столетней таблице есть великолепные и слабые периоды, режимы длятся по 15–20 лет. Тест на 5–10 годах может целиком попасть в слабый режим.
- Хедж шортом улучшал Sharpe и просадку, но снижал итоговую доходность, поэтому модель оставили только длинной. Просадки лонг-версии в медвежьем рынке никто не страхует.
- У Basso нет цифр результата. Версии B и C описаны как его текущие стратегии, без статистики и без ширины полос.
- Ежедневная нормировка по волатильности увеличивает оборот. На малом счёте и CFD издержки могут съесть разницу с простым удержанием.