← Torna agli articoli
August 2, 2026
5 min di lettura

Double Machine Learning: Stimare un Parametro Causale Invece che Prevedere i Ritorni

Double Machine Learning: Stimare un Parametro Causale Invece che Prevedere i Ritorni
#causal-inference
#double-ML
#treatment-effect
#econometrics
#quant

Ogni articolo di modellazione in questo blog finora pone la stessa forma di domanda: dati gli attributi, predici un numero, poi valida che la previsione sopravvive fuori campione. I modelli di spread predicono lo spread. I modelli di fill predicono la probabilita di fill. L'intero apparato di validazione — purged walk-forward, Sharpe deflato, tassonomia look-ahead — esiste per verificare se una previsione e reale.

Questo articolo pone una forma diversa di domanda, e e l'unica parte di macchinario che il blog non ha mai avuto: stima un singolo parametro scalare che ha un'interpretazione causale, e allega un errore standard che sopravvive al fatto che e stato usato un modello ML flessibile per arrivare li.

Questa non e una distinzione retorica. "La posizione in coda predice la probabilita di fill" e banalmente vera e operazionalmente inutile — naturalmente lo fa, entrambi sono guidati dalla profondita e dalla volatilita. "Spostarsi di una posizione avanti nella coda causa un cambiamento di θ\theta nella probabilita di fill, mantenendo fisso lo stato del mercato" e un numero che puoi inserire in una politica di placement degli ordini. Il primo e un fitting di regressione. Il secondo richiede uno stimatore che non esiste nella toolkit ML standard, perche la regolarizzazione e l'overfitting in una prima fase flessibile distorcono esattamente il coefficiente che ti interessa.

Double Machine Learning (Chernozhukov, Chetverikov, Demirer, Duflo, Hansen, Newey & Robins, 2018) e lo stimatore che risolve questo problema. Ogni trader quantitativo ha sentito questo: correlazione non e causalita. DML e la parte che viene dopo quella frase.

Perche la Regressione Naiva Fallisce

Un confonder dello stato del mercato nascosto guida sia il placement in coda che i risultati di fill, creando un'associazione naiva ingannevole

Imposta la domanda nel territorio del blog. Vogliamo l'effetto causale della posizione in coda sulla probabilita di fill:

  • YiY_i: se l'ordine limite in riposo all'osservazione ii e stato riempito entro l'orizzonte.
  • DiD_i: posizione in coda al placement (normalizzata per la dimensione del livello).
  • XiX_i: i confonderi — volatilita realizzata, spread quotato, squilibrio di profondita, dimensione del livello, ora del giorno, etichetta del regime. Queste sono le variabili di stato del mercato che il blog calcola gia in modellazione dello spread con machine learning.

Il parametro causale e θ0\theta_0 in

Yi=Diθ0+g0(Xi)+ϵiY_i = D_i \theta_0 + g_0(X_i) + \epsilon_i

dove g0(Xi)g_0(X_i) cattura la relazione (potenzialmente complessa, non lineare) tra lo stato del mercato e il risultato di fill.

Il trattamento non e assegnato casualmente. Sei vicino alla testa della coda perche il livello era sottile, o perche hai postato durante un periodo calmo, o perche il book era squilibrato a tuo favore. Le stesse condizioni guidano indipendentemente se vieni riempito. Questo e il confounding.

Approccio 1: Ignorare i confonderi. Regrisci YY su DD da solo. La stima assorbe l'effetto di ogni confonder correlato con entrambi. Bias da variabile omessa da libro di testo: i livelli sottili ti danno sia una buona posizione in coda che un alto tasso di fill, quindi esageri il valore della posizione stessa.

Approccio 2: Regressione lineare con controlli. Regrisci YY su DD e XX. Questo funziona solo se g0(X)g_0(X) e veramente lineare. La dinamica del book non lo e — la relazione fill/volatilita ha soglie, l'effetto di squilibrio di profondita cambia segno a seconda del regime. Specificare erroneamente g0g_0 reintroduce il bias.

Approccio 3: Previsione ML. Adatta un modello gradient-boosted su (D,X)(D, X). Ottieni buona discriminazione fuori campione, e nessuna interpretazione causale. Il modello cattura ogni schema predittivo, causale o no; la regolarizzazione riduce il contributo del trattamento in modi che distorcono θ\theta; e non c'e un errore standard su cui puoi fidarti.

Questa e la tensione centrale. ML e buono nella previsione, ma l'applicazione naiva a un parametro causale produce stime distorte, non normali, inaffidabili.

Il Modello Parzialmente Lineare

Due canali di residualizzazione sincronizzati rimuovono lo stato del mercato fastidioso prima che flussi residuali puliti si incontrino in una stima causale ortogonale

DML opera all'interno di un framework strutturale. Il cavallo di battaglia e la regressione parzialmente lineare (PLR):

Y=Dθ0+g0(X)+U,E[UX,D]=0Y = D\theta_0 + g_0(X) + U, \quad \mathbb{E}[U \mid X, D] = 0

D=m0(X)+V,E[VX]=0D = m_0(X) + V, \quad \mathbb{E}[V \mid X] = 0

  • θ0\theta_0 e il parametro causale di interesse.
  • g0(X)g_0(X) e una funzione di disturbo — la parte del risultato spiegata dallo stato del mercato.
  • m0(X)m_0(X) e un'altra funzione di disturbo — l'aspettativa condizionale del trattamento dato lo stato del mercato (la "propensity" in un setting di trattamento continuo).
  • UU e VV sono residui strutturali.

L'intuizione chiave: θ0\theta_0 e di bassa dimensione, ma g0g_0 e m0m_0 possono essere arbitrariamente complessi. Vogliamo che ML gestisca le funzioni di disturbo pur fornendo inferenza valida sullo scalare.

Perche "Doppio"?

Due modelli ML, non uno:

  1. Modello di risultato: ^(X)E[YX]\hat{\ell}(X) \approx \mathbb{E}[Y \mid X] — predici il risultato dallo stato del mercato da solo.
  2. Modello di trattamento: m^(X)E[DX]\hat{m}(X) \approx \mathbb{E}[D \mid X] — predici il trattamento dallo stato del mercato da solo.

Forma i residui

Y~i=Yi^(Xi),D~i=Dim^(Xi)\tilde{Y}_i = Y_i - \hat{\ell}(X_i), \quad \tilde{D}_i = D_i - \hat{m}(X_i)

e stima θ0\theta_0 regredendo Y~\tilde{Y} su D~\tilde{D}:

θ^0=iD~iY~iiD~i2\hat{\theta}_0 = \frac{\sum_i \tilde{D}_i \tilde{Y}_i}{\sum_i \tilde{D}_i^2}

Questo e Frisch-Waugh-Lovell su steroidi: partial-out i confonderi con ML invece di una proiezione lineare, poi leggi l'effetto del trattamento dalla variazione residuale.

Ortagonalita di Neyman: Perche Funziona

L'approccio di partial-out naivo (stima g0g_0, sottrai, regredisci) fallisce perche gli errori di stima ML in g^0\hat{g}_0 si propagano direttamente in θ^0\hat\theta_0. Il punteggio DML e costruito per essere Neyman ortogonale — insensibile a piccole perturbazioni nelle funzioni di disturbo.

Il punteggio ortogonale per PLR:

ψ(W;θ,η)=[Y(X)θ(Dm(X))][Dm(X)]\psi(W; \theta, \eta) = \big[Y - \ell(X) - \theta(D - m(X))\big] \cdot \big[D - m(X)\big]

dove η=(,m)\eta = (\ell, m). La condizione di ortogonalita e

ηE[ψ(W;θ0,η)]η=η0=0\left. \frac{\partial}{\partial \eta} \mathbb{E}\big[\psi(W; \theta_0, \eta)\big] \right|_{\eta = \eta_0} = 0

Intuitivamente, il punteggio usa solo la variazione in DD e YY che e indipendente da XX, e gli errori in una funzione di disturbo sono compensati dall'altra. Se m^\hat{m} sovrastima leggermente il trattamento, D~\tilde{D} e leggermente troppo piccolo, ma l'errore corrispondente in Y~\tilde{Y} dallo stimare erroneamente \ell spinge in una direzione compensatoria. Il bias diventa di secondo ordine — il prodotto di due errori di prima fase — invece che di primo ordine.

Formalmente, se entrambi gli stimatori di disturbo convergono al tasso n1/4n^{-1/4} (lieve; la maggior parte dei metodi ML ragionevoli lo soddisfa), allora

N(θ^0θ0)dN(0,σ2)\sqrt{N}(\hat{\theta}_0 - \theta_0) \xrightarrow{d} \mathcal{N}(0, \sigma^2)

quindi $\hat\theta_0 converge al tasso parametrico ed e asintoticamente normale.

Cross-Fitting: Perche Obbligatorio Qui

L'ortogonalita da sola non basta. Se i modelli di disturbo sono adattati sulle stesse righe usate per stimare θ0\theta_0, l'overfitting di prima fase contamina la seconda fase — e il danno specifico vale la pena essere enunciato con precisione, perche non e il danno a cui sei abituato. Altrove, l'overfitting appare come un punteggio di validazione gonfiato: lo noti, lo sconti, continui. Qui appare come una stima punto spostata per θ0\theta_0, con un intervallo di confidenza ancora stretto e ancora centrato sul numero sbagliato. Non c'e un punteggio di cui sospettare. Lo stimatore semplicemente mente in silenzio.

Il cross-fitting rompe la dipendenza: le previsioni di disturbo di ogni osservazione provengono da un modello addestrato senza di essa, e θ0\theta_0 e stimato dai residui held-out raggruppati. La meccanica e la macchinaria K-fold ordinaria, trattata in modellazione dello spread con machine learning; ciò che conta sotto e quali fold gli conseg.

L'Algoritmo DML Passo Dopo Passo

Input: dati {(Yi,Di,Xi)}i=1N\{(Y_i, D_i, X_i)\}_{i=1}^N, metodi ML M\mathcal{M}_\ell e Mm\mathcal{M}_m, fold KK.

Passo 1 — Partizione: dividi {1,,N}\{1, \ldots, N\} in KK fold disgiunti.

Passo 2 — Cross-fit modelli di disturbo: per k=1,,Kk = 1, \ldots, K, addestra ^(k)\hat{\ell}^{(-k)} e m^(k)\hat{m}^{(-k)} sul complemento del fold kk, poi calcola Y~i=Yi^(k)(Xi)\tilde{Y}_i = Y_i - \hat{\ell}^{(-k)}(X_i) e D~i=Dim^(k)(Xi)\tilde{D}_i = D_i - \hat{m}^{(-k)}(X_i) per iIki \in I_k.

Passo 3 — Stima:

θ^0=(i=1ND~i2)1i=1ND~iY~i\hat{\theta}_0 = \left(\sum_{i=1}^N \tilde{D}_i^2\right)^{-1} \sum_{i=1}^N \tilde{D}_i \tilde{Y}_i

Passo 4 — Inferenza:

σ^2=1Ni=1N(Y~iθ^0D~i)2D~i2/(1Ni=1ND~i2)2\hat{\sigma}^2 = \frac{1}{N} \sum_{i=1}^N \big(\tilde{Y}_i - \hat{\theta}_0 \tilde{D}_i\big)^2 \tilde{D}_i^2 \bigg/ \left(\frac{1}{N} \sum_{i=1}^N \tilde{D}_i^2\right)^2

con intervalli θ^0±zα/2σ^/N\hat{\theta}_0 \pm z_{\alpha/2} \cdot \hat{\sigma} / \sqrt{N}.

L'intervallo di confidenza e valido per esattamente una domanda

Questa e la riserva che decide se un risultato DML vale qualcosa, ed e dove la maggior parte degli usi applicati del metodo crollano silenziosamente.

La normalita asintotica sopra e una dichiarazione su un trattamento pre-specificato, un insieme di confonderi pre-specificato, un punteggio pre-specificato. Fissa questi in anticipo, esegui lo stimatore una volta, e l'intervallo significa ciò che dice. Prova tre trattamenti candidati, o quattro insiemi di confonderi, o scambia learner finche il p-value sembra migliore, e non stai più facendo inferenza — stai eseguendo una ricerca, e il p-value riportato e il p-value di un massimo, non di un'estrazione.

Il blog ha gia misurato cosa fa. Nello studio del ratio Sharpe deflato, le ricerche su rumore puro con zero vantaggio reale producono un tasso di scoperta falsa naivo di 1,000 — il test non aggiustato spara ogni singola volta — mentre il p-value naivo mediano del vincitore si siede vicino a 0,0007. Nulla sull'ortogonalita di Neyman ti protegge da questo. L'ortogonalita risolve il bias dalla stima del disturbo; non dice nulla sul bias dalla ricerca di specificazione. Un p-value DML di 1e-05 ottenuto dopo aver provato sei specifiche merita esattamente lo stesso trattamento Bonferroni/Holm/BHY di qualsiasi altro vincitore estratto da una griglia, con MM impostato al numero di specifiche che hai effettivamente eseguito.

Questo ha conseguenze pratiche dirette per le funzionalita di convenienza degli strumenti. DoubleMLData accetta una lista in d_cols e restituira felicemente tre effetti di trattamento in una tabella di riepilogo:

dml_data_multi = dml.DoubleMLData(
    df, y_col='filled', d_cols=['queue_pos', 'toxicity', 'spread_at_post'],
    x_cols=confounder_cols,
)

Tre righe, tre p-values, e un problema di test multipli che la tabella di riepilogo non menziona. Se leggi tutti e tre, aggiusta tutti e tre. Se solo uno era la domanda pre-registrata, dillo, e tratta gli altri due esplicitamente come esplorativi.

Cross-Fitting su Serie Temporali: Purge, Embargo, Fold Personalizzati

Fold di serie temporali rotanti usano gap di purge e zone di embargo prima che i residui out-of-fold si assemblino in una stima causale singola

Il DML standard assume osservazioni i.i.d. I dati del libro non lo sono, e la modalita di fallimento e quella che il blog ha gia documentato in dettaglio: le righe adiacenti condividono finestre forward sovrapposte, quindi un TimeSeriesSplit ordinario continua a perdere la risposta attraverso il limite del fold. Vedi modellazione dello spread con machine learning per l'implementazione walk-forward purgata ed embargata e la ragione per cui e richiesto un gap di almeno horizon righe, e la tassonomia del bias look-ahead per il catalogo completo delle perdite e le loro magnitudini misurate.

La parte veramente DML-specifica e come consegni i fold purgati allo stimatore, perche set_sample_splitting ha un contratto che fa inciampare la gente:

import numpy as np
import doubleml as dml

def purged_folds(n: int, n_splits: int, horizon: int):
    """Fold a finestra espansa con un gap purge/embargo di `horizon` righe.

    Stessa costruzione del CV walk-forward purgato nell'articolo di
    modellazione dello spread: il gap rimuove la sovrapposizione tra la finestra
    forward di una riga di training e una riga di validazione.
    """
    fold_size = n // (n_splits + 1)
    for k in range(1, n_splits + 1):
        train_end = fold_size * k
        val_start = train_end + horizon
        val_end = val_start + fold_size
        if val_end > n:
            break
        yield np.arange(0, train_end - horizon), np.arange(val_start, val_end)

folds = list(purged_folds(len(df), n_splits=5, horizon=HORIZON))

dml_plr = dml.DoubleMLPLR(dml_data, ml_l=ml_l, ml_m=ml_m)
dml_plr.set_sample_splitting([folds])
dml_plr.fit()

Due cose di cui essere a conoscenza, nessuna delle quale ovvia dai documenti della libreria:

  1. I fold walk-forward purgati non coprono ogni riga. I gap di purge e il blocco di training iniziale non sono mai il fold di test di nessuno, quindi θ0\theta_0 e stimato da rigorosamente meno di NN residui. Questo e comportamento corretto, non un bug, ma significa che la NN effettiva nella formula della varianza e il numero di righe di test raggruppate — controllalo piuttosto che assumerlo.
  2. Le ripetizioni n_rep non sono gratuite qui. Con K-fold casuale, ripetere il cross-fitting e mediare e una riduzione della varianza economica. Con uno split deterministico ordinato nel tempo c'e un solo splitting, quindi n_rep non compra nulla e non nasconde nulla; la stabilita deve provenire dal rieseguire su diverse finestre di dati.

Per le strutture panel (molti simboli nello stesso periodo), DoubleML supporta errori standard robusti al cluster — raggruppa per simbolo, non per tempo, e vedi validazione multi-simbolo per la posizione del blog su quando un risultato cross-instrument e effettivamente stabilito.

Il Caso Misurato: Posizione in Coda e Probabilita di Fill

Le posizioni degli ordini in una coda FIFO convergono in un effetto di posizione in coda aggiustato DML con un alone di confidenza

Questa e l'unica domanda causale nell'articolo dove il progetto ha gia i dati, e dovrebbe essere eseguita non posta. L'analisi della posizione in coda copre gia la stima della posizione, la meccanica FIFO, i tassi di drenaggio e il tempo-to-fill su dati reali del libro; la simulazione del fill copre la modellazione della probabilita di fill e il loop di calibrazione contro i fill dal vivo. Entrambi producono un modello predittivo di fill. DML trasforma gli stessi input in una stima causale.

La specifica, pre-registrata prima di guardare la stima:

  • Risultato YY: riempito entro HORIZON snapshot (binario).
  • Trattamento DD: posizione in coda normalizzata al placement.
  • Confounder XX: volatilita realizzata 1s, spread quotato in bps, squilibrio di profondita, dimensione del livello al post, distanza dal mid in tick, codifica dell'ora del giorno, etichetta del regime.
from sklearn.ensemble import GradientBoostingRegressor
import doubleml as dml

confounder_cols = [
    'rv_1s', 'spread_bps', 'depth_imbalance', 'level_size',
    'dist_from_mid_ticks', 'tod_sin', 'tod_cos', 'regime',
]

dml_data = dml.DoubleMLData(
    df, y_col='filled', d_cols='queue_pos_norm', x_cols=confounder_cols,
)

ml_l = GradientBoostingRegressor(n_estimators=300, max_depth=5)
ml_m = GradientBoostingRegressor(n_estimators=300, max_depth=5)

dml_plr = dml.DoubleMLPLR(dml_data, ml_l=ml_l, ml_m=ml_m, score='partialling out')
dml_plr.set_sample_splitting([folds])
dml_plr.fit()

print(dml_plr.summary)
dml_plr.sensitivity_analysis()
print(dml_plr.sensitivity_summary)

Il risultato da riportare e un confronto a quattro colonne, non un singolo coefficiente: la stima naiva OLS di YY su DD da solo, la stima di controllo lineare di YY su DD e XX, la stima DML con il suo errore standard, e il valore di robustezza dall'analisi della sensibilita — quanto forte deve essere un confonder non osservato per annullare l'effetto. Il divario tra le colonne naiva e DML e la quantita di reale interesse: e quanto del valore apparente della posizione in coda era lo stato del mercato in costume.

Un θ\theta nullo o negativo qui e un risultato pubblicabile e si adatta meglio a questo blog di uno positivo pulito. Se l'effetto causale della posizione in coda collassa una volta che volatilita e dimensione del livello sono partial-out, questo e un risultato diretto sulla politica di placement degli ordini: la posizione non e cio che guadagna il fill, le condizioni in cui hai ottenuto la posizione lo sono.

Analisi del Fattore Causale

L'approccio standard all'investimento nei fattori e associativo: ordina per una caratteristica, forma portafogli long-short, osserva che i rendimenti differiscono. DML abilita un test diverso — stima l'effetto causale diretto di una caratteristica sui rendimenti, eliminando gli effetti di confounding delle altre caratteristiche. Se l'effetto scompare sotto DML, il fattore non e causalmente indipendente; e un proxy.

Questa e una seconda, forma indipendente di scetticismo sui fattori, e vale la pena essere espliciti su come si relaziona a quella che il blog pubblica gia. Il ratio Sharpe deflato attacca lo zoo dei fattori dal lato della selezione: con abbastanza prove, un fattore puo sembrare significativo puramente perche hai guardato molte volte. DML lo attacca dal lato del confounding: un fattore puo sembrare significativo su un singolo test onesto ed essere ancora un proxy per qualcos'altro nell'insieme di condizionamento. Un fattore deve sopravvivere a entrambi per essere interessante, e le due modalita di fallimento sono indipendenti — passare uno non ti dice nulla sull'altro.

Cosa DML Non Puo Fare

  1. Richiede che i confonderi siano osservati. Se una variabile non osservata guida sia trattamento che risultato, DML e distorto, e nessuna sofisticazione ML risolve un problema di identificazione. L'analisi della sensibilita delimita il rischio; non lo rimuove.

  2. Stima un effetto medio. Se l'effetto della posizione in coda varia bruscamente attraverso i regimi, la stima punto e la media sul mix dei regimi del tuo campione. Per l'eterogeneita usa l'Interactive Regression Model (DoubleMLIRM) o una foresta causale.

  3. Assume un modello strutturale. La specifica parzialmente lineare richiede che il trattamento entri nell'equazione del risultato in un modo particolare. Se il processo vero e fondamentalmente diverso, DML e confidenzialmente sbagliato.

  4. Non scopre la struttura causale. DML stima l'effetto di un trattamento pre-specificato. Non ti dice quali variabili sono cause.

  5. Non ti esenta dai test multipli. Ripetere il punto sopra perche e quello piu spesso saltato: l'ortogonalita de-biasa la stima del disturbo, non la ricerca di specificazione.

Note Pratiche

Dimensione del campione. DML richiede che i modelli di disturbo convergano a n1/4n^{-1/4}, che in pratica significa abbastanza righe perche i modelli ML approssimino g0g_0 e m0m_0 affatto. Invece di fidarti di soglie di numeri tondi, stabilisci l'adeguatezza empiricamente nel modo in cui la validazione multi-simbolo lo fa — controlla se la stima regge attraverso strumenti e sottoperiodi, e tratta l'instabilita come il segnale che e.

Scelta del learner. Il fatto specifico DML e stretto ma utile: data la convergenza n1/4n^{-1/4}, il learner influenza l'efficienza di θ^0\hat\theta_0 (larghezza dell'intervallo), non la sua coerenza. Quali learner vale la pena raggiungere sui dati di mercato tabulari, e perche il gradient boosting e il predefinito, e gia trattato in modellazione dello spread con machine learning. Se θ^0\hat\theta_0 si muove materialmente attraverso i learner, non e un menu da cui scegliere — e evidenza che le funzioni di disturbo sono stimate male, e per la sezione sopra, scegliere il piu amichevole trasforma l'esercizio in una ricerca.

Conclusione

DML dà al blog qualcosa che non aveva: un modo di affermare una rivendicazione di microstruttura di mercato come un parametro causale con un errore standard difendibile, invece che come una previsione con un buon punteggio di validazione.

Le tre idee che portano il carico sono:

  • Ortogonizza il punteggio cosicche gli errori di prima fase si annullano al secondo ordine.
  • Cross-fit, con fold purgati ed embargati sui dati delle serie temporali, cosicche l'overfitting di prima fase non puo spostare θ0\theta_0.
  • Pre-specifica, cosicche l'intervallo che riporti e l'intervallo che hai effettivamente guadagnato.

Lo stimatore e la parte facile. Le parti difficili rimangono invariate: decidere quali confonderi contano, argomentare che le assunzioni di identificazione reggono, e resistere all'impulso di eseguire la specifica un'altra volta.


Riferimenti

La genealogia di DML e breve e vale una riga: e il modello parzialmente lineare di Robinson (1988) con ML che sostituisce gli stimatori kernel, raggiungendo il bound di efficienza semiparametrico, con una condizione di ortogonalita che risale al test C(α\alpha) di Neyman e un cugino prossimo nella letteratura del learning mirato (TMLE). Il contributo di Chernozhukov et al. era mostrare che questo poteva essere reso operativo con learner ML arbitrari mantenendo l'inferenza N\sqrt{N}-coerente, asintoticamente normale.

  1. Chernozhukov, V., Chetverikov, D., Demirer, M., Duflo, E., Hansen, C., Newey, W., & Robins, J. (2018). Double/Debiased Machine Learning for Treatment and Structural Parameters. The Econometrics Journal, 21(1), C1-C68.
  2. Robinson, P. M. (1988). Root-N-Consistent Semiparametric Regression. Econometrica, 56(4), 931-954.
  3. Bach, P., Chernozhukov, V., Kurz, M. S., & Spindler, M. (2022). DoubleML — An Object-Oriented Implementation of Double Machine Learning in Python. Journal of Machine Learning Research, 23(53), 1-6.
  4. Facure, M. (2022). Causal Inference for the Brave and True. Chapter 22: Debiased/Orthogonal Machine Learning.
  5. Cahan, E., Bai, J., & Ng, S. (2024). Causal Factor Investing. Quantitative Finance.
Disclaimer: le informazioni fornite in questo articolo hanno solo scopo didattico e informativo e non costituiscono consulenza finanziaria, di investimento o di trading. Il trading di criptovalute comporta un rischio significativo di perdita.

Autori

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

Resta un Passo Avanti al Mercato

Iscriviti alla nostra newsletter per approfondimenti esclusivi sul trading con IA, analisi di mercato e aggiornamenti sulla piattaforma.

Rispettiamo la tua privacy. Annulla l'iscrizione in qualsiasi momento.