📝

Draft article

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

← Voltar aos artigos
August 21, 2026
5 min read

Métodos de controle sintético para avaliar estratégias de negociação

Métodos de controle sintético para avaliar estratégias de negociação
#causal-inference
#synthetic-control
#counterfactual
#evaluation
#econometrics

Esta série passou muito tempo em uma rota para uma borda falsa: seleção. The Deflated Sharpe Ratio avalia o vencedor de uma pesquisa. A probabilidade de overfitting de backtest avalia a pesquisa em si. O negativo honesto é o que acontece quando você aponta ambos para uma estratégia que você realmente deseja negociar. Esse aparelho responde bem a uma pergunta: encontrei isso porque olhei muitas vezes?

Não aborda uma segunda rota totalmente separada: confusa. Você mudou uma coisa – implantou um novo algoritmo de execução, trocou um parâmetro, reagiu a um regime – e o desempenho melhorou. Não houve busca. Não houve problema de testes múltiplos. E a melhoria ainda pode não ter nada a ver com você, porque a volatilidade dobrou na semana em que você enviou. Nenhuma deflação detecta isso, porque a deflação corrige os testes e você executou apenas um.

O Método de Controle Sintético (SCM), desenvolvido por Abadie e Gardeazabal (2003) e refinado por Abadie, Diamond e Hainmueller (2010, 2015), ataca diretamente a confusão. Ele constrói um contrafactual – uma combinação ponderada de instrumentos que você não tocou, escolhidos de forma que rastreiem de perto o instrumento tratado antes da intervenção. A divergência pós-intervenção entre os dois é a sua estimativa de efeito. Crucialmente, o SCM vem com um critério de falsificação que informa quando ele não pode produzir um contrafactual confiável e um valor-p baseado em permutação que não exige que você acredite em nenhuma história assintótica.

Por que as alternativas óbvias falham

Caminhos de comparação contrafactual

A comparação antes-depois confunde a intervenção com tudo o que mudou naquela data. A comparação com um único instrumento de benchmark falha porque nenhum ativo único rastreia o seu — esta é a armadilha de instrumento único da outra direção: se a estrutura idiossincrática de um instrumento pode falsificar uma vantagem, a estrutura idiossincrática de um instrumento também pode falsificar um controle. O conjunto de doadores do SCM é a resposta formal exactamente a essa objecção: em vez de escolher um activo comparável, deixamos que os dados pré-período escolham um cabaz ponderado deles.

A diferença nas diferenças merece mais do que uma frase, porque é o quase acidente. DiD compara a mudança na unidade tratada com a mudança em um grupo de controle e identifica o efeito apenas sob tendências paralelas: sem a intervenção, o tratado e o controle teriam se movido juntos. Nos mercados financeiros, esse pressuposto é quase indefensável — os activos diferem no beta, no regime de volatilidade, no nível de liquidez e os seus caminhos relativos divergem. O SCM substitui a suposição por um objeto ajustado: em vez de assumir um controle que se move em paralelo, ele constrói um e depois mostra quão bem ele realmente foi rastreado. Se o rastreamento for ruim, você será instruído a parar.

O Método

Construção do doador de controle sintético

Configuração e notação

Considere J+1J + 1 unidades (ativos, estratégias ou carteiras) observadas ao longo TT períodos. A Unidade 1 é a unidade tratada — o ativo ou estratégia onde você interveio. Unidades 2,,J+12, \ldots, J+1 formar o conjunto de doadores de unidades não tratadas comparáveis.

Deixar Y1tIY_{1t}^I denotar o resultado para a unidade tratada no momento tt com a intervenção e Y1tNY_{1t}^N o resultado sem ele. O efeito do tratamento no momento t>T0t > T_0 é:

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

Nós observamos Y1tIY_{1t}^I diretamente. Todo o problema é estimar Y1tNY_{1t}^N.

Construindo o Controle Sintético

Estimativas de SCM Y1tNY_{1t}^N como uma média ponderada dos resultados dos doadores:

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

onde o vetor de peso w=(w2,,wJ+1)\mathbf{w} = (w_2, \ldots, w_{J+1})' satisfaz wj0w_j \geq 0 para todos jj e jwj=1\sum_j w_j = 1.

Essas duas restrições fazem um trabalho real. Eles forçam o controle sintético a ser uma combinação convexa de doadores, o que impede a extrapolação fora do suporte dos dados. Uma regressão irrestrita pode fornecer um contrafactual construído a partir de uma posição comprada de 3,4x em uma moeda contra uma posição vendida de 2,4x em outra – numericamente um ótimo ajuste pré-período e um contrafactual que corresponde a nenhum portfólio que alguém pudesse manter. A restrição de convexidade torna o contrafactual interpretável e os pesos escassos: normalmente, apenas um punhado de doadores obtém peso diferente de zero e você pode lê-los.

Seleção de peso ideal

Os pesos são escolhidos para minimizar a distância entre a unidade tratada e o controle sintético no período pré-intervenção:

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})

onde X1\mathbf{X}_1 é um (k×1)(k \times 1) vetor de características pré-intervenção para a unidade tratada, X0\mathbf{X}_0 é o (k×J)(k \times J) matriz das mesmas características para o pool de doadores, e V\mathbf{V} é um (k×k)(k \times k) matriz diagonal semidefinida positiva atribuindo importância a cada preditor.

V\mathbf{V} é escolhido por validação cruzada: escolha V\mathbf{V} tal que o resultante w(V)\mathbf{w}^*(\mathbf{V}) minimiza o erro quadrático médio de predição (MSPE) da variável resultado no período pré-intervenção. Esta é uma otimização aninhada – um loop externo V\mathbf{V}, uma solução com restrição interna para w\mathbf{w}.

Variáveis Preditoras para Aplicações de Negociação

Onde Abadie et al. usou o PIB per capita e a composição da indústria, as aplicações comerciais desejam:

  • Características de retorno: retorno médio, volatilidade, assimetria, curtose no pré-período
  • Medidas de liquidez: spread médio, volume diário, índice de iliquidez Amihud
  • Características da microestrutura: desequilíbrio no fluxo de pedidos, taxa de chegada de negociações, relação cotação/negociação
  • Exposições a fatores: fatores beta para mercado, momentum, valor e volatilidade
  • Resultados defasados: valores cumulativos de PnL em diversas datas pré-intervenção

Os resultados atrasados são os mais importantes. Abadie et al. (2010) mostram que se o controle sintético corresponder à unidade tratada em resultados defasados ​​ao longo de uma longa janela pré-intervenção, ele controla implicitamente os fatores de confusão não observados sob um modelo de fator linear - que é a razão pela qual o método vale a pena. Você não é obrigado a nomear o fator de confusão que impulsionou seu PnL. Você é obrigado a encontrar doadores que também foram expostos a isso.

Onde isso se aplica

Pontes causais entre regimes de mercado

Cenário 1: Avaliando um novo algoritmo de execução

Você implanta um novo cronograma TWAP em um instrumento e deseja seu efeito no déficit de implementação. Tanto a métrica quanto a família de algoritmos são abordadas em profundidade em outro lugar - consulte déficit de implementação e TCA para a decomposição de custos e algoritmos TWAP/VWAP/POV para os próprios agendadores. A contribuição do SCM é a camada de avaliação no topo: o pool de doadores são os mesmos instrumentos que ainda executam o antigo programador, na mesma janela, de modo que mudanças em todo o local na distribuição ou no volume afetam tanto os tratados quanto os doadores.

Período pré-intervenção: 60 dias úteis antes da mudança. Período pós-intervenção: 30 dias úteis após. A estimativa do efeito é a lacuna:

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

Se o novo escalonador realmente reduzir custos, τ^1t<0\hat{\tau}_{1t} < 0 persistentemente depois T0T_0 — e, mais importante, a lacuna tratada fica fora da nuvem de lacunas dos doadores.

Cenário 2: Impacto de um Evento de Mercado

Uma mudança na tabela de taxas, um piloto no tamanho do tick, um imposto sobre transações ou uma mudança nas regras do disjuntor atinge um único local. Unidade tratada: sua estratégia no local afetado. Pool de doadores: o mesmo par em locais que a mudança não afetou. Os efeitos da estrutura de taxas na execução são tratados separadamente em taxas e descontos do maker-taker; SCM é o que transforma "nossos preenchimentos pioraram após a mudança" em uma estimativa com valor nulo anexado.

Cenário 3: Mudança de Estratégia Condicional ao Regime

Você muda da reversão à média para o momentum em um ativo quando um sinal de detecção de regime é acionado. A mudança foi melhor do que ficar parado? Pool de doadores: ativos semelhantes onde o sinal foi disparado, mas você não mudou. Note-se aqui a armadilha: se o sinal do regime disparar em todo o mercado, os seus doadores também serão tratados e o projecto entrará em colapso. Veja a regra de transbordamento abaixo.

Testes e inferência de placebo

Trajetórias do placebo e caminho testado

A inferência do SCM é baseada em permutação. O argumento geral para construir um nulo empírico por reamostragem em vez de confiar em uma distribuição de forma fechada é feito em Monte Carlo e métodos de bootstrap para backtests; o que se segue é a construção específica do SCM.

Placebo a tempo

Mude a data da intervenção para o pré-período – na metade, digamos – e execute novamente. Se o SCM encontrar um “efeito de tratamento” numa data em que nada aconteceu, está a detectar uma divergência pré-existente e não a sua intervenção. Um controlo sintético credível não mostra qualquer efeito em datas de intervenção falsas.

Placebo no espaço (teste de permutação)

Aplicar todo o procedimento SCM a cada doador, fingindo que cada um era a unidade tratada:

  1. Para cada doador jj, construa um controle sintético a partir dos doadores restantes mais a unidade tratada original.
  2. Calcule a lacuna pós-intervenção gapjt=YjtY^jtsynth\text{gap}_{jt} = Y_{jt} - \hat{Y}_{jt}^{\text{synth}}.
  3. Compare a lacuna da unidade tratada com a distribuição das lacunas do placebo.

O valor p é uma classificação:

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

onde

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}

O rácio, e não a lacuna pós-período bruta, é a estatística correcta: um doador que nunca esteve bem adaptado apresentará uma grande lacuna pós-período por razões que nada têm a ver com qualquer intervenção, e a divisão pelo seu MSPE pré-período penaliza exactamente isso.

Este é o mesmo movimento inferencial que o Deflated Sharpe Ratio faz - classifique seu candidato dentro de uma distribuição de referência gerada empiricamente, nunca contra zero. O DSR classifica seu vencedor em relação a uma melhor de N nula em testes; SCM classifica sua unidade tratada em relação a um valor nulo em unidades. Estimador diferente, mesma disciplina e o mesmo aviso se aplicam: com J=15J = 15 doadores, o menor valor p atingível é 1/160.061/16 \approx 0.06. Um teste de permutação não pode resolver além de sua própria granularidade, portanto, um pequeno conjunto de doadores limita a importância que você tem direito a reivindicar, não importa quão grande seja o efeito.

Filtragem Prática

Abadie et al. recomendam a exclusão de unidades de placebo com baixo ajuste pré-intervenção – pré-MSPE mais do que kk vezes o da unidade tratada, com kk normalmente de 2 a 20. Placebos mal ajustados têm denominadores minúsculos e produzem enormes proporções de MSPE, contaminando a distribuição de referência e fazendo com que sua unidade tratada pareça normal. Relate a proporção em vários limites; se o seu valor p for significativo apenas em um determinado kk, você encontrou um parâmetro de ajuste, não um efeito.

Implementação

Pipeline de análise contrafactual

O código abaixo usa apenas numpy e scipy então a mecânica é visível. Alternativas de produção - SparseSC (Pesquisa da Microsoft), pysyncon, SyntheticControlMethods - lidar com casos extremos e dimensionar melhor.

Construção da matriz preditora

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 aqui está um painel de retornos cumulativos – unidade tratada na coluna 0, doadores no restante, uma linha por barra. Use retornos cumulativos, não níveis de preços.

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:]
])

Otimização de peso

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}")

A série de lacunas é então df["Treated"].values - df.iloc[:, 1:].values @ weights, plotado em relação à data da intervenção juntamente com as lacunas de doadores da execução do placebo abaixo.

Testes de Placebo

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}")

Calibrando o Estimador

Há uma demonstração que vale a pena realizar e uma demonstração que vale a pena recusar. Gerar dados de painel sintético, injetar um efeito de +0,3%/dia, recuperar aproximadamente +0,3%/dia e apresentar isso como evidência prova apenas que o SLSQP converge. É circular e este blog não o publica.

Os dados sintéticos são bons para a calibração - o mesmo padrão aplicado em a peça DSR e PBO, onde o nulo conhecido é o que torna a estatística confiável. Duas verificações, ambas executadas em dados gerados a partir de um modelo de fator linear com a contagem de doadores e a duração do pré-período que você realmente possui:

  1. Potência com tamanho de efeito conhecido. Injete um efeito de magnitude conhecida. O gap pós-período estimado o recupera e dentro de qual erro? Reduza o tamanho do efeito até que a recuperação falhe — esse piso é o menor efeito que a geometria do painel pode detectar e qualquer resultado real abaixo dele é ruído, independentemente de seu valor p.
  2. Tamanho sob um valor nulo verdadeiro. Injete nada. Execute o pipeline completo do placebo. O valor p deve ser aproximadamente uniforme em [0,1][0, 1], portanto, deve cair abaixo de 0,10 em cerca de 10% das vezes em sorteios repetidos. Se ele disparar com muito mais frequência do que isso, seu conjunto de preditores ou limite de filtro será importante para a fabricação e o pipeline será interrompido antes mesmo de atingir os dados reais.

A verificação 2 é aquela que as pessoas ignoram e a que importa. Execute-o primeiro.

Considerações Práticas

Sistema de avaliação causal equilibrado

Escolhendo o conjunto de doadores

Os doadores devem ser plausivelmente comparáveis à unidade tratada e não afetados pela intervenção. Para o trabalho de execução: o mesmo algoritmo em instrumentos semelhantes — mesmo setor, decil de capitalização de mercado, nível de liquidez. A taxonomia de nível em validação multisímbolo é diretamente reutilizável aqui; as propriedades que tornam os instrumentos um teste de robustez justo também os tornam um conjunto justo de doadores. Para eventos em locais: o mesmo instrumento nos locais que a mudança não alcançou.

Exclua unidades com repercussões. Se a alteração do algoritmo em um instrumento alterou sua cotação em instrumentos correlacionados, esses instrumentos serão parcialmente tratados. Deixá-los em polarização direciona o controle sintético para o caminho pós-período da unidade tratada e reduz sua estimativa para zero – uma falha de projeto que produz resultados nulos com a mesma facilidade com que um controle ruim produz resultados positivos.

O ajuste pré-intervenção é todo o argumento

A credibilidade da SCM depende inteiramente do ajuste pré-período. Relate o MSPE pré-intervenção e mostre o ajuste. Um mau pré-ajuste invalida tudo depois T0T_0.

Abadie et al. (2015) afirmam a regra de forma clara: se nenhuma combinação convexa de doadores reproduzir a trajetória pré-intervenção da unidade tratada, não aplicar o método. Este é um critério de falsificação honesto e é mais raro do que deveria ser – a maioria dos estimadores retorna um número independentemente do que você fornece. O SCM informa-o quando não consegue produzir um cenário contrafactual credível, e a resposta correcta a essa mensagem é publicar o fracasso e não alargar o conjunto de doadores até que a adequação melhore. Ampliar o pool para buscar o pré-ajuste é o mesmo overfitting sobre o qual o resto desta série trata, realocado para a etapa de construção de controle.

Overfitting em painéis curtos

A quantidade específica de SCM a ser observada é a proporção de doadores JJ para observações pré-período T0T_0. Com JJ pesos livres montados T0T_0 pontos, o pré-ajuste perfeito torna-se alcançável pela construção como JJ abordagens T0T_0 – e um pré-ajuste perfeito obtido dessa forma não contém nenhuma informação. Manter T0T_0 substancialmente maior do que JJ; se uma estratégia foi executada 30 dias antes da mudança e você tem 20 doadores candidatos, você não tem um problema de SCM, você tem uma interpolação. Mitigações:

  1. Regularização: SparseSC adiciona 1\ell_1 e 2\ell_2 penalidades à otimização do peso.
  2. Restringir o conjunto de doadores: menos doadores e mais bem justificados vencem mais doadores — ao custo de uma grelha de permutação mais grosseira, uma vez que JJ também define seu valor p mínimo. Essa tensão é real e não tem uma resolução clara.
  3. SCM aumentado: Ben-Michael, Feller e Rothstein (2021) usam um modelo de resultados para corrigir o viés quando o pré-ajuste perfeito é inatingível.

Não-estacionariedade

Execute o SCM com base em retornos cumulativos, nunca em níveis de preços – os níveis convidam a ajustes espúrios. Confirme que a lacuna pré-intervenção é média zero e estacionária antes de confiar na divergência pós-período; o mecanismo ADF e Engle-Granger para isso, incluindo os valores críticos corrigidos necessários ao testar um resíduo ajustado em vez de uma série observada, é abordado em arbitragem estatística e negociação de pares.

Múltiplas Unidades Tratadas

A implantação em vários ativos ao mesmo tempo quebra o design de unidade tratada única. Extensões: SCM agrupado (efeitos médios entre unidades tratadas) e designs de adoção escalonada (Ben-Michael et al., 2022) para unidades tratadas em momentos diferentes.

Quando não usar SCM

Estrutura causal ambígua

Adequado para: uma intervenção discreta e bem definida em uma data conhecida; um conjunto razoável de doadores de unidades não tratadas comparáveis; intervenções não previstas com antecedência, pois a antecipação move a unidade tratada antes T0T_0 e viola a identificação.

Pouco adequado para: tratamento contínuo, como desvio de parâmetro ao longo de semanas; ambientes sem comparáveis ​​genuinamente não tratados; avaliação de alta frequência onde a relação sinal-ruído derrota a estimativa de peso.

Conclusão

Trajetórias reais e sintéticas resolvidas juntas

Seleção e confusão são modos de falha diferentes e necessitam de instrumentos diferentes. DSR e PBO avaliam a pesquisa. O SCM avalia o contrafactual e é a única ferramenta nesta série que aborda o caso em que você executou exatamente um experimento e ainda não pode confiar no resultado.

A razão para preferi-lo a um benchmark ad hoc não é o facto de produzir efeitos maiores – frequentemente produz efeitos mais pequenos – mas sim o facto de poder recusar. Se nenhuma combinação convexa de doadores rastrear seu instrumento antes da intervenção, o SCM avisa e você para. Se a lacuna tratada estiver dentro da nuvem doadora, o valor p do placebo indica isso e você relata um valor nulo. Essas duas saídas são o valor do método, e um artigo do SCM sem um MSPE pré-período relatado e um valor p placebo pulou as únicas partes que o tornam mais do que um gráfico de duas linhas divergentes.


Leitura adicional

  • Abadie, A., Diamond, A., & Hainmueller, J. (2010). "Métodos de controle sintético para estudos de caso comparativos." Jornal da Associação Estatística Americana, 105(490), 493-505.
  • Abadie, A. (2021). "Usando controles sintéticos: viabilidade, requisitos de dados e aspectos metodológicos." Jornal de Literatura Econômica, 59(2), 391-425.
  • Ben-Michael, E., Feller, A., & Rothstein, J. (2021). "O Método de Controle Sintético Aumentado." Jornal da Associação Estatística Americana, 116(536), 1789-1803.
  • Cunningham, S. (2021). Inferência causal: a mixtape. Capítulo 10: Controle Sintético. Disponível em mixtape.scunning.com.
  • Pesquisa da Microsoft. SparseSC: Controles Sintéticos Esparsos. github.com/microsoft/SparseSC.
blog.disclaimer

Authors

Eugen Soloviov
Eugen Soloviov

Trading-systems engineer

Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.

Newsletter

Fique à frente do mercado

Assine nossa newsletter para insights exclusivos sobre trading com IA, análises de mercado e atualizações da plataforma.

Respeitamos sua privacidade. Cancele a inscrição a qualquer momento.