Идея коротко
Rob Hanna приводит пример самой простой идеи возврата к среднему: покупать каждый 5-дневный минимум и продавать, когда цена закроется выше 5-дневной средней. По его словам, у такой системы может быть около 75% прибыльных сделок, но кривая идёт вверх, вверх и проваливается, и провалы бывают резкими.
Защищается он размером позиции и подтверждением от рынка. Откаты в акциях он не покупает, если рынок перед этим взлетел и сам ждёт отката или если рынок ломается вниз. Решение принимает его индикатор Aggregator, который сводит все его исследования рынка в прогноз на несколько дней. Состав индикатора закрыт. Торгует Hanna такие модели только на крупных компаниях: S&P 500, S&P 100, NASDAQ 100.
Laurens Bensdorp в другом выпуске описывает похожую конструкцию с числами. Бумага должна быть в тренде, например выше 150-дневной EMA. Если S&P 500 закрылся ниже 40-дневной средней, новых входов нет. Выход часто по времени: не вернулась к средней за три дня, продаём. Стоп есть всегда, широкий.
Фильтры двух авторов в карточке не смешаны. Сигнал Hanna один, к нему два отдельных фильтра рынка: A по Hanna в нашей формализации и B по Bensdorp с его числами. Отбор бумаг вынесен в отдельное правило.
Почему это может работать
Hanna объясняет возврат к среднему структурой владельцев. У крупной компании много институциональных акционеров, и при сильной распродаже кто-то из них докупает по выгодной цене. У small caps таких владельцев один-два, и если один решил выйти, бумага может падать долго. Банкротство в S&P 500 тоже менее вероятно. Фильтр рынка он объясняет так: когда рынок на твоей стороне, поднимаются все лодки, и выбирать бумаги можно менее точно.
Bensdorp ставит фильтр рынка не ради лучшего результата отдельной системы. Он исходит из того, что при быстром падении все его лонговые системы теряют одновременно. Фильтр 40-дневной средней автоматически снижает лонговую экспозицию, когда рынок против, а на отскоке включается раньше долгосрочных трендовых фильтров. Этот вывод у него из опыта: после 2008 года он поверил, что лонг на возврат к среднему зарабатывает в медвежьем рынке, а в 2011 году убедился в обратном.
Оговорка: 75% у Hanna это пример того, что можно увидеть в тесте, а не показанный результат. Свои числа Bensdorp называет примерами.
Правила
Сигнал и выход (Rob Hanna)
// дневные бары; акция из S&P 500, S&P 100 или NASDAQ 100, либо индексный ETF
FiveDayLow = Close <= Lowest(Close, 5) // автор: покупать 5-дневный минимум
// Finetiq: минимум по закрытиям, текущий бар в окне. Вариант: Low <= Lowest(Low, 5)
IF FiveDayLow AND MarketOK AND NOT InPosition
BUY AT NEXT BAR OPEN // Finetiq: исполнение; вариант BUY AT CLOSE
IF Close > SMA(Close, 5)
EXIT AT NEXT BAR OPEN // автор: цена закрылась выше 5-дневной средней
// стопа в простой версии автора нет
Фильтр рынка A: Hanna (формализация Finetiq)
Hanna называет две ситуации, в которых не покупает, но не даёт для них чисел. Его Aggregator недоступен, поэтому ниже простая замена.
SPX = закрытие S&P 500 (второй символ)
Rocket = SPX >= Highest(SPX, 10) // автор: рынок взлетел и ждёт отката; Finetiq: 10-дневный максимум
BreakDown = SPX <= Lowest(SPX, 20) // автор: рынок ломается вниз; Finetiq: 20-дневный минимум
MarketOK = NOT Rocket AND NOT BreakDown
// автор: фильтр запрещает только новые входы, открытые позиции не закрывает
Если торговать сам индекс, фильтр A превращается в правило «покупать 5-дневные минимумы, которые не 20-дневные». Это уже другая система, её стоит тестировать отдельно.
Фильтр рынка B: Bensdorp (числа автора)
Триггер отката у Bensdorp не назван. Чтобы фильтры можно было сравнить, вход тот же, что у Hanna.
MarketOK = SPX > SMA(SPX, 40) // автор: S&P 500 выше 40-дневной средней; Finetiq: простая средняя
StockTrend = Close > EMA(Close, 150) // автор: «например» 150-дневная EMA
IF FiveDayLow AND StockTrend AND MarketOK AND NOT InPosition
BUY AT NEXT BAR OPEN // Finetiq: триггер Hanna
IF Close > SMA(Close, 5) THEN EXIT AT NEXT BAR OPEN // Finetiq: вернулась к средней = выше MA5
IF BarsSinceEntry >= 3 THEN EXIT AT NEXT BAR OPEN // автор: не вернулась за 3 дня
StopLoss = EntryPrice * 0.80 // автор: стоп всегда, широкий, 20% в его примере
Shares = Equity * 1% / (EntryPrice - StopLoss) // автор: размер от расстояния до стопа; Finetiq: риск 1%
Shares = Min(Shares, Equity * 10% / EntryPrice) // автор: потолок доли капитала; Finetiq: 10%
Отбор бумаг (отдельное правило)
// Hanna: только крупные компании
UniverseA = члены S&P 500 на дату сигнала // Finetiq: членство на дату, а не сегодняшний состав
// Bensdorp: все бумаги, включая исключённые из листинга,
// с фильтрами ликвидности, цены и волатильности, пороги не названы
UniverseB = акции США AND AvgVolume > X AND Close > Y AND ATRpct > Z // Finetiq: X, Y, Z подбирать
Bensdorp поясняет фильтр волатильности: при удержании 1-5 дней бумага, которая ходит на 0.2% в день, ничего не даст. На широкой вселенной сигналов в день бывает больше, чем мест в портфеле. Правило выбора между ними ни один автор для этой системы не назвал.
Параметры
| Параметр | Значение | Откуда |
|---|---|---|
| Сигнал | закрытие на 5-дневном минимуме | автор (Hanna) |
| База минимума | закрытия, текущий бар в окне | Finetiq |
| Выход | закрытие выше SMA 5 | автор (Hanna) |
| Вселенная A | S&P 500, S&P 100, NASDAQ 100, без small caps | автор (Hanna) |
| Фильтр A: взлёт рынка | S&P 500 на 10-дневном максимуме | Finetiq |
| Фильтр A: слом рынка | S&P 500 на 20-дневном минимуме | Finetiq |
| Фильтр B: рынок | S&P 500 выше 40-дневной средней | автор (Bensdorp), тип средней Finetiq |
| Фильтр B: тренд бумаги | выше EMA 150 | автор (Bensdorp) |
| B: выход по времени | 3 дня | автор (Bensdorp) |
| B: стоп | 20% | автор (Bensdorp, пример) |
| B: риск и потолок позиции | 1% и 10% капитала | Finetiq |
| Удержание | 1-5 дней | автор (Bensdorp) |
| Вход | открытие следующего дня | Finetiq |
Что проверить
- Нужен ли фильтр. Один сигнал на одной вселенной: без фильтра, с A, с B. Смотрите на просадку и число одновременных позиций в 2008, 2011, 2020 и 2022 годах. Bensdorp ставит фильтр ради экспозиции, так что одной доходности для сравнения мало.
- Заявление про 75%. Простая версия без фильтра и стопа на крупных компаниях. Кроме процента прибыльных, посмотрите на худшую серию убытков и глубину провалов.
- Крупные против мелких. Те же правила на small caps. Hanna говорит, что там возврат к среднему ненадёжен. Если разница есть, это аргумент в пользу его объяснения.
- Стоп. Без стопа, 20% и 10%. Bensdorp ожидает, что стоп снизит процент прибыльных, и соглашается на это ради худшего сценария. Меряйте, сколько стоит эта страховка.
- Окрестность параметров. Минимум за 4, 5, 7 дней. Выход над SMA 3, 5, 7. Фильтр B: средняя 30, 40, 50, тренд EMA 100, 150, 200. Если результат держится только на исходных числах, это подгонка.
- База минимума. По закрытиям против минимумов бара.
- Издержки. Удержание несколько дней, сделок на широкой вселенной много. Комиссия и спред на входе по рынку заметно снижают среднюю сделку, прогоните тест с ними.
Особенности платформ
TradingView (Pine Script)
- Стратегия торгует только символ графика. Портфель из акций S&P 500 в одном тесте не собрать: можно проверить сигнал на отдельных бумагах и сложить результаты вне платформы.
- S&P 500 подключается через
request.securityс тикером индекса и таймфреймом"D". Безlookahead_onбудущего на истории нет, но проверьте, что даты баров бумаги и индекса совпадают. ta.lowest(close, 5)включает текущий бар, условиеclose <= ta.lowest(close, 5)это ровно 5-дневный минимум закрытий.- Членства в индексе на дату в Pine нет. Тест на сегодняшних членах индекса завышает результат.
MultiCharts и TradeStation (EasyLanguage)
- Индекс подключается вторым потоком:
Close of Data2,Average(Close of Data2, 40). Ордера идут только поData1. - Портфель по вселенной: Portfolio Maestro в TradeStation, Portfolio Trader в MultiCharts. Для честного теста нужны данные с исключёнными из листинга бумагами, иначе результат завышен.
- EMA 150:
XAverage(Close, 150). Средней нужен разогрев 450-600 баров, первые годы истории отбросьте. - Выход по времени:
If BarsSinceEntry >= 3 then Sell next bar at market. Стоп ценой:Sell next bar at EntryPrice * 0.8 stop.
MetaTrader 5 (MQL5)
- Акции торгуются через CFD, список бумаг у брокера неполный, истории исключённых из листинга бумаг нет. Тест в MT5 почти всегда содержит ошибку выжившего.
- Индекс читается через
iCloseпо CFD на S&P 500, имя символа у брокеров разное. Дневной бар CFD строится по серверному времени и закрывается не в 16:00 ET, поэтому 40-дневная средняя будет немного другой. - Мультисимвольный режим тестера позволяет вести несколько бумаг в одном советнике, но все символы должны быть в Market Watch.
- Своп за удержание до пяти ночей учитывайте в тесте.
Где идея может сломаться
- Ни у Hanna, ни у Bensdorp нет показанного теста этой конструкции. 75% и 60% это их оценки.
- Отрицательная асимметрия: много мелких выигрышей и редкие резкие провалы. Короткая история без 2008 или 2020 года покажет слишком гладкую кривую.
- Фильтр A целиком наш. Настоящий фильтр Hanna закрытый и опирается на множество его исследований рынка.
- Числа Bensdorp (EMA 150, MA 40) он называет примерами, и работают они у него внутри портфеля из десятков систем с разными выходами.
- Тест на текущих членах S&P 500 без исключённых бумаг завышает результат, особенно для покупки падающих акций.
- Версия на одном индексе даёт мало сделок и ведёт себя иначе, чем портфель из сотен акций.