암호화폐 시장이 최근 좋지 않습니다. BTC는 고점에서 하락했고, 알트코인은 더 심각하며, 많은 사람들이 관망하거나 이탈하기 시작했습니다. 그런데 바로 이 시기에 또 다른 일이 조용히 뜨거워지고 있습니다. 바로 RWA, 즉 실물 자산의 토큰화입니다. 금, 미국 주식, 원유와 같은 전통 시장의 자산들이 계약 형태로 암호화폐 거래소에 등장하기 시작했습니다. 주요 거래소들은 SPY(S&P 500 ETF를 대표), 금 XAU, 원유 CL 등의 상품을 잇달아 상장했고, 기존에 있던 BTC와 합쳐져 미국 주식, 금, 원유, 암호화폐를 아우르는 다자산 거래 환경이 처음으로 온체인에서 구축되었습니다.
이 구성을 보고 한 가지 생각이 떠올랐습니다. 전통 금융에는 위험 패리티(Risk Parity)라는 매우 고전적인 개념이 있습니다. 간단히 말해, 모든 달걀을 한 바구니에 담지 말고, 각 바구니에 얼마나 담을지는 그 바구니의 위험도에 따라 결정하자는 것입니다. 이 논리는 전통 금융권에서 수십 년 동안 사용되어 왔으며, 이번 약세장에서 모두가 단일 자산에 의존하지 않고 생존할 방법을 찾고 있는 상황에서, 이제 암호화폐 시장에 이러한 자산의 계약이 등장했기에 직접 이 논리를 가져와 시도해 보기로 했습니다.
먼저 위험 패리티를 명확히 하고, 계속 읽어보겠습니다.
구체적인 방법을 설명하기 전에, '위험 패리티'라는 네 글자를 명확히 이해해야 합니다. 그렇지 않으면 이후의 논리를 따라가기 어렵습니다.
일반인이 자산을 배분할 때는 이렇게 생각할 수 있습니다. 돈을 네 등분하여 각 자산에 25%씩 넣는 것입니다. 균형 잡힌 것처럼 들리지만, 문제는 BTC는 하루에 10% 움직일 수 있는 반면, 금은 하루에 0.5% 정도 움직일 수 있다는 점입니다. 동일한 25% 비중이더라도 BTC가 가져오는 위험은 금의 20배에 달합니다. 표면적으로는 네 자산이 균등하게 분배된 것처럼 보이지만, 실제로 포트폴리오의 운명은 거의 전적으로 BTC에 의해 결정되고, 나머지 세 자산은 단지 장식에 불과합니다.
위험 패리티의 접근 방식은 반대로 생각합니다. 자금을 균등하게 나누는 것이 아니라, 위험을 균등하게 나누는 것입니다. 변동성이 큰 BTC는 적게 배분하고, 안정적인 금은 많이 배분하는 것입니다. 하지만 이것은 단지 첫걸음에 불과합니다. 더 중요한 것은 자산 간의 독립성입니다. BTC와 미국 주식은 특정 시장 상황에서 함께 하락할 수 있습니다. 두 자산이 높은 방향성을 가진다면, 각각의 변동성 차이가 크더라도 위험을 균등하게 분배하는 것은 의미가 제한적입니다. 진정한 위험 패리티는 각 자산의 변동성과 다른 자산과의 상관관계를 동시에 고려하여 공분산 행렬을 사용해 각 자산이 포트폴리오 전체 위험에 기여하는 한계를 측정하고, 궁극적으로 각 자산의 위험 기여도가 대략 동일하도록 만듭니다. 이 논리의 장점은 특정 자산이 갑자기 폭락하더라도 전체 포트폴리오가 무너지지 않는다는 점입니다.
먼저 자산을 잘 선택해야 분산이 의미 있습니다.
위험 패리티를 구현하기 위해 가장 먼저 해야 할 일은 포트폴리오에 포함할 자산을 선택하는 것입니다. 자산 선택이 잘못되면 이후의 계산이 아무리 정밀해도 소용이 없습니다.
자산 풀은 SPY, XAU, CL, BTC 네 가지로 선정했습니다. 이 네 가지를 선택한 데는 논리가 있습니다. 이들의 움직임은 일반적으로 완전히 동기화되지 않습니다. 경제가 좋을 때는 주식이 오르고, 안전자산 선호 심리가 생기면 금이 오르며, 인플레이션 기대치가 높을 때는 원유와 금이 함께 오르고, 암호화폐 시장은 때로는 주식과 같은 방향으로 움직이다가 때로는 완전히 이탈합니다. 바로 이들 간의 상관관계가 높지 않기 때문에 함께 포트폴리오에 넣었을 때 위험 분산 효과가 의미 있습니다. 만약 네 자산이 매일 같이 오르고 같이 내린다면 분산은 착각에 불과하며, 어떤 방법으로도 구제할 수 없습니다.
자산을 선택한 후의 다음 문제는 각 자산에 얼마를 배분해야 하는가입니다. 이것이 바로 위험 패리티가 실제로 계산해야 할 부분입니다.
각 자산에 얼마를 배분할지 계산하는 방법
전략의 계산 로직은 두 단계로 나뉩니다.
첫 번째 단계는 네 자산의 캔들 데이터를 가져와 타임스탬프 기준으로 정렬하는 것입니다. 전략은 1시간 캔들(PERIOD_H1)을 데이터 입력으로 사용합니다. 이 단계는 간단해 보이지만, 실제로 RWA 계약 종목은 때때로 데이터가 누락될 수 있습니다. 특정 시점에 SPY의 호가가 없다면, 해당 시점의 데이터는 전체 행을 삭제하고 네 자산 모두 동시에 호가가 존재하는 시점만 남겨둔 후 후속 계산을 수행합니다.
javascript
for (var k = 0; k < keys.length; k++) {
var row = timeMap[keys[k]], ok = true;
for (var i = 0; i < LABELS.length; i++) {
if (row[LABELS[i]] === undefined) { ok = false; break; }
}
if (ok) timestamps.push(parseInt(keys[k]));
}
데이터 정렬 후, 종가 시퀀스를 로그 수익률로 변환합니다. 즉 ln(현재 가격 / 이전 기간 가격)입니다. 단순 등락률 대신 로그 수익률을 사용하는 이유는 시간 가산성(time additivity)을 가지기 때문입니다. 여러 기간을 누적하면 전체 로그 수익률이 바로 더해져 처리하기 편리합니다. 또한 자산 가격이 기하 브라운 운동(geometric Brownian motion)을 따른다는 일반적인 가정 하에서 로그 수익률은 정규 분포를 따르며, 이후 공분산 행렬 계산 프레임워크와 호환됩니다. 다만 암호화폐 자산의 실제 수익률은 두꺼운 꼬리(heavy tail) 특성을 가지는 경우가 많아 주의해야 할 가정 편향이며, 극단적인 시장 상황에서는 공분산 행렬이 실제 위험을 과소평가할 수 있습니다.
javascript
function calcLogReturns(prices) {
var r = [];
for (var i = 1; i < prices.length; i++) {
var prev = prices[i - 1], cur = prices[i];
if (!prev || !cur || prev <= 0 || cur <= 0) { r.push(0); continue; }
r.push(Math.log(cur / prev));
}
return r;
}
두 번째 단계는 이러한 수익률 시퀀스를 사용하여 공분산 행렬을 계산하는 것입니다. 단순히 역사적 평균 공분산을 계산하는 것은 너무 조악합니다. 여기서는 EWMA(지수 가중 이동 평균) 가중치를 사용합니다. 최근 데이터에 더 높은 가중치를 부여하여 공분산 행렬이 시장 상태 변화를 더 빨리 감지할 수 있도록 합니다.
javascript
for (var t = T - 1; t >= 0; t--) {
var w = Math.pow(lambda, T - 1 - t);
c += w * (retMat[i][t] - means[i]) * (retMat[j][t] - means[j]);
ws += w;
}
cov[i][j] = c / ws;
cov[j][i] = cov[i][j];
lambda는 감쇠 계수로, 전략은 기본적으로 EWMA_LAMBDA = 0.94를 사용합니다. 이 값은 RiskMetrics가 일간 데이터에 대해 경험적으로 설정한 값을 참고한 것입니다. 다만 RiskMetrics의 0.94는 일간 데이터를 위해 설계된 값이며, 전략은 1시간 데이터를 사용하여 빈도가 더 높습니다. 공분산 행렬이 최근 변화에 대한 민감도를 일간 기준 0.94와 동일하게 유지하려면 이론적으로 1에 더 가까운 값으로 변환해야 합니다. 그러나 실제 사용에서는 0.94가 시간 단위에서도 여전히 수용 가능한 시작점이며, 최근 데이터 가중치가 높고 과거 데이터가 빠르게 감소하는 구성을 나타내므로 실제 백테스팅 결과에 따라 추가 조정할 수 있습니다. lambda가 1에 가까울수록 과거 데이터의 영향이 오래 지속되어 공분산 행렬이 최근 변화에 둔감해지고, lambda가 작을수록 전략이 시장 상태 변화에 더 민감해지지만 단기 노이즈로 인해 불필요한 리밸런싱이 발생하기 쉽습니다.
계산 후 대각선에 정규화 항(regularization term)을 추가하며, 계수는 대각선 평균의 0.1%로 설정됩니다(eps = diagMean * 0.001). 0.001배 계수는 테스트를 거쳐 선정된 값으로, 수치적으로 행렬의 양의 정부호(positive definiteness)를 보장하기에 충분하면서도 공분산 구조에 미치는 영향은 무시할 수 있습니다. 또한 한 가지 단순화에 대해 설명합니다. EWMA 공분산의 엄밀한 계산은 가중 평균을 사용하여 편차를 계산해야 하지만, 코드에서는 전체 롤링 윈도우의 단순 산술 평균을 사용합니다. 수익률 평균이 0에 가까운 경우(금융 자산 단기 수익률의 일반적인 상태) 이 단순화의 영향은 무시할 수 있지만, 평균이 0에서 현저히 벗어나는 상황에서는 미세한 편향이 발생할 수 있습니다.
공분산 행렬이 준비되면, 다음은 실제 위험 패리티 계산입니다. 각 자산의 포트폴리오 위험 기여도가 최대한 동일하도록 하는 가중치 집합을 찾는 것입니다. 반복이 시작되기 전에, 전략은 등변동성 포트폴리오 공분산을 통해 각 자산의 방향을 미리 판단하며, 결과는 signs[] 배열에 저장됩니다(+1은 롱, -1은 숏). 반복 과정에서는 이 미리 판단된 고정 부호를 계속 사용하며, 가중치 크기만 조정하고 방향은 변경하지 않습니다. 이는 수치적 안정성을 위해 가중치가 반복 중 수치적 요동으로 인해 방향이 반복적으로 변하는 것을 방지하기 위함입니다.
이 문제는 해석적 해가 없으므로, 반복을 통해 근사합니다. 각 라운드마다 현재 위험 기여도를 계산하고, 기여도가 너무 큰 자산의 가중치는 낮추고, 너무 작은 자산의 가중치는 높여서 수렴할 때까지 반복적으로 조정합니다.
javascript
for (var iter = 0; iter < 2000; iter++) {
var trc = riskContribs(w, scaledCov);
var pv = portVol(w, scaledCov);
var target = pv / n;
var obj = 0;
for (var i = 0; i < n; i++) {
for (var j = i + 1; j < n; j++) {
var d = Math.abs(trc[i]) - Math.abs(trc[j]);
obj += d * d;
}
}
if (obj < 1e-12) break;
var nw = [], ns = 0;
for (var i = 0; i < n; i++) {
var rc = Math.abs(trc[i]);
var sign = signs[i]; // 미리 판단한 고정 부호 사용
var a = target / rc;
var v = sign * Math.max(Math.abs(w[i]) * Math.pow(a, 0.5), 1e-6);
nw.push(v);
ns += Math.abs(v);
}
// 절대값 정규화: 각 자산 가중치의 절대값 합이 1이 되도록 함
for (var i = 0; i < n; i++) w[i] = nw[i] / ns;
}
수렴 기준은 모든 자산의 위험 기여도 차이의 제곱합이 1e-12 미만일 때입니다. 이 시점에서 각 자산의 위험 기여도가 충분히 가까워졌다고 판단하고 반복을 중단합니다. 최대 반복 횟수는 2000회로 제한하여 공분산 행렬이 병적일 때 무한 루프를 방지합니다. 실제로는 보통 수백 회 이내에 수렴합니다. 상한에 도달해도 수렴하지 않으면 입력 데이터나 공분산 행렬에 문제가 있는 것이며, 이 경우 전략은 동일 비중 롱 포지션으로 다운그레이드되어 시스템이 공회전하지 않도록 보장합니다.
각 자산의 위험 기여도는 해당 자산의 가중치와 한계 위험의 곱으로 정의됩니다. 결과는 음수가 될 수 있으며, 이는 해당 자산이 포트폴리오 전체 변동성을 낮추는 역할을 함을 의미합니다.
javascript
function riskContribs(w, cov) {
var sv = matVecMul(cov, w);
var pv = portVol(w, cov);
var trc = [];
for (var i = 0; i < w.length; i++) trc.push(w[i] * sv[i] / pv);
return trc;
}
가중치는 음수일 수 있습니다, 즉 공매도 가능
표준 위험 균형 전략은 일반적으로 롱 포지션만 취하지만, 파생상품 시장에서는 공매도가 가능하므로 이 전략은 가중치가 음수가 될 수 있도록 확장되었습니다.
판단 로직은 다음과 같습니다. 먼저 등변동성 참조 포트폴리오를 계산합니다. 변동성이 높은 자산은 가중치가 낮고, 변동성이 낮은 자산은 가중치가 높습니다. 그런 다음 각 자산과 이 참조 포트폴리오의 공분산이 양인지 음인지 확인합니다. 공분산이 음수이면 해당 자산이 포트폴리오 전체와 반대 방향으로 움직이는 경향이 있음을 의미하므로, 이를 공매도하면 포트폴리오의 전체 위험을 낮추는 데 도움이 됩니다. 따라서 가중치를 음수로 설정하며, 파생상품 시장에서는 공매도(Short)에 해당합니다.
설명하자면, 이는 엄밀한 롱-숏 위험 균형 이론적 해법이 아닌 공학적 근사치입니다. 엄밀한 롱-숏 위험 균형은 완전한 공분산 행렬을 기반으로 제약 최적화를 수행해야 하며, 계산 비용이 더 높습니다. 여기서의 근사치는 대부분의 시장 상태에서 합리적인 방향 판단을 제공하지만, 여러 자산이 동시에 참조 포트폴리오와 음의 공분산을 가질 때, 여러 자산을 동시에 공매도하는 것이 포트폴리오 위험을 여전히 낮출 수 있는지는 구체적으로 검증해야 하며, 일괄적으로 판단할 수 없습니다.
javascript
var invVols = [], sumInvVol = 0;
for (var i = 0; i < n; i++) {
var vol = Math.sqrt(Math.max(scaledCov[i][i], 1e-16));
invVols.push(1 / vol);
sumInvVol += 1 / vol;
}
var eqVolWeights = [];
for (var i = 0; i < n; i++) {
eqVolWeights.push(invVols[i] / sumInvVol);
}
var covWithPortfolio = 0;
for (var j = 0; j < n; j++) {
covWithPortfolio += eqVolWeights[j] * scaledCov[i][j];
}
var dir = covWithPortfolio < 0 ? -1 : 1;
Log('[방향 판단]', LABELS[i],
'등변동성 포트폴리오와의 공분산:', _N(covWithPortfolio, 8),
'→', dir < 0 ? '🔴 공매도(short)' : '🟢 매수(long)');
방향이 결정되면 signs[] 배열에 고정 저장되며, 이후 반복 해결 과정에서 변경되지 않습니다. 반복은 가중치의 크기만 조정하고 방향은 변경하지 않습니다. 방향이 결정된 후에는 포트폴리오 전체에 얼마나 많은 레버리지를 추가해야 하는지 처리해야 합니다.
레버리지는 높을수록 좋은 것이 아니라 변동성에 따라 조정됩니다
이 전략에는 포트폴리오 전체의 변동성을 미리 설정된 수준 근처로 제어하는 것을 목표로 하는 레버리지 조정 메커니즘이 내장되어 있습니다. 비유하자면, 운전을 할 때 목표 속도를 시속 60km로 설정했다고 가정해 보겠습니다. 고속도로에서는 도로 상태가 좋으므로 액셀을 조금 더 밟을 수 있고, 시내에서는 도로 상황이 복잡하므로 속도를 줄입니다. 전략의 레버리지 메커니즘도 이와 유사합니다. 시장 전체 변동성이 낮을 때는 적절히 레버리지를 높여 포트폴리오의 위험 수준을 목표치에 도달하게 하고, 시장 변동성이 높아지면 자동으로 레버리지를 낮추어 익스포저를 축소합니다.
이 전략은 1시간 봉을 사용하며, 1년은 정확히 8760개의 봉이 있으므로 연율화 계수는 직접 sqrt(8760)을 사용합니다. 다른 주기를 사용할 경우 이 계수를 함께 조정해야 합니다. 15분 봉은 sqrt(35040), 4시간 봉은 sqrt(2190), 일봉은 sqrt(365)에 해당합니다.
javascript
function calcLeverage(w, cov) {
var pv = portVol(w, cov) * Math.sqrt(8760);
if (!isFinite(pv) || pv <= 0) return 1;
return Math.min(TARGET_VOL / pv, MAX_LEVERAGE);
}
포트폴리오의 연율화 변동성을 목표 변동성으로 나누면 적용해야 할 레버리지 배수가 산출되며, 동시에 극단적인 상황에서 레버리지가 통제 불능 상태가 되는 것을 방지하기 위해 상한을 설정합니다. 이는 최고 수익을 추구하는 것이 아니라 위험 예산 관리를 수행하는 것입니다. 얼마나 많은 위험을 감수하여 얼마만큼의 수익을 얻을지는 사전에 결정된 것이지, 시장 흐름에 따라 표류하는 것이 아닙니다.
레버리지가 계산되면 포트폴리오를 구축할 수 있습니다. 동시에 전략은 현재 변동성 수준에 따라 메인 루프의 폴링 간격을 자동으로 조정합니다. 변동성이 높을수록 갱신 빈도가 빨라지고, 변동성이 낮으면 속도를 늦추어 불필요한 계산과 거래 마찰을 줄입니다.
javascript
function getAdaptiveSleep(w, cov) {
var av = portVol(w, cov) * Math.sqrt(8760);
if (av > 0.50) return FAST_INTERVAL; // 15분
else if (av > 0.30) return MID_INTERVAL; // 30분
else return SLOW_INTERVAL; // 60분
}
언제 리밸런싱을 할까
시장은 매일 움직이며 가중치는 계속해서 초기 설계에서 이탈합니다. 이를 방치하면 시간이 지남에 따라 포트폴리오가 실제로 감수하는 위험과 예상 위험 사이에 큰 차이가 발생합니다. 전략은 리밸런싱을 트리거하는 두 가지 조건을 설정합니다. 첫째는 정기적: 일정 시간 간격마다 강제로 가중치를 재계산합니다. 둘째는 편차 초과: 특정 자산의 실제 가중치와 목표 가중치의 편차가 임계값을 초과하거나, 롱-숏 방향이 반전될 경우 즉시 리밸런싱을 트리거하여 다음 정기 시점을 기다리지 않습니다.
상대 편차를 계산할 때 분모는 이전 가중치의 절대값입니다. 특정 자산의 가중치가 매우 작아져 0에 가까워지면 상대 편차가 증폭되어 잦은 리밸런싱이 발생할 수 있습니다. 전략은 이에 대한 보호 장치를 마련했습니다. lastWeights[i]가 0인 경우 편차 검사를 건너뛰어 0으로 나누기로 인한 오작동을 방지합니다.
javascript
if (!lastWeights) {
needRebal = true;
rebalReason = '최초 포지션 구축';
} else if ((now - lastTime) > REBALANCE_HOURS * 3600000) {
needRebal = true;
rebalReason = '정기 리밸런싱(' + REBALANCE_HOURS + 'h)';
} else {
for (var i = 0; i < weights.length; i++) {
if ((weights[i] >= 0) !== (lastWeights[i] >= 0)) {
needRebal = true;
rebalReason = LABELS[i] + ' 방향 전환(롱↔숏)';
break;
}
if (lastWeights[i] !== 0 &&
Math.abs(weights[i] - lastWeights[i]) / Math.abs(lastWeights[i]) > DRIFT_THRESHOLD) {
needRebal = true;
rebalReason = LABELS[i] + ' 가중치 편차 임계 초과';
break;
}
}
}
리밸런싱이 트리거되면 전략은 각 자산의 목표 명목 금액을 계산합니다. 양수는 롱, 음수는 숏을 나타내며, 현재 포지션과 비교하여 증분, 감소 또는 방향 전환을 결정합니다. 방향 전환 시에는 기존 반대 방향 포지션을 먼저 청산한 후 새로운 방향으로 포지션을 열어 롱과 숏을 동시에 보유하지 않도록 합니다.
javascript
if (targetSide === 'long' && shortQty > 0) {
exchange.CreateOrder(sym, "closesell", -1, shortQty);
}
if (targetSide === 'short' && longQty > 0) {
exchange.CreateOrder(sym, "closebuy", -1, longQty);
}
if (diffQty > 0) {
exchange.CreateOrder(sym, targetSide === 'long' ? "buy" : "sell", -1, diffQty);
} else if (diffQty < 0) {
exchange.CreateOrder(sym, targetSide === 'long' ? "closebuy" : "closesell", -1, Math.abs(diffQty));
}
이렇게 하면 잦은 거래로 인한 수수료 발생을 막을 수 있을 뿐만 아니라 포트폴리오가 설계 의도에서 장기간 벗어나는 것을 방지합니다. 정상적인 상황에서는 리밸런싱 메커니즘이 대부분의 시장 변화에 대응하기에 충분합니다. 하지만 시장이 때로는 정상적이지 않기 때문에 추가적인 안전장치가 필요합니다.
그리고 긴급 서킷 브레이커
일반 리밸런싱 외에도 전략에는 긴급 포지션 축소 메커니즘이 있습니다. 매 주기마다 모든 현재 포지션을 점검하고, 이전에 기록된 가격과 비교하여 각 방향의 불리한 변동 폭을 확인합니다. 롱 포지션이 크게 하락하거나 숏 포지션이 크게 상승하여 5%를 초과하면 전략은 자동으로 포지션의 절반을 축소하여 손실을 우선 통제하고 다음 리밸런싱을 기다리지 않습니다.
javascript
if (pos.side === 'long') {
drop = (last - cur) / last;
} else if (pos.side === 'short') {
drop = (cur - last) / last;
}
if (drop >= EMERGENCY_DROP) {
Log('🚨 긴급 위험 트리거! [' + label + '][' + pos.side + '] 불리한 변동:',
_N(drop * 100, 2) + '%', '이전:', _N(last, 4), '→ 현재:', _N(cur, 4));
if (mode === 'live') emergencyReduceLive(sym, label, pos.side, EMERGENCY_REDUCE);
else emergencyReducePaper(sym, label, cur, pos.side, EMERGENCY_REDUCE);
}
실제 거래 모드에서는 거래소 청산 인터페이스를 호출하고, 시뮬레이션 모드에서는 로컬 상태에서 증거금과 현금을 업데이트하고 포지션 비율에 따라 해당 증거금을 해제하며, 현재 손익을 계산하여 거래 기록에 기록합니다.
여기 하나의 설계 세부 사항을 설명해야 합니다: 긴급 축소가 트리거된 후 기준 가격이 즉시 리셋되지 않고, 다음 점검 시에도 트리거 전의 가격을 참조 기준으로 삼습니다. 이는 자산이 지속적으로 불리한 방향으로 움직이는 상황에서 해당 메커니즘이 매 주기마다 반복적으로 트리거되어 포지션이 소진되거나 다음 정기 리밸런싱이 기준 가격을 리셋할 때까지 점진적으로 축소된다는 것을 의미합니다. 이는 의도적인 설계입니다 – 극단적인 단방향 시장에서 한 번만 축소하고 멈추는 것보다 지속적인 축소가 손실 통제에 더 효과적입니다. 그러나 부작용으로, 가격이 임계값을 잠시 하회했다가 빠르게 반등할 경우 과도한 축소로 인해 반등을 놓칠 수 있습니다. 정상 시장에서는 이 메커니즘이 거의 트리거되지 않지만, 블랙 스완 사건에서 끝까지 버티는 상황을 방지할 수 있습니다.
실제 동작 모습
플랫폼에서 전략이 실행되면 대시보드에 각 자산이 현재 롱인지 숏인지, 각각의 가중치, 현재 레버리지 배수, 포트폴리오 전체의 연간 변동성 추정치, 그리고 네 자산 간의 상관관계 행렬이 실시간으로 표시됩니다. 미실현 손익은 매분 갱신되며, 전략의 핵심 계산은 시장 변동성 수준에 따라 폴링 빈도를 자동으로 전환합니다.
이 1분 갱신은 멀티스레드로 구현된 것이 아니라 메인 루프의 대기 시간 동안 중첩된 서브 루프를 사용하여 1분마다 깨어나 최신 가격을 가져오고, 미실현 손익과 자본 곡선을 업데이트합니다. 전략 폴링 간격이 누적되면 서브 루프를 종료하고 다음 전략 계산 주기로 진입합니다. 전체 전략은 완전히 단일 스레드로 동시성 위험이 없습니다.
javascript
function sleepWithPnlRefresh(totalSleepMs, weights, leverage, covMatrix, corrMatrix) {
var elapsed = 0;
while (elapsed < totalSleepMs) {
var step = Math.min(PNL_INTERVAL, totalSleepMs - elapsed);
Sleep(step);
elapsed += step;
var prices = getTickers();
var equity = calcEquity(prices);
var initCap = _G('pt_initCapital') || INIT_CAPITAL;
_chart.add(0, [new Date().getTime(), equity]);
LogProfit(equity - initCap, '&');
renderDashboard(weights, leverage, covMatrix, corrMatrix, prices, totalSleepMs, true);
}
}
또한 전략은 시뮬레이션 모드를 지원하여 실제 자금을 사용하지 않고도 로직을 완전히 실행하고 파라미터를 조정한 후, 실제 거래로 전환하기 전에 동작이 예상과 일치하는지 확인할 수 있습니다. 이 설정으로 시뮬레이션을 일정 기간 실행한 후 실제 결과를 살펴보겠습니다.
시뮬레이션 결과
전략 테스트 기간 동안 전체적으로 수익 상태입니다. 포지션 방향: BTC, XAU, SPY는 모두 롱, CL 원유는 숏입니다. 이 기간 동안 미-이란 관계가 완화될 조짐을 보이면서 지정학적 리스크 프리미엄이 하락하여 원유 가격이 비교적 크게 하락했습니다. 원유 숏이 이번 기간의 주요 수익원이었습니다. 이 기간의 시장 흐름은 전략에 유리했지만, 미래에도 항상 그럴 것이라고 단정할 수 없습니다. 사실, 이 전략에는 아직 명확히 해결되지 않은 부분이 많아 솔직하게 말하지 않으면 안 됩니다.
명확히 해결되지 않은 부분
이 전략을 구축하는 과정에서 몇 가지 문제가 완전히 해결되지 않았습니다.
첫째, RWA 계약의 유동성은 BTC에 비해 현저히 낮습니다. SPY, XAU, CL 같은 종목은 체인 상에서 매우 새롭기 때문에 슬리피지와 호가창 깊이는 미지수입니다. 시뮬레이션에서는 이 문제를 느낄 수 없지만, 실제 거래에서는 실제로 발생합니다.
둘째, 이 전략은 각 자산 간에 일정한 분산 효과가 유지되는 것에 의존합니다. 그러나 시장이 극도로 공포에 휩싸일 때 위험 자산 간의 상관관계는 급격히 상승하는 경향이 있어 분산 효과가 크게 줄어들며, 바로 그런 상황에서 보호가 가장 필요할 때입니다.
셋째, 전통 자산은 거래 시간 외에는 가격이 거의 움직이지 않지만, BTC는 24시간 변동합니다. 이로 인해 공분산 행렬이 자산 간의 실제 연관성을 과소평가하게 됩니다 – 미국 주식 시장이 마감한 후에도 BTC는 계속 움직이며, 이 기간의 변동성에 대응하는 SPY 데이터가 없어 전통 시장이 개장할 때 전략의 연관성 판단이 이미 지연되었을 수 있습니다.
넷째, 과거 데이터가 제한적이어서 공분산 행렬의 단기 안정성에 의문이 있습니다. EWMA 감쇠 계수, 목표 변동성, 리밸런싱 임계값 등의 파라미터는 모두 경험적 값으로 엄격한 검증을 거치지 않았습니다. 숏 판단에는 등변동성 참조 포트폴리오의 공분산 부호를 사용하는데, 이는 공학적 근사치입니다. 여러 자산이 동시에 참조 포트폴리오와 음의 공분산을 가질 때 모두 숏하는 것이 실제로 포트폴리오 리스크를 낮추는지 여부는 각각 검증해야 하며, 단순히 적용할 수 없습니다. 암호화폐 자체는 두꺼운 꼬리 특성을 가지며, 실제 수익률 분포는 정규 분포에서 벗어납니다. 극단적인 시장 상황에서는 공분산 행렬이 리스크를 과소평가할 가능성이 있으며, 이는 현재 프레임워크를 사용할 때 반드시 감수해야 하는 가정적 편향입니다.
다섯째, 실거래 환경에서 방향 전환 시 포지션 청산 명령 후 전략이 일정 시간을 기다린 후 계속해서 후속 매수/매도를 실행하며, 체결 확인을 기다리지 않습니다. 거래소 응답 속도가 느리거나 네트워크 지연이 높은 경우 기존 포지션이 완전히 청산되지 않은 상태에서 새로운 포지션을 열 위험이 있습니다. 모의 거래에서는 실제 체결이 이루어지지 않기 때문에 이 문제를 인식할 수 없으며, 실거래로 전환하기 전에 특정 거래소의 응답 속도에 따라 대기 시간 조정이 필요한지 평가해야 합니다.
이러한 문제는 모의 거래만으로는 발견할 수 없으며, 더 정밀한 모델링과 이론적 추론을 통해 모든 가정을 하나하나 검증해야만 이 로직이 암호화폐 시장에서 실제로 유효한지 알 수 있습니다.
마지막으로
이 전략의 출발점은 간단합니다. 암호화폐 시장이 약세장이고, RWA 계약이 마침내 대자산군의 지도를 완성했으며, 전통 금융에는 수십 년간 축적된 자산배분 이론이 있습니다. 이 두 가지가 만난 지금, 시도해볼 가치가 있습니다. 코드는 완전하고, 로직은 투명하며, 파라미터는 조정 가능합니다. 하지만 결국 이것은 하나의 출발점에 불과하며, 진정한 실거래 검증을 통과할 수 있는 자산배분 전략이 되기에는 아직 많이 부족합니다. 더 좋은 아이디어가 있다면 함께 완성해 나가기를 환영합니다.
위 내용은 전략 탐구 과정을 기록한 것일 뿐, 어떤 투자 권고도 구성하지 않습니다. 거래 계약 거래는 큰 위험을 수반하며, 모의 거래 성과는 실거래 결과를 대표하지 않습니다. 실제 자금을 투입하기 전에 관련 위험을 충분히 숙지하시기 바랍니다.
전략 소스코드: RWA 대자산군 위험 패리티 전략
- 1



