Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

Относительная сила ETF и атрибуция альфы

Метод ранжирования фондов по доходности относительно SPY за двадцать сессий. Узнайте, как атрибуция альфы меняет значение интерсепта при корректном подборе факторов бенчмарка.

Относительная сила ETF ранжирует небольшую корзину фондов по тому, насколько доходность каждого из них за последнее время превышает или уступает бенчмарку, после чего удерживает активы, занявшие верхние позиции. Правило, которое разбирается в этой статье, состоит из одной строки: каждые двадцать торговых сессий ранжировать вселенную активов по доходности за двадцать сессий за вычетом доходности SPY за тот же период, а затем удерживать два лучших актива в перекрывающихся портфелях (sleeves). Атрибуция — это этап, на котором подобная стратегия проходит проверку. В одном опубликованном исследовании с именно такой конструкцией интерсепт, который был бы представлен как альфа, составил ноль целых тридцать восемь сотых процента годовых после того, как в регрессию были включены факторы риска, которые правило уже покупало.

Как работает правило относительной силы ETF

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

В основе этого лежат два выбора. Период ретроспективного анализа (lookback) определяет, какой объем истории учитывается при ранжировании; двадцать сессий — это примерно один календарный месяц торгов. Период удержания определяет, как долго лидер остается в портфеле. Когда эти два периода равны, весь портфель обновляется в одну дату месяца, и весь результат зависит от того, в какой день вы начали торговлю. Перекрывающиеся портфели устраняют эту зависимость: вы запускаете несколько копий одного и того же правила со сдвигом в несколько сессий, распределяете капитал между ними, и объединенный портфель удерживает динамически меняющийся набор активов, а не делает ставку на одну дату запуска.

В приведенной ниже панели выполняется этап ранжирования для вселенной из девяти фондов, включающей широкие рыночные индексы, секторальные, международные ETF и ETF на металлы, с использованием последних двадцати одной цены закрытия, чтобы доходность охватывала ровно двадцать сессий.

ЗапросДоходность за 20 сессий относительно SPY в группе из девяти ETF
Точный SQL-код для каждого числа
WITH bounds AS
(
    SELECT
        min(d) AS first_day,
        max(d) AS last_day
    FROM
    (
        SELECT date AS d
        FROM global_markets.stocks_daily_aggs
        WHERE ticker = 'SPY'
          AND date >= today() - 120
        GROUP BY d
        ORDER BY d DESC
        LIMIT 21
    )
)
SELECT
    sleeve.ticker                            AS etf,
    sleeve.ret_pct                           AS return_pct,
    round(sleeve.ret_pct - bench.ret_pct, 2) AS excess_vs_spy_pct
FROM
(
    SELECT
        ticker,
        round((argMax(toFloat64(close), date) / argMin(toFloat64(close), date) - 1) * 100, 2) AS ret_pct
    FROM global_markets.stocks_daily_aggs
    WHERE ticker IN ('QQQ', 'IWM', 'XLK', 'XLE', 'XLF', 'XLV', 'XLU', 'GLD', 'EFA')
      AND date >= (SELECT first_day FROM bounds)
      AND date <= (SELECT last_day FROM bounds)
    GROUP BY ticker
) AS sleeve
CROSS JOIN
(
    SELECT
        round((argMax(toFloat64(close), date) / argMin(toFloat64(close), date) - 1) * 100, 2) AS ret_pct
    FROM global_markets.stocks_daily_aggs
    WHERE ticker = 'SPY'
      AND date >= (SELECT first_day FROM bounds)
      AND date <= (SELECT last_day FROM bounds)
) AS bench
ORDER BY excess_vs_spy_pct DESC
Run this yourself

В верхней части рейтинга GLD показал доходность 8.69% за эти двадцать сессий, что составляет 6.34 пунктов относительно SPY. В нижней части XLU оказался на уровне -5.81 пунктов. Каждая строка передает суть идеи двумя столбцами: результат фонда и результат за вычетом движения SPY за тот же период. Расстояние между двумя столбцами одинаково во всех 9 строках, так как каждый фонд измеряется относительно одного бенчмарка за один период.

Что на самом деле измеряет атрибуция альфы

Атрибуция альфы — это регрессия. Вы выстраиваете ряд доходности стратегии относительно одного или нескольких рядов доходности бенчмарков и проводите прямую линию через облако точек. Коэффициент наклона для каждого бенчмарка — это экспозиция: насколько стратегия движется синхронно с данным активом. Интерсепт — это то, что остается после учета этих экспозиций, и именно этот остаток называют альфой. R-квадрат — это третий показатель, доля вариативности стратегии, объясняемая бенчмарками, которая варьируется от нуля процентов (бенчмарки ничего не объясняют) до ста процентов (стратегия представляет собой бенчмарки плюс константа).

Если применить регрессию правила ротации к одному широкому рыночному индексу, оно обычно выглядит оригинально. В опубликованной атрибуции правила такой формы, представленной в открытом доступе в августе две тысячи двадцать шестого года и протестированной на детерминированных синтетических ценах, подгонка по одному бенчмарку дала R-квадрат четырнадцать процентов. Шесть седьмых вариативности стратегии остались необъясненными, что на бумаге выглядит как оригинальность. Замена на прокси-активы для экспозиций, которые правило фактически удерживало — импульсный фактор (momentum) и секторальная концентрация, присущая портфелю из двух имен, — повысила R-квадрат до шестидесяти трех целых шести десятых процента и снизила интерсепт до ноль целых тридцати восьми сотых процента годовых. Тот же ряд доходности и тот же код. Другой набор для сравнения. Стратегия просто арендовала хорошо известные рыночные факторы.

Это исследование генерирует собственные цены из фиксированного источника, поэтому читатель без доступа к поставщику данных может воспроизвести каждую цифру. Кроме того, на момент написания статьи проекту всего несколько дней, а такие проекты меняются еженедельно. Зафиксируйте точный коммит или тег релиза, который вы использовали, прежде чем цитировать цифры из него: показатели атрибуции меняются при каждом изменении прокси-факторов или выборки. Наша заметка о воспроизводимых инструментах бэктестинга рассматривает ту же привычку с другой стороны.

Урок понятен и без терминологии факторных моделей. Бенчмарк, относительно которого вы проводите регрессию, определяет, сколько альфы у вас якобы есть, поэтому выбирайте его до того, как посмотрите на интерсепт, и запишите, почему это сравнение является верным. Набор для сравнения, выбранный после того, как вы увидели результат, измеряет лишь качество вашего выбора сравнения.

Какая часть ETF уже является бенчмарком

Вам не нужна полная факторная модель, чтобы увидеть проблему. Возьмите дневную доходность одного фонда, сопоставьте ее с дневной доходностью SPY за те же сессии и возведите корреляцию в квадрат. Это даст долю дневной вариативности фонда, которую уже объясняет один широкий рыночный бенчмарк.

ЗапросДоля дневной волатильности, объясняемая SPY, за последние два года
Точный SQL-код для каждого числа
WITH daily AS
(
    SELECT
        ticker,
        date,
        toFloat64(close) AS px,
        lagInFrame(toFloat64(close)) OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_px
    FROM global_markets.stocks_daily_aggs
    WHERE ticker IN ('SPY', 'QQQ', 'IWM', 'XLK', 'XLE', 'XLF', 'XLV', 'XLU', 'GLD', 'EFA')
      AND date >= today() - 760
)
SELECT
    sleeve.ticker                                                AS etf,
    round(pow(corr(sleeve.fund_ret, bench.spy_ret), 2) * 100, 1) AS r_squared_vs_spy_pct
FROM
(
    SELECT ticker, date, px / prev_px - 1 AS fund_ret
    FROM daily
    WHERE prev_px > 0
      AND ticker != 'SPY'
) AS sleeve
INNER JOIN
(
    SELECT date, px / prev_px - 1 AS spy_ret
    FROM daily
    WHERE prev_px > 0
      AND ticker = 'SPY'
) AS bench USING (date)
GROUP BY sleeve.ticker
ORDER BY r_squared_vs_spy_pct DESC
Run this yourself

За последние два года QQQ имел самый высокий R-квадрат по одному бенчмарку в этой вселенной на уровне 90.3%, а GLD — самый низкий на уровне 3.1%. Портфель, собранный из активов в верхней части этого графика, близок к простому повторению бенчмарка с другим весом, и любой интерсепт, измеренный относительно чего-то иного, чем бенчмарк, будет незаметно поглощать эту разницу. Нижняя часть — это то место, где ротация может добавить поток доходности, которого еще нет в широком рынке, но именно здесь портфель из двух имен перестает быть диверсифицированным.

Как часто меняется фонд-лидер

Правило ранжирования имеет смысл только тогда, когда фонды показывают разные результаты. Панель ниже измеряет доходность каждого фонда за календарный месяц относительно SPY за тот же месяц, а затем сохраняет самый сильный и самый слабый портфель для каждого месяца.

ЗапросЛучшие и худшие показатели относительно SPY по календарным месяцам
Точный SQL-код для каждого числа
WITH monthly AS
(
    SELECT
        toStartOfMonth(date)           AS m,
        ticker,
        argMin(toFloat64(close), date) AS first_close,
        argMax(toFloat64(close), date) AS last_close
    FROM global_markets.stocks_daily_aggs
    WHERE ticker IN ('SPY', 'QQQ', 'IWM', 'XLK', 'XLE', 'XLF', 'XLV', 'XLU', 'GLD', 'EFA')
      AND date >= toStartOfMonth(today() - 400)
      AND date <  toStartOfMonth(today())
    GROUP BY m, ticker
)
SELECT
    formatDateTime(x.m, '%Y-%m')   AS month,
    argMax(x.ticker, x.excess_pct) AS leading_etf,
    round(max(x.excess_pct), 2)    AS leader_excess_pct,
    round(min(x.excess_pct), 2)    AS laggard_excess_pct
FROM
(
    SELECT
        sleeve.m      AS m,
        sleeve.ticker AS ticker,
        (sleeve.last_close / sleeve.first_close - 1) * 100
          - (bench.spy_last / bench.spy_first - 1) * 100 AS excess_pct
    FROM monthly AS sleeve
    INNER JOIN
    (
        SELECT
            m,
            first_close AS spy_first,
            last_close  AS spy_last
        FROM monthly
        WHERE ticker = 'SPY'
    ) AS bench USING (m)
    WHERE sleeve.ticker != 'SPY'
) AS x
GROUP BY x.m
ORDER BY x.m
Run this yourself

За 13 полных месяцев серия начинается в 2025-07 с XLK в лидерах. В последнем полном месяце, 2026-07, самым сильным портфелем был XLE с результатом 12.59 пунктов относительно SPY, в то время как самый слабый составил -5.7. Расстояние между двумя линиями — это дисперсия, на которой «кормится» правило ранжирования. Месяцы, в которые линии сближаются, — это месяцы, когда ранжирование близко к произвольному, и правило, которое торгует на каждом ранжировании, платит за оборот во всех из них. Границы месяцев здесь требуют особого внимания; как измеряется месячная доходность подробно описывает эти условности.

Является ли концентрация на двух именах реальным риском?

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

ЗапросГодовая волатильность и максимальное падение за сессию, за последние два года
Точный SQL-код для каждого числа
WITH daily AS
(
    SELECT
        ticker,
        date,
        toFloat64(close) AS px,
        lagInFrame(toFloat64(close)) OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_px
    FROM global_markets.stocks_daily_aggs
    WHERE ticker IN ('SPY', 'QQQ', 'IWM', 'XLK', 'XLE', 'XLF', 'XLV', 'XLU', 'GLD', 'EFA')
      AND date >= today() - 760
)
SELECT
    ticker                                                   AS etf,
    round(stddevSamp(px / prev_px - 1) * sqrt(252) * 100, 1) AS annual_vol_pct,
    round(min(px / prev_px - 1) * 100, 2)                    AS worst_day_pct
FROM daily
WHERE prev_px > 0
GROUP BY ticker
ORDER BY annual_vol_pct DESC
Run this yourself

XLK находился в широком диапазоне на уровне 27.7% в годовом исчислении, с худшей отдельной сессией -6.82%, а XLU — в узком диапазоне на уровне 15.8%. Правило, удерживающее два актива одновременно, выбирает из этого диапазона без усреднения, и более глубокие просадки, характерные для широкого диапазона, в атрибуции учитываются как экспозиция, а не как мастерство. Заметка о аномалии низкой волатильности охватывает долгосрочные показатели в узкой части того же графика.

Четыре проверки для вашего бэктеста ротации

  1. Утечка сигнала внутри дня. Если ранжирование за двадцать сессий рассчитывается по закрытию сессии, а исполнение сделки записывается по тому же закрытию, тест торгует на информации, которой у него не было в момент сделки. Ранжируйте по данным на сессию t, исполняйте на сессии t плюс один и сравните две версии: разрыв между ними — это размер утечки. Ошибка заглядывания в будущее показывает, насколько велик этот разрыв.
  2. Выживаемость в списке фондов. Вселенная, собранная из фондов, существующих сегодня, исключает каждый фонд, который был закрыт или поглощен, а закрытия концентрируются в продуктах с наихудшими результатами. Ошибка выжившего применима к списку ETF точно так же, как и к списку акций.
  3. Бенчмарк, выбранный заранее. Запишите набор для сравнения до первой регрессии, включая прокси-активы для экспозиций, которые, как вы ожидаете, будет удерживать правило. Интерсепт имеет значение только относительно бенчмарка, который вы выбрали заранее.
  4. Концентрация, измеренная напрямую. Запустите то же ранжирование, удерживая два лучших имени, затем четыре, затем равные веса всей вселенной. Если большая часть заявленного преимущества заключается в версии с двумя именами, то концентрация и есть позиция, а ранжирование — это лишь способ выбора того, какую концентрацию принять.

Часто задаваемые вопросы

Что такое относительная сила ETF?

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

Что такое атрибуция альфы?

Это регрессия доходности стратегии на один или несколько рядов доходности бенчмарков. Коэффициенты наклона измеряют экспозиции, которые несет стратегия, а интерсепт — это доходность, оставшаяся после учета этих экспозиций. Этот интерсепт — число, которое обычно называют альфой.

Означает ли высокий R-квадрат, что стратегия плохая?

Нет. Высокий R-квадрат означает, что бенчмарки объясняют большую часть вариативности стратегии, что является утверждением о перекрытии, а не о качестве. Меняется интерсепт: экспозиции, которые теперь видит регрессия, перестают считаться оригинальностью.

Зачем удерживать перекрывающиеся портфели вместо одного?

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


Каждая панель здесь поставляется с SQL-кодом, который ее создал. Откройте любой, подставьте свой список фондов и перезапустите ранжирование в терминале Strasmore, чтобы увидеть, как меняется порядок.

#etfs#momentum#quant#factor models#attribution