Блог им. AndreyVarakin

Как я проверяю, что стратегия не подогнана: протокол из 14 процедур, код открыт

В алготрейдинге около года, пришёл из другой сферы, где исследование начинается
с протокола: что проверяем, каким способом и какое решение принимаем по каждому
результату — всё это ДО того, как посмотрели на данные. В трейдинге меня удивило,
что здесь так почти никто не делает: сначала перебирают параметры, потом решают,
что считать успехом.

Выложил в открытый доступ то, чем сам проверяю систематическую стратегию перед
тем, как пустить её на реальные деньги:
github.com/andreyvarakin/quant-validation

Это не библиотека и не грааль. Половина содержимого давно и лучше сделана
в arch, quantstats, pypbo, backtesting.py — в README так и написано: в продакшн
берите их. Ценность в другом: в порядке процедур и в том, что каждая метрика
откалибрована.

Четыре вещи, ради которых писалось.

1. Отбор не должен видеть проверку. Если параметр выбран по всей истории, а
потом на ней же и показан — это не результат, а описание прошлого. В коде
параметр выбирается только на прошлом и применяется вперёд, без исключений.

2. Метрика модели — не результат счёта. Это самое недооценённое. В демо видно
прямо: уменьшаем книгу с 5 млн до 250 тыс — и доля позиций, округлённых
в НОЛЬ целыми лотами, растёт с 0.8% до 7.6%. То есть торгуется уже не тот
портфель, который посчитан, при том же самом сигнале. Туда же задержка
исполнения, издержки и лимит ликвидности.

3. Метрику надо калибровать, а не только считать. Любимое. Есть показатель
вероятности переподгонки (PBO). Само число не значит ничего, пока не известно,
что эта же процедура выдаёт в заведомо известных случаях. Поэтому она гоняется
ещё на двух контрольных наборах: где эдж специально уничтожен и где
«разные» конфигурации на самом деле клоны одной. В демо рабочая сетка даёт
4.6% против примерно 80% на убитом эдже. Без этих двух реперов число не
читается — а в готовых пакетах их нет, там показатель считают и на этом
останавливаются.

4. Просадка и потеря денег — разные вопросы. «Яма 20% от пика» на выросшем
счёте может не означать потери ни рубля. Считаю то, что реально интересует:
минимум эквити относительно СТАРТА. И отдельно проверяю, не досталась ли
наблюдённая просадка везением порядка сделок — в демо её перцентиль 81, то
есть путь был удачный, и планировать по нему нельзя.

Плюс отдельная секция, где аппарат обязан МОЛЧАТЬ: тот же набор процедур
прогоняется на рынке, где предсказуемость не заложена вообще. Точечный Sharpe
там может выйти каким угодно — важно, что p-value отказывается его подтверждать.
Если ваш тестер на таком рынке рисует прибыль, дело не в рынке.

Свой код проверял тем же способом, что и стратегию, — вторым независимым
источником. Те же ряды прогнаны через сторонние библиотеки в отдельном
окружении: Sharpe, профит-фактор, просадка и Deflated Sharpe совпали
с quantstats и pypbo до нуля, бутстрап и PBO — в пределах 1–4%.

Запускается на голом numpy + pandas, данные генерируются, ключей и интернета
не нужно: pip install -r requirements.txt, python run_demo.py. 47 тестов
написаны на инварианты, а не на золотые числа: лимит ликвидности не смотрит
в сегодняшний объём, повторная обработка того же дня не удваивает
реализованный P&L, сбой чтения позиций не закрывает книгу в учёте. Последние
два написаны по следам собственных аварий.

Сразу отвечу на главный вопрос: сигнала, параметров и состава корзины там нет
и не будет — инструменты называются INSTRUMENT_A…E, демо-стратегия написана
специально для пакета. Стратегия торгуется, и раздавать её я не собираюсь.
Оценивать предлагаю процедуру вокруг неё, её как раз видно целиком.

Буду рад, если разберёте по косточкам.

Данная публикация является личным мнением автора. Мнение владельца сайта может не совпадать с мнением автора.
757 | ★2
15 комментариев
Мудрено, солидно!
Не нашел ничего про период тестирования, ну или некоторые говорят про минимальное количество сделок в тесте.
Еще есть критерий стабильности системы вне зависимости от параметров и от инструментов.
Что со средней сделкой? И т.д.

В общем, у меня другой подход.
Задача трех тел, 


Про минимальное число сделок и среднюю сделку — да, отдельных критериев нет. Средняя сделка учтена косвенно: издержки, целые лоты и задержка вычитаются в
движке исполнения ещё до того, как считается хоть одна метрика. Система, у которой
средняя сделка не перекрывает комиссию, там умирает сама. Но явным порогом честнее,
согласен, заберу себе.

Стабильность по параметрам есть — сетка чувствительности, где двигаешь по одному
параметру за раз, плюс walk-forward. Он заодно показывает, часто ли вообще меняется
выбранный параметр: если каждое окно новый оптимум, это уже ответ. По инструментам
смотрю вклад каждой ноги в итог, когда всё держится на одной — видно сразу.

Период теста в демо 900 дней: отбор на 250, проверка на следующих 60, шаг 60.
Получается 10 непересекающихся кусков OOS, склеенных в один ряд. Параметр за эти 10
окон сменился 5 раз — само по себе диагноз. PBO режет ту же
историю на 16 блоков по 56 дней и перебирает все 12 870 способов поделить её пополам.

Но walk-forward без длинной истории не
собирается в принципе, так что снизу оно упирается само.

А что за подход у вас? Правда интересно, чем стабильность меряете.

avatar
уменьшаем книгу с 5 млн до 250 тыс 

чего за книга такая? ) ИИ видимо написал неподумав

 

в амерской старой литературе так называли стакан заявок )

avatar
Андрей К, 

Ну так-то вы говорите про order book, другое значение слова)

В посте про то, что при уменьшении портфеля с 5 млн до 250 тыс часть позиций округляется целыми лотами в ноль, и торгуется уже
не то, что посчитано. И под книгой подразумевается торговый портфель

avatar
Буду рад, если разберёте по косточкам.
че тут разбирать ) очень сложно читать, ИИ стопудово написал, не?

еще и адреса такого нет ( github.com/andreyvarakin
avatar
Андрей К, 

Адрес верный, дело не в нём. GitHub зафлажил мой аккаунт целиком: профиль и оба репозитория отдают 404 всем, кроме меня. Аккаунту неделя, захожу через VPN. Апелляция подана, как снимут напишу здесь же.

avatar
Читать не возможно. А тема вечная, но от этого не менее интересная
avatar
«Валидировать — не мешки ворочать» ©
avatar
Привязка к начальной стоимости портфеля, имхо, блажь, которую используют инфоцыгане, чтобы объявить, что у них нет убытков. 
Многие будут плеваться, но я считаю эквити в лог. масштабе и использую в качестве базовой меры отношение среднегодовой доходности к среднеквадратическому дроудауну расчитанному по всей эквити относительно предшествующего ДД максимума. С натяжкой — индекс язвы 
(ulcer). 
Методологически мне не нравится в Вашем подходе то, что смешиваются какие-то базовые вещи частностями типа лотности. То, что можно учесть отдельно, как поправку. Биржа этой лотностью вовсю елозит.
Ну и главное, если я занимаюсь оптимизацией, то лукфорварды и оценки вне интервала подгонки в принципе несостоятельны. 
Дополнительно к этому — нестационарность исходных данных. Ну очевидно же, что QQQ в кризис доткомов и вне кризиса доткомов — просто разные ряды. Либо вы догоняетесь переключателями режимов, что само есть злая подгонка или рукоблудие, или желаете невозможного. 

avatar
SergeyJu, 

Про привязку к старту — принимаю упрёк, но у меня она не вместо просадки от пика, а вдобавок. Основная метрика от пика, она и в коде основная. Отношение к старту я считаю отдельно и ровно для одного вопроса: сколько своих денег рискует потерять человек, который зашёл сегодня. Это не про качество системы, это про первые месяцы, пока нет буфера прибыли. Ну, так звезды сложились, не факт ведь, что начинаешь с хорошего периода и сразу поперло, потому этот вариант тоже надо учитывать, раз можно просчитать. Что этим же приёмом удобно прятать убытки — согласен,
поэтому одно без другого показывать нельзя, что и является ответом на вопрос «как разоблачить инфоцигана». Ulcer не считал, посмотрю, спасибо.

Про лотность не соглашусь, и вот почему. Пока книга(портфель, ка некоторым больше нравится) большая, это действительно поправка, тут вы правы. Но она перестаёт быть поправкой, когда часть позиций округляется В НОЛЬ: у меня в демо при уменьшении портфеля с 5 млн до 250 тыс доля
таких ног растёт с 0.8% до 7.6%. Меняется не масштаб, а состав — торгуется другой портфель, чем посчитан, при том же сигнале. Линейно вынести это за скобки не получается, поэтому оно внутри движка, а не в множителе. Пропорциональное соотношение позиций по инструментам не собираются как нужно(как проверено) при недостаточном капитале.

Про лукфорвард и нестационарность — не спорю. Walk-forward не
даёт оценки будущего и на нестационарном ряду дать не может. Он закрывает ровно один способ себя обмануть: когда параметр выбран по тем же данным, на которых потом показан результат. Это не прогноз, это вычитание конкретной ошибки. Дальше я не пытаюсь получить точечное число, а смотрю распределение по окнам и проверяю, не досталась ли яма везением порядка сделок. Про переключатели режимов согласен полностью: у меня несколько попыток улучшения не пережили walk-forward и закрыты,
и это как раз тот класс, где подгонка ловится легче всего.

avatar
Andrey Varakin, маленькие счета, это же только автоследование? У А.Г., он писал, внутреннее ограничение, объем, выделенный на систему должен покрывать 5 лотов. Но это не разработку систем, а на использование ограничение. Собственно об этом я и написал. 
Есть еще одна вещь. 
Предположим, я разбил данные на 2 непересекающихся отрезка. Провел раздельно оптимизацию. Очевидно, что оптимумы не совпадут. Важно другое, система 1 должна быть приемлемой на отрезке 2, а система 2 — на отрезке 1. Степень ухудшения, это уже такой себе параметр, имхо, не принципиальный, потому что в конце концов мы должны принять решение, возьмем систему в портфель, или нет, какую долю в портфеле дадим. И здесь я скорее положусь на общее впечатление, чем на цифру. Насколько будущее будет напоминать отрезок 1 или 2 или вообще все пойдет по другому, в любом случае придется рано или поздно увеличивать экспозицию, или уменьшать. 
avatar
SergeyJu, 

Про пять лотов Бинго!=D Попал в точку, я как раз в это и упёрся. Только у меня это не правило, а замер: как я и сказал, в демо при уменьшении книги с 5 млн до 250 тыс доля позиций, округлённых в НОЛЬ, растёт с 0.8% до 7.6%. И там же вылезла вещь, которой я не ожидал: если инструментов остаётся два, кросс-секция вырождается математически — веса после центрирования и нормировки становятся ровно ±0.5 всегда, меняется только знак. То есть это уже не портфель, а один спред. Так что согласен: ограничение на использование, а не на разработку, но при этом оно меняет саму конструкцию, а не только масштаб.

А про два отрезка — вы описали ровно то, что у меня стоит в коде(кстати, гитхаб разфлажил, Но потребовал оставить приватным, пока выясняю в чем причина. Так что отзеркалил на гитлаб :( gitlab.com/andreyvarakin29/quant-validation), только я перебираю все разбиения, а не одно. Режу историю на 16 блоков и беру ВСЕ способы взять половину как обучение, остальное как проверку: C(16,8) = 12 870 вариантов, и каждый идёт вместе со своим зеркальным — то есть ровно ваше «система 1 приемлема на отрезке 2, и наоборот», просто много раз. Смотрю не на ухудшение, а на ранг: как часто лидер обучения оказывается на проверке ниже медианы.
И тут я с вами наполовину. Число само по себе действительно так себе параметр — я поэтому и прогоняю ту же процедуру на заведомо известных наборах, чтобы понимать, что она вообще выдаёт. Но одну вещь оно ловит, а впечатление не ловит: случай, когда отбор систематически выбирает будущего аутсайдера. Это видно только на многих разбиениях, на двух отрезках такое можно списать на невезение.
С последним да, солидарен: решение «брать или не брать и с какой долей» ни одна метрика за меня не примет. Но они и нужны только чтобы отсеять то, что брать точно нельзя.

Про вырождение двух ног я вам вчера считал — цифры проверенные, ±0.5 подтверждается чисму, почему «пять лотов» у вас не просто про размер счёта.

avatar
И как практические успехи? Прошли ли какие-то конкретные стратегии строгий-престрогий отбор, торгуются ли на деньги? Если да, то были ли случаи отбраковки стратегий уже из прода, ввиду неудовлетворительности результатов на настоящем OOS?
avatar
Кирилл Гудков, 

Торгуется, на реальные деньги первый месяц( сейчас в яме, но по продленному бэктесту до этого периода ситуация аналогична и пока в рамки допустимого из проверенного влезает) и на бумаге параллельно полгода, там в плюсе.

Отбраковка из прода была, и не одна. Один рукав я вывел из портфеля по живому результату: в бэктесте он проходил, на реальном исполнении не подтвердился, и после разбора выяснилось, что проверен он был слабее остальных — по строгим критериям его вообще не следовало запускать. Другую идею закрыл до запуска, когда посчитал среднюю сделку против тарифа: валовый результат был, но комиссия съедала его целиком. 

В общем-то для того и сделал четкий протокол, т.к. обе штуки выглядели работающими. пока нормально не проверил.

avatar

Читайте на SMART-LAB:
Фото
Новый выпуск облигации ПКО "Вернём" (B|ru|, 170 млн., YTM 28,71%)
❗️ Информация для квалифицированных инвесторов 💼 В следующий четверг, 17 сентября планируется размещение нового выпуска облигаций ПКО...
Фото
Почему инвесторы выбирают «Норникель» - Мосбиржа опубликовала «Народный портфель» за август
Несмотря на продолжающуюся на фондовом рынке волатильность, связанную с перелетами переговорщиков по Украине, и снижение в августе индекса Мосбиржи...
Фото
Как рынок отреагирует на решение ЦБ в пятницу: прогноз Т-Инвестиций по акциям, облигациям и рублю
Сейчас инвесторы настроены осторожно. В котировки рынка заложено ожидание по сохранению ключевой ставки неизменной. Таков и консенсус...
Фото
Сбер РПБУ 8 мес. 2026 г. - менеджмент ждет замедления, но в отчетах пока рекорды
Сбер опубликовал результаты по РПБУ за 8 мес. 2026 г.  Чистая прибыль за 8 месяцев составила 1,33 трлн руб. (+19%). За август 169,1 млрд руб....

теги блога Andrey Varakin

....все тэги



UPDONW
Новый дизайн