Уже устал писать, что стратегия обновила свой максимум, но это снова произошло . Ничего не поделаешь, придётся написать 😈
Результаты за 8 месяцев
Оценка портфеля 66 859 ₽:
🔹 Пополнения 55 500 ₽ – начальный депозит 50к+5,5к бонусов от брокера
🔹 Прибыль 11 359 ₽
🔹 Доходность +21,1%
Расширил статистику по портфелю, чтобы результаты стали нагляднее. Плюс надоело вручную высчитывать чистую стоимость портфеля (без учета подарка от брокера). График доходности за сентябрь уже по традиции прикреплен к посту.
📌 На длинном периоде стратегия достаточно стабильна. После преодоления рубежа в 20% доходности просадки на 2-3% больше не ощущаются как нечто существенное. Торговать стало намного спокойнее, чем в первые 3 месяца.
Сентябрь прошёл гладко, без значимых взлётов и падений. Наибольшее изменение за сутки – падение на 2,15%, которое система быстро отыграла. По дневным свечам фьючерс $CRZ6 почти весь месяц болтался в боковике, без устойчивых трендов.
В такие моменты трендовушкам тяжелее всего. Моей версии тоже: неделю она откусывает небольшие кусочки, а потом за день теряет заработанное. Фильтры, которые я добавил месяц назад, сглаживают ситуацию, но не решают проблему.
📝 Фильтр пилы (боковика) – Святой Грааль трендовой торговли. В идеальном мире он определяет отсутствие тренда со 100% точностью. Однако в реальном мире такого фильтра не существует.
Прочитал в одном инвесторском чате, что для трендовой стратегии хороший результат – доходность 4-5 максимальных просадки. У Системного юаня доходность +21,1% при просадке -2,85%, то есть 7,4 к 1. На бэктесте результат чуть скромнее: 6,8 к 1. Тоже впечатляет, учитывая максимальное плечо в 200% счета.
А что там с роботом?
Чуть ли не с самого начала следования стратегии я мечтал о торговом роботе. Даже изучал Python ради этого.
Первым шагом в сторону автоматизации стал бот в тг, который присылает торговые сигналы. Это значительно упростило процесс, особенно когда я вышел на работу.
Первым шагом в сторону автоматизации стал бот в тг, который в определенное время присылает торговые сигналы. Это значительно упростило процесс, особенно когда я вышел на работу.
Второй шаг сделал в сентябре – познакомился с платформой для алготрейдинга Os.Engine. Она позволяет написать торгового робота на языке C# и подключить его к счету. Понравилось в ней вот что:
➖ бесплатная;
➖ удобный интерфейс (по сравнению с командной строкой для управления тг-ботом);
➖ параметры алгоритма можно регулировать без изменения кода;
➖ доступен бэктестинг.
С помощью ИИ я за пару дней воплотил Системный юань в Os.Engine и подключил его к брокерскому счету. Обрадовался успеху и решил, что проблема автоматизации торговли решена. Однако в день запуска робот не сработал…
Проблема в том, что для непрерывной работы робота должен быть постоянно включен ПК. Я наивно полагал, что специализированная платформа решит эту проблему. Однако, чтобы алгоритм работал круглосуточно, нужно держать ПК и саму Os.Engine включенными, либо организовать удаленный сервер.
Мой простенький VPS для запуска Os.Engine не годится, а платить 2-3к в месяц за продвинутый сервер смысла нет – издержки убьют прибыль. Держать свой старый ноутбук постоянно включенным я не хочу, поэтому пока идею с роботом отложил до лучших времен.
P.S. Os.Engine буду использовать для тестирования стратегий. Когда-нибудь попробую поиграть со своим вариантом моментума. Очень хочется проверить его на истории
📊 Пять стратегий в терминале — это пять ставок? Посчитайте
Спор о диверсификации обычно идёт про число: сколько систем, сколько инструментов, сколько таймфреймов. Число ничего не говорит. Пять систем, которые зарабатывают и теряют в одни и те же дни, — это одна ставка на рынок, размазанная по пяти окнам.
🧮 «У меня пять разных логик»
Сколько ставок на самом деле, считает формула эффективного числа:
N_eff = N / (1 + (N − 1)·ρ)
N — число систем, ρ — средняя попарная корреляция их дневных результатов. При ρ = 0 выходит N, при ρ = 1 — ровно одна ставка, сколько систем ни добавляй.
Пример: пять систем, ρ = 0,6. Знаменатель 1 + 4·0,6 = 3,4, N_eff ≈ 1,5. Полторы ставки вместо пяти.
Формула стоит на двух допущениях: веса равные и волатильность систем сопоставима. Если одна система несёт половину риска, считать надо по весам риска, иначе N_eff выйдет завышенным.
🔬 «А как это выглядит на живых системах»
Мой замер: четыре системы, одна на индекс, три на рубль — через доллар и юань. Корреляции считал по дням, интервалы — блочным бутстрапом.
Индекс с валютными системами: ρ от −0,05 до 0,03, неотличима от нуля. Валютные между собой: 0,40–0,63, и в одну сторону они стоят 85–93 % общих дней. ρ = 0,24, N_eff = 2,32 из 4. Портфель — это индекс плюс один валютный блок, а не четыре ноги.
🌪 «Почему считать дважды»
Корреляция, снятая за всю историю, — это в основном спокойные дни. В панике продают всё подряд, и связи между системами на одном рынке обычно растут. Поэтому N_eff считают дважды: по средней ρ и по кризисной.
На тех же четырёх системах: ρ = 0,70 даёт 4 / (1 + 3·0,7) = 1,29 ставки. Было 2,32 — стало 1,29.
Главное, что показал замер: ошибка ОЦЕНКИ корреляции сдвигает ответ на ±0,17 ставки (интервал 2,16–2,50). Допущение о режиме — на целую ставку. Мерить ρ точнее бессмысленно, решает то, какой режим вы закладываете.
🎯 «И что с этим делать»
Читать разрыв между двумя числами. N_eff в спокойное время 2,3, в кризис 1,3 — разница и есть цена «защиты», которая исчезнет ровно тогда, когда понадобится.
Размер позиции ограничивать по кризисному N_eff, а не по спокойному. Портфель, который выдерживает просадку при 1,3 ставки, переживёт и 2,3, — обратное неверно.
⚠️ Оговорка, без которой пост будет враньём
ρ = 0,70 в моём примере — допущение, а не замер: кризисных дней в истории мало, и корреляция по ним шумит сильнее, чем по всей выборке. Кризисное N_eff — это стресс-сценарий, который задают, а не оценивают.
Рост корреляций в кризис — не закон. Трендовая система в обвал может встать против рынка и ослабить связь, а не усилить. Поэтому кризисную ρ смотрят по своим системам в свои плохие дни, а не берут из учебника.
И независимость сама по себе ничего не стоит. Я находил семейство систем с ρ = 0,25 и тремя эффективными ставками — с нулевым краем. Подмешанное 50/50 к рабочей системе, оно уронило отношение доходности к просадке с 3,4 до 1,5. Диверсифицирует только то, что зарабатывает.
💡 В сухом остатке
Считайте ставки, а не стратегии: N_eff по средней корреляции и по кризисной. Разрыв между ними — цена иллюзии.
Размер — по кризисному числу. Новая система в портфеле стоит места, только если она и зарабатывает сама, и не ходит в ногу с остальными.
🎲 Корреляция говорит «вместе». Но молчит о том, что будет на краю.
Когда в портфеле несколько систем, главный вопрос не «сколько каждая зарабатывает», а «сложатся ли их убытки в один день». Обычный ответ — корреляция, одно число. Но она описывает середину, а платит счёт за края.
Инструмент, который говорит про края отдельно, — копула. Разбираю его на $SiZ6 $CRZ6 $MMZ6.
🧩 «Раздень зависимость от масштаба»
Возьмите доходности системы и замените каждый день не процентом, а МЕСТОМ в её собственном ряду: «худшие 5 % моей истории», «середина, 50 %». Число от 0 до 1. Так же со второй.
Теперь у обеих одна шкала, и весь масштаб — хвосты, асимметрия, плечо — из картинки ушёл. Что осталось, то и есть копула: когда у первой выпадает 0.03, что обычно выпадает у второй.
Распределение разбирается на маргиналы (какая нога сама по себе) и копулу (как они сцеплены). Значит, можно взять честные исторические хвосты своих систем и приклеить к ним ЛЮБУЮ связь.
🎛 Семейства спорят ровно об одном — о краях
Гауссова. В середине связь есть, но на краю ноги расцепляются: вероятность «вторая тоже в катастрофе, раз первая уже там» стремится к нулю. Плюс — один параметр, прозрачно и быстро. Минус — обещает, что в кризис системы разойдутся. А они сходятся.
t-Стьюдента. Хвосты степенные, углу не даёт опустеть. Плюс — честнее описывает совместные обвалы. Минус — второй параметр, который и управляет краями, приходится оценивать в самом хвосте, где данных меньше всего.
Клейтона. Слипается только НИЗ: падают хором, растут врозь — на рынок похоже. Минус — асимметрия тихо съедает доходность модели, и легко принять «риск уменьшился» за «дрейф исчез». Я на этом обжёгся. Гумбеля — зеркальная.
🔧 Мой приём: не оценивать связь, а назначить её руками
Копулу можно оценить по истории. Я так не делаю — и это главная мысль поста.
Оценка отвечает «как ноги ходили вместе раньше». Мне нужно другое: «а если слипнутся сильнее». Поэтому маргиналы беру из своей истории как есть, а корреляцию внутри копулы ВБИВАЮ: по валютным фьючерсам историческая выходила 0.38 и 0.62 — в стресс ставлю 0.70, в катастрофу 1.00.
Слабость гауссовой связи это не чинит, а компенсирует: занижает края — задираю вход.
📏 Три замера, а не рассуждения
Первый. Сравнил грубую фиксированную 0.70 с тонкими: асимметричной и со случайно плавающей. CVaR95 просадки — 9.3 % против 7.5 % и 6.4–6.9 %. Грубое допущение оказалось КОНСЕРВАТИВНЕЕ изощрённых. Менять не на что.
Второй. Одинаково ли строга вбитая 0.70 на разном числе систем? Мерил долю пути от независимости до полного слипания: 0.70–0.73 на четырёх составах, из двух и трёх ног, при исторической связи от 0.03 до 0.62. Число ног ручку не сдвигает.
Третий. Во сколько раз связь 0.70 ухудшает CVaR против независимости: на паре ×1.47, на тройке ×1.84. На трёх ногах стресс бьёт сильнее — там больше диверсификации, которую он разрушает. Приём масштабируется сам.
🚪 Почему я так и не перешёл на t-копулу
Собирался — и не стал, после одного вопроса: если связь вбивается руками, что даст другое семейство? Ничего. При 1.00 гауссова копула вырождается в комонотонность: каждый день все ноги берут ОДИН И ТОТ ЖЕ процентиль своей истории. Сцепить сильнее не может ни одна. t-копула — другая дорога к тому же пределу, а не точка за ним.
⚠️ Оговорка, без которой пост будет враньём
Комонотонность строго доказана как максимум для ОДНОДНЕВНОГО убытка. Моя мерка — просадка по пути, а не сумма. Довод сильный, теоремой я его не называю. И числа сняты с моих систем и моего окна: на другом наборе доля будет другой.
И свой прокол: на 5 000 путей разброс вышел 0.67–0.73, и я чуть не принял его за зависимость от состава. На 20 000 он схлопнулся — шум, а не сигнал.
💡 В сухом остатке
Корреляция — это наклон. Копула — ещё и края, а края и есть риск.
Оценивать копулу осмысленно, когда вы ей ЦЕНИТЕ: так считали транши облигаций и в 2008 сгорели. Если вы ей себя пугаете, семейство почти не важно — важно, докуда готовы выкрутить ручку и помечено ли это как допущение.
Вбитое число честнее оценённого ровно до тех пор, пока подписано вбитым.
⚖️ Правило, которое дважды подряд дало мне ответ наоборот
Проверял идею: вместо того чтобы выбирать один параметр стратегии, торговать сразу несколько её версий с разными настройками, разделив капитал поровну.
Правило приёмки объявил заранее, до замеров — так, чтобы не подгонять его под результат. Три условия: профит-фактор не ниже худшей из версий, просадка ниже, чем у боевой, и версии должны быть достаточно независимы.
Правило отработало. Дало ровно противоположный ответ. Дважды из двух.
🪤 Где ловушка
Портфель из четырёх версий по четверти капитала несёт меньше риска, чем одна версия на полном размере. Не потому, что диверсификация работает, а просто потому, что размер меньше. Я замерил: 75–78% волатильности исходной системы.
А раз риск меньше — просадка падает автоматически. Условие «просадка ниже базы» выполняется само собой, есть польза или нет её вовсе.
То есть я поставил условием то, что выполняется механически. Всё равно что оценивать автомобиль по расходу топлива, разрешив ему ехать медленнее.
🔀 Как это выглядело на деле
Первый случай, юань. Ансамбль показал просадку заметно ниже боевой версии, но не прошёл третье условие — версии оказались недостаточно независимы. Формально отклонён.
Второй случай, доллар. Тот же ансамбль по той же схеме прошёл все три условия. Формально принят.
Потом я привёл оба к равной просадке — и получил обратную картину.
Юань: отклонённый вариант при равной просадке давал +1402% против +619% у боевой. Больше чем вдвое.
Доллар: принятый вариант при равной просадке давал 14 709% против 26 987%. Почти вдвое хуже.
Правило не просто ошиблось. Оно оказалось антикоррелировано с тем, что я хотел измерить.
📏 Что делать вместо
Приводить всё к равной просадке и сравнивать только после этого.
Механика простая. Берём ряд доходностей кандидата и умножаем на множитель — это ровно то же, что торговать его с другим плечом. Подбираем множитель делением пополам так, чтобы просадка совпала с базовой. Дальше сравниваем итоговую доходность.
Просадка у обоих одинаковая по построению. Значит, разница в доходности — это и есть преимущество, а не разница в размере позиции.
🔎 Множитель сам по себе — информация
Его нельзя выбрасывать после сравнения. Он показывает, какой ценой достаётся выигрыш.
У юаня, чтобы догнать просадку боевой версии, ансамблю потребовался множитель 1,78 — то есть плечо 355% вместо 200%. И при этом ухудшился хвостовой риск: средний убыток в худших днях вырос с 2,35% до 3,01%.
Читается так: да, при равной просадке доходность выше — но за это надо почти удвоить плечо и получить более тяжёлые отдельные дни. Бесплатного обеда не выдали.
🧪 Проверка, что метод работает
Я не стал верить себе на слово и завёл три контрольные точки.
Первая: беру систему и просто уменьшаю её размер вдвое. Просадка падает с 24,1% до 12,7% — «безопаснее» без всякого преимущества. Ловушка воспроизводится.
Вторая: привожу разбавленный вариант к исходной просадке. Множитель выходит ровно 2,00, доходность совпадает с исходной до третьего знака. Разница исчезла — как и должна была, ведь это одна и та же система.
Третья: беру систему с настоящим преимуществом. После приведения она по-прежнему впереди, 663% против 137%. Значит метод не «зануляет всё подряд», а различает разбавление и кромку.
💡 Итог
Условия вида «просадка ниже» и «риск меньше» звучат осторожно и ответственно, а на деле пропускают что угодно, если сравниваемые варианты идут с разной экспозицией. Но тут есть что копать дальше.
Я записал это себе в регламент рядом с другим правилом того же рода: сравнивать только на одинаковых окнах. Там приводят к общей длине истории, здесь — к общему уровню риска. Смысл один: пока обе стороны не поставлены в одинаковые условия, сравнивать нечего.