起源: 一見美しい裁定取引の夢
最近、Zhihu で非常に魅力的なタイトルの投稿を見つけました。「暗号通貨の世界で急速に金持ちになる確実な方法: 3 か月で 3000U から 12000U」。
つい笑ってしまいました。安定?一攫千金?この二つの言葉を組み合わせると、大抵は二通りの意味合いになります。詐欺か、まだブラックスワンイベントに遭遇していない人かのどちらかです。
しかし、定量取引開発者として、私はこの戦略の説明を見たとき、クリックして見てみずにはいられませんでした。
この理論は次のように述べています。
- BTCは暗号通貨界のリーダーですその価格変動は、より小規模な同種の通貨(ETH、SOL など)よりも明らかに大きいです。
- 強気相場が到来BTCが急騰中 → BTCをロング + ETHをショート → 価格差で利益を得る。
- 弱気相場が到来BTC が急落 → BTC をショート + ETH をロング → 価格差から利益を得る確実な方法。
読み終えて、深く考え込んでしまいました…
どうやら、おそらく、おそらく、たぶん、希望、願い、たぶん、何らかの意味があるのでしょうか?
コードの最初のバージョン: 素朴な始まり
早速、Inventors Quantification Platform を開いて始めましょう。
最も単純なロジック:
javascript
// 伪代码
if (btcChange > 2%) {
开多 1手 BTC
开空 1手 ETH
}
コードを書き終えて、自信を持ってバックテストをクリックすると、

私たちはお金をどんどん失っています。
株価曲線が急落していくのを見て、私は深い自信喪失に陥りました。
第2版コード:科学的ヘッジ
問題はどこにあったのか?ベータヘッジの技術
冷静に考えてみると、問題は明らかです。
1ロットのBTC≠1ロットのETH
BTCは現在1枚あたり10万ドルの価値がありますが、ETHは約3,000ドルです。1:1の比率でヘッジするのはヘッジではなく、お金を失っていることになります。
適切なヘッジ戦略では、次の点を考慮する必要があります。
- 価格比:BTC/ETH ≈ 30:1
- ボラティリティの違い両者のリターンの相関関係
- 契約額面金額OKX の永久 BTC 契約 = 0.01 BTC、永久 ETH 契約 = 0.1 ETH です。
ベータヘッジの完全な実装
このコードは、この戦略の中核となる計算エンジンであり、BTCに対するETHのベータ係数の計算を完全に実装しています。ここでのベータ係数は、原資産価格比率とボラティリティ相関という2つの重要な情報を表し、ヘッジすべき比率を直接決定します。
javascript
// 计算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
}
主な機能とロジック:
- データ検証と劣化処理十分な履歴データがあるかどうかを確認します。ない場合は、現在の価格比率を直接使用して、戦略が常に実行できるようにします。
- リターン系列の計算価格データを利回りに変換すると、絶対的な価格次元の影響が排除され、異なる価格の資産を比較できるようになります。
- 統計分析のためのコア計算:
- 共分散: BTC と ETH の利回り間の相関の方向と強さを測定します。
- 分散: BTC 利回り自体の変動性を測定します。
- 利回りベータ:
Cov(ETH,BTC) / Var(BTC)これは、ETH リターンが BTC リターンの変化にどれだけ敏感であるかを示しています。 - 相関係数標準化共分散は線形相関の度合いを反映します。
- 包括的なベータ合成最終ベータ = 過去の平均価格比率 × リターンベータ。これは、原資産価格の差(例:BTCはETHの30倍)とボラティリティの差(例:ETHのボラティリティはBTCの0.8倍)の両方を考慮した値です。例えば、価格比率が30でリターンベータが0.8の場合、最終ベータは24となり、1BTCをヘッジするには24ETHが必要になります。
- リスク管理短期的な極端な市場状況により不合理なヘッジ比率が計算されるのを防ぐために、ベータ値に適切な制限を設定します。
ベータ版のリリース後、理論と現実のギャップを埋め、理論上の係数を取引所で実際に取引可能な数量に変換する必要がありました。このコード部分は、この重要な変換を実現しました。
javascript
// 计算对冲张数
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 の基本量 (例: 0.1) を設定します。これは、ヘッジ ポートフォリオ全体の「アンカー」として機能します。
- 理論的なコイン計算ETHの理論量 = BTCの基本量 × ベータ係数。
- 契約額面金額の変換最も重要な実務上のステップは、理論上のコイン数を各契約の「契約価値」(CtVal)で割ることです。例えば、1BTC契約は0.01BTC、1ETH契約は0.1ETHを表す場合があり、これにより契約数が算出されます。
- 整数化切り捨てにより、取引は少なくとも1つの契約を含む整数契約で行われます。同時に、実際の取引の割合が逆算され、その後の正確な損益計算に使用されます。
開始と終了のロジック
このセクションでは、戦略の実行とリスク管理、つまり計算されたヘッジプランを実際の取引に反映させ、リスクを管理する方法について説明します。ここではロングポジションを例にエントリーロジックを説明します。ショートポジションも同様に理解できます。
トリガー条件設計このシステムは、BTC価格上昇率 > 2%、かつBTC価格上昇率 > ETH価格上昇率という2つの条件を採用しています。これにより、十分な市場ボラティリティが確保され、期待される相対的な強さの関係が成立することが保証されます。
javascript
// 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注文が失敗した場合は、ポジションの整合性を確保し、一方的なリスクへのエクスポージャーを回避するため、既存のBTCのロングポジションを直ちにクローズします。
以下は終了ロジックのデモンストレーションです。
通貨別に計算した損益保有コイン数に基づいて2つのポジションの合計損益を計算し、全体的なヘッジ効果を決定します。
- BTCロングポジションの利益/損失 = (現在価格 - 始値) × 保有BTC数
- ETHショートポジションの利益/損失 = (始値 - 現在価格) × 保有ETH数
リスク管理閾値設定ポートフォリオ全体のパフォーマンスを評価し、プラスの期待値を追求するために非対称の利益確定(+3%)と損切り(-1%)のラインを設定します。
javascript
// 按币数计算盈亏
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か月間:
ファンドのパフォーマンス
- 初期資本金:5万ドル
- 最終純資産: 51,095ドル
- 総収益率:約2.2%
- 最大ドローダウン: 妥当な範囲内に維持する
取引統計
- 利益確定の機会数: 6
- ストップロス注文数: 14
- 勝率: 30%
真の結論
完全なバックテストの後、この戦略は検証されました。
✅ 理論的に実現可能な部分:
- ベータヘッジは確かに一方的なリスクを軽減することができます。
- 価格比率の反転により裁定取引の機会が生まれます。
- ストップロス注文とテイクプロフィット注文により利益を守ることができます。
⚠️ 現実世界の問題:
- 低いリターン利益率はわずか30%で、3か月間の累積収益は2.2%であり、投稿で主張されている4倍の収益には程遠いものでした。
- ポジションを開く機会が少ない2% のしきい値により、ポジションを開く頻度が制限されます。
- 取引手数料ポジションを頻繁に開いたり閉じたりすると、多くの利益が消えてしまいます。
- スリッページリスクライブ取引のパフォーマンスはバックテストよりも悪くなる可能性があります。
- 極端な市場状況BTC と ETH の両方が同時に急騰/下落した場合、ヘッジ メカニズムは失敗します。
🔍 最適化すべき領域:
- 複数通貨のローテーションETH だけでなく、SOL、BNB などもヘッジできます。
- ダイナミックな<unk>値ボラティリティに基づいてエントリー閾値を調整する
- ストップロス冷却ストップロス注文が出された直後に新しいポジションを開かないでください。
- ボラティリティデルタヘッジ価格ベータに加えて、ボラティリティヘッジも検討できます。
- 資金管理各ポジションのオープンごとに資本比率を動的に調整します。
結論:定量化の重要性
これが定量取引の魅力です。
アイデアから始める → それを実装するためのコードを書く → 検証するためにバックテストする → 最適化して改善する
その Zhihu の投稿で概説された戦略は妥当なものだったが、細部にこそ問題が潜んでいる。
- ベータヘッジがなければ、単に方向性に賭けるだけです。
- リスク管理の仕組みがなければ、裸で走っているようなものです。
- バックテストによる検証がなければ、それは単なる希望的観測に過ぎません。
真の定量取引には、すべてのアイデアをデータで検証し、すべての戦略をコードで実装し、すべての取引を記録することが含まれます。
アイデアがあるなら、それを検証する必要があります。
コードは記事の最後にあります。ぜひご自身で実行、変更、最適化してみてください。
もし興味があれば、後ほど続きを書きます:
- ボラティリティデルタに基づくヘッジ戦略
- 複数通貨ローテーションの実装
- 資金管理とリスク管理の最適化
ぜひ「いいね!」やコメントをしたり、さらなるアップデートを促したりしてください。
📝記事のソースコード(ソースコード先頭のパラメータセクションで戦略パラメータを柔軟に設定可能、取引ロジックが最適化されています)。:双方向ベータヘッジ戦略
免責事項
この記事は学習とコミュニケーションのみを目的としており、いかなる投資アドバイスも構成するものではありません。
追伸: 暗号通貨の世界では、すぐに金持ちになれる確実な方法はありません。リスク管理と継続的な最適化だけです。
- 1


