📝

Draft article

This draft is visible to admins and superusers only. Sign in with an authorized account.

← К списку статей
August 21, 2026
5 мин. чтения

Synthetic Control Methods for Evaluating Trading Strategies

Synthetic Control Methods for Evaluating Trading Strategies
#causal-inference
#synthetic-control
#counterfactual
#evaluation
#econometrics

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

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

Метод синтетического контроля (SCM), разработанный Abadie и Gardeazabal (2003) и доработанный Abadie, Diamond и Hainmueller (2010, 2015), напрямую устраняет смешение причин. Он строит контрфактический сценарий — взвешенную комбинацию инструментов, которых вы не затрагивали, выбранную так, чтобы до вмешательства она близко отслеживала затронутый инструмент. Расхождение между ними после вмешательства — оценка эффекта. Важно, что SCM включает критерий фальсификации, показывающий, когда достоверный контрфактический сценарий построить нельзя, и перестановочное p-значение, для которого не нужно верить в какую-либо асимптотическую модель.

Почему очевидные альтернативы не работают

Траектории сравнения с контрфактическим сценарием

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

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

Метод

Построение донорского пула синтетического контроля

Постановка и обозначения

Рассмотрим J+1J + 1 единиц (активов, стратегий или портфелей), наблюдаемых в течение TT периодов. Единица 1 — затронутая единица, то есть актив или стратегия, в которую вы вмешались. Единицы 2,,J+12, \ldots, J+1 образуют донорский пул сопоставимых незатронутых единиц.

Пусть Y1tIY_{1t}^I обозначает результат затронутой единицы в момент tt при вмешательстве, а Y1tNY_{1t}^N — результат без него. Эффект воздействия в момент t>T0t > T_0 равен:

τ1t=Y1tIY1tN\tau_{1t} = Y_{1t}^I - Y_{1t}^N

Мы непосредственно наблюдаем Y1tIY_{1t}^I. Вся проблема состоит в оценке Y1tNY_{1t}^N.

Построение синтетического контроля

SCM оценивает Y1tNY_{1t}^N как взвешенное среднее результатов доноров:

Y^1tN=j=2J+1wjYjt\hat{Y}_{1t}^N = \sum_{j=2}^{J+1} w_j \, Y_{jt}

где вектор весов w=(w2,,wJ+1)\mathbf{w} = (w_2, \ldots, w_{J+1})' удовлетворяет условиям wj0w_j \geq 0 для всех jj и jwj=1\sum_j w_j = 1.

Эти два ограничения действительно важны. Они заставляют синтетический контроль быть выпуклой комбинацией доноров и не позволяют экстраполировать за пределы области данных. Регрессия без ограничений может выдать контрфактический сценарий с длинной позицией 3,4x в одной монете против короткой позиции 2,4x в другой — численно отличное соответствие до вмешательства, но сценарий, соответствующий портфелю, которым никто не мог бы владеть. Ограничение выпуклости делает контрфактический сценарий интерпретируемым, а веса — разреженными: обычно ненулевой вес получают лишь несколько доноров, и их можно прочитать напрямую.

Оптимальный выбор весов

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

minwX1X0wV=minw(X1X0w)V(X1X0w)\min_{\mathbf{w}} \| \mathbf{X}_1 - \mathbf{X}_0 \mathbf{w} \|_V = \min_{\mathbf{w}} (\mathbf{X}_1 - \mathbf{X}_0 \mathbf{w})' \mathbf{V} (\mathbf{X}_1 - \mathbf{X}_0 \mathbf{w})

где X1\mathbf{X}_1 — вектор размера (k×1)(k \times 1) с характеристиками затронутой единицы до вмешательства, X0\mathbf{X}_0 — матрица размера (k×J)(k \times J) с теми же характеристиками донорского пула, а V\mathbf{V} — диагональная положительно полуопределенная матрица размера (k×k)(k \times k), задающая важность каждого предиктора.

V\mathbf{V} выбирается кросс-валидацией: нужно выбрать V\mathbf{V} так, чтобы получившийся вектор w(V)\mathbf{w}^*(\mathbf{V}) минимизировал среднеквадратичную ошибку прогноза (MSPE) целевой переменной в период до вмешательства. Это вложенная оптимизация: внешний цикл перебирает V\mathbf{V}, внутренний решает ограниченную задачу для w\mathbf{w}.

Предикторы для торговых приложений

Вместо ВВП на душу населения и отраслевой структуры, использованных Abadie и соавторами, в торговых приложениях нужны:

  • Характеристики доходности: средняя доходность, волатильность, асимметрия и эксцесс за период до вмешательства
  • Показатели ликвидности: средний спред, дневной объем, коэффициент неликвидности Amihud
  • Признаки микроструктуры: дисбаланс потока ордеров, частота прихода сделок, отношение котировок к сделкам
  • Факторные экспозиции: бета к рыночным, моментум-, стоимостным факторам и факторам волатильности
  • Запаздывающие результаты: накопленные значения PnL на нескольких датах до вмешательства

Запаздывающие результаты важнее всего. Abadie и соавторы (2010) показывают: если синтетический контроль совпадает с затронутой единицей по запаздывающим результатам на длинном окне до вмешательства, то при линейной факторной модели он неявно контролирует ненаблюдаемые смешивающие факторы — именно поэтому метод стоит затраченных усилий. Не требуется называть фактор, который двигал ваш PnL. Требуется найти доноров, подверженных ему в той же мере.

Где это применяется

Причинные связи между рыночными режимами

Сценарий 1: оценка нового алгоритма исполнения

Вы внедряете новое расписание TWAP для одного инструмента и хотите оценить его влияние на проскальзывание исполнения. И метрика, и семейство алгоритмов подробно разобраны в других материалах: см. проскальзывание исполнения и TCA для разложения затрат и алгоритмы TWAP/VWAP/POV для самих планировщиков. Вклад SCM — слой оценки поверх них: донорский пул состоит из тех же инструментов, которые в том же окне продолжают работать со старым планировщиком, поэтому общерыночные изменения спреда или объема одинаково затрагивают обработанную и донорские единицы.

Период до вмешательства: 60 торговых дней до переключения. Период после вмешательства: 30 торговых дней после него. Оценка эффекта — это разрыв:

τ^1t=Y1tactualY^1tsynthetic,t>T0\hat{\tau}_{1t} = Y_{1t}^{\text{actual}} - \hat{Y}_{1t}^{\text{synthetic}}, \quad t > T_0

Если новый планировщик действительно снижает затраты, после T0T_0 значение τ^1t<0\hat{\tau}_{1t} < 0 остается отрицательным — и, что еще важнее, разрыв затронутой единицы выходит за пределы облака разрывов доноров.

Сценарий 2: влияние рыночного события

Изменение тарифной сетки, пилотный проект с размером шага цены, налог на сделки или изменение правила автоматического выключателя затрагивает одну площадку. Затронутая единица — ваша стратегия на этой площадке. Донорский пул — та же пара на площадках, которых изменение не коснулось. Влияние структуры комиссий на исполнение отдельно рассматривается в материале о комиссиях maker-taker и ребейтах; SCM превращает утверждение "после изменения наши исполнения стали хуже" в оценку с нулевой гипотезой.

Сценарий 3: переключение стратегии в зависимости от режима

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

Плацебо-тесты и вывод

Траектории плацебо и проверяемый путь

Выводы SCM основаны на перестановках. Общий случай построения эмпирической нулевой модели с помощью повторной выборки вместо доверия к распределению в замкнутой форме разобран в материале о методах Монте-Карло и бутстрепе для бэктестов; далее приведена конструкция, специфичная для SCM.

Плацебо во времени

Сдвиньте дату вмешательства назад, в период до вмешательства — например, на середину — и запустите процедуру заново. Если SCM находит "эффект воздействия" в дату, когда ничего не произошло, он улавливает существовавшее ранее расхождение, а не ваше вмешательство. Достоверный синтетический контроль не показывает эффекта в ложные даты вмешательства.

Плацебо в пространстве (перестановочный тест)

Примените всю процедуру SCM к каждому донору, по очереди считая его затронутой единицей:

  1. Для каждого донора jj постройте синтетический контроль из остальных доноров и исходной затронутой единицы.
  2. Вычислите разрыв после вмешательства gapjt=YjtY^jtsynth\text{gap}_{jt} = Y_{jt} - \hat{Y}_{jt}^{\text{synth}}.
  3. Сравните разрыв затронутой единицы с распределением плацебо-разрывов.

p-значение — это ранг:

p=rank of treated unit’s post/pre MSPE ratioJ+1p = \frac{\text{rank of treated unit's post/pre MSPE ratio}}{J + 1}

где

MSPE ratio=MSPEpostMSPEpre=1TT0t>T0(Y1tY^1tN)21T0tT0(Y1tY^1tN)2\text{MSPE ratio} = \frac{\text{MSPE}_{\text{post}}}{\text{MSPE}_{\text{pre}}} = \frac{\frac{1}{T - T_0} \sum_{t > T_0} (Y_{1t} - \hat{Y}_{1t}^N)^2}{\frac{1}{T_0} \sum_{t \leq T_0} (Y_{1t} - \hat{Y}_{1t}^N)^2}

Именно отношение, а не необработанный разрыв после вмешательства, является правильной статистикой: донор, который никогда не подгонялся хорошо, покажет большой разрыв после вмешательства по причинам, не связанным с каким-либо вмешательством, а деление на его MSPE до вмешательства как раз штрафует это.

Это тот же статистический прием, который использует дефлированный коэффициент Шарпа: ранжировать кандидата внутри эмпирически построенного эталонного распределения, а не относительно нуля. DSR ранжирует победителя относительно нулевой модели лучшего из N результатов поиска, а SCM — затронутую единицу относительно нулевой модели по единицам. Оценки разные, дисциплина одна, и предупреждение то же: при J=15J = 15 донорах минимально достижимое p-значение равно 1/160.061/16 \approx 0.06. Перестановочный тест не может разрешить больше, чем позволяет его дискретность, поэтому небольшой донорский пул ограничивает заявляемую статистическую значимость, каким бы большим ни казался эффект.

Практическая фильтрация

Abadie и соавторы рекомендуют исключать плацебо-единицы с плохой подгонкой до вмешательства — с MSPE до вмешательства более чем в kk раз выше, чем у затронутой единицы; обычно kk выбирают от 2 до 20. У плохо подогнанных плацебо маленькие знаменатели и огромные отношения MSPE, поэтому они загрязняют эталонное распределение и заставляют эффект затронутой единицы выглядеть заурядным. Отчитывайтесь об отношении при нескольких порогах; если p-значение значимо только при одном конкретном kk, вы нашли параметр настройки, а не эффект.

Реализация

Конвейер контрфактического анализа

В приведенном ниже коде используются только numpy и scipy, чтобы механика была видна. Альтернативы для production — SparseSC (Microsoft Research), pysyncon, SyntheticControlMethods — обрабатывают пограничные случаи и лучше масштабируются.

Построение матрицы предикторов

import numpy as np
import pandas as pd
from scipy.optimize import minimize


def build_predictors(series: pd.Series, T0: int) -> np.ndarray:
    """
    Extract predictor vector from pre-intervention data.
    Features: mean return, volatility, skewness, kurtosis,
              plus lagged outcome values at regular intervals.
    """
    pre = series.iloc[:T0]
    daily_ret = pre.diff().dropna()

    stats = [
        daily_ret.mean(),
        daily_ret.std(),
        daily_ret.skew(),
        daily_ret.kurtosis(),
    ]

    lag_indices = np.linspace(0, T0 - 1, 5, dtype=int)
    lags = pre.iloc[lag_indices].values.tolist()

    return np.array(stats + lags)

Здесь df — панель накопленных доходностей: затронутая единица находится в столбце 0, доноры — в остальных, одна строка соответствует одному бару. Используйте накопленные доходности, а не уровни цен.

X1 = build_predictors(df["Treated"], T0).reshape(-1, 1)   # (k x 1)
X0 = np.column_stack([                                    # (k x J)
    build_predictors(df[col], T0) for col in df.columns[1:]
])

Оптимизация весов

def solve_weights(
    X1: np.ndarray,
    X0: np.ndarray,
    Y1_pre: np.ndarray,
    Y0_pre: np.ndarray,
) -> np.ndarray:
    """
    Solve for optimal synthetic control weights.

    Nested optimization:
      Outer: optimize V (predictor importance)
      Inner: optimize w (donor weights) given V
    """
    k = X1.shape[0]
    J = X0.shape[1]

    def solve_w_given_V(V_diag: np.ndarray) -> np.ndarray:
        """Inner: find w minimizing weighted predictor distance."""
        V = np.diag(V_diag)

        def objective(w):
            gap = X1.flatten() - X0 @ w
            return gap @ V @ gap

        constraints = {"type": "eq", "fun": lambda w: np.sum(w) - 1.0}
        bounds = [(0, 1)] * J
        w0 = np.ones(J) / J

        result = minimize(objective, w0, method="SLSQP",
                         bounds=bounds, constraints=constraints,
                         options={"maxiter": 1000, "ftol": 1e-12})
        return result.x

    def outer_objective(V_diag: np.ndarray) -> float:
        """Outer: minimize pre-period MSPE given V."""
        w = solve_w_given_V(np.abs(V_diag))
        return np.mean((Y1_pre - Y0_pre @ w) ** 2)

    V0 = np.ones(k)
    result = minimize(outer_objective, V0, method="Nelder-Mead",
                     options={"maxiter": 5000, "xatol": 1e-8})

    return solve_w_given_V(np.abs(result.x))


Y1_pre = df["Treated"].iloc[:T0].values
Y0_pre = df.iloc[:T0, 1:].values
weights = solve_weights(X1, X0, Y1_pre, Y0_pre)

for col, w in zip(df.columns[1:], weights):
    if w > 0.01:
        print(f"  {col}: {w:.4f}")

Затем ряд разрывов задается выражением df["Treated"].values - df.iloc[:, 1:].values @ weights; его строят относительно даты вмешательства вместе с разрывами доноров из приведенного ниже плацебо-запуска.

Плацебо-тесты

def run_placebo_tests(df: pd.DataFrame, T0: int) -> pd.DataFrame:
    """In-space placebo: treat each unit in turn as if intervened upon."""
    results = []
    all_columns = df.columns.tolist()

    for placebo_col in all_columns:
        donor_cols = [c for c in all_columns if c != placebo_col]
        donor_df = df[donor_cols]

        X1_p = build_predictors(df[placebo_col], T0).reshape(-1, 1)
        X0_p = np.column_stack([
            build_predictors(donor_df[c], T0) for c in donor_cols
        ])

        w_p = solve_weights(
            X1_p, X0_p,
            df[placebo_col].iloc[:T0].values,
            donor_df.iloc[:T0].values,
        )
        gap_p = df[placebo_col].values - donor_df.values @ w_p

        mspe_pre = np.mean(gap_p[:T0] ** 2)
        mspe_post = np.mean(gap_p[T0:] ** 2)

        results.append({
            "unit": placebo_col,
            "mspe_pre": mspe_pre,
            "mspe_post": mspe_post,
            "mspe_ratio": mspe_post / mspe_pre if mspe_pre > 1e-10 else np.inf,
            "gap_series": gap_p,
            "is_treated": placebo_col == "Treated",
        })

    return pd.DataFrame(results)


placebo_results = run_placebo_tests(df, T0)

treated_pre = placebo_results.loc[placebo_results["is_treated"], "mspe_pre"].values[0]
filtered = placebo_results[placebo_results["mspe_pre"] <= 5 * treated_pre]

treated_ratio = filtered.loc[filtered["is_treated"], "mspe_ratio"].values[0]
p_value = (filtered["mspe_ratio"] >= treated_ratio).sum() / len(filtered)
print(f"MSPE ratio (treated): {treated_ratio:.2f}   p = {p_value:.3f}")

Калибровка оценивателя

Есть демонстрация, которую стоит запустить, и демонстрация, от которой стоит отказаться. Сгенерировать синтетические панельные данные, добавить эффект +0,3% в день, восстановить примерно +0,3% в день и представить это как доказательство — значит доказать лишь сходимость SLSQP. Это круговое рассуждение, и в этой статье такой результат не публикуется.

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

  1. Мощность при известном размере эффекта. Добавьте эффект известной величины. Восстанавливает ли оцененный разрыв после вмешательства эту величину и с какой ошибкой? Уменьшайте эффект, пока восстановление не начнет давать сбой: этот порог — наименьший эффект, который может обнаружить геометрия вашей панели, и любой реальный результат ниже него будет шумом независимо от p-значения.
  2. Размер при истинной нулевой модели. Не добавляйте ничего. Запустите весь конвейер плацебо. P-значение должно быть примерно равномерным на [0,1][0, 1], поэтому при повторных генерациях оно должно быть меньше 0,10 примерно в 10% случаев. Если оно срабатывает существенно чаще, набор предикторов или порог фильтра искусственно создает значимость, и конвейер неисправен еще до применения к реальным данным.

Проверка 2 — та, которую часто пропускают, хотя именно она важна. Запускайте ее первой.

Практические соображения

Сбалансированная система причинной оценки

Выбор донорского пула

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

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

Подгонка до вмешательства — весь аргумент

Достоверность SCM полностью опирается на подгонку до периода вмешательства. Сообщайте MSPE до вмешательства и показывайте саму подгонку. Плохая предварительная подгонка делает недействительным все, что происходит после T0T_0.

Abadie и соавторы (2015) формулируют правило прямо: если никакая выпуклая комбинация доноров не воспроизводит траекторию затронутой единицы до вмешательства, не применяйте метод. Это честный критерий фальсификации, который встречается реже, чем должен: большинство оценивателей возвращают число, что бы им ни подали. SCM сообщает, когда не способен построить достоверный контрфактический сценарий; правильный ответ — опубликовать неудачу, а не расширять донорский пул, пока подгонка не улучшится. Расширение пула ради улучшения предварительной подгонки — это то же переобучение, о котором говорит вся эта серия, только перенесенное на этап построения контроля.

Переобучение на коротких панелях

Специфическая для SCM величина, за которой нужно следить, — отношение числа доноров JJ к числу наблюдений до вмешательства T0T_0. Если JJ свободных весов подгоняются по T0T_0 точкам, идеальная предварительная подгонка становится достижимой конструктивно по мере приближения JJ к T0T_0, но полученная таким способом идеальная подгонка ничего не сообщает. Держите T0T_0 существенно больше JJ; если до изменения стратегия работала 30 дней, а у вас есть 20 кандидатов в доноры, это не проблема SCM, а интерполяция. Варианты смягчения:

  1. Регуляризация: SparseSC добавляет штрафы 1\ell_1 и 2\ell_2 в оптимизацию весов.
  2. Ограничение донорского пула: меньшее число лучше обоснованных доноров предпочтительнее большего числа — ценой более грубой сетки перестановок, поскольку JJ также задает минимальное p-значение. Это реальное противоречие, у которого нет простого решения.
  3. Расширенный SCM: Ben-Michael, Feller и Rothstein (2021) используют модель результата для коррекции смещения, когда идеальная предварительная подгонка недостижима.

Нестационарность

Запускайте SCM на накопленных доходностях, а не на уровнях цен: уровни провоцируют ложные подгонки. Прежде чем доверять расхождению после вмешательства, убедитесь, что разрыв до вмешательства имеет нулевое среднее и стационарен; методы ADF и Engle-Granger, включая скорректированные критические значения для проверки подогнанного остатка, а не наблюдаемого ряда, разобраны в материале о статистическом арбитраже и парной торговле.

Несколько затронутых единиц

Одновременное внедрение на нескольких активах нарушает дизайн с одной затронутой единицей. Возможные расширения: объединенный SCM (средние эффекты по затронутым единицам) и схемы ступенчатого внедрения (Ben-Michael и соавторы, 2022) для единиц, затронутых в разные моменты.

Когда SCM применять не следует

Неоднозначная причинная структура

Метод хорошо подходит для дискретного, четко определенного вмешательства в известную дату; разумного донорского пула сопоставимых незатронутых единиц; вмешательств, не ожидавшихся заранее, поскольку ожидание сдвигает траекторию затронутой единицы еще до T0T_0 и нарушает идентификацию.

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

Заключение

Фактическая и синтетическая траектории, сходящиеся вместе

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

Причина предпочесть его специальному эталону не в том, что он дает большие эффекты — часто он дает меньшие, — а в том, что он способен отказаться от ответа. Если ни одна выпуклая комбинация доноров не отслеживает ваш инструмент до вмешательства, SCM сообщает об этом, и вы останавливаетесь. Если разрыв затронутой единицы находится внутри облака донорских разрывов, об этом сообщает плацебо p-значение, и вы публикуете нулевой результат. Эти два выхода и есть ценность метода; описание SCM без MSPE до вмешательства и плацебо p-значения пропускает единственные части, превращающие его из графика двух расходящихся линий в полноценный анализ.


Дополнительная литература

  • Abadie, A., Diamond, A., & Hainmueller, J. (2010). "Synthetic Control Methods for Comparative Case Studies." Journal of the American Statistical Association, 105(490), 493-505.
  • Abadie, A. (2021). "Using Synthetic Controls: Feasibility, Data Requirements, and Methodological Aspects." Journal of Economic Literature, 59(2), 391-425.
  • Ben-Michael, E., Feller, A., & Rothstein, J. (2021). "The Augmented Synthetic Control Method." Journal of the American Statistical Association, 116(536), 1789-1803.
  • Cunningham, S. (2021). Causal Inference: The Mixtape. Chapter 10: Synthetic Control. Available at mixtape.scunning.com.
  • Microsoft Research. SparseSC: Sparse Synthetic Controls. github.com/microsoft/SparseSC.
Дисклеймер: Информация в этой статье предоставлена исключительно в образовательных и ознакомительных целях и не является финансовым, инвестиционным или торговым советом. Торговля криптовалютами сопряжена с высоким риском убытков.

Авторы

Eugen Soloviov
Eugen Soloviov

Инженер торговых систем

Разработка торговых ботов с 2017 года: межбиржевой арбитраж (подключал до 30 бирж), парный арбитраж на коинтеграции между спотом и фьючерсами, скальпинг, фронтраннинг, торговля по новостям, сентиментный анализ, трендовые алгоритмы, а также алгоритмы управления и балансировки портфелей. Делает выставление ордеров до 1 мс, warehouse для big data, бэктестинг-движки, AI-агентов и интерфейсы для ботов (в т.ч. open-source profitmaker.cc). Стек: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, архитектура.

Newsletter

Будьте в курсе событий

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

Мы уважаем вашу конфиденциальность. Отписаться можно в любой момент.