← 기사 목록으로
August 18, 2026
5분 소요

PCMCI: Causal Discovery in Multivariate Crypto Time Series

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

Jakob Runge가 2018년과 2020년에 개발한 PCMCI는 다변량 시계열을 위한 인과 발견 알고리즘이다. 그래프 모델 학습을 위한 PC 알고리즘과 Momentary Conditional Independence(MCI)검정을 결합하며, 조건부 집합은 공통 원인, 간접 경로, 원인 변수의 자기상관이라는 세 가지 요소를 동시에 무력화하도록 구성된다. 마지막 요소를 특히 자세히 볼 가치가 있다. 모멘텀 성향이 강한 시계열에서 순진한 리드-래그 검정을 무너뜨리는 거짓 양성률을 PCMCI가 물려받지 않는 이유가 바로 여기에 있다.

이 글은 두 단계 구성의 원리를 처음부터 해부하고, tigramite 라이브러리로 구현하며, 이 방법을 거래 입력으로 사용하기 전에 필요한 실제 데이터 연구를 제시한다.

기존 내용에 더하는 것

상관관계·공적분·인과관계라는 서로 다른 관계 구조

이 블로그는 이미 상관관계를 다뤘다. 암호화폐의 동조 움직임은 대체로 공통 요인의 산물이다. 페어 간 신호 상관관계는 10개 페어로 구성된 북에서 PC1 하나가 분산의 65%를 흡수한다는 것을 보여준다. 페어별 상관관계가 높다고 거래 가능한 관계인 것은 아니므로, 통계적 차익거래와 암호화폐 페어 트레이딩은 공적분을 사용한다. 의존성 자체도 안정적이지 않다. DCC-GARCH 동적 상관관계는 정적 표본 상관관계가 의존성의 정상성, 일정한 주변 변동성, 방향에 따른 대칭성을 가정한다는 점을 열거하는데, 어느 것도 성립하지 않는다.

하지만 이 방법들 중 어느 것도 방향성 그래프를 만들지는 않는다. BTC, ETH, SOL이 함께 움직이고 공통 요인이 대부분을 설명한다는 것은 알려주지만, BTC가 SOL을 직접 움직이는지 아니면 그 연관성이 전적으로 ETH를 통해 매개되는지는 알려주지 않는다. 방향성을 찾을 때 보통 사용하는 것이 Granger 인과관계지만, 표준 Granger는 이변량이다. 관측되지 않은 공통 원인과 실제 인과관계를 분리할 수 없다.

여기서는 겉보기보다 중요한 세 번째 실패 모드가 있다. 각 암호화폐 수익률 시계열에는 양의 자기상관이 있고, 자기상관이 있는 두 시계열 사이에서 수행하는 모든 의존성 검정의 통계량을 부풀린다. 서로 독립인 자기상관 과정 두 개도 유한 표본에서는 유의미하게 관련된 것처럼 보인다. 상관관계 분석에서는 이를 표본 크기 보정으로 다룬다(신호 상관관계 글의 effective_N 논의)。하지만 인과 발견에서는 보정이 아니라 핵심 설계 문제이며, Stage 2의 조건부 집합이 바로 이를 해결하도록 만들어졌다.

PCMCI 알고리즘

두 단계 인과 발견으로 방향성 네트워크를 추출하기

PCMCI는 두 단계로 작동한다. 첫 번째 단계는 각 변수의 인과적 부모 후보 집합을 찾는다. 두 번째 단계는 신중하게 구성한 조건부 독립성 검정으로 각 후보 연결을 검정한다.

1단계: PC-Stable 조건 선택(PC1)

1단계의 목표는 각 변수 XtjX_t^j에 대해 실제 인과 부모를 포함하는 상위 집합 B^(Xtj)\widehat{\mathcal{B}}(X_t^j)를 찾는 것이다. 이후 이 집합을 2단계의 조건부 집합으로 사용한다.

알고리즘은 모든 시차 변수를 잠재적 부모로 삼는 전체 집합에서 시작한다.

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

그다음 XtjX_t^j와 조건부 독립인 변수를 반복적으로 제거한다. 반복 pp에서 알고리즘은 각 후보 부모 XtτiX_{t-\tau}^i에 대해, 자기 자신을 제외하고 남아 있는 부모 중 가장 강한 pp개를 조건으로 XtjX_t^j와 독립인지 검정한다.

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}XtτiX_{t-\tau}^i를 제외한 B^(Xtj)\widehat{\mathcal{B}}(X_t^j)XtjX_t^j와의 연관성이 가장 강한 pp개 변수의 집합이다.

"stable"이라는 말은 한 번의 반복 pp 안에서 제거 여부를 결정할 때 이전 반복의 부모 집합을 사용한다는 뜻이다. 따라서 결과가 검사 순서에 의존하지 않으며, 재현성에 매우 중요하다.

이 단계의 유의수준 αPC\alpha_{\text{PC}}는 의도적으로 관대하게 설정한다(보통 0.2 이상, 또는 tigramite의 pc_alpha=None 옵션으로 자동 결정)。여기서 목표는 거짓 양성을 통제하는 것이 아니라, 관련 없는 변수를 최대한 가지치기하면서 실제 부모를 모두 남기는 것이다. B^\widehat{\mathcal{B}}에 거짓 양성이 몇 개 남는 것은 괜찮지만 거짓 음성은 허용되지 않는다.

2단계: Momentary Conditional Independence(MCI)검정

모든 변수의 추정 부모 집합 B^(Xtj)\widehat{\mathcal{B}}(X_t^j)를 얻으면, 2단계는 다음 MCI 통계량으로 각 잠재적 인과 연결 XtτiXtjX_{t-\tau}^i \to X_t^j를 검정한다.

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)

핵심은 조건부 집합이다. 다음 두 가지를 조건으로 둔다.

  1. 타깃의 부모 B^(Xtj){Xtτi}\widehat{\mathcal{B}}(X_t^j) \setminus \{X_{t-\tau}^i\}: XtjX_t^j로 들어오는 공통 원인과 다른 간접 경로의 효과를 제거한다.
  2. 원인의 부모 B^(Xtτi)\widehat{\mathcal{B}}(X_{t-\tau}^i): 원인 변수의 자기상관을 제거하여 부풀려진 검정 통계량을 막는다.

두 집합을 동시에 조건으로 둠으로써 MCI는 모든 교란 요인, 매개 변수, 자기상관 효과를 제외하고 특정 시차 τ\tau에서 XtτiX_{t-\tau}^iXtjX_t^j에 미치는 직접적이고 순간적인 인과 효과를 사실상 분리한다.

검정 통계량에는 유효한 조건부 독립성 검정이라면 무엇이든 사용할 수 있다. 선형 관계에서는 편상관이 표준 선택이다. 비선형 의존성에는 kk-최근접 이웃 방법으로 추정한 조건부 상호정보량(CMI)이나 GPDC(Gaussian Process Distance Correlation)검정을 사용할 수 있다.

기본 검정으로서의 편상관

대부분의 금융 애플리케이션에서 편상관 검정(tigramite의 ParCorr)은 실무의 주력 도구다. 변수 XX, YY와 조건부 집합 Z\mathbf{Z}가 주어졌을 때 편상관은 다음과 같다.

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

여기서 rXr_XrYr_Y는 각각 XXYYZ\mathbf{Z}에 회귀했을 때의 잔차다.

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

즉 편상관은 조건부 변수 Z\mathbf{Z}의 선형 영향을 제거한 뒤 XXYY 사이에 남는 선형 연관성을 측정한다. 가우시안 데이터에서 조건부 독립이라는 귀무가설하에 검정 통계량은 알려진 분포를 따르므로 정확한 pp값을 계산할 수 있다.

편상관 값은 [1,1][-1, 1]에 있으며 인과 연결 강도를 자연스럽게 순위화한다. 두 부모 집합을 모두 조건으로 했을 때 시차 1의 BTC와 시차 0의 ETH 사이 편상관이 0.3이라는 것은 다음을 의미한다. "확인된 모든 교란 요인과 자기상관의 효과를 제거하면, BTC 수익률의 1표준편차 충격이 한 기간 뒤 ETH 수익률의 0.3표준편차 움직임을 예측한다."

검정 결과에서 인과 그래프(DAG)로

PCMCI의 출력은 두 개의 행렬이다.

  • val_matrix: 형태는 (N,N,τmax+1)(N, N, \tau_{\max}+1)이며, 모든 방향성 연결 XtτiXtjX_{t-\tau}^i \to X_t^j에 대한 MCI 검정 통계량(예: 편상관)을 담는다.
  • p_matrix: 같은 형태이며 해당 pp값을 담는다.

인과 그래프를 만들려면 보정된 유의수준에서 pp 행렬에 임계값을 적용한다.

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

어떤 보정을 사용할지는 대충 넘길 세부사항이 아니다. PCMCI는 N2×τmaxN^2 \times \tau_{\max}개의 연결을 검정하며, 이들은 구조적으로 종속되어 있다. XtjX_t^j로 들어가는 모든 연결은 서로 조건부 집합을 공유하고, 원인 시계열은 애초에 서로 상관되어 있다. 바로 이런 상황에서 단순 Benjamini-Hochberg는 실패하고, Benjamini-Yekutieli의 조화 패널티 c(M)=j=1M1/jc(M) = \sum_{j=1}^{M} 1/j가 검정 간 임의의 의존성에서도 유효하게 남는다. 보정 Sharpe와 다중 검정은 이를 구체화하는 귀무 거짓 발견률을 측정한다. 어떤 그래프를 공개하든 검정한 연결 수와 보정된 임계값을 함께 보고하라.

그 결과는 시계열 그래프(TSG)다. 특정 시차의 변수를 노드로 하는 방향성 그래프이며:

  • 노드는 특정 시차의 변수를 나타낸다.
  • 방향성 간선은 해당 시차를 가진 인과 연결을 나타낸다.
  • 자기 고리는 자기회귀 효과를 나타낸다.

이 TSG는 시차를 합산하여 변수 사이의 인과 연결이 존재하는지와 방향만 보여주는 요약 그래프로 축약할 수 있으며, 해석에는 이쪽이 더 실용적인 경우가 많다.

Tigramite로 구현하기

희소 인과 그래프를 생성하는 다변량 시계열 파이프라인

Tigramite는 PCMCI의 참조 구현으로, German Aerospace Center(DLR)의 Jakob Runge 연구 그룹이 개발하고 유지보수한다. 데이터 처리, 여러 조건부 독립성 검정, 다양한 PCMCI 변형, 내장 시각화에 사용할 수 있는 깔끔한 API를 제공한다.

설치

pip install tigramite

복구 sanity check(결과가 아님)

시장 데이터에 실행하기 전에 직접 심어 둔 구조를 파이프라인이 찾아내는지 확인할 가치가 있다. 이는 구현을 위한 단위 테스트일 뿐이며 그 이상이 아니다. 아래의 실제 정답은 데이터 생성 루프에 손으로 작성되어 있으므로, 이를 복구하는 것은 코드가 동작한다는 것만 증명할 뿐 암호화폐에 관해서는 아무것도 말하지 않는다. 그런 의미로 읽어야 한다.

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

출력 읽기

심어 둔 VAR에 대해 print_significant_links는 다음을 반환한다.

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

심어 둔 구조가 돌아왔으며, 중요한 음의 결과도 포함된다. 이 표본에서는 BTC와 SOL이 강하게 상관되어 있는데도 직접적인 BTC → SOL 간선은 없다. MCI는 그 연관성을 전부 ETH라는 매개 변수에 돌린다. 이것이 이중 조건부 집합이 만들어야 하는 동작이며, 이를 확인하는 것이 이 블록의 목적이다. 통과하는 단위 테스트이지 암호화폐에 대한 발견이 아니다.

실제 시장 데이터 다루기

PCMCI에는 약정상 입력이 필요하므로 가격이 아니라 표준화한 로그수익률을 넣어야 한다. ADF 도구와 원시 가격이 실패하는 이유는 통계적 차익거래와 암호화폐 페어 트레이딩에서 다룬다. 표준화한 수익률 행렬을 얻었다면 tigramite에 필요한 부분은 두 줄이다.

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

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

일반적인 수익률 파이프라인에서 그대로 가져올 수 없는 tigramite의 세부사항이 두 가지 있다.

  1. 결측 데이터: Tigramite는 결측 관측값을 다루기 위한 masked array를 지원한다. dataframe.mask로 공백을 표시하라. 인위적으로 만든 관측값이 이를 포함하는 모든 조건부 집합으로 전파되므로 forward-fill해서는 안 된다.
  2. 주기 정렬: 모든 시계열은 같은 시간 격자에 있어야 한다. 암호화폐에서는 거래소가 동기화된 OHLCV 데이터를 제공하므로 대개 간단하다.

이 방법에 필요한 연구

지금까지는 모두 도구에 대한 설명이다. 실제 데이터에 도구를 적용해 안정적인 것이 아무것도 없는 경우까지 포함하여 결과를 보고하기 전에는 이 글을 블로그에 게시할 수 없다. 수행해야 할 연구는 다음과 같다.

  • 설정: 명시한 날짜 범위의 실제 자산 바스켓 시간별 수익률에 PCMCI+를 적용한다. tau_max는 도메인 지식으로 고정하고, 모든 N2×τmaxN^2 \times \tau_{\max} 연결에 대해 Benjamini-Yekutieli 보정을 적용한 alpha_level = 0.01을 사용한다. 보정 Sharpe 기준에 따라 검정한 연결 수와 보정 임계값을 보고한다.
  • 보고할 결과: 보정을 통과한 간선, 그 편상관 크기, 표본 외에서도 살아남는 간선 수.
  • 최소 하나의 안정성 측정: 이것이 없으면 글은 암호화폐 티커를 넣은 tigramite README에 불과하다. 롤링 윈도우 사이에서 유지되는 간선의 비율, tau_maxpc_alpha에 대한 복구 그래프의 민감도, 또는 동일 데이터에서 ParCorr와 CMIknn의 불일치 중 하나를 측정한다.

불안정한 그래프도 게시할 가치가 있는 결과이지 실패가 아니다. "5개 주요 자산에 PCMCI를 적용했지만 인과 그래프는 롤링 윈도우를 견디지 못했다"는 이 블로그가 이미 정직한 음의 결과에서 다루는 흐름에 맞는다. 작동하는 튜토리얼보다 더 유용한 글이 될 수도 있다.

적절한 파라미터 고르기

인과 네트워크를 둘러싼 보정된 추상 제어

최대 시차 τmax\tau_{\max}

이 파라미터는 인과 발견의 시간적 범위를 제한한다. 너무 낮게 설정하면 천천히 전파되는 효과를 놓칠 수 있고, 너무 높으면 계산 비용과 다중 검정 부담이 커진다.

시간별 암호화폐 데이터에서는 τmax=6\tau_{\max} = 6에서 2424가 합리적인 범위다. 일별 데이터에서는 τmax=5\tau_{\max} = 5에서 1010이면 대부분의 리드-래그 관계를 포착한다. 여기서는 도메인 지식이 중요하다. 펀딩비 효과가 전파되는 데 8시간이 걸린다는 것을 안다면 τmax8\tau_{\max} \geq 8로 설정하라.

조건 선택 유의수준 αPC\alpha_{\text{PC}}

pc_alpha=None으로 두면 tigramite가 Akaike Information Criterion을 사용하여 이 파라미터를 자동 선택하며, 이를 권장 기본값으로 삼을 수 있다. 수동 설정을 원한다면 0.1에서 0.4 사이가 잘 작동한다. 낮은 값은 1단계를 더 공격적으로 만들어(남겨 두는 부모가 줄어든다)계산 비용을 낮추지만 실제 부모를 제거할 위험이 있다.

최종 유의수준 α\alpha

표준 가설 검정의 임계값이다. 탐색적 분석에는 α=0.05\alpha = 0.05면 충분하다. 거래 의사결정에 들어가는 모든 것에는 α=0.01\alpha = 0.01 또는 그보다 엄격한 값을 사용하고, 앞서 설명한 의존성 인식 보정을 적용한 후 이 값을 적용하라. 명목 수준은 실제로 검정하는 수준이 아니다.

PCMCI+:동시점 연결 추가하기

시간 층을 가로지르는 시차 및 동시점 인과 연결

표준 PCMCI는 시차가 있는 인과 연결(τ1\tau \geq 1)만 발견한다. 하지만 정보가 수초 안에 자산 사이로 전파되는 암호화폐 시장에서는 시간별 샘플링 때문에 많은 인과 효과가 동시점(τ=0\tau = 0)으로 나타난다.

PCMCI+(Runge, 2020)는 시차가 있는 연결과 동시점 인과 연결을 모두 찾도록 PCMCI를 확장한다. 동시점 연결은 기본적으로 무방향이다. 같은 시간 단계 안에서는 시간 순서로 원인과 결과를 구분할 수 없기 때문이다. 다만 표준 PC 알고리즘의 방향 결정 규칙(collider 탐지, 비순환성 제약)을 사용하면 일부 방향을 정할 수 있다.

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

시간별 또는 그보다 높은 빈도의 암호화폐 애플리케이션에서는 표준 PCMCI보다 PCMCI+가 적합한 경우가 많다. 많은 자산 간 효과가 샘플링 간격보다 빠르게 발생하기 때문이다.

비선형 확장

곡선형 상호작용 다양체를 이루는 비선형 인과 관계

금융 시계열은 비선형 의존성을 자주 보인다(예: 변동성 군집, 국면에 따라 달라지는 리드-래그 효과)。Tigramite는 여러 비선형 조건부 독립성 검정을 제공한다.

Gaussian Process Distance Correlation(GPDC)

from tigramite.independence_tests.gpdc import GPDC

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

GPDC는 가우시안 프로세스 회귀로 조건부 집합의 영향을 제거한 다음 잔차에 거리 상관관계를 적용한다. 비선형 효과 탐지에서는 ParCorr보다 강력하지만 훨씬 느리다.

조건부 상호정보량(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)

CMIknnkk-최근접 이웃 방법으로 조건부 상호정보량을 추정한다. 완전 비모수적이며 임의의 함수적 의존성을 감지할 수 있다. 대신 계산 비용이 크고 통계적 검정력을 확보하려면 더 많은 데이터가 필요하다.

대부분의 암호화폐 거래 애플리케이션에서는 ParCorr부터 시작하라. 비선형 인과 메커니즘에 대한 구체적인 증거와 충분한 데이터(일반적으로 T>5000T > 5000)가 있을 때만 비선형 검정으로 전환한다.

인과 그래프를 연결할 수 있는 곳

모듈형 암호화폐 연구 파이프라인에 통합되는 인과 그래프

상관관계 행렬에는 없는 인과 그래프의 정보가 하나 있다. 바로 out-degree다. 20~50개 자산에 PCMCI를 실행했을 때 나가는 간선이 많은 노드는 정보 리더다. 그 움직임이 북의 나머지 자산에 예측 정보를 전달하며, 이는 대칭적인 상관관계 행렬로는 구조적으로 주장할 수 없는 방향성 주장이다. 요인 분해는 BTC가 분산을 지배한다고 말하지만, out-degree 순위는 BTC가 선행하기 때문에 지배하는지 아니면 BTC를 포함한 모든 자산이 같은 거시 충격에 노출되어 지배하는지를 말해준다.

안정적인 그래프가 복구된다는 가정하에, 이 그래프가 이 블로그의 기존 작업에 연결될 지점은 충분히 분명하다. 그래프 토폴로지의 롤링 윈도우 변화는 구조적 단절 신호이며, HMM을 이용한 적응형 거래의 국면 탐지가 이를 다룬다. 열린 질문은 인과 그래프가 상태 모델보다 전환을 먼저 감지하는지다. 한 자산을 여러 거래소에 걸쳐 PCMCI로 분석하면 거래소 간 가격 주도력을 다룰 수 있는데, 이는 이미 스마트 주문 라우팅에서 밀리초 단위로 측정했다. 시간별 바의 그래프라면 이를 반복하는 것이 아니라 능가해야 한다. 또한 8시간 펀딩 메커니즘이 만드는 주기적 무기한 선물-현물 연결은 펀딩비 차익거래에서 다룬 알려진 정답의 테스트 케이스다. PCMCI가 독립적으로 검증할 수 있는 인과 구조를 복구해야 하므로, 이는 발견이 아니라 검증의 목표다.

이 중 어느 것도 발견이 아니다. 모두 위에서 설명한 연구를 기다리는 가설이다.

한계와 주의사항

통제된 불확실성에 일부 가려진 정밀한 인과 그래프

PCMCI는 강력한 도구지만 실무자가 이해해야 할 중요한 한계가 있다.

  1. 인과적 충분성 가정: PCMCI는 관련된 모든 변수가 관측되었다고 가정한다. 숨은 공통 원인(예: 고래의 거래 활동, 공개되지 않은 뉴스)이 관측된 두 자산에 영향을 주면, PCMCI는 둘 사이에 직접적인 인과 연결이 있다고 잘못 보고할 수 있다. LPCMCI 변형은 잠재적 교란 요인을 허용하여 이 문제를 일부 다루지만, 그 대가로 방향이 정해진 간선이 더 적게 나온다.

  2. 정상성 가정: 인과 구조가 분석 구간에서 일정하다고 가정한다. 실제 암호화폐 시장의 동학은 빠르게 변한다. 구조적 단절을 탐지하려면 롤링 윈도우 분석을 사용하라.

  3. 선형과 비선형: ParCorr에서는 선형 인과 효과만 탐지된다. "BTC가 5% 넘게 하락할 때만 BTC가 ETH 하락을 유발한다"와 같은 비선형 메커니즘은 선형 검정에서 보이지 않는다.

  4. 샘플링 빈도가 중요하다: 샘플링 빈도보다 빠르게 발생하는 인과 효과는 표준 PCMCI에서 동시점(τ=0\tau = 0)연결로 나타나며 방향이 모호할 수 있다. PCMCI+를 사용하고 더 높은 빈도의 데이터를 고려하라.

  5. 다중 검정: N2×τmaxN^2 \times \tau_{\max}개의 종속 검정을 위에서 설명한 방식으로 보정한다. 왜 의존 구조가 뻔한 선택을 배제하는지는 보정 Sharpe와 다중 검정을 참조하라.

  6. 표본 크기 요건: 신뢰할 수 있는 인과 발견에는 충분한 데이터가 필요하다. 대략적인 지침으로, 변수 N<10N < 10개에서 ParCorr를 사용할 때는 T>500T > 500, 비선형 검정 또는 더 큰 변수 집합에는 T>2000T > 2000을 목표로 하라.

PCMCI와 다른 방법 비교

서로 다른 인과 그래프 방법을 나란히 비교

방법 자기상관 처리 공통 원인 처리 동시점 연결 비선형 잠재 교란 요인
Granger 인과관계 부분적 아니오(이변량) 아니오 확장 기능으로 가능 아니오
전달 엔트로피 부분적 아니오(이변량) 아니오 아니오
PCMCI 예(MCI) 아니오 CMIknn/GPDC로 가능 아니오
PCMCI+ CMIknn/GPDC로 가능 아니오
LPCMCI CMIknn/GPDC로 가능
VAR-LiNGAM 아니오 아니오 아니오

Granger 인과관계와 전달 엔트로피에 비해 PCMCI가 갖는 핵심 장점은 MCI 검정이다. 다변량 환경에서 자기상관과 공통 원인을 올바르게 고려하기 때문이다. 이는 수십 개의 상관되고 자기상관된 자산이 동시에 상호작용하는 암호화폐 시장에서 정확히 마주치는 상황이다.

결론

측정된 통찰로 정리되는 필터링된 직접 인과 경로

가져갈 만한 기여는 두 단계 구성이다. 먼저 부모 집합을 제한하는 희소 조건 선택을 하고, 이어서 원인의 부모와 타깃의 부모를 모두 포함하는 조건부 집합으로 MCI 검정을 수행한다. 이 두 번째 단계가 PCMCI를 Granger 및 전달 엔트로피와 구분하며, 암호화폐 수익률만큼 자기상관이 강한 시계열에도 이 방법을 적용할 수 있게 한다.

이 방법에 빠져 있는 것은 증거다. 복구된 그래프는 정보 흐름에 대한 가설이지 신호가 아니다. 이 블로그에서 의미를 가지려면 명시된 자산 바스켓, 날짜 범위, 의존성을 고려한 보정, 그리고 윈도우가 이동해도 그래프가 유지되는지에 대한 최소 한 가지 측정과 함께 실제 데이터에 실행해야 한다. 그 실행이 있기 전까지는 여기 있는 모든 것을 도구로 취급하라.

그래프가 안정적이지 않다는 결과가 나오더라도 그것이 바로 글의 내용이 된다. 여기서 작동하는 튜토리얼보다 더 가치 있는 부정적 결과가 처음은 아닐 것이다.


참고문헌

  • Runge, J., Nowack, P., Kretschmer, M., Flaxman, S., and Sejdinovic, D. (2019). 대규모 비선형 시계열 데이터셋에서 인과적 연관성 탐지 및 정량화. Science Advances, 5(11), eaau4996.
  • Runge, J. (2020). 자기상관이 있는 비선형 시계열 데이터셋에서 동시점 및 시차 인과관계 발견. Proceedings of the 36th Conference on Uncertainty in Artificial Intelligence (UAI), PMLR 124:1388-1397.
  • Tigramite 문서: https://jakobrunge.github.io/tigramite/
  • 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

시장에서 앞서 나가세요

뉴스레터를 구독하여 독점적인 AI 트레이딩 통찰력, 시장 분석 및 플랫폼 업데이트를 받아보세요.

귀하의 개인정보를 존중합니다. 언제든지 구독을 취소할 수 있습니다.