Идея коротко
Laurens Bensdorp торгует 55 стратегий на акциях и делит их на четыре «ноги»: тренд и возврат к среднему, каждая в лонг и в шорт. В выпуске он целиком показал одну трендовую систему как пример простоты. Фильтр рынка: индекс NASDAQ 100 закрылся выше 200-дневной средней. Сетап бумаги: закрытие выше верхней границы 50-дневного канала Кельтнера шириной 2 ATR. По словам автора, это весь трендовый компонент.
Такой фильтр, по оценке автора, пропускает 20-30 кандидатов. Их автор ранжирует по доходности за 200 дней (ROC 200) и берёт сильнейших. Сколько позиций держать, он не назвал. Начальный стоп 15% от входа, дальше трейлинг-стоп 25%. Шортов нет.
Широкие процентные стопы делают систему медленной. Трейлинг 25% поднимается выше начального стопа, только когда бумага прибавила больше 13.3% от входа (0.85 / 0.75 = 1.133). До этого позицию защищает стоп 15%.
С карточкой new-high-breakout-ma10-exit общая логика пробоя вверх, но устройство другое. Там уровень это максимум за 100 или 200 дней, а выход по 10-дневной средней закрывает сделку за дни. Здесь уровень считается от волатильности, процентный выход держит позицию месяцами, а важная часть системы это выбор между бумагами по ROC 200. Страховку длинного портфеля на обвалах тот же автор описывает в index-crash-hedge.
Почему это может работать
Автор объясняет правила так. Закрытие выше канала Кельтнера на двух ATR значит, что бумага вышла вверх из обычного диапазона колебаний. Высокий ROC за 200 дней отбирает бумаги, которые долго росли и при этом волатильны. Трендовая нога у него охотится за редкими крупными движениями с положительной асимметрией. Возврат к среднему, наоборот, копит мелкую прибыль и иногда получает крупный удар.
Шорт в тренде на отдельных акциях автор не держит из-за корпоративного риска: при долгом удержании новость в любой день может дать гэп против позиции. Для короткой стороны он торгует ETF. Вселенную для тренда он берёт из индексов и прямо называет встроенную ошибку выжившего: индекс сам добавляет сильные бумаги и убирает слабые.
Про ранжирование у автора отдельная мысль. Он ведёт таблицу параметров всех стратегий и не берёт ROC 200 во вторую систему, даже если тот тестируется лучше: иначе новая система ищет то же, что старая. Пример принципиально другого ранга у него: максимальный RSI за 14 дней.
Бэктеста этой системы в выпуске нет. Объяснения выше это логика автора, нами не проверенная.
Правила
Сигнал на одной бумаге (автор)
// дневные бары, акция из индекса NASDAQ 100, только лонг
RegimeOK = NDX_Close > SMA(NDX_Close, 200) // автор: индекс выше 200-дневной средней
// Finetiq: тип средней не назван, берём простую
KC_Mid = EMA(Close, 50) // Finetiq: середина канала не названа
KC_Upper = KC_Mid + 2 * ATR(50) // автор: 50-дневный канал + 2 ATR
// Finetiq: ATR той же длины, по Уайлдеру
Setup = Close > KC_Upper // автор
ROC200 = Close / Close[200] - 1 // автор: ранг по доходности за 200 дней
Отбор кандидатов и вход (автор, число позиций Finetiq)
// после закрытия, по всей вселенной сразу
Candidates = бумаги, где RegimeOK AND Setup AND позиции ещё нет
Sort Candidates по ROC200 от большего к меньшему // автор
MaxPositions = 10 // Finetiq: автор число позиций не назвал.
// Ведущий пересказал правило как «топ-30»
FreeSlots = MaxPositions - число открытых позиций
FOR первые FreeSlots бумаг из Candidates
BUY AT NEXT BAR OPEN // Finetiq: исполнение на открытии следующего дня
// Finetiq: выключенный фильтр рынка запрещает новые входы, открытые позиции ведут стопы
Размер позиции (Finetiq)
// для этой системы автор метод не назвал.
// В MR-системах он считает размер по волатильности и ограничивает долю капитала в бумаге
PositionValue = Equity / MaxPositions // Finetiq: равные доли, 10% капитала
// риск на сделку при стопе 15% около 1.5% капитала, без учёта гэпов
Выход (автор)
InitialStop = EntryPrice * 0.85 // автор: стоп 15%
TrailStop = HighestClose(с входа) * 0.75 // автор: трейлинг 25%
// Finetiq: от максимального закрытия, не от High
Stop = MAX(InitialStop, TrailStop)
SELL STOP at Stop // Finetiq: стоп-ордер внутри дня
// вариант для проверки: IF Close < Stop THEN EXIT AT NEXT BAR OPEN
Вариант B. Выход по каналу (автор, уровни Finetiq)
// автор не хочет, чтобы у всех его стратегий был трейлинг 25%.
// Примеры простых выходов «цена пошла вниз»: 200-дневные полосы Боллинджера,
// 100-дневный канал Кельтнера, канал Дончиана
IF Close < SMA(Close, 200) THEN EXIT AT NEXT BAR OPEN // Finetiq: средняя линия полос 200
IF Close < EMA(Close, 100) - 2 * ATR(100) THEN EXIT AT NEXT BAR OPEN // Finetiq: нижняя граница, ширина 2
// какую границу считать сигналом, автор не уточнил
Вариант C. Ротационный выход (автор, частота Finetiq)
// ранг задаёт и вход, и выход
Rank = место бумаги по ROC200 среди всех бумаг вселенной
IF RegimeOK AND Rank <= 10 AND позиции нет THEN BUY AT NEXT BAR OPEN // автор: вход в топ-10
IF Rank > 10 THEN EXIT AT NEXT BAR OPEN // автор: выпала из топ-10
// Finetiq: ранг пересчитывается каждый день; фильтр рынка оставлен от основной системы
// выход не значит, что бумага падает: нашлась более сильная (автор)
Отбор бумаг (отдельное правило)
// вселенная: состав NASDAQ 100 на дату каждого бара, включая бумаги, исключённые позже
// автор: подходит и S&P 500, и корзина акций одного сектора, например энергетики
// Finetiq: у бумаги, исключённой из индекса, новых входов нет, открытую позицию ведут стопы
// сигнал считается на каждой бумаге отдельно, ранжирование по всей вселенной
Параметры
| Параметр | Значение | Откуда |
|---|---|---|
| Вселенная | акции NASDAQ 100 (вариант: S&P 500) | автор |
| Фильтр рынка | индекс выше 200-дневной средней | автор |
| Тип средней фильтра | простая | Finetiq |
| Канал Кельтнера | 50 дней, ширина 2 ATR | автор |
| Середина канала и ATR | EMA 50, ATR 50 по Уайлдеру | Finetiq |
| Ранжирование | ROC за 200 дней, по убыванию | автор |
| Число позиций | 10 | Finetiq |
| Размер позиции | равные доли капитала | Finetiq |
| Начальный стоп | 15% от входа | автор |
| Трейлинг-стоп | 25% | автор |
| База трейлинга | максимальное закрытие с входа | Finetiq |
| B: виды выхода | полосы Боллинджера 200, канал Кельтнера 100, канал Дончиана | автор |
| B: уровни выхода | средняя линия, нижняя граница на 2 ATR | Finetiq |
| C: ротация | вход в топ-10 по ROC 200, выход при выпадении | автор |
| C: частота пересчёта | каждый день | Finetiq |
Что проверить
- Ранг против случайного выбора. Прогоните тот же сигнал с тремя способами выбора кандидатов: максимальный ROC 200, случайный порядок, минимальный ROC 200. Если случайный выбор близок к ROC 200, результат дают фильтр и выход, а не ранг. Добавьте ранг по RSI(14), который автор приводит как принципиально другой.
- Окрестность параметров. Канал 40, 50, 60 дней и ширина 1.5, 2, 2.5 ATR; ROC 150, 200, 250; стоп 10, 15, 20%; трейлинг 20, 25, 30%. Смотрите на форму результата по сетке, а не на лучшую точку.
- Число позиций. 5, 10 и 20 позиций на одних и тех же сигналах. Автор число не назвал, а от него зависят концентрация и доля пропущенных кандидатов.
- Ошибка выжившего. Сравните тест на историческом составе NASDAQ 100 с тестом на сегодняшнем списке. Разница покажет, сколько результата дал сам список. Отдельно проверьте правило для бумаг, исключённых из индекса при открытой позиции.
- Выходы в обвал. Трейлинг 25%, выход по каналу и ротационный выход на одной вселенной. Посчитайте, сколько позиций закрылось за одну неделю в марте 2020 года и в 2022 году. Разные выходы автор держит именно для того, чтобы в падении они не срабатывали одновременно.
- Периоды без роста. Отдельно 2000-2002, 2008 и 2022 годы. Автор считает выборку 1995-2024 смещённой в сторону роста.
- Живая просадка. Умножьте максимальную просадку теста на два, как советует автор. Проверьте, выдержите ли вы такую просадку при выбранном числе позиций.
Особенности платформ
TradingView (Pine Script)
- Стратегия торгует только символ графика. Ранжирование по ROC 200 между бумагами и лимит позиций в бэктесте Pine не воспроизводятся. Сигнал с фильтром индекса и стопами можно проверить по одной бумаге, но это другая система: без ранга входов больше.
- Фильтр индекса на дневном графике:
request.security("NASDAQ:NDX", "D", close > ta.sma(close, 200)). Таймфрейм совпадает с графиком, заглядывания вперёд здесь нет. - Реализации канала Кельтнера различаются: середина бывает SMA или EMA, ширина через ATR или средний диапазон. Посчитайте канал явной формулой.
ta.atrуже сглажен по Уайлдеру. - Трейлинг 25% считайте ценой и передавайте в
strategy.exitчерезstop. Параметрыtrail_pointsиtrail_offsetзадаются в тиках. - Проверьте корректировку на дивиденды и сплиты: от неё зависят ROC 200 и уровни процентных стопов.
MultiCharts и TradeStation (EasyLanguage)
- Ранжирование и лимит позиций делаются в портфельном модуле: Portfolio Maestro в TradeStation, Portfolio Trader в MultiCharts. Нужны исторические составы индекса с исключёнными бумагами, в стандартных данных их обычно нет.
AvgTrueRangeэто простое среднее TrueRange. Для ATR по Уайлдеру считайте сами:ATRw = ATRw[1] + (TrueRange - ATRw[1]) / 50. Готовые индикаторы канала Кельтнера устроены по-разному, сверьте формулу.- Стоп задавайте ценой:
Sell next bar at MaxList(EntryPrice * 0.85, HiClose * 0.75) stop, гдеHiCloseваша переменная максимального закрытия. Ордер живёт один бар, отправляйте его на каждом баре.SetDollarTrailingсчитает в деньгах и даёт другой уровень. - В версии на одном графике индекс подключается вторым потоком:
Close of Data2. Для SMA 200 и ROC 200 грузите историю с запасом, первые MaxBarsBack баров стратегия не торгует.
MetaTrader 5 (MQL5)
- Советник может ранжировать бумаги из Market Watch, но все акции индекса должны быть у брокера. Истории состава индекса у брокера нет, тест пойдёт на сегодняшнем списке.
- CFD на Nasdaq-100 (USTEC, NAS100) обычно следует за фьючерсом и торгуется почти круглосуточно, а дневной бар закрывается по времени сервера. Фильтр по нему приблизителен. Значение берите с закрытого бара:
iClose(symbol, PERIOD_D1, 1). - История CFD на акции часто короче биржевой. SMA 200 и ROC 200 считаются по одной и той же истории: до первой сделки нужно около 200 баров и ещё запас на разогрев EMA 50 и ATR 50 по Уайлдеру.
- Позиция держится месяцами. По CFD каждую ночь начисляется своп, проверьте, что тестер его учитывает.
Где идея может сломаться
- Автор показал систему как пример простоты. Результатов, периода теста и числа сделок в выпуске нет.
- Число позиций, размер, формула канала и база трейлинга дописаны нами. От числа позиций результат зависит сильно.
- Ошибка выжившего. Автор сам называет её встроенной в индекс. Исторические составы NASDAQ 100 обычно платные, а тест на сегодняшнем списке завышает результат.
- В резком падении стоп 15% и трейлинг 25% срабатывают почти на всех бумагах сразу, а гэпы делают убыток больше расчётного. Автор сам говорит, что при обвале такие выходы стопаются вместе.
- Результат трендовой ноги держится на немногих крупных движениях. На коротком тесте их может не оказаться, а период 1995-2024 автор считает удачным для лонга.
- Автор предупреждает, что ранг, лучший на истории, не обязан остаться лучшим. Подбор ранга под лучший тест превращает эту систему в подгонку.