Стратегии
Сезонность доходности в одном календарном месяце, доллар-нейтральный кросс-секционный портфель из 18 секторальных и страновых ETF (USEQ 1-DAY, ежемесячная ребалансировка на закрытии месяца, длинные позиции в топ-k / короткие в нижних k по сезонной избыточной доходности)
Итог: Отменено
SameMonthSeasonalityEtfLS
Сводка по итогам
SameMonthSeasonalityEtfLS стремилась использовать кросс-секционную сезонность месячной доходности для 18 ETF с взвешиванием по обратной волатильности. После четырёх итераций QA выявил несоответствие исполнения: гипотеза требовала исполнения на закрытии месяца, тогда как платформа исполняет эти ордера на открытии следующей сессии. Отрицательное математическое ожидание в песочнице носило рекомендательный характер; несоответствие исполнения привело к отказу от стратегии до последующих этапов конвейера.
Гипотеза
Это заполняет недостаточно представленные сегменты (long_short 18.8%, USEQ 6.6%, несколько инструментов) механизмом, отсутствующим в корпусе. Панель ETF позволяет избежать ловушки состава индекса, характерной для вселенной акций-компонентов (L190). Дополнительные данные не нужны (L189); стратегия нацелена на движения в несколько процентов в месяц, а десятилетия дневной истории дают сотни ребалансировок.
Реализация
Ежемесячное ранжирование фиксированной панели 18-ETF USEQ по сезонной избыточной доходности; длинные позиции в топ-k и короткие в нижних k с весами по обратной волатильности, валовая экспозиция 100% и внутрибараные защитные стопы 15%. Существующая реализация сохранена для проверки; требуемое исполнение по цене закрытия месяца не поддерживается.
Сохраняет прежние сигнал, универсум, определение размера позиций, сверку и защитные стопы. QA указывает на реальное несоответствие контракту исполнения. Явное правило разработчика USEQ требует отказаться от реализации, если гипотеза требует исполнения по цене закрытия; изменения инфраструктуры и подмена на исполнение в следующей сессии нарушили бы рамки этой задачи. Отрицательное матожидание в песочнице носит рекомендательный характер и не является причиной отказа.
Результаты верификации
Получи обновлённую спецификацию исследования, где явно требуется принимать решения на конец месяца с исполнением на открытии следующей сессии, а затем соответственно обнови документацию стратегии. Для сохранения текущей спецификации платформе необходима поддержка исполнения на закрытии текущей сессии; код стратегии этого обеспечить не может.
Гипотеза прямо требует, чтобы ордера ребалансировки на конец месяца исполнялись по цене закрытия этой сессии. _reconcile отправляет обычные рыночные ордера через _submit_entry_instrument и _submit_exit_position. Эта конфигурация USEQ, управляемая барами, исполняет их на открытии следующей сессии, что подтверждается src/backtesting/next_open.py и документом execution_capabilities в техническом задании. Поэтому входы, сокращения позиций и развороты не могут соответствовать заданному времени исполнения. В самой заявке признана эта несовместимость.
История итераций
Устанавливай и синхронизируй стоп каждой стороны с ограничением только на сокращение позиции сразу после исполнения входа или изменения размера, используя события исполнения/позиции, либо используй поддерживаемые условные ордера. Убедись, что защита установлена до исполнения OHLC следующей сессии.
Защитные стопы синхронизируются до исполнения поставленных в очередь входных ордеров. Поэтому у новых позиций нет стопа, а количества стопов существующих позиций с изменённым размером остаются устаревшими. Обратного вызова при исполнении для синхронизации защиты нет. Следующая синхронизация происходит после обработки исполнения на следующем дневном баре, оставляя всю эту сессию без защиты или с неполной защитой. Это нарушает заданный внутрибараный защитный стоп 15%.
Выполняй развороты посредством сверки по событиям исполнения на исходный момент ребалансировки либо отправляй корректно управляемый ордер на разворот с неттингом. Проверь, что старый риск снят, а новая целевая позиция установлена на конец месяца.
Сторона с изменившимся знаком закрывается в обработчике конца месяца, но вход на противоположной стороне откладывается, поскольку поставленный в очередь ордер на закрытие ещё не исполнен, когда _net_qty считывается повторно. _reconcile вызывается снова только на следующем согласованном дневном баре. Поэтому противоположная позиция открывается на закрытии следующей сессии вместо требуемого закрытия месяца, пропуская первую сессию месяца удержания.
Проверяй совокупные исполненные номиналы длинных и коротких позиций после применения допуска и устраняй остаточный дисбаланс в пределах явно утверждённого допуска портфеля.
Допуск изменения размера позиции 20% на каждую ногу может привести к тому, что исполненная книга существенно отклонится от доллар-нейтральных целей с валовой экспозицией 100%. Например, сохранённая длинная экспозиция может составить 120% от целевого значения своей стороны, а сохранённая короткая — 80%, что до округления даст чистую экспозицию примерно 20%. Одни лишь целевые веса не подтверждают фактическую нейтральность.
Отслеживай полное покрытие календарных лет и применяй правило допуска гипотезы либо явно уточни, что допуск означает 60 завершённых месячных доходностей.
Проверяется наличие 60 завершённых месячных доходностей вместо пяти полных календарных лет. Инструмент ETF, вышедший на биржу в середине года, может пройти отбор до завершения пяти полных лет с января по декабрь.
Во время заморозки перед оценкой загружай историю, но не продвигай состояние исполненной ребалансировки и не сверяй ордера. Определяй завершение сверки по фактическим позициям с учётом знака и открытым ордерам, а не по попыткам отправки. Установи явную политику границы оценки, сохраняющую семантику исполнения на конец месяца, и обрабатывай отклонённые заявки, не объявляя портфель завершённым без предупреждения.
_reconcile возвращает True после отправки ордеров, не проверяя достижение целевых значений. Это неправильно работает с фактическим прогревом бэктеста: исполнитель задаёт _no_entries_before_ns, а базовый класс вызывает calculate_signal во время этого предварительного этапа, подавляя отправку ордеров на вход. На конец месяца прогрева calculate_signal записывает _rebal_target_mk предстоящего месяца, строит целевые значения и сбрасывает _rebal_pending, хотя позиции остаются нулевыми. Если оценка начинается в этом следующем месяце, резервная логика начала месяца также пропускает ребалансировку, поскольку _rebal_target_mk уже равен mk. Поэтому стратегия пропускает портфель на этот месяц и не держит позиций до конца следующего месяца. Отклонённые или подавленные отправки ордеров при обычном исполнении также могут оставить неполную, ненейтральную позицию, ошибочно отмеченную как завершённую.
Для определения конца и начала месяца используй функции торгового календаря репозитория, сохраняя фактические временные метки закрытия сессии дневных баров.
Стратегия дублирует календарь USEQ вместо использования src/data/market_calendar.py, как указано в спецификации. В её календаре отсутствуют исключительные нерабочие дни репозитория. Например, он считает 2, 2007 января торговой сессией, поэтому резервная логика не распознаёт 3 января как фактическую первую сессию. Дневные бары с укороченной сессией обрабатываются по переданным временным меткам закрытия.
Проверка не пройдена (уровень 1 — статический анализ): - Запрещённый импорт: src.data.market_calendar — стратегиям разрешено импортировать только базовые классы и вспомогательные средства фреймворка (src.strategies.base_template, src.strategies.rolling_options_template, src.strategies.polymarket_series_template, src.strategies.helpers); сборщики данных, база данных, движок бэктеста и реестр находятся за пределами песочницы. (строка 20)
Внедри явную политику исполнения по цене закрытия согласно исследовательскому контракту в инфраструктуру исполнения и передай её в песочницу, полные бэктесты и оптимизацию. Сверяй фактическую временную метку исполнения каждого плеча ребалансировки с закрытием сессии в конце месяца, а цену исполнения — с ценой закрытия инструмента, допуская предусмотренные издержки исполнения. Сохрани спред, импакт и внутрисвечные защитные стопы; не заменяй исполнение на исполнение в следующей сессии.
Гипотеза требует исполнения по цене закрытия месяца. В этих обычных рыночных заявках используется стандартный путь исполнения USEQ: venue_configs.py задаёт latency_ms=100, а runner.py устанавливает эту LatencyModel до добавления торговой площадки. Поэтому ордера, отправленные после получения согласованных баров на конец месяца, исполняются позже закрытия; стратегия/конфигурация не предусматривает политику исполнения по той же цене закрытия. Это также касается сокращения позиций при ребалансировке и разворотов. Успешное прохождение теста песочницы не подтверждает требуемые временные метки или цены исполнения.
Сводка по итогам
До реализации согласуй спецификацию исполнения исследования с возможностями платформы: либо прими исполнение на открытии следующей сессии, либо добавь поддержку исполнения на закрытии текущей сессии.
После четырёх итераций проверка уровня 4 QA не пройдена: рыночные ордера USEQ исполняются на открытии следующей сессии, что нарушает требование гипотезы об исполнении на закрытии месяца. До последующих этапов конвейера дело не дошло.
Ранжируй секторальные и страновые ETF 18 по сезонной избыточной доходности за тот же календарный месяц; покупай лидеров и открывай короткие позиции по отстающим в доллар-нейтральном портфеле с ребалансировкой на закрытии месяца.
Метрики результатов бэктеста и отчёт об оптимизации не предоставлены. QA указал отрицательное математическое ожидание в песочнице, особенно в стрессовых режимах, как замечание рекомендательного характера.
Причина отказа
Stratmill — это инструмент для исследований и бумажной торговли, а не финансовая консультация или брокер. Результаты бэктестов и бумажной торговли являются гипотетическими. Торговля сопряжена с риском убытков.