DCC-GARCH: 페어 트레이딩과 포트폴리오 리스크를 위한 동적 상관관계
대부분의 암호화폐 데스크에 BTC와 ETH 간의 상관관계를 물어보면 단일 숫자 — 0.8, 어쩌면 0.75 — 가 돌아옵니다. 아무도 왜 선택했는지 기억하지 못하는 어떤 윈도우에서 계산된 값입니다. 그 숫자는 거짓말이거나, 적어도 위험한 단순화입니다. 표본 상관관계는 실제 의존 구조가 끊임없이 움직이던 기간에 대한 평균입니다. 조용한 시장에서는 BTC와 ETH가 충분히 벌어져서 시장 중립 페어가 매력적으로 보이게 만듭니다. 청산 캐스케이드가 일어나면 서로 그리고 다른 모든 것과 함께 묶이고, 여러분이 대가를 치른 분산 효과는 정확히 필요한 순간에 증발합니다.
이것은 미묘한 효과가 아닙니다. 2022년의 어떤 급락장이든 살펴보십시오 — 5월의 LUNA 붕괴, 6월의 3AC 청산, 11월의 FTX 파산 — 상위 20개 토큰의 평균 쌍별 상관관계가 며칠 만에 0.4-0.6 범위에서 0.9+ 를 향해 행진하는 것을 볼 수 있습니다. 상관관계는 가끔 잘못 추정되는 상수가 아닙니다. 그것은 자체적인 동역학, 자체적인 클러스터링, 자체적인 국면(regime)을 가진 시계열입니다. 이를 스칼라로 취급하는 것은 본 시리즈 1부에서 단일 자산에 대해 이미 무너뜨렸던 상수 변동성 가정의 다변량 버전입니다.
이 글은 4부작 변동성 시리즈의 3부입니다. 1부는 arch 라이브러리로 단변량 GARCH(1,1)를 구축하고 변동성이 어떻게 클러스터링되고 평균회귀하는지 보여주었습니다. 2부는 레버리지 효과와 두꺼운 꼬리를 포착하기 위해 비대칭성(GJR-GARCH, EGARCH)과 스튜던트-t 이노베이션을 추가했습니다. 이번 글에서는 다변량으로 넘어갑니다. Engle의 동적 조건부 상관관계(Dynamic Conditional Correlation, DCC) 모델을 사용하여 전체 조건부 공분산 행렬 가 어떻게 진화하는지 모델링합니다. 이는 스칼라 상관관계가 결코 줄 수 없는 두 가지 — 페어 트레이딩을 위한 동적 헤지 비율과, 리스크 기반 배분을 위한 정직하고 시변하는 포트폴리오 분산 — 를 제공합니다. 4부는 단변량 및 다변량 예측을 포지션 사이징 규칙으로 연결하는 변동성 타기팅 백테스트로 시리즈를 마무리합니다.
이 글은 독자가 1부와 2부를 읽었다고 가정하므로 단변량 GARCH를 다시 유도하지 않습니다. 결합 꼬리 행동 — 두 자산이 함께 1% 분위수를 돌파할 확률 — 을 원한다면, 그것은 코퓰라(copula) 문제이며 결합 리스크를 위한 코퓰라 모델에서 다룹니다. DCC와 코퓰라는 상호 보완적입니다. 코퓰라는 정적이지만 유연한 꼬리 의존 구조를 제공하고, DCC는 전체 상관행렬의 다루기 쉬운 시계열을 제공합니다. 이 글은 후자에 관한 것입니다.
암호화폐에서 정적 상관관계가 무너지는 이유
메커니즘을 다루기 전에, 무엇이 실패하는지 정확히 짚어봅시다. 윈도우 에 대한 단일 표본 상관관계 는 다음을 추정합니다.
이는 세 가지 암묵적 가정을 담고 있으며, 암호화폐에서는 모두 거짓입니다.
- 의존관계의 정상성. 윈도우 안에는 하나의 진짜 가 있다는 가정입니다. 실제로 의존관계는 국면을 가집니다 — 0.5 근처의 조용한 시장 국면과 0.95 근처의 스트레스 국면 — 그리고 는 이들을 의미 없는 중간값으로 섞어버립니다.
- 일정한 개별 변동성. 피어슨 상관계수는 정규화된 공분산입니다. 와 자체가 움직이고 있다면(실제로 그렇습니다 — 이것이 1부와 2부의 전체 전제입니다), 일정한 공분산조차 시변하는 상관관계를 만들어내며, 그 반대도 성립합니다. 그 아래에 변동성 모델 없이는 둘을 분리할 수 없습니다.
- 시장 방향에 대한 비대칭성. 상관관계는 랠리보다 급락장에서 더 많이 상승합니다. 이는 레버리지 효과의 다변량 사촌입니다. 롤링 윈도우는 순수 노이즈가 될 정도로 짧아지지 않고서는 이를 표현할 수 없습니다.
롤링 윈도우 방식 — 지난 30일 또는 60일에 걸쳐 를 재계산하는 것 — 은 한 문제를 다른 문제와 맞바꿀 뿐입니다. 짧은 윈도우는 반응성이 좋지만 노이즈가 많고 실제 변화에 뒤처지며, 긴 윈도우는 안정적이지만 낡은 정보를 담습니다. 더 나쁜 것은, 개 자산에 대한 롤링 상관행렬은 축소(shrinkage)나 패치를 시작하면 양의 준정부호(positive semi-definite) 상태를 유지한다는 보장이 없으며, 이는 다운스트림의 모든 최적화기를 망가뜨립니다. 우리가 원하는 모델은 (a) 자산별로 적절한 변동성 프로세스에 의해 구동되고, (b) 구조적으로 매 단계마다 유효한 상관행렬을 생성하며, (c) 임의로 고른 윈도우 길이가 아니라 최대우도법으로 추정할 수 있는 파라미터를 가진 모델입니다. 그 모델이 바로 DCC-GARCH입니다.
다변량 문제: 조건부 공분산 행렬
를 시점 에서 개 자산의 수익률 벡터라 하고, 조건부 평균을 (종종 상수 또는 작은 AR 항), 잔차를 라 합시다. 다음을 가정합니다.
여기서 는 정보 집합 이 주어졌을 때 조건부 공분산 행렬이고, 는 어떤 조건부 분포(가우시안, 또는 암호화폐에는 더 나은 다변량 스튜던트-t)입니다. 다변량 변동성 모델링의 모든 것은 하나의 질문에 대한 다른 답입니다. 파라미터 폭발 없이 매 단계 대칭 양의 정부호(positive definite) 상태를 유지하도록 의 동역학을 어떻게 파라미터화할 것인가?
이 문제가 왜 어려운지 보여주는 두 가지 고전적인 답이 있습니다.
VECH
VECH 모델(Bollerslev, Engle, Wooldridge 1988)은 의 반벡터화(half-vectorization)를 과거의 제곱 잔차와 과거 공분산의 선형 함수로 씁니다.
여기서 는 대칭 행렬의 하삼각 부분을 길이 의 벡터로 쌓습니다. 이는 최대한 일반적이지만 — 모든 분산과 공분산이 모든 과거 분산과 공분산에 의존합니다 — 을 넘어서면 최대한 쓸모없어집니다. 개 자산에 대해 와 는 각각 크기입니다. 에서는 두 개의 행렬, 대략 450개 파라미터에, 표현하기조차 고통스러운 양의 정부호 제약이 추가됩니다. 우도 곡면은 늪지대입니다.
BEKK
BEKK 모델(Engle & Kroner 1995)은 이차 형식을 사용하여 구조적으로 양의 정부호성을 보장합니다.
는 상삼각 행렬입니다. 모든 항이 이차 형식이므로, 인 한 이 자동으로 성립합니다. BEKK는 VECH보다 더 절약적이지만 여전히 파라미터로 확장됩니다 — 와 행렬은 각각 입니다. 에서는 노이즈가 많은 일일 암호화폐 데이터에서 MLE로 200개 이상의 파라미터를 동시에 추정하게 되며, 최적화기가 의미 있는 값으로 수렴한다는 보장이 없습니다. 실무에서 완전한 BEKK는 에 국한되며, 그마저도 사람들은 교차 동역학 대부분을 버리는 "대각(diagonal)" 또는 "스칼라(scalar)" 제약을 사용합니다.
이것이 다변량 GARCH의 차원의 저주입니다. 파라미터 수는 제곱으로 증가하지만 데이터 내 정보량은 그렇지 않습니다. 관심 있는 자산 수를 다 쓰기도 전에 자유도가 바닥납니다. 10-30개 토큰을 가진 어떤 암호화폐 북(book)도 VECH나 BEKK로는 완전히 손이 닿지 않습니다.
Engle이 제시한 해법은 를 직접 모델링하려는 시도를 멈추고, 대신 이미 저렴하게 추정하는 방법을 아는 조각들로 인수분해하는 것입니다.
Engle의 DCC(2002): 2단계 분해
Bollerslev의 상수 조건부 상관관계(Constant Conditional Correlation, CCC) 모델(1990)은 최초의 절약적 인수분해였습니다. 다음과 같이 씁니다.
여기서 는 조건부 표준편차의 대각행렬 — 자산당 하나의 단변량 GARCH — 이고, 은 상수 상관행렬입니다. 이는 엄청난 단순화입니다. 개의 독립적인 단변량 GARCH 모델을 적합시킨 다음, 표준화된 잔차의 단일 표본 상관행렬을 추정하면 됩니다. 이 유효한 상관행렬이고 모든 인 한 양의 정부호성은 자동으로 보장됩니다.
CCC의 문제는 이름 그 자체에 있습니다 — 상관관계가 상수라는 것이며, 이는 정확히 이 글을 시작하며 우리가 기각한 가정입니다. Engle의 동적 조건부 상관관계(2002)는 CCC의 아름다운 인수분해를 유지하면서 상관행렬이 숨쉬게 합니다.
이제 는 시변합니다. 천재적인 점은 변동성과 상관관계가 두 개의 별도 단계에서 추정되므로, 완전한 결합 최적화에 결코 직면하지 않는다는 것입니다.
1단계: 자산별 단변량 GARCH
각 자산 에 대해, 1부와 2부에서와 정확히 동일한 방식으로 단변량 GARCH 모델을 적합시킵니다 — 해당 계열에 가장 잘 맞는 것이 무엇이든, 스튜던트-t 이노베이션을 가진 GARCH(1,1), GJR-GARCH, 또는 EGARCH를 사용합니다. 이는 조건부 분산 , 따라서 를 제공합니다.
적합된 모델로부터 표준화된 잔차를 추출합니다.
구조상 각 는 (근사적으로) 단위 조건부 분산을 가집니다. 이들을 벡터 로 쌓습니다. 이 표준화된 잔차들이 상관관계 단계의 원재료입니다 — 개별 변동성 동역학이 벗겨져 나갔으므로, 남아있는 공행보(co-movement)는 순수한 의존관계이지 변동성의 인공물이 아닙니다. (이는 코퓰라 글에서 마진을 적합시키기 전에 사용하는 것과 동일한 확률적분변환(PIT) 방식의 로직입니다. 다만 여기서는 균등분포까지 완전히 가지 않고 표준화 단계에서 멈춥니다.)
2단계: DCC 상관관계 재귀식
표준화된 잔차의 외적(outer product)에 의해 구동되는 GARCH 유사 재귀를 가진 대칭 양의 정부호 행렬인 보조 프로세스 를 모델링합니다.
여기서:
- 는 표준화된 잔차의 무조건 상관행렬입니다(이것이 상관관계 타기팅입니다 — 아래에서 더 자세히 설명합니다).
- 은 오늘의 충격 이 상관관계를 얼마나 강하게 끌어당기는지를 결정합니다.
- 은 지속성을 결정합니다 — 어제의 이 얼마나 이월되는지입니다.
- 그리고 평균회귀 제약은 ()이며, 단변량 GARCH의 과 직접 유사합니다.
구조가 스칼라 GARCH(1,1) 재귀와 동일하지만, 행렬 위에서 이루어집니다. 장기 앵커 , 충격 항, 지속성 항이 그것입니다. 이는 양의 준정부호 행렬들(, 계수 1인 외적, 이전 )의 볼록 결합(convex combination)이므로, 이고 가중치가 음이 아닌 한 는 양의 정부호를 유지합니다. 이것이 무료로 유효한 공분산행렬을 보장받는 이유입니다.
는 상관행렬에 거의 가깝지만 정확히는 아닙니다 — 대각선이 정확히 1이 아닙니다. 따라서 정규화합니다.
원소별로, 자산 와 사이의 조건부 상관관계는 다음과 같습니다.
이 는 매 시점마다 구조적으로 — 단위 대각선, 범위의 비대각 원소, 양의 정부호성 — 을 갖춘 적절한 상관행렬입니다. 전체 조건부 공분산을 재구성하면 다음과 같습니다.
마지막 원소별 형태는 여러분이 계속 사용하게 될 것입니다. 두 자산의 조건부 공분산은 그들의 동적 상관관계에 각각의 동적 변동성을 곱한 것입니다. 우변의 모든 요소는 시변하며 추정 가능한 모델에서 나옵니다.
전체 모델은 이든 이든 상관없이 오직 두 개의 상관관계 파라미터, 와 만 가집니다. 변동성 측은 선형으로 확장됩니다(자산당 하나의 단변량 GARCH, 각각 약 4-5개 파라미터를 가지며 모두 독립적으로, 당황스러울 만큼 병렬로 적합됩니다). 이것이 BEKK와 VECH가 할 수 없는 규모로 DCC가 확장되는 이유입니다. 차원의 저주는 최적화되는 것이 아니라 타기팅(표본 추정치로 대입)되는 에 국한됩니다.
스칼라 제약과 그 비용
스칼라 는 모든 자산 쌍이 동일한 상관관계 동역학 — 동일한 조정 속도와 동일한 지속성 — 을 공유한다는 것을 의미합니다. BTC-ETH 상관관계와 DOGE-SHIB 상관관계는 경제적 특성이 다름에도 같은 리듬으로 움직입니다. 이것은 다루기 쉬움(tractability)의 대가이며, 보통 받아들일 만한 대가입니다. 일반화(행렬 를 가진 Generalized DCC; Cappiello-Engle-Sheppard 비대칭 DCC)는 파라미터 비용과 추정 안정성을 대가로 이 제약을 완화합니다. 아래에서 aDCC를 언급합니다.
DCC 준로그우도(Quasi-Log-Likelihood)
와 를 추정하려면 우도가 필요합니다. Engle의 핵심 결과는 가우시안 로그우도가 변동성 부분과 상관관계 부분으로 분리된다는 것이며, 이것이 2단계 추정량을 정당화합니다. 를 가정하면, 시점 에서의 로그우도 기여분은 다음과 같습니다.
를 대입합니다. 그러면 이고 이며, 를 사용하면:
이제 를 더하고 빼서 분리합니다.
변동성 부분 는 오직 단변량 GARCH 파라미터에만 의존합니다(를 통해) — 이를 최대화하는 것은 정확히 1단계에서 수행한 개의 독립적인 단변량 GARCH 모델을 적합시키는 것입니다. 상관관계 부분 는 1단계의 표준화된 잔차가 주어졌을 때 와 에 의존합니다(를 통해). 따라서 2단계에서는 다음만 최대화합니다.
( 항은 에 의존하지 않으므로 제거합니다.) 이는 자산 수와 무관하게 2-파라미터 최적화입니다 — 이것이 핵심입니다. 2단계 추정량이 일치성(consistent)은 있지만 완전한 효율성은 없기 때문에 이를 준우도(quasi-likelihood)라 부릅니다. 표준오차는 보정이 필요하지만(Engle & Sheppard 2001), 신호 생성 목적으로는 점 추정치가 중요합니다.
암호화폐의 경우 가우시안 이노베이션은 꼬리 리스크를 과소평가합니다. 다변량 스튜던트-t 우도로 교체하는 것은 에 대한 간단한 변경입니다(가우시안 커널을 다변량- 밀도로 교체하고 자유도 파라미터 를 추가). 명료함을 위해 아래 추정량에서는 가우시안 준우도를 유지하며 가 어디에 들어가는지만 언급합니다 — 1-2부의 표준화 단계에서 이미 마진에 t-이노베이션을 사용했으므로 꼬리 이점의 대부분을 포착했습니다.
Python 구현
직설적이지만 중요한 사실: arch 라이브러리는 다변량 GARCH나 DCC를 지원하지 않습니다. arch는 훌륭한 단변량 엔진이지만(바로 그 용도로 우리가 의존하는 것입니다), dcc_model이라는 것은 없습니다. 실질적인 선택지는 다음과 같습니다.
arch위에 직접 DCC를 구축한다 —arch로 단변량 모델을 적합시키고, 표준화된 잔차를 추출하고, -재귀와 상관관계 준우도를 NumPy/SciPy로 구현하고, 두 스칼라를 최적화합니다. 아래에서 우리가 하는 방식입니다. 약 60줄이며 완전히 투명합니다.mgarchPyPI 패키지 — 가벼운 순수 Python DCC-GARCH 구현체입니다. 빠른 적합에는 편리하지만, GJR 마진이나 t-이노베이션을 정밀하게 연결하고 싶다면 유연성이 떨어집니다.- R의
rmgarch(Alexios Galanos) — 레퍼런스 구현체입니다.dccspec/dccfit이 DCC, aDCC, GARCH-코퓰라, 스튜던트-t, 그리고 적절한 표준오차를 지원합니다. 진지한 다변량 변동성 연구를 한다면,rmgarch(꼭 필요하다면rpy2를 통해 Python에서 호출)가 최고 표준입니다.
우리는 옵션 1을 구축합니다. 모든 부분을 명시적으로 만들고 1-2부의 단변량 스킬을 재사용하기 때문입니다.
1단계: arch로 단변량 GARCH 마진 적합
import numpy as np
import pandas as pd
from arch import arch_model
from scipy.optimize import minimize
def fetch_returns(symbols, start="2022-01-01", end="2025-12-31"):
"""
Daily log returns for a list of crypto symbols.
Replace with your data source (ccxt for 24/7 exchange data,
yfinance for a quick sketch).
"""
import yfinance as yf
px = yf.download([f"{s}-USD" for s in symbols],
start=start, end=end)["Close"]
px.columns = symbols
rets = np.log(px / px.shift(1)).dropna()
return rets
symbols = ["BTC", "ETH", "SOL", "BNB"]
returns = fetch_returns(symbols)
def fit_univariate(series, dist="t"):
"""
Fit GJR-GARCH(1,1) with Student-t innovations (Part 2 model).
Returns the fitted result and the *scaled* series it was fit on.
We scale returns by 100 for the optimizer's numerical health,
exactly as in Parts 1 and 2.
"""
scaled = series * 100.0
model = arch_model(scaled, mean="Constant",
vol="GARCH", p=1, o=1, q=1, dist=dist)
res = model.fit(disp="off")
return res
fits = {s: fit_univariate(returns[s]) for s in symbols}
Z = pd.DataFrame({s: fits[s].std_resid for s in symbols}).dropna()
Sigma = pd.DataFrame({s: fits[s].conditional_volatility
for s in symbols}).loc[Z.index]
print(Z.describe())
표준화된 잔차에 대한 빠른 검증이 중요합니다. 어떤 열이든 표준편차가 1에서 크게 벗어나거나 에 잔여 자기상관(융-박스 검정)이 심하게 남아있다면, 단변량 마진이 잘못 설정된 것이며 DCC 단계는 그 오류를 그대로 물려받습니다. 마진을 먼저 고치십시오 — 그것이 2부의 목적이었습니다.
2단계: DCC 재귀와 준로그우도
def dcc_negloglik(params, Z):
"""
Negative DCC quasi-log-likelihood (Gaussian) in (a, b).
Z : (T, d) array of standardized residuals from Step 1.
Implements:
Q_t = (1-a-b) Qbar + a z_{t-1} z_{t-1}' + b Q_{t-1}
R_t = diag(Q_t)^{-1/2} Q_t diag(Q_t)^{-1/2}
LL = -1/2 sum_t ( log|R_t| + z_t' R_t^{-1} z_t )
with correlation targeting: Qbar = sample corr of Z.
"""
a, b = params
if a <= 0 or b <= 0 or a + b >= 1.0:
return 1e10
Z = np.asarray(Z)
T, d = Z.shape
Qbar = np.cov(Z, rowvar=False, bias=True) # unconditional (targeted)
dinv = np.diag(1.0 / np.sqrt(np.diag(Qbar)))
Qbar = dinv @ Qbar @ dinv
Q = Qbar.copy() # initialize Q_1 at the target
ll = 0.0
for t in range(T):
q_diag = np.sqrt(np.diag(Q))
R = Q / np.outer(q_diag, q_diag)
sign, logdet = np.linalg.slogdet(R)
if sign <= 0:
return 1e10
z = Z[t]
Rinv_z = np.linalg.solve(R, z)
ll += -0.5 * (logdet + z @ Rinv_z)
Q = (1 - a - b) * Qbar + a * np.outer(z, z) + b * Q
return -ll
def fit_dcc(Z):
"""Estimate (a, b) by maximizing the DCC quasi-log-likelihood."""
res = minimize(
dcc_negloglik, x0=[0.03, 0.94], args=(np.asarray(Z),),
method="L-BFGS-B",
bounds=[(1e-6, 0.5), (1e-6, 0.999)],
)
a, b = res.x
print(f"DCC estimates: a = {a:.4f}, b = {b:.4f}, a+b = {a+b:.4f}")
print(f"log-likelihood: {-res.fun:.2f}")
return a, b
a_hat, b_hat = fit_dcc(Z)
BTC/ETH/SOL/BNB 북에 대해 수년간의 일일 데이터로 이를 실행하면 다음과 같은 형태의 결과가 나옵니다(아래 숫자는 특정 날짜의 실험 결과가 아니라 예시입니다 — 여러분 자신의 데이터로 실행해 보십시오).
DCC estimates: a = 0.0287, b = 0.9401, a+b = 0.9688
log-likelihood: -3812.44
읽는 법:
- ****는 작습니다 — 상관행렬이 하루의 충격에 요동치지 않습니다. 매일 를 외적 쪽으로 약 3%만 밀어줍니다.
- ****은 큽니다 — 상관관계는 매우 지속적입니다. 일단 북이 스트레스 이벤트에서 커플링되면, 로 천천히 감쇠하며 한동안 커플링된 상태를 유지합니다. 이는 암호화폐 급락장의 실제 경험과 일치합니다. 가격이 안정되는 순간 상관관계가 즉시 되돌아가지 않습니다.
- ****은 평균회귀를 확인해줍니다. 상관관계 프로세스는 회귀하는 정상적인 장기 수준()을 가지며, 반감기는 대략 일입니다. 가 사실상 1과 같게 추정된다면, 상관관계 프로세스는 적분된(integrated) 것입니다 — 장기 앵커가 없으며, 보통 모델이 무한 지속성으로 흡수하고 있는 표본 내 구조적 변화의 증상입니다.
거의 단위에 가까운 지속성과 작은 충격 반응 로딩은 자산군을 막론하고 나타나는 전형적인 DCC 지문이며, 암호화폐도 예외가 아닙니다. 이것이 또한 30일 롤링 상관관계가 그토록 형편없는 대체재인 이유이기도 합니다. 롤링 윈도우는 이 감쇠 구조와 전혀 맞지 않는 와 를 암묵적으로 가정하기 때문입니다.
실제 디버깅 시간을 절약해주는 몇 가지 구현 노트:
- 초기화.
[0.03, 0.94]에서 시작하는 것은 일반적인 암호화폐 추정치를 반영합니다. 작은 (상관관계가 충격에 반응하지만 격렬하지는 않음), 큰 (상관관계가 지속적임). 최적화기가 로 흘러간다면 상관관계 프로세스가 적분된 것입니다 — 보통 표본 내 구조적 변화(모델이 지속성으로 무리하게 맞추려는 국면 변화)의 징후입니다. - 타이밍 관례. 루프 안에서 우리는 를 에 대해 채점한 다음 다음 단계를 위해 로 를 업데이트합니다. 이는 가 까지의 정보만의 함수로 유지되게 합니다 — 미래 참조(look-ahead)가 없습니다. 이 순서를 잘못 맞추는 것이 가장 흔한 DCC 버그이며, 표본 내 적합도를 소리 없이 부풀립니다.
- 상관관계 타기팅. 우리는 를 추정하는 대신 표본 상관관계로 대입합니다. 이것이 최적화를 2차원으로 만드는 요인입니다. 대가는 가 전체 표본을 사용한다는 것이므로, 엄격한 워크포워드에서는 훈련 윈도우에서만 재추정해야 합니다(아래 참조).
3단계: 상관관계 및 공분산 경로 재구성
가 고정되면, 다운스트림 전략이 사용할 수 있도록 전체 (및 ) 경로를 저장하면서 재귀를 한 번 더 실행합니다.
def dcc_filter(Z, Sigma, a, b):
"""
Run the DCC recursion with fixed (a,b) and return the full paths:
R_path : (T, d, d) conditional correlation matrices
H_path : (T, d, d) conditional covariance matrices (scaled units)
Sigma : (T, d) conditional volatilities aligned with Z.
"""
Z = np.asarray(Z); Sig = np.asarray(Sigma)
T, d = Z.shape
Qbar = np.cov(Z, rowvar=False, bias=True)
dinv = np.diag(1.0 / np.sqrt(np.diag(Qbar)))
Qbar = dinv @ Qbar @ dinv
Q = Qbar.copy()
R_path = np.empty((T, d, d))
H_path = np.empty((T, d, d))
for t in range(T):
q_diag = np.sqrt(np.diag(Q))
R = Q / np.outer(q_diag, q_diag)
R_path[t] = R
Dt = np.diag(Sig[t]) # D_t = diag(sigma_i,t)
H_path[t] = Dt @ R @ Dt # H_t = D_t R_t D_t
z = Z[t]
Q = (1 - a - b) * Qbar + a * np.outer(z, z) + b * Q
return R_path, H_path
R_path, H_path = dcc_filter(Z, Sigma, a_hat, b_hat)
i, j = symbols.index("BTC"), symbols.index("ETH")
rho_btc_eth = pd.Series(R_path[:, i, j], index=Z.index, name="rho_BTC_ETH")
print(rho_btc_eth.describe())
print("min/max correlation:", rho_btc_eth.min().round(3),
rho_btc_eth.max().round(3))
rho_btc_eth 시계열은 이 전체 작업의 결실입니다. 단일 숫자 대신, 이제 플롯하고, 임계값을 적용하고, 전략에 투입할 수 있는 일일 상관관계를 갖게 되었습니다. 실제 암호화폐 데이터에서는 보통 조용한 구간에서 대략 0.5, 스트레스 구간에서 0.9 이상까지 범위가 형성되는 것을 볼 수 있습니다 — 단일 표본 상관관계가 평균으로 지워버리는 바로 그 폭입니다.
1스텝 앞 예측
라이브 트레이딩을 위해서는 현재 이용 가능한 정보로부터 다음 시점 이 필요합니다. 변동성 측은 각 arch 모델의 1스텝 예측에서 나오며, 상관관계 측은 재귀의 한 단계 더입니다.
def dcc_forecast_next(Z, a, b, fits, symbols):
"""One-step-ahead H_{t+1} using info through the last observation."""
Z = np.asarray(Z); T, d = Z.shape
Qbar = np.cov(Z, rowvar=False, bias=True)
dinv = np.diag(1.0 / np.sqrt(np.diag(Qbar)))
Qbar = dinv @ Qbar @ dinv
Q = Qbar.copy()
for t in range(T):
z = Z[t]
Q = (1 - a - b) * Qbar + a * np.outer(z, z) + b * Q
q_diag = np.sqrt(np.diag(Q))
R_next = Q / np.outer(q_diag, q_diag)
sig_next = np.array([
np.sqrt(fits[s].forecast(horizon=1, reindex=False)
.variance.iloc[-1, 0])
for s in symbols
])
Dt = np.diag(sig_next)
H_next = Dt @ R_next @ Dt
return R_next, H_next, sig_next
R_next, H_next, sig_next = dcc_forecast_next(Z, a_hat, b_hat, fits, symbols)
모든 것이 스케일링(×100)된 단위임을 기억하십시오. series * 100으로 arch를 적합시켰기 때문입니다. 전략에 투입하기 전에 변동성은 100으로 나누고(공분산은 으로 나눔) 원래 수익률 단위로 되돌리십시오. 스케일링을 정확하게 유지하는 것은 번거롭지만 소리 없는 버그의 흔한 원인입니다.
응용 1: 페어 트레이딩을 위한 동적 헤지 비율
전형적인 시장 중립 페어 — 한 자산을 롱하고 베타 가중된 만큼 다른 자산을 숏하는 것 — 은 헤지 비율 에 사활을 겁니다. 훈련 윈도우에 대한 정적 OLS로 이를 추정하면 정확히 이 글 전체가 다루는 낡은 상관관계 문제를 물려받게 됩니다. 지난 분기 시장 노출을 중립화했던 헤지는 이번 분기에는 틀린 헤지입니다.
DCC는 헤지 비율을 시계열로 제공합니다. BTC를 사용한 ETH 노출의 최소분산 헤지는 조건부 회귀 계수입니다.
우변의 모든 항이 DCC 출력값입니다. 헤지 비율은 두 가지 뚜렷한 이유로 움직이며, DCC는 이를 깔끔하게 분리합니다. 상관관계 가 변하는 것(자산들이 커플링되거나 디커플링됨)과, 변동성 비율 가 변하는 것(한 자산이 상대적으로 더 변동성이 커짐)입니다. 롤링 OLS 베타는 두 효과를 지연과 함께 뭉뚱그리지만, DCC는 이를 각각 귀속시킵니다.
def dynamic_hedge_ratio(R_path, Sigma, base="BTC", target="ETH",
symbols=symbols, index=Z.index):
"""
beta_t to hedge `target` exposure with `base`:
beta_t = rho_t * sigma_target,t / sigma_base,t
(Scaling cancels in the ratio, so scaled units are fine here.)
"""
i = symbols.index(target)
j = symbols.index(base)
rho = R_path[:, i, j]
sig = np.asarray(Sigma)
beta = rho * sig[:, i] / sig[:, j]
return pd.Series(beta, index=index, name=f"beta_{target}_{base}")
beta_t = dynamic_hedge_ratio(R_path, Sigma)
print(beta_t.describe())
spread = (returns["ETH"] - beta_t.shift(1) * returns["BTC"]).dropna()
spread를 여러분이 운용하는 어떤 페어 엔진에도 투입하십시오. 동적 헤지 자체가 엣지를 만들어내지는 않습니다 — 그것은 여러분이 거래하는 스프레드를 시간에 걸쳐 진정으로 시장 중립으로 만들어서, 평균회귀 신호가 표류하는 방향성 노출로 오염되지 않게 합니다. 페어 전략을 구축한다면, 이는 암호화폐 통계적 차익거래와 페어 트레이딩과 페어 트레이딩의 거리 접근법의 프레임워크에 바로 들어맞아 고정 헤지 비율을 대체합니다. 상관관계 시계열 자체도 어떤 롤링 윈도우보다 상관관계 기반 페어 신호에 더 깨끗한 입력입니다 — 노이즈 낀 윈도우 추정치 대신 평활화되고 모델과 일관된 를 얻습니다.
를 실전에서 사용할 때 특히 주의할 두 가지가 있습니다. 첫째, 지연시키십시오 — 동시대의 가 아니라 로 거래하십시오, 그렇지 않으면 미리보기(peeking)를 하는 것입니다. 둘째, 매일 요동치는 헤지 비율은 회전율과 수수료를 발생시킵니다. 숏 다리에 펀딩 비용이 있는 암호화폐의 24/7 시장에서는 과잉 반응하는 헤지가 그것이 교정하는 드리프트보다 더 많이 출혈을 일으킬 수 있습니다. 를 평활화하고(EWMA, 또는 밴드를 벗어났을 때만 헤지를 리밸런싱), 전체를 합리적으로 사이징하십시오 — 노이즈 낀 신호로부터의 포지션 사이징은 그 자체로 별도의 규율이며 켈리 기준 사이징에서 다룹니다.
응용 2: 시변 포트폴리오 분산
가중치 벡터 를 가진 포트폴리오의 경우, 조건부 분산은 다음과 같습니다.
정적 공분산행렬 — 마코위츠 디폴트 — 을 사용하면 이 숫자는 한 번 계산하고 여전히 참이라고 가정하는 상수입니다. 실제로는 그렇지 않습니다. 포트폴리오 리스크는 시장과 함께 숨쉬며, 상관관계가 급등할 때 가장 격렬하게 숨쉽니다. 급락장에서는 항과 항이 함께 상승하며 곱해지기 때문입니다. 조용한 시장에서는 연율 40%처럼 보이던 포트폴리오가 스트레스 주간에는 80% 이상으로 치솟을 수 있으며, 정적 공분산행렬은 아무것도 바뀌지 않았다고 말할 것입니다.
def portfolio_vol_path(H_path, weights, index=Z.index, unscale=1e4):
"""
Conditional portfolio volatility sigma_{p,t} = sqrt(w' H_t w).
H_path is in scaled (x100) units, so covariances carry a 100^2
factor: divide by unscale=1e4 to return to raw-return variance.
"""
w = np.asarray(weights)
var_t = np.einsum("i,tij,j->t", w, H_path, w) / unscale
return pd.Series(np.sqrt(var_t), index=index, name="port_vol")
w = np.array([0.4, 0.3, 0.2, 0.1]) # BTC, ETH, SOL, BNB
pv = portfolio_vol_path(H_path, w)
pv_annual = pv * np.sqrt(365)
print(pv_annual.describe())
이 시변하는 는 리스크 기반 배분이 필요로 하는 정직한 입력값입니다. 정적 표본 공분산을 사용하는 평균-분산 최적화(암호화폐를 위한 마코위츠)는 허구를 상대로 최적화하는 것입니다. (또는 그 단기 예측치)를 투입하면 효율적 프론티어 자체가 시변하게 되며, 최적화기가 상관관계가 상승하는 국면 이후가 아니라 그 안에서 리스크를 줄이도록 강제합니다. 리스크 패리티와 계층적 접근법 — HRP + CVaR 파이프라인 — 은 공분산 입력에 훨씬 더 민감합니다. 전체 배분 자체가 리스크 행렬의 함수이기 때문입니다. 그리고 비교된 포트폴리오 최적화 알고리즘에서처럼 배분자들을 직접 비교한다면, 그들이 정적 공분산을 사용하는지 동적 공분산을 사용하는지가 종종 알고리즘 선택보다 실현된 리스크에 더 큰 영향을 미칩니다.
직접적인 응용은 전체 포트폴리오에 대한 변동성 타기팅입니다. 목표 연율 변동성 를 정하고, 매 기간 로 총 노출을 조정하여 위기 상황에서 폭증하는 대신 실현 리스크가 대체로 일정하게 유지되도록 합니다. 이것이 정확히 이 규칙을 구축하고 백테스트하는 4부와 연결됩니다.
응용 3: 국면 신호로서의 상관관계
헤지와 사이징을 넘어서, 상관행렬은 매크로 신호를 담고 있습니다. 추출할 수 있는 가장 유용한 단일 스칼라는 평균 쌍별 상관관계입니다.
가 북 전체에서 상승할 때, 시장은 리스크 오프(risk-off) 국면에 진입하고 있습니다 — 개별 종목 스토리가 더 이상 중요하지 않게 되고 모든 것이 하나의 매크로 베타로 거래됩니다. 이것이 "위기에는 상관관계가 1로 간다"는 것의 정량적 지문입니다. 급락장을 선행하거나 동시에 나타나는 경향이 있어, 사후 부검 신호가 아니라 사용 가능한 국면 지표가 됩니다.
def avg_pairwise_corr(R_path, index=Z.index):
T, d, _ = R_path.shape
iu = np.triu_indices(d, k=1) # upper-triangle off-diagonals
avg = R_path[:, iu[0], iu[1]].mean(axis=1)
return pd.Series(avg, index=index, name="avg_corr")
avg_corr = avg_pairwise_corr(R_path)
roll_q = avg_corr.rolling(365, min_periods=90).quantile(0.80)
risk_off = (avg_corr > roll_q)
risk_off를 독립적인 스로틀(총 노출 축소, 스탑 확대, 모든 것이 함께 추세를 이룰 때 짓밟히는 평균회귀 전략 중단)로 사용하거나, 더 공식적인 국면 모델의 특성으로 사용할 수 있습니다. 이는 은닉 마르코프 모델을 이용한 국면 탐지의 접근법과 자연스럽게 맞물립니다. 평균 DCC 상관관계는 HMM에 건넬 수 있는 가장 정보력 있는 관측 변수 중 하나입니다. 후행하는 수익률과 달리 시스템적 스트레스에 대해 선행적이기 때문입니다. 정직한 주의사항은 이렇습니다. 상관관계 상승은 분산투자가 실패하고 있음을 알려줄 뿐, 시장이 어느 방향으로 갈지는 말해주지 않습니다. 이는 리스크 신호이지 알파 신호가 아니며, 그렇게 사이징되어야 합니다 — 리스크 국면을 방향성 베팅으로 취급하는 것이 왜 나쁘게 끝나는지는 손실과 이익의 비대칭성을 참조하십시오.
실무적 고려사항
추정 안정성과 자산 수
DCC는 BEKK보다 훨씬 잘 확장되지만, "확장된다"가 "공짜"는 아닙니다. 상관관계 타기팅 행렬 는 표본 상관관계이며, 표본 상관행렬은 가 관측치 수에 접근함에 따라 조건이 나빠집니다(ill-conditioned). 자산 4개와 1000일이면 문제없습니다. 자산 60개와 400일이면 는 거의 특이(singular)해지고, 우도에서 그 역행렬이 폭발하며, 는 수치 노이즈로 인해 비양의정부호 상태를 헤맬 수 있습니다. 완화 방법은 필요 빈도 순으로 대략 다음과 같습니다.
- **를 축소(shrink)**하여 구조화된 목표(Ledoit-Wolf, 또는 항등행렬 / 상수 상관행렬)를 향하게 한 다음 재귀를 실행합니다. 대형 북에 대해 가장 효과적인 단일 수정입니다.
- 자산을 그룹화하여 몇 개의 섹터(메이저, L1, DeFi, 밈)로 나누고, 섹터 수준에서 내부 및 교차 모델링을 하거나, 원자산이 아닌 주성분 팩터에 대해 DCC를 실행합니다.
- 자산보다 데이터를 우선시합니다. DCC는 길고 깨끗하며 동시성을 가진 이력을 끝없이 필요로 합니다 — 이는 정확히 신생 토큰들이 갖지 못한 것입니다.
현실적으로 직접적인 DCC는 많아야 수십 개 자산으로 유지하십시오. 대형 유니버스의 경우, 팩터 수익률과 개별 잔차에 대한 DCC가 표준적인 우회책입니다.
상관관계 타기팅은 비용이 따르는 지름길이다
를 타기팅하는 것은 추정을 다루기 쉽게 만들지만, 전체 표본의 무조건 상관관계를 매 에 구워 넣습니다. 엄격한 백테스트에서 이는 미래 참조 누수입니다. 일의 상관행렬이 미래를 포함한 전체 표본의 평균 상관관계를 "알고 있는" 것입니다. 정직한 평가를 위해서는 훈련 윈도우에서만 를 재추정하고 표본 외에서는 고정시켜 두거나, 앞으로 롤링해야 합니다. 이는 전체 워크포워드 최적화 프레임워크가 강제하는 것과 동일한 규율이며, 위 우리의 교육용 코드가 그러하듯 편리한 np.cov(Z)를 전체 배열에 걸쳐 실수로 위반하기 쉽습니다. 단일 손익 숫자를 신뢰하기 전에 이를 고치십시오.
재적합 주기와 미래 참조 규율
를 매일 재최적화할 필요는 없습니다 — 안정적인 파라미터이기 때문입니다. 합리적인 프로덕션 주기는 다음과 같습니다.
- 와 단변량 GARCH 파라미터를 재추정하는 것은 주간 또는 월간으로 합니다.
- 필터(즉 , 의 업데이트)는 매 기간 실행하되 고정된 파라미터로 신선한 와 를 얻습니다. 필터링은 저렴하지만 적합은 그렇지 않습니다.
- 항상 예측하고, 절대 평활화하지 마십시오. 까지의 정보로 구축된 를 사용하여 에서 거래하십시오. 2단계 구조(윈도우에 적합시킨 다음 앞으로 필터링)가 여러분을 정직하게 유지시킵니다.
DCC 백테스트와 라이브 성과 간의 격차는 거의 항상 미래 참조 누수입니다 — 전체 표본 , 동시대의 , 또는 평가 중인 거래를 포함한 데이터로 재적합하는 것 등입니다. 백테스트를 라이브 조건에 맞추는 규율은 백테스트-라이브 패리티에서 그 자체로 하나의 주제이며, DCC는 다른 어떤 모델보다도 여기서의 부주의함을 가혹하게 처벌하는 모델입니다. 깨끗한 워크포워드 평가 후에도, 동적 상관관계가 여러분의 전략에서 단순한 롤링 추정치보다 아무것도 더해주지 않는다면, 그것은 진짜이며 발표할 만한 부정적 결과입니다 — 정직한 부정적 결과의 자세가 직접 적용됩니다.
비대칭 DCC(aDCC)
단변량 레버리지 효과(2부)가 나쁜 소식이 좋은 소식보다 변동성을 더 많이 상승시키는 것을 의미하듯이, 상관관계는 결합된 양의 충격 이후보다 결합된 음의 충격 이후에 더 많이 상승합니다. Cappiello, Engle & Sheppard(2006)는 비대칭 DCC로 이를 포착하며, 음의 부분 표준화 잔차 의 외적에 의해 구동되는 항을 추가합니다.
여기서 이고 은 결합된 하락 움직임으로부터의 추가 상관관계 상승을 측정합니다. 크래시 상관관계가 지배적인 리스크인 암호화폐에서는 이 비대칭성 항이 보통 유의미하며 하나 더 추가하는 파라미터의 값어치를 합니다. rmgarch는 기본으로 aDCC를 적합시킬 수 있으며(model="aDCC"), 우리 NumPy 추정량에 항을 추가하는 것은 어렵지 않은 연습 문제입니다.
비교: 대안들과 견주어 본 DCC
암호화폐 북에 대한 공분산행렬을 얻는 여러 방법 중 DCC는 어디에 위치할까요? 정직한 요약은 다음과 같습니다.
| 방법 | 파라미터 | 확장 가능 범위 | 시변 ? | 양의 정부호 보장? | 꼬리 의존성? |
|---|---|---|---|---|---|
| 표본 / 롤링 공분산 | 0(윈도우 길이) | 모든 | 조악함(지연, 노이즈) | 아니오(패치 필요) | 아니오 |
| EWMA(RiskMetrics) | 1() | 모든 | 예(단일 감쇠) | 예 | 아니오 |
| CCC-GARCH | 개 마진 + | 수십 개 | 아니오(상수 ) | 예 | 아니오 |
| DCC-GARCH | 개 마진 + 2 | 수십 개 | 예 | 예 | 아니오 |
| aDCC-GARCH | 개 마진 + 3 | 수십 개 | 예, 비대칭 | 예 | 부분적 |
| BEKK | 예(풍부함) | 예 | 아니오 | ||
| VECH | 예(가장 풍부함) | 고통스러움 | 아니오 | ||
| GARCH-코퓰라 | 개 마진 + 코퓰라 | 수십 개(바인) | 정적 코퓰라 | 예 | 예 |
이 표를 읽는 몇 가지 방식:
- EWMA는 DCC가 도움이 된다고 주장하기 전에 모두가 이겨야 할 저렴한 베이스라인입니다. 정신적으로는 1-파라미터 특수 사례입니다 — 공분산에 직접 적용되는 단일 지수 감쇠 — 이며 많은 북에서 표본 외 성과를 개선하기가 놀랍도록 어렵습니다. 깨끗한 워크포워드에서 DCC가 EWMA를 이기지 못한다면, EWMA를 사용하십시오.
- CCC 대 DCC는 이 글 전체의 요점입니다. 동일한 인수분해이지만, CCC는 을 고정하고 DCC는 움직이게 합니다. 두 개의 추가 파라미터()가 전체 차이이며, 암호화폐에서는 그 값어치를 합니다.
- BEKK/VECH는 더 풍부한 동역학을 삽니다 — 모든 공분산이 모든 과거 충격에 반응할 수 있습니다 — 하지만 파라미터 비용이 소규모 북에 국한시킵니다. 4개 자산을 넘어서면 실질적인 선택지가 아닙니다.
- GARCH-코퓰라는 꼬리 의존성 항목에서 "예"를 받는 유일한 행입니다. 다시 그 상호보완성입니다. DCC는 결합 분포의 동적 중심을 모델링하고, 코퓰라는 그 정적 꼬리를 모델링합니다. 리스크 질문이 "모든 것이 한꺼번에 무너지면 어떻게 되는가"라면 코퓰라 파이프라인을 찾으십시오. "지금 내 헤지 비율 / 포트폴리오 분산이 얼마인가"라면 DCC를 찾으십시오.
체계적인 암호화폐 데스크의 실무적 기본값: 본체에서 헤지 비율과 동적 공분산에는 DCC(또는 aDCC), 꼬리 리스크와 CVaR에는 코퓰라 오버레이, 그리고 추가 장치가 그 값어치를 하고 있는지 정직하게 확인해주는 EWMA를 정합성 검증 베이스라인으로 사용합니다.
한계
- 스칼라 동역학. 모든 쌍에 대해 하나의 와 하나의 는 강한 제약입니다. BTC-ETH와 두 개의 무명 알트코인이 동일한 조정 속도를 공유합니다. Generalized DCC가 이를 완화하지만 DCC가 피하려 설계된 파라미터 폭발을 다시 불러들입니다.
- 2단계 효율성 손실. 준우도 추정량은 일치성은 있지만 완전한 효율성은 없으며, 순진한 표준오차는 틀립니다. 추론에 신경 쓴다면 Engle-Sheppard 보정을 사용하십시오. 신호 생성에는 점 추정치로 충분합니다.
- 기본값은 가우시안 꼬리입니다. 순수 가우시안 준우도는 결합 꼬리 리스크를 과소평가합니다. 스튜던트-t 이노베이션이 도움이 되지만, 진정한 꼬리 의존성(동시적 극단 움직임의 확률)을 위해서는 DCC는 잘못된 도구이며 코퓰라 모델이 올바른 도구입니다. DCC는 상관관계의 동적 몸통을, 코퓰라는 정적 꼬리를 제공합니다. 진지한 데스크는 둘 다 사용합니다.
- 상관관계는 인과관계가 아니며, 방향도 아닙니다. 의 상승은 분산투자가 실패하고 있다고 경고할 뿐, 시장 방향에 대해서는 아무것도 말해주지 않습니다. 리스크 신호에 방향성 기대를 과적재하지 마십시오.
- 데이터 갈증. 위의 모든 것은 길고, 깨끗하고, 동시적인 이력을 가정합니다. 암호화폐의 가장 최신이고 흥미로운 토큰들은 이 세 가지 모두를 위반합니다.
요약
- 정적 상관관계는 암호화폐에서 거짓입니다. 상관관계는 클러스터링되고, 지속되며, 급락장에서 1을 향해 치솟습니다 — 분산투자가 도움이 되어야 할 바로 그 순간입니다. 단일 표본 는 국면 전환 프로세스를 의미 없는 중간값으로 평균화합니다.
- 완전한 다변량 GARCH(VECH, BEKK)는 확장되지 않습니다. 파라미터 수는 로 증가하며, 둘 다 실무에서는 소수의 자산에 국한됩니다.
- DCC(Engle 2002)는 문제를 인수분해합니다. 이며, 는 독립적인 단변량 GARCH 적합(1-2부 재사용)에서, 는 2-파라미터 재귀에서 나옵니다. 만 최적화되므로 수십 개 자산으로 확장됩니다.
- 재귀식 을 로 정규화하면, , 조건 하에 매 단계 유효한 양의 정부호 상관행렬이 생성됩니다.
arch는 DCC를 지원하지 않습니다.arch로 마진을 적합시킨 다음 여기서 소개한 약 60줄짜리 NumPy/SciPy 추정량을 구현하거나,mgarch(Python) 또는rmgarch(R, 레퍼런스)를 사용하십시오.- 세 가지 구체적인 보상: 페어 트레이딩을 위한 동적 헤지 비율 , 리스크 기반 배분을 위한 정직한 시변 포트폴리오 분산 , 그리고 리스크 오프 국면 신호로서의 평균 쌍별 상관관계.
- 규율이 전부입니다. 상관관계 타기팅은 전체 표본 평균을 누출시키므로, 훈련 데이터에서만 를 재추정하십시오. 모든 헤지 비율을 지연시키고, 항상 앞으로 필터링하되 절대 평활화하지 마십시오. 워크포워드 평가는 타협할 수 없습니다.
- aDCC는 하락 비대칭성 항을 추가하며, 크래시 상관관계가 지배적인 암호화폐에서는 보통 그럴 만한 가치가 있습니다.
- 4부는 이 예측치들을 사용하여 변동성 타기팅 전략을 구축하고 백테스트합니다.
참고 문헌:
- Engle, R. (2002). Dynamic Conditional Correlation: A Simple Class of Multivariate Generalized Autoregressive Conditional Heteroskedasticity Models. Journal of Business & Economic Statistics, 20(3), 339-350. DOI
- Engle, R. & Sheppard, K. (2001). Theoretical and Empirical Properties of Dynamic Conditional Correlation Multivariate GARCH. NBER Working Paper 8554. DOI
- Bollerslev, T. (1990). Modelling the Coherence in Short-Run Nominal Exchange Rates: A Multivariate Generalized ARCH Model. Review of Economics and Statistics, 72(3), 498-505. DOI
- Cappiello, L., Engle, R., & Sheppard, K. (2006). Asymmetric Dynamics in the Correlations of Global Equity and Bond Returns. Journal of Financial Econometrics, 4(4), 537-572. DOI
- Engle, R. & Kroner, K. (1995). Multivariate Simultaneous Generalized ARCH. Econometric Theory, 11(1), 122-150. DOI
- Bollerslev, T., Engle, R., & Wooldridge, J. (1988). A Capital Asset Pricing Model with Time-Varying Covariances. Journal of Political Economy, 96(1), 116-131. DOI
- Galanos, A. (2022). rmgarch: Multivariate GARCH Models. R package. CRAN.
MarketMaker.cc Team
퀀트 리서치 및 전략