Идея коротко
Есть два способа вести размер позиции. Первый: посчитать размер при входе и больше его не трогать. Второй: регулярно подстраивать позицию под текущую волатильность, уменьшая её, когда рынок разгулялся, и увеличивая, когда он затих. Второй способ называют vol-targeting или контролем волатильности.
Moritz Seibert и Moritz Heiden из Takahé Capital торгуют первым способом. ATR замеряется один раз в момент открытия сделки, и размер держится до выхода. Капитал для расчёта (trade level) берётся не из текущего счёта, а из условной величины. Её пересматривают редко и только по реализованной прибыли, открытая прибыль в расчёт не входит.
Карточка задаёт этот блок для любой системы и контрольный вариант с ежедневной подстройкой, чтобы проверить утверждения авторов на своих сделках.
Почему это может работать
Аргументы авторов:
- Меньше сделок. Каждая подстройка платит комиссию и спред, а фиксированный размер их не платит совсем.
- Волатильность плохая мера риска. Она симметрична и одинаково считает движение в вашу сторону и против вас.
- Подстройка ломает логику системы. Шорт в падающем рынке обычно попадает на рост волатильности, и правило урезает выигрышную позицию. Пример авторов: нефть в 2020 году.
- Подстройка срезает правый хвост. Кривая становится глаже, но трендовая система живёт редкими огромными сделками, и именно их размер уменьшается.
- Тезис «волатильность растёт у разворотов» их данные не подтверждают. Облигации годами падали плавно. Контроль волатильности в такой ситуации наращивал бы позицию, которая начала терять.
Про свой подход авторы честно говорят: единственный замер может прийтись на момент необычно низкой или высокой волатильности, и это бывает и плюсом, и минусом. Исследование, на которое они ссылаются, в интервью не раскрыто. Цифр по нему нет.
Trade level по закрытым сделкам авторы называют консервативным: плечо не наращивается автоматически на каждой волне открытой прибыли.
Правила
Блок размера (авторы, числа Finetiq)
// считается только в момент сигнала на вход
// trade level: условный капитал для расчёта размера (авторы)
// держится постоянным и пересматривается по реализованной прибыли, когда P&L заметно изменился
ClosedEquity = InitialCapital + сумма закрытых сделок // открытая прибыль не входит (авторы)
IF первый торговый день месяца // Finetiq: проверка раз в месяц
AND |ClosedEquity / TradeLevel - 1| >= 10% // Finetiq: порог «заметного» изменения
TradeLevel = ClosedEquity
ATRe = ATR(20) на закрытии сигнального бара // авторы: недавний средний диапазон; Finetiq: 20
RiskMoney = TradeLevel * 0.25% // авторы: «определённый процент»; Finetiq: 0.25%
StopDist = 3 * ATRe // авторы: начальный стоп есть; Finetiq: 3 ATR
Contracts = floor(RiskMoney / (StopDist * PointValue))
BUY Contracts AT NEXT BAR OPEN // или SELL SHORT
// после входа Contracts не меняется до выхода (авторы): ни при росте ATR, ни при падении
// одинаковый риск для всех рынков и для лонга и шорта (авторы)
Контрольный вариант: ежедневный vol-targeting (Finetiq)
// тот же вход, тот же выход, тот же TradeLevel; меняется только ведение размера
Target(t) = floor(TradeLevel * 0.25% / (3 * ATR(20)[t] * PointValue))
IF |Target(t) - CurrentContracts| >= MAX(1, 20% * CurrentContracts) // Finetiq: зона нечувствительности
довести позицию до Target(t) AT NEXT BAR OPEN
пометить сделку ярлыком "vol-adj"
Корзина корректировок (метод авторов, учёт Finetiq)
// авторы: сложить все корректирующие сделки отдельно, с комиссией и спредом 0.5-1 тик
// Finetiq: каждая добавка закрывается при ближайшем сокращении или на общем выходе (LIFO)
AdjPnL = Σ по сделкам "vol-adj": (цена закрытия части - цена открытия части) * контракты * PointValue
- комиссия - (0.5 или 1 тик) * контракты * 2
// AdjPnL < 0: подстройка стоит денег (утверждение авторов)
Применение к карточке always-in-breakout
// там размер уже считается в момент переворота: Units = Equity * 0.2% / (ATR20 * PointValue)
// блок меняет две вещи:
Equity -> TradeLevel по закрытым сделкам, пересмотр раз в месяц при изменении от 10%
ATR20 -> фиксируется на баре переворота и не пересчитывается до следующего переворота
// контрольный вариант: те же перевороты, Units пересчитываются каждый день по ATR20[t]
Параметры
| Параметр | Значение | Откуда |
|---|---|---|
| Замер волатильности | один раз при входе | автор |
| Мера волатильности | недавний ATR | автор |
| Капитал для расчёта | trade level по закрытым сделкам | автор |
| Пересмотр trade level | когда P&L заметно изменился | автор |
| Порог пересмотра | 10%, проверка раз в месяц | Finetiq |
| Период ATR | 20 | Finetiq |
| Риск на сделку | 0.25% trade level | Finetiq |
| Стоп для расчёта размера | 3 ATR | Finetiq |
| Лонг и шорт | одинаковый бюджет риска | автор |
| Контроль: частота пересчёта | каждый день | Finetiq |
| Контроль: зона нечувствительности | 1 контракт или 20% | Finetiq |
| Издержки в корзине | 0.5-1 тик спреда плюс комиссия | автор |
Что проверить
- Главное сравнение. Одни и те же сигналы (например,
always-in-breakoutилиturtle-4w-2wна 20-30 фьючерсах), размер на входе против ежедневного vol-targeting. Смотрите доходность, максимальную просадку, средний убыток, среднюю прибыль и асимметрию распределения сделок. - Корзина корректировок. Посчитайте AdjPnL при 0.5 и при 1 тике. Это прямая проверка утверждения авторов, что подстройка сама по себе приносит убыток.
- Правый хвост. Доля итоговой прибыли, которую дают 5% лучших сделок, в обоих вариантах. Если vol-targeting заметно её снижает, он меняет саму природу трендовой системы, о чём и говорят авторы.
- Частота между крайностями. Пересчёт каждый день, раз в неделю, раз в месяц, только при изменении размера от 50%. Так видно, где исчезает разница.
- Чувствительность единственного замера. Период ATR 10, 20, 50. Отдельно сделки, открытые сразу после всплеска волатильности: при коротком ATR их размер будет крошечным на всю сделку.
- Капитал для расчёта. Trade level с пересмотром, закрытый капитал на каждой сделке, полный капитал с открытой прибылью. Сравните поведение просадки в конце длинного тренда, когда открытая прибыль возвращается.
- Размер счёта. При 1-3 контрактах на рынок ежедневная подстройка почти всегда округляется в ноль изменений. Прогоните сравнение на капитале, с которым будете торговать, а не на миллионах.
Особенности платформ
TradingView (Pine Script)
- Закрытый капитал:
strategy.initial_capital + strategy.netprofit.strategy.equityуже включает открытую прибыль и для trade level не подходит. - Размер на входе считайте на сигнальном баре и передавайте в
strategy.entry(..., qty = n). Стоимость пункта:syminfo.pointvalue. - Контрольный вариант требует добора и частичного сокращения:
pyramidingвstrategy()иstrategy.close(..., qty = x). Безpyramidingдобавки молча не исполнятся, и сравнение покажет два одинаковых результата. - Портфельного теста нет: trade level на весь портфель в Pine не посчитать, только на один символ (раздел 5 справочника).
ta.atrсглаживает по Уайлдеру.
MultiCharts и TradeStation (EasyLanguage)
- Закрытая прибыль стратегии:
NetProfit, открытая:OpenPositionProfit. Начальный капитал удобнее задать входом, чтобы trade level считался одинаково в бэктесте и в торговле. - Стоимость пункта
BigPointValue.AvgTrueRangeэто простое среднее TrueRange, а не Уайлдер. - Размер фиксируется в переменной на сигнальном баре:
Buy Contracts_ contracts next bar at market. Контрольный вариант требует разрешить несколько входов в одну сторону в свойствах стратегии и сокращать позицию именованными выходами с числом контрактов. - Общий trade level на много рынков считается в Portfolio Maestro или Portfolio Trader. На одном графике стратегия видит только свою прибыль.
MetaTrader 5 (MQL5)
AccountInfoDouble(ACCOUNT_BALANCE)это баланс без плавающей прибыли,ACCOUNT_EQUITYс ней. Для trade level нужен баланс, но он общий для всех советников на счёте.- Лот из риска:
SYMBOL_TRADE_TICK_VALUE,SYMBOL_TRADE_TICK_SIZE, округление доSYMBOL_VOLUME_STEP. Зафиксированный лот храните в переменной, а при перезапуске советника берите объём открытой позиции. - На неттинговом счёте подстройка меняет объём одной позиции, на хеджинговом создаёт отдельные позиции. Корзину корректировок проще вести на хеджинговом счёте.
iATRэто простое среднее TR. У CFD каждая подстройка платит спред, а позиция, которую держат 200 дней, ещё и своп. Для CFD издержки в корзине будут выше, чем у авторов на биржевых фьючерсах.
Где идея может сломаться
- Исследование авторов не опубликовано в интервью. Все утверждения о среднем убытке и корзине корректировок пока словесные.
- Авторы торгуют долгосрочный тренд со средней сделкой около 200 дней. За такое время волатильность меняется сильно, и разница между двумя способами заметна. У системы со сделками на 3-10 дней ATR почти не успевает измениться, и сравнение может ничего не показать.
- Единственный замер ATR может прийтись на всплеск или затишье. Если после затишья волатильность выросла в разы, риск позиции в деньгах тоже вырос в разы, и блок это сознательно не исправляет.
- Trade level консервативен только на росте. После глубокой просадки он остаётся высоким до пересмотра, и риск в процентах от реального капитала становится больше плана.
- Процент риска, период ATR, множитель стопа и порог пересмотра trade level авторы не назвали. Значения в таблице стартовые и требуют проверки.
- На маленьком счёте округление до целых контрактов сильнее, чем выбор между двумя способами. Фиксированный процент риска там выдерживается только приблизительно.