[TOC]

Je suis récemment tombé sur un article sur Zhihu avec un titre très alléchant : « Un moyen stable de s’enrichir rapidement dans le monde des cryptomonnaies : de 3 000 U à 12 000 U en trois mois ».
J’ai juste ri. Stable ? Devenir riche rapidement ? Associer ces deux mots signifie généralement deux choses : soit c’est une arnaque, soit vous n’avez pas encore été confronté à un cygne noir.
Cependant, en tant que développeur de solutions de trading quantitatif, je n’ai pas pu résister à l’envie de cliquer pour jeter un coup d’œil lorsque j’ai vu la description de cette stratégie.

Après l’avoir lu, je suis tombé dans une profonde réflexion…
Il semble, peut-être, possiblement, espoir, souhait, peut-être que cela ait du sens ?
Sans plus tarder, ouvrons la plateforme de quantification des inventeurs et commençons !
La logique la plus simple :
// 伪代码
if (btcChange > 2%) {
开多 1手 BTC
开空 1手 ETH
}
Après avoir terminé d’écrire le code, j’ai cliqué avec confiance sur backtest, et ensuite…

Nous perdons de l’argent à une vitesse folle.
En voyant la courbe des actions dégringoler, je suis tombé dans un profond doute de moi-même.
En y réfléchissant calmement, le problème est évident :
1 lot de BTC ≠ 1 lot d’ETH
Le Bitcoin vaut actuellement 100 000 \( l'unité, tandis que l'Ethereum ne vaut qu'environ 3 000 \). Utiliser un ratio de 1:1 pour se couvrir revient à jeter son argent par les fenêtres.
Une stratégie de couverture adéquate doit prendre en compte :
Ce code constitue le moteur de calcul principal de la stratégie, implémentant intégralement le calcul du coefficient bêta de l’ETH par rapport au BTC. Ce coefficient bêta représente deux informations clés : le ratio de prix sous-jacent et la corrélation de volatilité, déterminant directement la proportion à couvrir.
// 计算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
}
Fonctions principales et logique:
Cov(ETH,BTC) / Var(BTC)Cela indique la sensibilité des rendements de l’ETH aux variations des rendements du BTC.Après la publication de la version bêta, il a fallu combler l’écart entre la théorie et la pratique en convertissant les coefficients théoriques en quantités négociables sur le marché. Cette partie du code a permis cette conversion essentielle.
// 计算对冲张数
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
}
}
Étapes clés de conversion:
Cette section traite de l’exécution de la stratégie et du contrôle des risques, de la traduction du plan de couverture calculé en opérations de trading concrètes et de la gestion des risques. La logique d’entrée est illustrée ici, à l’aide d’une position longue comme exemple ; une position courte peut être comprise de la même manière.
Conception des conditions de déclenchementLe système repose sur une double condition : la hausse du prix du BTC doit être supérieure à 2 % et la hausse du prix du BTC doit être supérieure à celle du prix de l’ETH. Ceci garantit une volatilité suffisante du marché et le respect de la relation de force relative attendue.
// 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))
}
Exécution atomique des transactionsL’exécution est séquentielle et comprend un mécanisme d’annulation. Commencez par ouvrir une position longue sur BTC ; en cas de succès, ouvrez une position courte sur ETH. Si l’ordre sur ETH échoue, fermez immédiatement la position longue existante sur BTC afin de garantir l’intégrité de la position et d’éviter une exposition à un risque unilatéral.
Voici une démonstration de la logique de fermeture :
Bénéfices et pertes calculés en deviseLe profit et la perte totaux des deux positions sont calculés en fonction du nombre de pièces ouvertes, et l’effet global de la couverture est déterminé.
paramètres de seuil de contrôle des risquesLa performance globale du portefeuille est évaluée, et des lignes de prise de bénéfices asymétriques (+3%) et de stop-loss (-1%) sont définies pour poursuivre une valeur attendue positive.
// 按币数计算盈亏
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}
}
Le test a été répété et les résultats ont été…

La courbe est enfin ascendante !
D’octobre 2025 à janvier 2026, soit environ 3 mois :
Après des tests rétrospectifs complets, cette stratégie a été validée :
C’est tout l’attrait du trading quantitatif :
Partir d’une idée → Écrire le code pour la mettre en œuvre → Effectuer des tests rétrospectifs pour la vérifier → Optimiser et améliorer
La stratégie décrite dans cet article de Zhihu était judicieuse, mais le diable se cache dans les détails :
Le véritable trading quantitatif implique de valider chaque idée par des données, de mettre en œuvre chaque stratégie par du code et d’enregistrer chaque transaction.
Si vous avez une idée, vous devriez la vérifier.
Le code se trouve à la fin de l’article. N’hésitez pas à l’exécuter, à le modifier et à l’optimiser vous-même.
Si cela vous intéresse, je peux continuer à écrire plus tard :
N’hésitez pas à aimer, commenter et demander plus de mises à jour !
📝Code source de l’article (les paramètres de stratégie peuvent être définis de manière flexible dans la section des paramètres au début du code source ; la logique de trading a été optimisée).:Stratégie de couverture bêta bidirectionnelle
Cet article a pour seul but de fournir des informations et des communications, et ne constitue en aucun cas un conseil en investissement.
P.S. : Il n’existe aucun moyen sûr de s’enrichir rapidement dans le monde des cryptomonnaies ; seules la gestion des risques et l’optimisation continue sont efficaces.