← Retour aux articles
August 18, 2026
5 min de lecture

PCMCI: Causal Discovery in Multivariate Crypto Time Series

PCMCI: Causal Discovery in Multivariate Crypto Time Series
#causal-inference
#PCMCI
#causal-discovery
#time-series
#crypto

PCMCI, développé par Jakob Runge (2018, 2020), est un algorithme de découverte causale pour les séries chronologiques multivariées. Il combine l'algorithme PC pour l'apprentissage de modèles graphiques avec un test d'indépendance conditionnelle momentanée (MCI) dont l'ensemble de conditionnement est construit pour neutraliser trois éléments à la fois : les pilotes communs, les chemins indirects et l'autocorrélation de la variable source. Ce dernier élément mérite d’être lu attentivement – ​​c’est la raison pour laquelle PCMCI n’hérite pas du taux de faux positifs qui fait échouer les tests naïfs d’avance et de décalage sur les séries à forte impulsion.

Cet article décortique la construction en deux étapes à partir des premiers principes, la met en œuvre avec la bibliothèque tigramite et présente l'étude des données réelles dont la méthode a besoin avant que l'une d'entre elles ne devienne une entrée commerciale.

Ce que cela ajoute à ce qui est déjà là

Cointégration de corrélation et causalité en tant que structures relationnelles distinctes

Le blog a déjà fait le travail de corrélation. Le co-mouvement cryptographique est en grande partie un artefact de facteur commun — corrélation de signal entre les paires montre que PC1 absorbe à lui seul 65 % de la variance sur un livre de dix paires. Une corrélation par paire élevée n'est pas une relation négociable, c'est pourquoi arbitrage statistique et trading de paires recherche plutôt la cointégration. Et la dépendance elle-même n'est même pas stable : Corrélation dynamique DCC-GARCH énumère pourquoi une corrélation d'échantillon statique suppose une stationnarité de dépendance, une volatilité marginale constante et une symétrie dans la direction, dont aucune n'est valable.

Aucun de ceux-ci ne produit un graphique dirigé. Ils vous disent que BTC, ETH et SOL évoluent ensemble et qu’un facteur commun explique l’essentiel ; ils ne vous disent pas si BTC pilote SOL directement ou si l’association passe entièrement par l’ETH. La causalité de Granger est la direction habituelle, mais la Granger standard est bivariée : elle ne peut pas séparer un moteur commun inobservé d'une véritable causalité.

Il existe un troisième mode de défaillance qui compte ici plus qu’il n’y paraît. Chaque série de retours cryptographiques comporte une autocorrélation positive, et l'autocorrélation gonfle les statistiques de test de tout test de dépendance exécuté entre deux de ces séries : deux processus autocorrélés indépendants sembleront significativement liés sur des échantillons finis. Le travail de corrélation traite cela comme une correction de la taille de l'échantillon (la discussion effective_N dans l'article sur la corrélation des signaux). Pour la découverte causale, il ne s’agit pas d’une correction, c’est le problème de conception central – et c’est exactement ce que l’ensemble de conditionnement de l’étape 2 est conçu pour résoudre.

L'algorithme PCMCI

Découverte causale en deux étapes distillant un réseau dirigé

PCMCI fonctionne en deux étapes. La première étape identifie un ensemble candidat de parents causals pour chaque variable. La deuxième étape teste chaque lien candidat avec un test d’indépendance conditionnelle soigneusement construit.

Étape 1 : Sélection de conditions stables pour PC (PC1)

Le but de l’étape 1 est de trouver, pour chaque variable XtjX_t^j, un surensemble B^(Xtj)\widehat{\mathcal{B}}(X_t^j) de ses véritables parents causals. Cet ensemble sera ensuite utilisé comme ensemble de conditionnement à l’étape 2.

L'algorithme commence avec l'ensemble complet de toutes les variables retardées comme parents potentiels :

B^0(Xtj)={Xtτi:i=1,,N,τ=1,,τmax}\widehat{\mathcal{B}}^0(X_t^j) = \{ X_{t-\tau}^i : i = 1, \ldots, N, \quad \tau = 1, \ldots, \tau_{\max} \}

Il supprime ensuite de manière itérative les variables conditionnellement indépendantes de XtjX_t^j. À l'itération pp, l'algorithme teste chaque parent candidat XtτiX_{t-\tau}^i pour l'indépendance avec XtjX_t^j, conditionnant sur le pp les parents restants les plus forts (à l'exclusion XtτiX_{t-\tau}^i lui-même) :

Xtτi ⁣ ⁣ ⁣XtjSremove Xtτi from B^(Xtj)X_{t-\tau}^i \perp\!\!\!\perp X_t^j \mid \mathbf{S} \quad \Rightarrow \quad \text{remove } X_{t-\tau}^i \text{ from } \widehat{\mathcal{B}}(X_t^j)

S\mathbf{S} est l'ensemble de pp variables dans B^(Xtj){Xtτi}\widehat{\mathcal{B}}(X_t^j) \setminus \{X_{t-\tau}^i\} avec l'association la plus forte avec XtjX_t^j.

L'aspect "stable" signifie que les décisions de suppression en une seule itération pp sont basés sur les ensembles parents de l'itération précédente, évitant ainsi la dépendance à l'ordre dans les résultats. Ceci est essentiel pour la reproductibilité.

Le niveau de signification αPC\alpha_{\text{PC}} à ce stade est délibérément réglé libéralement (souvent 0,2 ou plus, ou déterminé automatiquement via le pc_alpha=None option en tigramite). Le but n’est pas ici de contrôler les faux positifs, mais de conserver tous les vrais parents tout en éliminant autant de variables non pertinentes que possible. Quelques faux positifs dans B^\widehat{\mathcal{B}} sont acceptables ; les faux négatifs ne le sont pas.

Étape 2 : Test d'indépendance conditionnelle momentanée (MCI)

Une fois que nous avons les ensembles parents estimés B^(Xtj)\widehat{\mathcal{B}}(X_t^j) pour toutes les variables, l'étape 2 teste chaque lien de causalité potentiel XtτiXtjX_{t-\tau}^i \to X_t^j en utilisant la statistique MCI :

Xtτi ⁣ ⁣ ⁣XtjB^(Xtj){Xtτi},B^(Xtτi)X_{t-\tau}^i \perp\!\!\!\perp X_t^j \mid \widehat{\mathcal{B}}(X_t^j) \setminus \{X_{t-\tau}^i\}, \quad \widehat{\mathcal{B}}(X_{t-\tau}^i)

L'innovation clé est le kit de conditionnement. Nous conditionnons :

  1. Parents de la cible B^(Xtj){Xtτi}\widehat{\mathcal{B}}(X_t^j) \setminus \{X_{t-\tau}^i\} : Cela supprime l'effet des facteurs communs et autres chemins indirects dans XtjX_t^j.
  2. Parents de la source B^(Xtτi)\widehat{\mathcal{B}}(X_{t-\tau}^i) : Cela supprime l'autocorrélation de la variable source, empêchant ainsi les statistiques de test gonflées.

En conditionnant simultanément les deux ensembles, MCI isole efficacement l'effet causal direct et momentané de XtτiX_{t-\tau}^i sur XtjX_t^j au décalage spécifique τ\tau, net de tous les facteurs de confusion, médiateurs et effets d'autocorrélation.

La statistique de test peut être n’importe quel test d’indépendance conditionnelle valide. Pour les relations linéaires, la corrélation partielle est le choix standard. Pour les dépendances non linéaires, informations mutuelles conditionnelles (CMI) estimées via kk-les méthodes du plus proche voisin ou le test GPDC (Gaussian Process Distance Correlation) peuvent être utilisés.

Corrélation partielle comme test par défaut

Pour la plupart des applications financières, le test de corrélation partielle (ParCorr en tigramite) est le cheval de bataille. Variables données XX, YY, et un ensemble de conditionnement Z\mathbf{Z}, la corrélation partielle est :

ρXYZ=corr(rX,rY)\rho_{XY \cdot \mathbf{Z}} = \text{corr}(r_X, r_Y)

rXr_X et rYr_Y sont les résidus de la régression XX et YY sur Z\mathbf{Z}, respectivement :

rX=XX^(Z),rY=YY^(Z)r_X = X - \hat{X}(\mathbf{Z}), \quad r_Y = Y - \hat{Y}(\mathbf{Z})

En d’autres termes, la corrélation partielle mesure l’association linéaire entre XX et YY après avoir supprimé l'influence linéaire des variables de conditionnement Z\mathbf{Z}. Sous l'hypothèse nulle d'indépendance conditionnelle avec des données gaussiennes, la statistique de test suit une distribution connue, permettant une distribution exacte pp-calcul de la valeur.

Les valeurs de corrélation partielles se situent dans [1,1][-1, 1] et fournir un classement naturel des forces du lien de causalité. Une corrélation partielle de 0,3 entre BTC au décalage 1 et ETH au décalage 0, conditionnelle aux deux ensembles parents, signifie : « Après avoir supprimé les effets de tous les facteurs de confusion identifiés et l'autocorrélation, un choc d'un écart type sur les rendements BTC prédit un mouvement d'écart type de 0,3 dans les rendements ETH une période plus tard.

Des résultats de test à un graphique causal (DAG)

La sortie de PCMCI est une paire de matrices :

  • val_matrix : Forme (N,N,τmax+1)(N, N, \tau_{\max}+1), contenant la statistique du test MCI (par exemple, corrélation partielle) pour chaque lien dirigé XtτiXtjX_{t-\tau}^i \to X_t^j.
  • p_matrix : Même forme, contenant le correspondant pp-valeurs.

Pour construire un graphe causal, nous seuillons le pp-matrice à un niveau de signification corrigé :

Link XtτiXtj exists if pijτ<αcorrected\text{Link } X_{t-\tau}^i \to X_t^j \text{ exists if } p_{ij\tau} < \alpha_{\text{corrected}}

Quelle correction n’est pas un détail auquel vous pouvez faire signe. Tests PCMCI N2×τmaxN^2 \times \tau_{\max} liens qui sont dépendants par construction — chaque lien vers XtjX_t^j partagent un ensemble de conditionnement les uns avec les autres, et les séries sources sont mutuellement corrélées pour commencer. C'est précisément le régime dans lequel le simple Benjamini-Hochberg échoue et la pénalité harmonique de Benjamini-Yekutieli. c(M)=j=1M1/jc(M) = \sum_{j=1}^{M} 1/j est celui qui survit à une dépendance arbitraire entre les tests ; Sharpe dégonflé et tests multiples mesure les taux nuls de fausses découvertes qui rendent cela concret. Signalez le nombre de liens testés et le seuil corrigé à côté de tout graphique que vous publiez.

La structure résultante est un graphe de séries chronologiques (TSG), qui est un graphe orienté où :

  • Les nœuds représentent des variables à des délais spécifiques.
  • Les bords dirigés représentent les liens de causalité avec les décalages associés.
  • Les auto-boucles représentent des effets autorégressifs.

Ce TSG peut être réduit en un graphique récapitulatif qui montre uniquement l'existence et la direction des liens de causalité entre les variables (regroupés sur plusieurs décalages), ce qui est souvent plus pratique pour l'interprétation.

Implémentation avec Tigramite

Pipeline de séries chronologiques multivariées produisant un graphique causal clairsemé

Tigramite est l'implémentation de référence de PCMCI, développée et maintenue par le groupe de Jakob Runge au Centre aérospatial allemand (DLR). Il fournit une API propre pour la gestion des données, plusieurs tests d'indépendance conditionnelle, plusieurs variantes PCMCI et une visualisation intégrée.

###Installation

pip install tigramite

Contrôle d'intégrité de la récupération (pas de résultat)

Avant d’exploiter les données du marché, il convient de confirmer que le pipeline trouve une structure que vous avez implantée. Il s'agit d'un test unitaire pour l'implémentation et rien de plus : la vérité terrain ci-dessous est écrite à la main dans la boucle de génération de données, donc sa récupération prouve que le code fonctionne et ne dit rien sur la cryptographie. Lisez-le de cette façon.

import numpy as np
import tigramite
from tigramite import data_processing as pp
from tigramite.pcmci import PCMCI
from tigramite.independence_tests.parcorr import ParCorr
from tigramite import plotting as tp


np.random.seed(42)
T, N = 2000, 5
var_names = ["BTC", "ETH", "SOL", "BNB", "AVAX"]
data = np.zeros((T, N))
noise = np.random.randn(T, N) * 0.5

for t in range(2, T):
    data[t, 0] = 0.5 * data[t-1, 0] + noise[t, 0]
    data[t, 1] = 0.5 * data[t-1, 1] + 0.4 * data[t-1, 0] + noise[t, 1]
    data[t, 2] = 0.5 * data[t-1, 2] + 0.3 * data[t-1, 1] + noise[t, 2]
    data[t, 3] = 0.5 * data[t-1, 3] + 0.25 * data[t-1, 0] + noise[t, 3]
    data[t, 4] = 0.5 * data[t-1, 4] + 0.2 * data[t-2, 3] + noise[t, 4]

dataframe = pp.DataFrame(
    data,
    datatime=np.arange(T),
    var_names=var_names,
)

parcorr = ParCorr(significance="analytic")

pcmci = PCMCI(
    dataframe=dataframe,
    cond_ind_test=parcorr,
    verbosity=1,
)

results = pcmci.run_pcmci(
    tau_max=4,        # test lags up to 4 hours
    tau_min=1,        # only lagged (not contemporaneous) links
    pc_alpha=None,    # auto-select alpha for condition selection
    alpha_level=0.01, # significance threshold for final MCI test
)

print("\n--- Significant causal links ---")
pcmci.print_significant_links(
    p_matrix=results["p_matrix"],
    val_matrix=results["val_matrix"],
    alpha_level=0.01,
)

tp.plot_graph(
    val_matrix=results["val_matrix"],
    p_matrix=results["p_matrix"],
    var_names=var_names,
    link_colorbar_label="MCI (partial corr.)",
    node_colorbar_label="Auto-MCI",
    alpha_level=0.01,
    figsize=(10, 6),
)

tp.plot_time_series_graph(
    val_matrix=results["val_matrix"],
    p_matrix=results["p_matrix"],
    var_names=var_names,
    link_colorbar_label="MCI (partial corr.)",
    alpha_level=0.01,
    figsize=(14, 6),
)

Lecture de la sortie

Sur le VAR planté, print_significant_links renvoie :

Variable BTC has 0 causal parent(s):

Variable ETH has 1 causal parent(s):
    BTC (lag -1): val = 0.38, p = 0.000

Variable SOL has 1 causal parent(s):
    ETH (lag -1): val = 0.28, p = 0.000

Variable BNB has 1 causal parent(s):
    BTC (lag -1): val = 0.24, p = 0.000

Variable AVAX has 1 causal parent(s):
    BNB (lag -2): val = 0.19, p = 0.000

La structure plantée revient, y compris le résultat négatif qui compte : il n’y a pas de bord direct BTC -> SOL, même si BTC et SOL sont fortement corrélés dans cet échantillon. Le MCI attribue entièrement l'association au médiateur de l'ETH. C’est le comportement que le double ensemble de conditionnement est censé produire, et le confirmer est tout l’intérêt de ce bloc. Il s’agit d’un test unitaire réussi, pas d’une découverte sur la cryptographie.

Travailler avec des données de marché réelles

PCMCI a besoin d'intrants faiblement stationnaires, alors nourrissez-le de rendements logarithmiques standardisés plutôt que de prix - la machinerie ADF et les raisons pour lesquelles les prix bruts échouent sont traités dans [l'arbitrage statistique et le commerce par paires] (/en/blog/post/statistical-arbitrage-pairs-trading-crypto). Une fois que vous disposez d’une matrice de rendement standardisée, la partie spécifique à la tigramite est constituée de deux lignes :

data = log_returns.values          # (T, N) standardized log-returns
var_names = list(log_returns.columns)

dataframe = pp.DataFrame(data, var_names=var_names)

Deux détails de tigramite ne sont pas reportés du pipeline de retours habituel :

  1. Données manquantes : Tigramite prend en charge les tableaux masqués pour gérer les observations manquantes. Utiliser dataframe.mask pour signaler les lacunes - ne les remplissez pas, car une observation fabriquée se propage dans chaque ensemble de conditionnement qui la contient.
  2. Alignement des fréquences : Toutes les séries doivent se situer sur la même grille horaire. Pour la cryptographie, cela est généralement simple, puisque les échanges fournissent des données OHLCV synchronisées.

L'étude dont cette méthode a besoin

Tout ce qui précède est de la machinerie. L'article ne peut pas être publié sur ce blog tant que la machine n'a pas pointé sur des données réelles et n'a rapporté ce qu'elle a trouvé, y compris si la réponse est « rien de stable ». La course à faire :

  • Setup : PCMCI+ sur rendements horaires pour un panier réel sur une plage de dates indiquée, tau_max corrigé par le raisonnement de domaine, alpha_level = 0.01 avec correction Benjamini-Yekutieli dans tous N2×τmaxN^2 \times \tau_{\max} links. Signalez le nombre de liens testés et le seuil corrigé, selon le Sharpe dégonflé standard.
  • Résultat à signaler : quelles arêtes survivent à la correction, leurs ampleurs de corrélation partielle et combien survivent hors échantillon.
  • Au moins une mesure de stabilité, sans laquelle la pièce est un fichier README tigramite avec des tickers cryptographiques : quelle fraction de bords persistent fenêtre après fenêtre à travers les fenêtres déroulantes ; ou la sensibilité du graphique récupéré à tau_max et pc_alpha; ou désaccord ParCorr vs CMIknn sur les mêmes données.

Un graphique instable est un résultat publiable et non un échec. "PCMCI sur cinq majors : le graphique causal ne survit pas aux fenêtres glissantes" correspond à la ligne dans laquelle ce blog s'exécute déjà un résultat négatif honnête, et c'est un article plus utile qu'un tutoriel qui fonctionne.

Choisir les bons paramètres

Contrôles abstraits calibrés entourant un réseau causal

Décalage maximum τmax\tau_{\max}

Ce paramètre délimite l’horizon temporel de la découverte causale. Un réglage trop bas risque de manquer les effets à propagation lente ; trop élevé augmente le coût de calcul et la charge de tests multiples.

Pour les données cryptographiques horaires, τmax=6\tau_{\max} = 6 à 2424 est une fourchette raisonnable. Pour les données quotidiennes, τmax=5\tau_{\max} = 5 à 1010 capture la plupart des relations avance-retard. La connaissance du domaine est importante ici : si vous savez que les effets du taux de financement mettent 8 heures à se propager, définissez τmax8\tau_{\max} \geq 8.

Importance de la sélection des conditions αPC\alpha_{\text{PC}}

Paramètre pc_alpha=None permet à Tigramite de sélectionner automatiquement ce paramètre à l'aide du critère d'information Akaike, qui est la valeur par défaut recommandée. Si vous souhaitez le définir manuellement, les valeurs comprises entre 0,1 et 0,4 fonctionnent bien. Des valeurs plus faibles rendent l'étape 1 plus agressive (moins de parents retenus), ce qui réduit le coût de calcul mais risque de supprimer les vrais parents.

Niveau de signification final α\alpha

Il s’agit du seuil standard de test d’hypothèse. Pour une analyse exploratoire, α=0.05\alpha = 0.05 ça va. Pour tout ce qui alimente une décision commerciale, utilisez α=0.01\alpha = 0.01 ou plus serré, et appliquez-le après la correction tenant compte de la dépendance décrite précédemment — le niveau nominal n'est pas le niveau auquel vous testez réellement.

PCMCI+ : Ajout de liens contemporains

Liens causals décalés et contemporains à travers les couches temporelles

Le PCMCI standard ne découvre que les liens de causalité retardés (τ1\tau \geq 1). Mais sur les marchés de la cryptographie, où les informations se propagent entre les actifs en quelques secondes, la fréquence d'échantillonnage horaire signifie que de nombreux effets causals semblent contemporains (τ=0\tau = 0).

PCMCI+ (Runge, 2020) étend PCMCI pour découvrir des liens de causalité à la fois décalés et contemporains. Les liens contemporains ne sont pas dirigés par défaut (puisque l'ordre temporel ne peut pas distinguer la cause de l'effet dans le même pas de temps), mais certains peuvent être orientés en utilisant les règles d'orientation de l'algorithme PC standard (détection de collisionneur, contraintes d'acyclicité).

results_plus = pcmci.run_pcmciplus(
    tau_max=4,
    tau_min=0,         # include contemporaneous links
    pc_alpha=None,
)

Pour les applications de cryptographie à fréquence horaire ou inférieure, PCMCI+ est souvent plus approprié que PCMCI standard, car de nombreux effets multi-actifs se produisent plus rapidement que l'intervalle d'échantillonnage.

Extensions non linéaires

Relations causales non linéaires formant des variétés d'interaction courbes

Les séries temporelles financières présentent souvent des dépendances non linéaires (par exemple, regroupement de volatilité, effets avance-retard dépendant du régime). Tigramite propose plusieurs tests d'indépendance conditionnelle non linéaire :

Corrélation de distance de processus gaussien (GPDC)

from tigramite.independence_tests.gpdc import GPDC

gpdc = GPDC(significance="analytic", gp_params=None)
pcmci = PCMCI(dataframe=dataframe, cond_ind_test=gpdc)

GPDC utilise la régression du processus gaussien pour supprimer l'influence de l'ensemble de conditionnement, puis applique une corrélation de distance sur les résidus. C'est plus puissant que ParCorr pour détecter les effets non linéaires mais nettement plus lent.

Informations mutuelles conditionnelles (CMIknn)

from tigramite.independence_tests.cmiknn import CMIknn

cmiknn = CMIknn(significance="shuffle_test", knn=0.1, shuffle_neighbors=5)
pcmci = PCMCI(dataframe=dataframe, cond_ind_test=cmiknn)

CMIknn estime les informations mutuelles conditionnelles en utilisant kk-méthodes du plus proche voisin. Il est entièrement non paramétrique et peut détecter des dépendances fonctionnelles arbitraires. Le compromis réside dans le coût de calcul et la nécessité de disposer de davantage de données pour obtenir une puissance statistique.

Pour la plupart des applications de trading de cryptomonnaies, commencez par ParCorr. Passez aux tests non linéaires uniquement lorsque vous disposez de preuves spécifiques de mécanismes causals non linéaires et de données suffisantes (généralement T>5000T > 5000).

Où un graphique causal pourrait s'insérer

Graphique causal intégré dans un pipeline de recherche crypto modulaire

Une chose qu'un graphique causal vous donne qu'une matrice de corrélation ne peut pas : hors degré. Exécutez PCMCI sur 20 à 50 actifs et les nœuds avec de nombreux bords sortants sont des leaders de l'information – leurs mouvements comportent un contenu prédictif pour le reste du livre, et c'est une affirmation directionnelle qu'une matrice de corrélation symétrique est structurellement incapable de faire. Une décomposition factorielle vous indique que BTC domine la variance ; un classement hors degré vous indique si BTC domine parce qu'il mène ou parce que tout, y compris BTC, se charge sur le même choc macro.

En supposant qu’un graphique stable soit un jour récupéré, les endroits où il serait attaché aux travaux déjà présents sur ce blog sont suffisamment clairs. Les changements de fenêtre glissante dans la topologie du graphe sont un signal de rupture structurelle, qui fait l'objet de détection de régime avec des HMM — la question ouverte est de savoir si un graphe causal détecte la transition plus tôt qu'un modèle d'état. L'application du PCMCI à un actif sur plusieurs sites permet d'améliorer le leadership en matière de prix sur tous les sites, déjà mesuré à une résolution de la milliseconde dans le routage intelligent des ordres; un graphique en barres horaires devrait battre cela, pas le reformuler. Et le lien périodique perp-spot créé par le mécanisme de financement de 8 heures, couvert dans l'arbitrage des taux de financement, est un cas de test à réponse connue : PCMCI devrait récupérer une structure causale que nous pouvons vérifier indépendamment, ce qui en fait une cible de validation plutôt qu'une découverte.

Aucun de ces éléments n’est une découverte. Ce sont des hypothèses qui attendent l’étude décrite ci-dessus.

Limites et mises en garde

Graphique causal précis partiellement obscurci par une incertitude contrôlée

PCMCI est un outil puissant, mais il présente des limites importantes que les praticiens doivent comprendre :

  1. Hypothèse de suffisance causale : PCMCI suppose que toutes les variables pertinentes sont observées. Si un facteur commun caché (par exemple, l'activité commerciale d'une baleine, des informations inédites) affecte deux actifs observés, PCMCI peut signaler à tort un lien de causalité direct entre eux. La variante LPCMCI résout partiellement ce problème en autorisant les facteurs de confusion latents, au prix de renvoyer moins d'arêtes orientées.

  2. Hypothèse de stationnarité : La structure causale est supposée constante sur la fenêtre d'analyse. Dans la pratique, la dynamique du marché des cryptomonnaies évolue rapidement. Utilisez l’analyse par fenêtre glissante pour détecter les ruptures structurelles.

  3. Linéaire ou non linéaire : avec ParCorr, seuls les effets causals linéaires sont détectés. Un mécanisme causal non linéaire (par exemple, « BTC entraîne une baisse de l'ETH uniquement lorsque le BTC chute de plus de 5 % ») serait invisible pour le test linéaire.

  4. La fréquence d'échantillonnage compte : les effets causals qui se produisent plus rapidement que la fréquence d'échantillonnage apparaissent comme contemporains (τ=0\tau = 0) liens dans la norme PCMCI, et leur direction peut être ambiguë. Utilisez PCMCI+ et envisagez des données à plus haute fréquence.

  5. Tests multiples : N2×τmaxN^2 \times \tau_{\max} tests dépendants, corrigés comme décrit ci-dessus — voir Sharpe dégonflé et tests multiples pourquoi la structure de dépendance exclut le choix évident.

  6. Exigences relatives à la taille de l'échantillon : Une découverte causale fiable nécessite des données suffisantes. À titre indicatif, visez T>500T > 500 pour ParCorr avec N<10N < 10 variables, et T>2000T > 2000 pour les tests non linéaires ou les ensembles de variables plus grands.

PCMCI par rapport à d'autres méthodes

Méthodes distinctes de graphiques causals comparées côte à côte

Méthode Gère l'autocorrélation Gère les pilotes courants Liens contemporains Non linéaire Confondeurs latents
causalité Granger En partie Non (bivarié) Non Avec rallonges Non
Entropie de transfert En partie Non (bivarié) Non Oui Non
PCMCI Oui (MCI) Oui Non Avec CMIknn/GPDC Non
PCMCI+ Oui Oui Oui Avec CMIknn/GPDC Non
LPCMCI Oui Oui Oui Avec CMIknn/GPDC Oui
VAR-LiNGAM Non Oui Oui Non Non

Le principal avantage du PCMCI par rapport à la causalité de Granger et à l'entropie de transfert réside dans le test MCI, qui prend correctement en compte l'autocorrélation et les facteurs communs dans un contexte multivarié. C’est précisément le scénario rencontré sur les marchés de la cryptographie, où des dizaines d’actifs corrélés et autocorrélés interagissent simultanément.

Conclusion

Chemins causals directs filtrés se résolvant en un aperçu mesuré

La construction en deux étapes est l'apport à retenir : une sélection de conditions éparses pour délimiter l'ensemble parent, puis un test MCI dont l'ensemble de conditionnement inclut les parents de la source ainsi que la cible. Cette seconde moitié est ce qui sépare PCMCI de Granger et de l’entropie de transfert, et c’est ce qui rend la méthode viable sur des séries aussi autocorrélées que les rendements cryptographiques.

Ce que la méthode n’apporte pas, ce sont des preuves. Un graphique récupéré est une hypothèse sur le flux d'informations, pas un signal, et sur ce blog, il ne compte pour rien tant qu'il n'a pas été exécuté sur des données réelles avec un panier indiqué, une plage de dates indiquée, une correction tenant compte de la dépendance et au moins une mesure indiquant si le graphique reste immobile lorsque la fenêtre se déplace. Jusqu'à ce que cette exécution existe, traitez tout ici comme un outil.

Si le graphique s’avère instable, c’est l’article. Ce ne serait pas le premier résultat négatif qui vaudrait plus qu’un tutoriel fonctionnel.


Références

  • Runge, J., Nowack, P., Kretschmer, M., Flaxman, S. et Sejdinovic, D. (2019). Détecter et quantifier les associations causales dans de grands ensembles de données de séries chronologiques non linéaires. Progrès scientifiques, 5(11), eaau4996.
  • Runge, J. (2020). Découverte de relations causales contemporaines et décalées dans des ensembles de données de séries chronologiques non linéaires autocorrélées. Actes de la 36e Conférence sur l'incertitude dans l'intelligence artificielle (UAI), PMLR 124 : 1388-1397. -Documentation Tigramite : https://jakobrunge.github.io/tigramite/
  • Dépôt Tigramite GitHub : https://github.com/jakobrunge/tigramite
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

Gardez une longueur d'avance sur le marché

Abonnez-vous à notre newsletter pour des insights exclusifs sur le trading IA, des analyses de marché et des mises à jour de la plateforme.

Nous respectons votre vie privée. Désabonnement possible à tout moment.