[TOC]

최근 Zhihu에서 “암호화폐 세계에서 빠르게 부자가 되는 안정적인 방법: 3개월 만에 3000U에서 12000U로”라는 매우 매력적인 제목의 게시물을 발견했습니다.
나는 그냥 웃었다. 안정적이라고? 벼락부자라고? 이 두 단어를 함께 쓰는 건 보통 두 가지 중 하나를 의미한다. 사기이거나, 아니면 아직 블랙 스완 사건을 겪어보지 못한 사람이거나.
하지만 양적 거래 개발자로서, 이 전략 설명을 보자마자 클릭해서 살펴보지 않을 수 없었습니다.

그 책을 읽고 나서 깊은 생각에 잠겼다…
“아마도, 어쩌면, 아마도, 희망, 소망”, “어쩌면” 같은 표현이 어느 정도 의미가 있는 것 같나요?
그럼 이제 발명가 정량화 플랫폼을 열고 시작해 볼까요!
가장 간단한 논리는 다음과 같습니다.
// 伪代码
if (btcChange > 2%) {
开多 1手 BTC
开空 1手 ETH
}
코드를 작성하고 나서 자신 있게 백테스트 버튼을 클릭했는데…

우리는 엄청난 손실을 보고 있어요.
주가 상승률이 급격히 떨어지는 것을 보면서 깊은 자기 회의에 빠졌습니다.
차분히 생각해 보면 문제는 명확하다.
비트코인 1랏과 이더리움 1랏은 서로 다릅니다.
현재 비트코인(BTC)은 개당 10만 달러의 가치가 있는 반면, 이더리움(ETH)은 약 3천 달러에 불과합니다. 1:1 비율로 헤지하는 것은 헤지가 아니라 돈을 그냥 주는 것과 마찬가지입니다.
적절한 헤지 전략을 세우려면 다음 사항을 고려해야 합니다.
이 코드는 전략의 핵심 계산 엔진으로, 비트코인(BTC) 대비 이더리움(ETH)의 베타 계수 계산을 완벽하게 구현합니다. 여기서 베타 계수는 두 가지 핵심 정보, 즉 기초 가격 비율과 변동성 상관관계를 나타내며, 이는 헤지해야 할 비율을 직접적으로 결정합니다.
// 计算ETH相对BTC的Beta系数
function calculateBeta(btcRecords, ethRecords, lookback) {
// 数据不足时的降级处理
if (btcRecords.length < lookback + 1 || ethRecords.length < lookback + 1) {
Log("⚠️ K线数据不足,使用当前价格比作为默认Beta")
let btcPrice = btcRecords[btcRecords.length - 1].Close
let ethPrice = ethRecords[ethRecords.length - 1].Close
let defaultBeta = btcPrice / ethPrice
betaInfo.currentBeta = defaultBeta
betaInfo.correlation = 0
betaInfo.priceRatio = defaultBeta
betaInfo.returnBeta = 1.0
betaInfo.lastUpdate = new Date().toLocaleString()
Log(" 默认Beta =", _N(defaultBeta, 2), "| 价格比:", _N(btcPrice, 0), "/", _N(ethPrice, 0))
return defaultBeta
}
let btcReturns = []
let ethReturns = []
let priceRatios = []
// 第一步:计算日收益率 + 历史价格比
for (let i = btcRecords.length - lookback; i < btcRecords.length; i++) {
// 日收益率 = (今日收盘 - 昨日收盘) / 昨日收盘
let btcRet = (btcRecords[i].Close - btcRecords[i-1].Close) / btcRecords[i-1].Close
let ethRet = (ethRecords[i].Close - ethRecords[i-1].Close) / ethRecords[i-1].Close
btcReturns.push(btcRet)
ethReturns.push(ethRet)
// 记录每天的价格比
let ratio = btcRecords[i].Close / ethRecords[i].Close
priceRatios.push(ratio)
}
// 第二步:计算历史平均价格比
let avgPriceRatio = priceRatios.reduce((a, b) => a + b, 0) / priceRatios.length
// 第三步:计算价格比的波动性
let priceRatioVariance = 0
for (let i = 0; i < priceRatios.length; i++) {
let diff = priceRatios[i] - avgPriceRatio
priceRatioVariance += diff * diff
}
priceRatioVariance /= (priceRatios.length - 1)
let priceRatioStd = Math.sqrt(priceRatioVariance)
let priceRatioCv = priceRatioStd / avgPriceRatio // 变异系数
// 第四步:计算收益率的均值
let btcMean = btcReturns.reduce((a,b) => a+b, 0) / btcReturns.length
let ethMean = ethReturns.reduce((a,b) => a+b, 0) / ethReturns.length
// 第五步:计算协方差和方差
let covariance = 0
let btcVariance = 0
let ethVariance = 0
for (let i = 0; i < btcReturns.length; i++) {
let btcDiff = btcReturns[i] - btcMean
let ethDiff = ethReturns[i] - ethMean
covariance += btcDiff * ethDiff
btcVariance += btcDiff * btcDiff
ethVariance += ethDiff * ethDiff
}
covariance /= (btcReturns.length - 1)
btcVariance /= (btcReturns.length - 1)
ethVariance /= (ethReturns.length - 1)
// 第六步:计算收益率Beta
// Beta = Cov(ETH, BTC) / Var(BTC)
let returnBeta = covariance / btcVariance
// 第七步:计算相关系数
// 相关系数 = Cov(ETH, BTC) / (Std(BTC) × Std(ETH))
let correlation = covariance / Math.sqrt(btcVariance * ethVariance)
// 第八步:最终Beta = 历史平均价格比 × 收益率Beta
let finalBeta = avgPriceRatio * returnBeta
// 第九步:限制Beta范围,避免极端值
let minBeta = avgPriceRatio * 0.5
let maxBeta = avgPriceRatio * 2.0
finalBeta = Math.max(minBeta, Math.min(maxBeta, finalBeta))
// 第十步:获取当前价格比
let currentBtcPrice = btcRecords[btcRecords.length - 1].Close
let currentEthPrice = ethRecords[ethRecords.length - 1].Close
let currentPriceRatio = currentBtcPrice / currentEthPrice
// 更新Beta信息到全局
betaInfo.currentBeta = finalBeta
betaInfo.correlation = correlation
betaInfo.returnBeta = returnBeta
betaInfo.avgPriceRatio = avgPriceRatio
betaInfo.currentPriceRatio = currentPriceRatio
betaInfo.priceRatioStd = priceRatioStd
betaInfo.priceRatioCv = priceRatioCv
betaInfo.lastUpdate = new Date().toLocaleString()
return finalBeta
}
주요 기능 및 로직:
Cov(ETH,BTC) / Var(BTC)이는 이더리움 수익률이 비트코인 수익률 변화에 얼마나 민감한지를 나타냅니다.베타 버전 출시 후, 이론과 현실 사이의 간극을 메우고 이론적 계수를 거래소에서 실제로 거래 가능한 수량으로 변환해야 했습니다. 이 코드 부분은 바로 이러한 중요한 변환 작업을 수행했습니다.
// 计算对冲张数
function calculateHedgeAmount(beta) {
let btcCoinAmount = config.btcCoinAmount // 0.1 BTC
let ethCoinAmount = btcCoinAmount * beta // ETH数量 = 0.1 × Beta
// 转换成合约张数
let btcContracts = Math.floor(btcCoinAmount / contractInfo.btcCtVal)
btcContracts = Math.max(1, btcContracts) // 至少1张
let ethContracts = Math.floor(ethCoinAmount / contractInfo.ethCtVal)
ethContracts = Math.max(1, ethContracts)
// 实际开仓的币数
let actualBtcCoins = btcContracts * contractInfo.btcCtVal
let actualEthCoins = ethContracts * contractInfo.ethCtVal
Log("🎯 对冲计算 | Beta:", _N(beta, 3),
"\n BTC: ", _N(actualBtcCoins, 4), "币 =", btcContracts, "张 (CtVal:", contractInfo.btcCtVal, ")",
"\n ETH: ", _N(actualEthCoins, 4), "币 =", ethContracts, "张 (CtVal:", contractInfo.ethCtVal, ")",
"\n 实际比例:", _N(actualEthCoins / actualBtcCoins, 3))
return {
btc: btcContracts,
eth: ethContracts,
btcCoins: actualBtcCoins,
ethCoins: actualEthCoins,
beta: beta
}
}
주요 변환 단계:
이 섹션에서는 전략 실행 및 위험 관리에 대해 다루며, 계산된 헤지 계획을 실제 거래 운영으로 전환하고 위험을 관리하는 방법을 설명합니다. 진입 논리는 매수 포지션을 예로 들어 설명하지만, 매도 포지션도 동일한 방식으로 이해할 수 있습니다.
트리거 조건 설계이 시스템은 BTC 가격 상승률이 2% 이상이고 BTC 가격 상승률이 ETH 가격 상승률보다 높다는 두 가지 조건을 사용합니다. 이는 충분한 시장 변동성을 보장하고 예상되는 상대적 강도 관계가 성립하도록 합니다.
// BTC涨 > 2% 且涨幅大于ETH → 开多BTC + 开空ETH
if (btcChange > 0.02 && btcChange > ethChange) {
let amounts = calculateHedgeAmount(beta)
// 先开BTC多单
let btcOrder = createMarketOrder(config.btcSymbol, "buy", amounts.btc)
if (!btcOrder) {
Log("❌ BTC开多失败")
return null
}
// 再开ETH空单
let ethOrder = createMarketOrder(config.ethSymbol, "sell", amounts.eth)
if (!ethOrder) {
Log("❌ ETH开空失败,回滚BTC")
createMarketOrder(config.btcSymbol, "closebuy", amounts.btc)
return null
}
Log("🟢 开仓完成 | Beta:", _N(beta, 3))
}
원자적 트랜잭션 실행주문 실행은 순차적으로 진행되며 롤백 메커니즘을 포함합니다. 먼저 비트코인(BTC) 롱 포지션을 개설하고, 성공하면 이더리움(ETH) 숏 포지션을 개설합니다. ETH 주문이 실패하면 기존 비트코인 롱 포지션을 즉시 청산하여 포지션의 안정성을 확보하고 한쪽으로 치우친 위험에 노출되는 것을 방지합니다.
다음은 종료 로직의 예시입니다.
통화별로 계산된 손익두 포지션의 총 손익은 개설된 코인 수를 기준으로 계산되며, 이를 통해 전반적인 헤징 효과가 결정됩니다.
위험 제어 임계값 설정포트폴리오의 전반적인 성과를 평가하고, 기대값이 양수가 되도록 비대칭적인 이익 실현(+3%) 및 손절매(-1%)선을 설정합니다.
// 按币数计算盈亏
function checkClose(pos, btcTicker, ethTicker) {
let btcPnlUsd, ethPnlUsd
if (pos.type === 'long_btc_short_eth') {
// BTC多单盈亏 = (当前价 - 开仓价) × 币数
btcPnlUsd = (btcTicker.Last - pos.btcPrice) * pos.btcCoinAmount
// ETH空单盈亏 = (开仓价 - 当前价) × 币数
ethPnlUsd = (pos.ethPrice - ethTicker.Last) * pos.ethCoinAmount
} else {
btcPnlUsd = (pos.btcPrice - btcTicker.Last) * pos.btcCoinAmount
ethPnlUsd = (ethTicker.Last - pos.ethPrice) * pos.ethCoinAmount
}
let totalPnlUsd = btcPnlUsd + ethPnlUsd
let totalCost = pos.btcPrice * pos.btcCoinAmount + pos.ethPrice * pos.ethCoinAmount
let totalPnlPct = totalPnlUsd / totalCost
// 止盈: +3%
if (totalPnlPct >= 0.03) {
return {close: true, reason: '✅止盈', pnl: totalPnlPct, pnlUsd: totalPnlUsd}
}
// 止损: -1%
if (totalPnlPct <= -0.01) {
return {close: true, reason: '🛑止损', pnl: totalPnlPct, pnlUsd: totalPnlUsd}
}
return {close: false, pnl: totalPnlPct, pnlUsd: totalPnlUsd}
}
재검사를 다시 실시했고, 결과는 다음과 같았습니다…

드디어 상승세로 돌아섰습니다!
2025년 10월부터 2026년 1월까지, 약 3개월 동안:
백테스팅을 완료한 결과, 이 전략은 유효성이 입증되었습니다.
이것이 바로 양적 거래의 매력입니다.
아이디어 구상 → 코드 작성으로 구현 → 백테스팅을 통한 검증 → 최적화 및 개선
지후의 글에 나온 전략은 훌륭했지만, 문제는 세부 사항에 있었다.
진정한 양적 거래는 모든 아이디어를 데이터로 검증하고, 모든 전략을 코드로 구현하며, 모든 거래를 기록하는 것을 포함합니다.
아이디어가 있다면 검증해 봐야 합니다.
코드는 글의 마지막에 있습니다. 자유롭게 실행하고, 수정하고, 최적화해 보세요.
관심 있으시면 나중에 이어서 쓸 수 있어요.
좋아요, 댓글, 그리고 더 많은 업데이트를 요청하는 댓글을 자유롭게 남겨주세요!
📝본문 소스 코드 (전략 매개변수는 소스 코드 시작 부분의 매개변수 섹션에서 유연하게 설정할 수 있으며, 거래 로직은 최적화되었습니다).:양방향 베타 헤징 전략
본 글은 학습 및 정보 전달 목적으로만 작성되었으며 투자 조언을 구성하지 않습니다.
추신: 암호화폐 세계에서 단숨에 부자가 되는 확실한 방법은 없습니다. 오직 위험 관리와 지속적인 최적화만이 있을 뿐입니다.