Ваш сигнал входу, ймовірно, має найменший вплив на результат бектесту. Я можу взяти посереднє правило імпульсної торгівлі, не змінювати жодного часу входу й виходу, а змінити лише функцію, яка визначає кількість контрактів у позиції, — і чистий Sharpe зміниться з 0.41 до 0.71, а максимальна просадка — з 31% до 13%. Ті самі угоди. Ті самі виконання. Інша стратегія.
Таке твердження дратує людей, і небезпідставно: воно означає, що більшість часу, витраченого на підбір періодів і порогів фільтрів, іде на другорядний параметр. Тож покажу реальні результати, а потім розгляну слушні заперечення, бо в цього аргументу є хибна версія, і варто розуміти, яку саме версію я відстоюю.
Один сигнал, шість способів утримувати позицію
Сигнал: безстроковий ETHUSDT на Binance USDⓈ-M, свічки 1-годинного таймфрейму, купуємо, коли EMA за 12 годин вище за EMA за 96 годин, інакше поза ринком, без коротких позицій. Від липня 2022 до червня 2026 року. 431 угода туди й назад. Комісії taker з обох боків — 5.0 bps, фінансування сплачується або отримується кожні 8 годин відповідно до фактичної позиції, прослизання моделюється за глибиною найкращих цін у стакані. Сигнал навмисно нудний — я вибрав його, бо ніхто не став би його захищати, а отже, він дає чистий матеріал для перевірки.
У всіх рядках нижче однакові часові позначки свічок входу й виходу. Відрізняється лише функція визначення розміру позиції.
| Правило визначення розміру позиції | Чистий Sharpe | Максимальна просадка | Річний торговий оборот (× середня позиція) | Витрати як % від валового PnL | Пікове плече |
|---|---|---|---|---|---|
| Фіксований номінал $10k | 0.41 | 18.2% | 246× | 14% | 1.0× |
| Фіксована частка, 100% капіталу | 0.44 | 30.8% | 251× | 15% | 1.0× |
| Обернено пропорційно до реалізованої волатильності за 20 днів | 0.68 | 14.1% | 690× | 29% | 4.4× |
| Цільова річна волатильність 20%, погодинне ребалансування, без обмеження | 0.71 | 12.9% | 1,180× | 41% | 6.3× |
| Цільова волатильність 20%, зона без торгівлі 20%, обмеження плеча 3× | 0.66 | 15.3% | 402× | 19% | 3.0× |
| Половина Kelly за ковзними середнім і дисперсією за 60 днів | 0.52 | 24.6% | 830× | 33% | 8.1× |
Погляньте на розкид. Між найгіршим і найкращим рядками — різниця в Sharpe на 73% відносно та у 2.4 раза за просадкою. А тепер знайдіть мені параметр сигналу входу на цьому наборі даних, який змінює Sharpe на 0.30, не будучи очевидним переобученням. Я шукав. Довжина пари EMA змінює його приблизно на 0.12 у всій правдоподібній сітці параметрів, і більша частина цієї зміни — шум, який не зберігається поза вибіркою.
Чому обернена волатильність дає такий гарний результат і яка його частина реальна
Механізм простий. За фіксованого номіналу розмір позиції не корелює з реалізованою волатильністю, отже, доларовий ризик на угоду залежить від того, якою була волатильність цього тижня. Для ETH за цей період реалізована волатильність за 20 днів коливалася від 31% до 118% у річному вимірі. У березні 2024 року фіксований номінал означав у 3.8× більший доларовий ризик, ніж у липні 2023 року, не тому, що сигнал був упевненішим, а тому, що ринок був бурхливішим. Майже вся просадка припадає на верхній квінтиль волатильності. Розмір позиції, обернено пропорційний волатильності, усуває цей зв’язок, і завдяки цьому форма потоку доходів справді поліпшується.
Та частина приросту Sharpe — артефакт вимірювання, і якщо не розділити ці складові, надалі ви ухвалюватимете погані рішення. Sharpe ділить дохідність на стандартне відхилення доходів. Таргетування волатильності за визначенням стабілізує стандартне відхилення доходів. Ви безпосередньо оптимізуєте знаменник. Правило, яке масштабує позиції для досягнення сталої очікуваної волатильності, поліпшить Sharpe майже для будь-якого потоку доходів зі скупченнями волатильності, зокрема й для потоків без переваги. Я перевірив це на перемішаних сигналах: рандомізуйте часові позначки входу, залиште накладений шар таргетування волатильності — і Sharpe все одно зростає приблизно на 0.06 порівняно з фіксованим номіналом для базового потоку із середнім значенням 0. Небагато, але приріст є, і він пояснюється самою механікою.
Тому, порівнюючи правила визначення розміру позиції всередині команди, я ніколи не дивлюся лише на Sharpe. Мені потрібен Calmar, чистий PnL на одиницю середнього задіяного номіналу та розклад переходу від валового результату до чистого, бо разом ці три показники набагато важче підтасувати трюком зі знаменником.
Оцінка волатильності — це модель, і дані в неї просочуються
Найпоширеніша причина, через яку гарний результат визначення розміру позиції виявляється фальшивим: оцінка волатильності використовує інформацію зі свічки, для якої визначається розмір. Якщо ряд волатильності обчислюється на центрованому вікні, або стандартною функцією `rolling().std()` у pandas після ресемплінгу, що включає поточну незакриту свічку, або на основі стандартизації за всією вибіркою, у вас витік даних. Його легко пропустити, бо волатильність стійка, тож на кожному окремому рядку витік невеликий, а крива капіталу все ще виглядає правдоподібно. Просто в найважливіші тижні вона трохи надто гладка.
Перш ніж результат потрапить до черги паперової торгівлі, наші агенти перевіряють для кожного правила визначення розміру позиції 4 речі:
- Доступність на момент ухвалення рішення. Розмір позиції для свічки, що відкривається о 14:00, має обчислюватися за даними з часовою позначкою закриття ≤ 13:59:59.999. Ми перевіряємо це, повторно обчислюючи часовий ряд розмірів позицій на обрізаному наборі даних для випадкової вибірки з 200 моментів ухвалення рішень і порівнюючи результати.
- Період оцінювання — повноцінний параметр. Вікна волатильності за 20 і 60 днів — це дві різні стратегії. Період входить до сітки walk-forward разом з усіма іншими параметрами. Якщо результат працює лише за однієї довжини вікна, це свідчить про крихкість.
- Траєкторія плеча, а не лише його пік. Показуйте повний розподіл валового плеча. Наведений вище запуск таргетування волатильності без обмеження провів 4% годин із плечем понад 5× — такі деталі ніколи не потрапляють до зведеної таблиці, але повністю визначають, чи можна реалізувати стратегію.
- Чутливість до розміру позиції як перевірка стійкості. Якщо Sharpe різко падає, коли ви змінюєте цільову волатильність з 20% на 25%, стратегія не таргетує волатильність — вона налаштована під певне плече, і свою перевагу ви знайшли, підібравши конкретне число.
Обмеження плеча — це складова визначення стратегії, а не декоративне доповнення для управління ризиками. На Binance для ETHUSDT зі зростанням номіналу позиції знижуються доступні рівні максимального плеча, а ставка підтримувальної маржі зростає. Бектест, у якому правило таргетування волатильності доводить плече до 6.3× за номіналу $400k, описує позицію, яку біржа не дозволить утримувати з такою маржею. Рядок з обмеженням коштує 0.05 Sharpe і лише він із цих двох описує реальну позицію.
Саме на ребалансуванні зникають гроші
Зверніть увагу на стовпець витрат. Погодинне ребалансування до цільової волатильності дало найкращий показник Sharpe на перший погляд, але водночас віддало біржі 41% валового PnL. За рік це торговий оборот у 1,180× від середнього номіналу позиції: 5 bps за бік плюс спред і ринковий вплив. Очевидне рішення — ребалансувати рідше, за графіком. Краще рішення — зона без торгівлі: змінювати розмір лише тоді, коли поточна позиція відхиляється від цільової більше за певний поріг.
Зона 20% зменшила річний торговий оборот з 1,180× до 402× — на 66% — і коштувала 0.05 Sharpe. Я перевірив це вже на 8 сигналах, і картина повторюється: зони від 15% до 25% зберігають більшість переваг контролю ризику за третини обороту, а нижче 10% ви просто сплачуєте комісії за косметичну точність параметра, який і так оцінюєте за вікном у 20 днів. Не можна ребалансувати до 3 знаків після коми, спираючись на число зі стандартною похибкою 15%.
У лютому в нас був запуск, де у звіті, написаному агентом, приріст Sharpe на 0.22 приписали «вдосконаленому фільтру входу». У модулі визначення розміру позиції змінився один рядок. Фільтр не змінювався. Тепер я змушую звіт показувати хеш конфігурації визначення розміру позиції на самому початку, бо атрибуція потребує дисципліни, а моделі так само охоче вигадують стрункі пояснення, як і люди.
Як паперова торгівля змінює ваше правило визначення розміру позиції
Саме тут розрив між бектестом і паперовою торгівлею найбільший, і причина здебільшого в арифметиці. За чутливого до волатильності визначення розміру позиції її величина змінюється у 4–8 разів протягом вибірки. Обидва кінці цього діапазону впираються в обмеження біржі, які бектест не моделював.
На нижньому кінці — крок кількості й мінімальний номінал. Для безстрокового контракту ETHUSDT крок кількості становить 0.001, а мінімальна сума — $5. Якщо розмір позиції за низької волатильності становить 0.0004 ETH, у бектесті позиція є, а в паперовій торгівлі її немає. Це здається рідкісним випадком, аж поки не згадаєш, що правило таргетування волатильності формує найменші позиції саме на найспокійніших ринках, де за трендовим сигналом часто з’являються найкращі входи. На верхньому кінці — ліміти позицій, рівні маржі й те, що позиція з плечем 6× потребує дисципліни ізольованої маржі, для якої ви не моделювали ліквідацію в бектесті.
Ми виявили випадок, коли крива капіталу в паперовій торгівлі 6 тижнів відхилялася від бектесту не більше ніж на 3%, а потім різко розійшлася. Причина — округлення: у модулі виставлення ордерів використовувалося відсікання через `int()` замість округлення до кроку кількості, а середній розмір позицій становив 1.4 кроку. У бектесті розмір позиції визначався у неперервному просторі, а модуль для реальної торгівлі втрачав 20-30% запланованого розміру кожної малої угоди. Жодних хитрощів із моделлю виконання, жодних історій про затримки. Просто відсікання.
У чому критики мають рацію
Є 3 слушні заперечення, і я не хочу замовчувати їх.
Перше й найважливіше: визначення розміру позиції розподіляє перевагу, але не створює її. Якщо валове математичне сподівання вашого сигналу після реалістичних комісій і фінансування дорівнює нулю або менше, кожне правило з таблиці принесе збиток — просто хитромудрі правила зроблять профіль дисперсії привабливішим. Я вибрав сигнал із невеликою, але позитивною чистою перевагою за цей період. Застосуйте ті самі 6 правил до сигналу з чистим результатом −1.2 bps на угоду — ранжування збережеться, але капітал за будь-якого правила завершить період нижче стартового рівня. Визначення розміру позиції множить щось. Це «щось» спершу треба мати.
Друге: у таргетування волатильності є реальна й добре задокументована проблема — воно скорочує плече на самому дні стрімкого розпродажу й збільшує його після відскоку. За різкого V-подібного руху виграє фіксований номінал, іноді з великим відривом. Березневий обвал 2020 року на фондових ринках і криптовалютний розпродаж у серпні 2024 року в обох випадках покарали визначення розміру позиції з урахуванням волатильності на відновленні. У моєму чотирирічному періоді для ETH більше було затяжних рухів зі скупченнями волатильності, ніж V-подібних коливань, тож рядки з оберненою волатильністю виглядають краще. На іншому періоді частина порядку зміниться; якби я почав із таблиці за 2020 рік, аргумент був би слабшим.
Третє: правило визначення розміру позиції так само вразливе до переобучення, як і будь-яке інше. У моїй таблиці на це вказує половина Kelly за ковзними оцінками: виглядає витончено, має теоретичне обґрунтування, але дало другу за величиною просадку, бо ковзна оцінка середнього для зашумленого ряду доходів — нікудишня, а Kelly надзвичайно чутливий до такої оцінки. Будь-яке правило визначення розміру позиції, яке використовує оцінку очікуваного доходу, успадковує її похибку, ще й підсилює її. Правила, що використовують лише оцінку дисперсії, поводяться значно краще, бо дисперсія — єдиний момент, який справді можна оцінити за 4 роками погодинних даних.
Що я виніс із цього: коли результат бектесту дивує, спершу перевірте модуль визначення розміру позиції, а вже потім шукайте хитромудрі пояснення в сигналі. А коли звітуєте про Sharpe, поруч показуйте траєкторію плеча й розклад витрат, бо показник, який настільки залежить від рішення про розмір позиції, взагалі не є властивістю самого сигналу.
← Усі статті
