Перейти к содержимому
Все стратегии

Стратегии

Порт стратегии QuantRocket «ValueMomentumTrendCombined» (VMOT) на дневных данных USEQ: отбор 12-1 по ликвидности, моментуму и плавности (числу положительных дней), равные веса, квартальная ребалансировка Q-NOV, еженедельный трендовый фильтр SPY на 252 дней сокращает экспозицию на 50%/100%; этапы стоимости и F-балла NOT перенести нельзя (нет фундаментальных данных на конкретный момент времени)

Итог: Отменено

VmotMomentumTrendUseq

Сводка по итогам

Порт VmotMomentumTrendUseq перенёс momentum- и SPY-трендовую части стратегии VMOT от QuantRocket на USEQ дневных барах для 59 акций с большой капитализацией; SPY служил инструментом сигнала. Этапы value и F-score исключены из-за отсутствия фундаментальных данных на конкретный момент времени. В гипотезе явно требовалось O(1) обновлений deque на бар, поскольку два предыдущих многокомпонентных порта USEQ остановились из-за лимита песочницы 300 с. После одной итерации выполнение застопорилось на проверке, и проект закрыли после трёх тайм-аутов («verifying_stuck_3_timeouts»). Бэктест, оптимизация и заключение аналитика не появились, поэтому преимущество стратегии так и не было измерено.

Гипотеза

Портирование стратегии с открытым исходным кодом Moonshot от QuantRocket «ValueMomentumTrendCombined» (vmot_combined.py, Apache-2.0, авторство: QuantRocket LLC; смоделирована на основе стратегии Alpha Architect VMOT ETF). LONG-ONLY, мультиинструментальная US стратегия для акций на площадке USEQ, бары 1–DAY. Для CODE используются значения, отличающиеся от docstring: VALUE_TOP_N_PCT=20 и MOMENTUM_TOP_N_PCT=20 (в docstring указано 10). PORTABILITY, без прикрас: шаги 2 (отбор по стоимости: самые дешёвые 20% по……Показать большеСвернуть

Портирование стратегии с открытым исходным кодом Moonshot от QuantRocket «ValueMomentumTrendCombined» (vmot_combined.py, Apache-2.0, авторство: QuantRocket LLC; смоделирована на основе стратегии Alpha Architect VMOT ETF). LONG-ONLY, мультиинструментальная US стратегия для акций на площадке USEQ, бары 1–DAY. Для CODE используются значения, отличающиеся от docstring: VALUE_TOP_N_PCT=20 и MOMENTUM_TOP_N_PCT=20 (в docstring указано 10). PORTABILITY, без прикрас: шаги 2 (отбор по стоимости: самые дешёвые 20% по EV/EBIT, EBIT>0, Sharadar ART) и 3 (верхние 50% по оценке Piotroski F на основе 9 фундаментальных компонентов Sharadar) CANNOT невозможно перенести. На фабрике нет истории фундаментальных данных на момент времени; Yahoo предоставляет только цены, сплиты и дивиденды, а src/data/yahoo_quotes.py загружает актуальный срез фундаментальных данных для отображения, что привело бы к заглядыванию в будущее. Шаг 1b (исключение финансовых компаний/ADR/REIT) обеспечивается конструкцией фиксированной вселенной ниже. Поэтому в портированной версии отбор по моментуму ранжирует весь прошедший фильтр ликвидности набор, тогда как оригинал ранжирует только акции с высокими показателями качества и стоимости. Это существенное изменение: остаётся половина стратегии VMOT, основанная на моментуме и тренде, и аналитик должен оценивать её именно в таком виде. Все остальные правила перенесены точно. UNIVERSE (фиксированная, все инструменты проверены и присутствуют в каталоге как <SYM>.USEQ-1-DAY-LAST-EXTERNAL; нефинансовые, не-REIT, крупные акции S&P 500, торгуемые на площадке US, без ADR): AAPL MSFT AMZN GOOGL META NVDA AVGO ORCL CSCO ADBE CRM INTC TXN QCOM AMD IBM ACN JNJ PFE MRK ABBV LLY UNH AMGN TMO ABT MDT BMY GILD PG KO PEP WMT COST MCD NKE HD LOW SBUX DIS CMCSA VZ T XOM CVX COP CAT DE HON GE MMM UNP UPS LMT RTX BA LIN (59 акций), плюс SPY.USEQ в качестве инструмента для трендового фильтра. Исходный TREND_SID FIBBG000BDTBL9 — это SPY; SPY используется только как сигнал и никогда не торгуется. Основной инструмент = SPY.USEQ (его бар задаёт ежедневный цикл принятия решений); 59 акций распределяются между extra_instruments/extra_bar_types. RULES (на момент дневного закрытия t, расчёт по синхронизированным ценам закрытия): (1c) avg_dollar_volume = скользящее среднее close*volume за 90 баров; ранжирование по убыванию процентильного ранга среди инструментов с данными (pandas rank pct, средние ранги при совпадениях); ликвидные = ранг <= 0.60. (4) моментум = (close[t-22] - close[t-252]) / close[t-252] (NaN, если close[t-252]==0 или отсутствует); процентильное ранжирование по убыванию ONLY среди ликвидных инструментов; have_momentum = ранг <= 0.20. (5) positive_days = число дней, когда close.pct_change() > 0, за последние 252 баров; процентильное ранжирование по убыванию ONLY среди инструментов have_momentum; отобранные = ранг <= 0.50. (6) Равные веса: w_i = 1/N_selected для отобранных инструментов, иначе 0. (7) Квартальная ребалансировка «Q-NOV»: веса акций пересчитываются только по сигналу последнего торгового дня февраля, мая, августа и ноября, то есть по последнему значению внутри каждого периода Q-NOV. Они остаются неизменными до следующей такой даты; промежуточной ребалансировки с учётом дрейфа нет, поскольку Moonshot учитывает оборот только при изменении весов. (8-9) Трендовый фильтр для SPY: below_zero = SPY close / SPY close[t-252] - 1 < 0; below_mavg = SPY close < SPY 252-барный SMA; n = below_zero + below_mavg. Данные выбираются WEEKLY («W» = недели, заканчивающиеся в воскресенье): берётся последний торговый день каждой недели (обычно цена закрытия пятницы), значение действует всю следующую неделю. Итоговый вес = w_i, если n==0; w_i/2, если n==1; 0, если n==2; остаток остаётся в денежных средствах. EXECUTION LAG (target_weights_to_positions = weights.shift()): изменение веса, принятое на закрытии t, исполняется на баре t+1 следующей сессии рыночными заявками. Размер позиции меняется только при изменении целевого веса FINAL для инструмента — при квартальном пересмотре состава или еженедельном изменении числа трендовых сигналов. Размер позиции: целевой notional_i = final_weight_i * капитал счёта при плече 1.0 (USEQ маржа не используется); целое число акций, округление вниз; заявки ниже минимального номинала пропускаются. Комиссии: платформенная модель USEQ (нулевая комиссия, моделируются спред и влияние на цену) заменяет исходную PerShareCommission в размере $0.005 за акцию. PERFORMANCE ENGINEERING (два недавних мультиинструментальных порта USEQ завершились из-за лимита песочницы 300 с): хранить для каждого инструмента дек с фиксированной длиной (253 цен закрытия, 90 долларовых объёмов, 252 флагов дней с положительной доходностью с текущей суммой, 252 SPY цен закрытия с текущей суммой для SMA). Обновление O(1) на бар; поперечное ранжирование выполнять один раз в день после поступления всех баров 60 для даты t (ориентироваться на временную метку бара, обрабатывать после получения полного набора баров за дату или на баре SPY), и ONLY в дни ребалансировки/выборки трендовых данных. Никогда не сканировать историю повторно.

USEQ (5.7%) недостаточно представлен в корпусе с преобладанием BINANCE (61.5%); здесь используются 59 неиспользованных рядов акций компаний с большой капитализацией вместо BTC. Механизм (кросс-секционный плавный momentum с трендовым фильтром рынка и квартальным удержанием) предполагает низкий оборот и прибыль на сделку, значительно превышающую издержки, что позволяет избежать чрезмерных комиссий. Направление только длинное, поскольку так устроен исходник. Для точной проверки без оптимизации все параметры оставлены по умолчанию, как в исходнике.

verifying_stuck_3_timeouts

Реализация

Порт Stratmill стратегии ValueMomentumTrendCombined от QuantRocket (Apache-2.0), только momentum + трендовая часть. Дневной порт USEQ только с длинными позициями по 57 фиксированным нефинансовым акциям компаний с большой капитализацией из S&P, перечисленным в задании: фильтр ликвидности по долларовому объёму за 90 дней (верхние 60%), затем 12-1 по momentum среди ликвидных имён (верхние 20%), затем отбор 50% самых плавных по числу дней роста за 252 сессий. Выбранные акции получают равные веса; отбор обновляется только по сигналу последней сессии каждого квартала Q-NOV (февраль/май/август/ноябрь). Недельный трендовый фильтр SPY снижает экспозицию на 50% за каждое из условий: «SPY доходность за 252 дней < 0» и «SPY < SMA252». Итоговые веса исполняются на следующей сессии по цене закрытия рыночными заявками на целое число акций; размер позиции рассчитывается по equity, оценённому по рынку на 1x. SPY используется только как сигнал и никогда не торгуется.

Примечания к переводу: (0) В гипотезе указано 59 акций, но в списке перечислено 57. Используются все 57; наличие всех 57 и SPY в каталоге проверено по барам 1-DAY USEQ. (1) Этапы Value (EV/EBIT) и Piotroski F-score пропущены, поскольку нет фундаментальных данных, доступных на конкретный момент времени; поэтому ранжируется momentum по всему ликвидному набору. Проверяется momentum + трендовая часть VMOT. (2) Исключения из вселенной обеспечиваются фиксированным набором. (3) Семантика ресэмплинга точно соответствует……Показать большеСвернуть

Примечания к переводу: (0) В гипотезе указано 59 акций, но в списке перечислено 57. Используются все 57; наличие всех 57 и SPY в каталоге проверено по барам 1-DAY USEQ. (1) Этапы Value (EV/EBIT) и Piotroski F-score пропущены, поскольку нет фундаментальных данных, доступных на конкретный момент времени; поэтому ранжируется momentum по всему ликвидному набору. Проверяется momentum + трендовая часть VMOT. (2) Исключения из вселенной обеспечиваются фиксированным набором. (3) Семантика ресэмплинга точно соответствует исходному коду. Значение Q-NOV или W берётся за последнюю сессию периода и действует с первой сессии в календарную дату или после неё, обозначающую конец периода, как это делает resample().last().reindex(method='ffill'). Затем weights.shift() исполняет его на следующем закрытии. Поэтому изменение недельного тренда по закрытию пятницы торгуется по закрытию вторника: понедельник — первая сессия в дату воскресной метки или после неё, плюс задержка в одну сессию. Квартальные изменения торгуются через одну сессию после последнего торгового дня, если он приходится на конец календарного месяца, иначе — через две. Это на одну сессию позже упрощённой формулировки из задания «решение в t, исполнение t+1», но соответствует исходному коду. (4) Ранжирование использует pandas pct-rank по убыванию со средними рангами при совпадении, вложенная последовательность: ликвидность -> momentum -> плавность, точно как в исходнике. Окна для каждого имени рассчитываются по его собственному ряду баров; на дату ранжирования у имени должен быть бар. (5) Позиции меняют размер только при изменении итогового веса имени. Частичные изменения — рыночные заявки на разницу на площадке NETTING, полные выходы закрывают позицию. Комиссия USEQ с нулевой ставкой заменяет комиссию $0.005 за акцию. (6) Производительность: O(1) добавлений в deque на бар. Ранжирование 57 имён выполняется только на сессиях конца квартала, а подсчёт тренда — только на сессиях конца недели. Дата считается завершённой, когда приходит первый бар следующей даты. Базовый барьер между компонентами отключён, поэтому поздно появившийся или пропущенный компонент (например, ABBV до 2013) не может остановить портфель. (7) Ограничение размера выборки: при удержании примерно 3-4 имён (57 x 0.6 x 0.2 x 0.5) и квартальном пересмотре вместе с недельным изменением тренда 50%/0% ожидается около 15-30 записей в журнале в год. На коротком отрезке это может не достичь заранее зарегистрированного min_trades=120; это ограничение заложено в исходный дизайн.

Сводка по итогам

Многокомпонентные порты USEQ примерно с 60 дневными компонентами и окнами в 252 баров снова достигают лимита времени проверки даже при оптимизированной производительности. В следующих попытках стоит уменьшить число компонентов или стоимость прогрева либо сверить время выполнения с бюджетом песочницы до отправки.

Выполнение закрыли на этапе проверки с причиной «verifying_stuck_3_timeouts»: проверка трижды завершилась по тайм-ауту, этапы анализа бэктеста, оптимизации, аналитики и риска не запускались.

Длинная дневная реализация USEQ моментумной и трендовой части стратегии VMOT от QuantRocket. Она выбирает лидеров моментума с наиболее плавной динамикой 12-1 из фиксированной вселенной 59 крупных акций, прошедших фильтр ликвидности, распределяет между ними равные веса и пересматривает состав по квартальному графику Q-NOV. Еженедельный трендовый фильтр SPY на 252 дней сокращает экспозицию на 50% или 100%. Этапы отбора по стоимости и F-баллу исключены, поскольку у платформы нет фундаментальных данных на конкретный момент времени.

Данных о результатах нет: отчёт о бэктесте пуст, оптимизация не запускалась, поэтому отсутствуют показатели доходности, Sharpe и числа сделок.

Анализ

ValueMomentumTrendCombined

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