Le marché des cryptomonnaies traverse une période difficile ces derniers temps. Le BTC a chuté depuis ses sommets, les altcoins ont encore plus souffert, et beaucoup de gens adoptent une attitude attentiste, voire quittent le marché. Mais pendant ce temps, une autre tendance a discrètement pris de l'ampleur : le RWA, c'est-à-dire la tokenisation des actifs du monde réel. L'or, les actions américaines, le pétrole brut — ces actifs des marchés traditionnels commencent à apparaître sous forme de contrats sur les bourses de cryptomonnaies. Les principales plateformes ont successivement lancé des instruments comme SPY (représentant l'ETF S&P 500), l'or XAU, le pétrole brut CL, et en plus du BTC déjà présent, un environnement de trading multi-actifs couvrant les actions américaines, l'or, le pétrole brut et les cryptomonnaies a pris forme pour la première fois sur la chaîne.
En voyant cette configuration, une idée m'est venue à l'esprit : dans la finance traditionnelle, il existe un concept très classique appelé le Risk Parity (parité des risques). En termes simples, il s'agit de ne pas mettre tous ses œufs dans le même panier, et de décider combien mettre dans chaque panier en fonction du degré de risque de ce panier. Cette logique est utilisée depuis des décennies dans les cercles financiers traditionnels. Dans ce marché baissier, tout le monde cherche un moyen de survivre sans dépendre d'un seul actif. Maintenant que le marché crypto dispose enfin de contrats pour ces actifs, j'ai décidé de passer à l'action et d'essayer d'adapter cette logique.
Commençons par clarifier le Risk Parity, puis continuons
Avant de parler de la mise en œuvre concrète, il faut bien expliquer ce qu'est le Risk Parity, sinon la suite sera difficile à suivre.
Une personne normale, en allouant ses actifs, pourrait penser : je divise mon argent en quatre parts égales, 25 % dans chaque actif. Cela semble équilibré. Mais le problème, c'est que le BTC peut fluctuer de 10 % en une journée, tandis que l'or peut ne bouger que de 0,5 %. Avec une position de 25 % dans chaque, le risque apporté par le BTC est vingt fois supérieur à celui de l'or. En surface, les quatre actifs sont également répartis, mais en réalité, le sort du portefeuille dépend presque entièrement du BTC, les trois autres ne sont que de la figuration.
L'approche du Risk Parity est inverse : il ne s'agit pas de répartir le capital de manière égale, mais de répartir le risque de manière égale. Le BTC étant très volatil, on en alloue moins ; l'or étant stable, on en alloue davantage — mais ce n'est que la première étape. Plus important encore, les actifs ne sont pas indépendants : le BTC et les actions américaines peuvent baisser ensemble dans certaines conditions. Si deux actifs sont fortement corrélés, même si leurs volatilités respectives sont très différentes, répartir le risque entre eux de manière égale a peu de sens. Le véritable Risk Parity doit prendre en compte à la fois la volatilité de chaque actif et sa corrélation avec les autres, en utilisant la matrice de covariance pour mesurer la contribution marginale de chaque actif au risque global du portefeuille, de sorte que la contribution au risque de chaque actif soit approximativement égale. L'avantage de cette logique est qu'elle empêche qu'un seul actif soudainement défaillant ne fasse s'effondrer l'ensemble du portefeuille.
Choisir d'abord les bons actifs, la diversification n'a de sens qu'ensuite
Pour mettre en œuvre le Risk Parity, la première chose à faire est de choisir les actifs à inclure. Si les actifs ne sont pas bien choisis, tous les calculs ultérieurs, aussi précis soient-ils, seront inutiles.
Le pool d'actifs retenu comprend SPY, XAU, CL et BTC. Ce choix est logique : leurs évolutions ne sont généralement pas synchrones. Quand l'économie va bien, les actions montent ; quand le sentiment de risque augmente, l'or monte ; quand les anticipations d'inflation sont élevées, le pétrole et l'or montent tous deux ; le marché crypto suit parfois les actions, parfois il s'en détache complètement. C'est précisément parce que leurs corrélations sont faibles que les regrouper a du sens pour diversifier le risque. Si les quatre actifs montaient et descendaient chaque jour ensemble, la diversification ne serait qu'une illusion, et aucune méthode ne pourrait y remédier.
Une fois les actifs choisis, la question suivante est : quelle proportion allouer à chaque actif ? C'est là que le Risk Parity nécessite un véritable calcul.
Comment calculer la proportion de chaque actif
La logique de calcul de la stratégie se déroule en deux étapes.
Première étape : récupérer les données des chandeliers (K-line) des quatre actifs et les aligner par horodatage. La stratégie utilise des chandeliers d'une heure (PERIOD_H1) comme données d'entrée. Cette étape semble simple, mais en réalité, les contrats RWA peuvent parfois manquer de données. Si à un moment donné SPY n'a pas de cours, la ligne de données correspondant à cet horodatage est supprimée entièrement ; seuls les points temporels où les quatre actifs ont simultanément un cours sont conservés pour les calculs ultérieurs.
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]));
}
Une fois les données alignées, on convertit la série de prix de clôture en rendements logarithmiques, c'est-à-dire ln(prix actuel / prix précédent). On utilise les rendements logarithmiques plutôt que les variations simples car ils sont additifs dans le temps — l'addition sur plusieurs périodes donne directement le rendement logarithmique total, ce qui facilite le traitement ; de plus, sous l'hypothèse courante que le prix d'un actif suit un mouvement brownien géométrique, les rendements logarithmiques suivent une distribution normale, compatible avec le cadre de calcul de la matrice de covariance. Il est à noter que les rendements réels des actifs cryptos présentent souvent des queues épaisses, c'est un biais d'hypothèse à surveiller ; la matrice de covariance peut sous-estimer le risque réel dans des conditions de marché extrêmes.
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;
}
Deuxième étape : à partir de ces séries de rendements, calculer la matrice de covariance. Un simple calcul de la covariance historique moyenne est trop grossier ; on utilise ici une pondération EWMA (moyenne mobile exponentiellement pondérée) — donner un poids plus élevé aux données récentes, afin que la matrice de covariance réagisse plus rapidement aux changements d'état du marché.
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 est le coefficient d'atténuation. La stratégie utilise par défaut EWMA_LAMBDA = 0.94, une valeur issue des travaux empiriques de RiskMetrics pour les données quotidiennes. Il convient de noter que le 0.94 de RiskMetrics est conçu pour des données quotidiennes ; la stratégie utilise des données horaires, une fréquence plus élevée. Si l'on souhaite que la sensibilité de la matrice de covariance aux changements récents soit équivalente à celle du 0.94 journalier, il faudrait théoriquement une valeur plus proche de 1. Cependant, en pratique, 0.94 reste un point de départ acceptable au niveau horaire, représentant une configuration où les données récentes ont un poids plus élevé et où l'historique se dégrade plus rapidement ; on peut ajuster en fonction des résultats du backtest. Plus lambda est proche de 1, plus l'influence des données historiques est durable, et plus la matrice de covariance réagit lentement aux changements récents ; plus lambda est petit, plus la stratégie est sensible aux changements d'état du marché, mais aussi plus elle risque de déclencher des réallocations inutiles en raison du bruit à court terme.
Après le calcul, on ajoute un terme de régularisation sur la diagonale, avec un coefficient fixé à 0,1 % de la moyenne des termes diagonaux (eps = diagMean * 0.001). Ce facteur de 0.001 a été déterminé par test ; il est numériquement suffisant pour garantir que la matrice soit définie positive, tout en ayant un impact négligeable sur la structure de covariance. Il faut également noter une simplification : la méthode stricte de l'EWMA pour la covariance utiliserait des moyennes pondérées pour calculer les écarts, mais le code utilise la moyenne arithmétique simple sur toute la fenêtre de rétrospection. Lorsque la moyenne des rendements est proche de zéro (ce qui est courant pour les rendements à court terme des actifs financiers), cette simplification a un impact négligeable, mais elle introduit un léger biais dans les scénarios où la moyenne s'écarte significativement de zéro.
Une fois la matrice de covariance obtenue, on passe à la véritable résolution du Risk Parity — trouver un ensemble de poids tel que la contribution de chaque actif au risque du portefeuille soit aussi égale que possible. Avant de démarrer l'itération, la stratégie a déjà déterminé la direction de chaque actif via le calcul de la covariance du portefeuille à volatilité égale, et le résultat est stocké dans le tableau signs[] (+1 pour long, -1 pour short). Le processus d'itération utilise ces signes fixes prédéterminés, en ajustant uniquement la magnitude des poids, sans modifier la direction — cela garantit la stabilité technique, en évitant que les poids ne changent de direction de manière erratique lors des itérations à cause de fluctuations numériques.
Ce problème n'a pas de solution analytique ; on l'approxime par itération. À chaque itération, on calcule la contribution actuelle au risque, on réduit le poids des actifs dont la contribution est trop élevée, et on augmente celui des actifs dont la contribution est trop faible, en ajustant de manière répétée jusqu'à convergence.
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]; // Utilisation du signe fixe pré-déterminé
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);
}
// Normalisation en valeur absolue pour que la somme des poids absolus soit égale à 1
for (var i = 0; i < n; i++) w[i] = nw[i] / ns;
}
Le critère de convergence est que la somme des carrés des différences des contributions au risque de tous les actifs soit inférieure à 1e-12. Lorsque cela est atteint, on considère que les contributions au risque de chaque actif sont suffisamment proches, et on arrête l'itération. Le nombre maximal d'itérations est limité à 2000 pour éviter une boucle infinie en cas de matrice de covariance mal conditionnée. En pratique, la convergence se produit généralement en quelques centaines d'itérations. Si la limite est atteinte sans convergence, cela indique un problème avec les données d'entrée ou la matrice de covariance ; dans ce cas, la stratégie se dégrade en une position longue équipondérée, garantissant que le système ne tourne pas à vide.
La contribution au risque de chaque actif est définie comme son poids multiplié par le risque marginal, et peut être négative, ce qui signifie que cet actif réduit la volatilité globale du portefeuille.
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;
}
Les poids peuvent être négatifs, c'est-à-dire vendre à découvert
La stratégie standard de parité des risques est généralement long-only, mais comme le marché des contrats à terme permet la vente à découvert, cette stratégie étend le concept en permettant des poids négatifs.
La logique de décision est la suivante : on calcule d'abord un portefeuille de référence à volatilité égale — les actifs à forte volatilité ont un poids faible, ceux à faible volatilité un poids élevé — puis on examine si la covariance de chaque actif avec ce portefeuille de référence est positive ou négative. Une covariance négative indique que l'actif a tendance à évoluer en sens inverse du portefeuille global ; le vendre à découvert aide à réduire le risque global du portefeuille, donc le poids est fixé comme négatif, ce qui correspond à une position short sur le marché des contrats à terme.
Il convient de noter qu'il s'agit d'une approximation technique et non d'une solution théorique stricte de parité des risques long-short — la parité des risques long-short rigoureuse nécessite une optimisation sous contraintes basée sur la matrice de covariance complète, ce qui est plus coûteux en calcul. Cette approximation donne une direction raisonnable dans la plupart des conditions de marché, mais lorsque plusieurs actifs présentent simultanément une covariance négative avec le portefeuille de référence, il faut vérifier au cas par cas si vendre à découvert plusieurs actifs réduit encore le risque du portefeuille ; on ne peut pas généraliser.
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('[Détermination de la direction]', LABELS[i],
'Covariance avec le portefeuille à volatilité égale :', _N(covWithPortfolio, 8),
'→', dir < 0 ? '🔴 Short (vente à découvert)' : '🟢 Long (achat)');
Une fois la direction déterminée, elle est stockée de manière fixe dans le tableau signs[] et ne change plus pendant tout le processus de résolution itérative. L'itération ne fait qu'ajuster l'amplitude des poids, sans modifier la direction. Une fois la direction fixée, il reste à traiter une autre question : le niveau de levier à appliquer à l'ensemble du portefeuille.
Le levier n'est pas un simple "plus haut, mieux c'est", il suit la volatilité
La stratégie intègre un mécanisme d'ajustement du levier dont l'objectif est de maintenir la volatilité globale du portefeuille autour d'un niveau prédéfini. Pour faire une analogie : vous conduisez et souhaitez rouler à 60 km/h. Sur autoroute, la route est bonne, vous pouvez accélérer un peu ; en ville, la circulation est complexe, vous ralentissez. Le mécanisme de levier de la stratégie fonctionne de la même manière : lorsque la volatilité globale du marché est faible, on augmente modérément le levier pour amener le niveau de risque du portefeuille à l'objectif ; quand la volatilité augmente, on réduit automatiquement le levier pour resserrer l'exposition.
La stratégie utilise des chandeliers d'une heure, ce qui donne exactement 8760 chandeliers par an. Par conséquent, le coefficient annualisé est directement sqrt(8760). Si l'on utilise une autre période, ce coefficient doit être ajusté en conséquence : chandeliers de 15 minutes → sqrt(35040), chandeliers de 4 heures → sqrt(2190), chandeliers journaliers → 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);
}
La volatilité annualisée du portefeuille divisée par la volatilité cible donne le multiplicateur de levier à appliquer, avec une limite supérieure pour éviter une perte de contrôle en cas de conditions extrêmes. Il ne s'agit pas de maximiser le rendement, mais de gérer un budget de risque — le niveau de risque que l'on est prêt à prendre pour un rendement donné est décidé à l'avance, il ne dérive pas en fonction des fluctuations du marché.
Une fois le levier calculé, le portefeuille peut être constitué. Parallèlement, la stratégie ajuste également automatiquement l'intervalle de scrutation de la boucle principale en fonction de la volatilité actuelle : plus la volatilité est élevée, plus le rafraîchissement est rapide ; plus elle est faible, plus le rythme est lent, réduisant ainsi les calculs inutiles et les frictions de transaction.
javascript
function getAdaptiveSleep(w, cov) {
var av = portVol(w, cov) * Math.sqrt(8760);
if (av > 0.50) return FAST_INTERVAL; // 15 minutes
else if (av > 0.30) return MID_INTERVAL; // 30 minutes
else return SLOW_INTERVAL; // 60 minutes
}
Quand rééquilibrer
Les marchés évoluent chaque jour et les poids s'écartent constamment de leur conception initiale. Si l'on n'intervient pas, le risque réel supporté par le portefeuille finit par s'éloigner considérablement de celui prévu. La stratégie met en place deux conditions déclenchant un rééquilibrage : l'une basée sur le temps, avec un recalcul forcé des poids toutes les heures fixes ; l'autre basée sur la dérive excessive : lorsque l'écart entre le poids réel d'un actif et son poids cible dépasse un seuil, ou que la direction long/short s'inverse, le rééquilibrage est immédiat, sans attendre le prochain déclenchement temporel.
Pour calculer la dérive relative, on utilise comme dénominateur la valeur absolue du poids précédent. Lorsque le poids d'un actif est très faible (proche de zéro), la dérive relative est amplifiée, ce qui peut entraîner des rééquilibrages fréquents. La stratégie se prémunit contre cela : lorsque lastWeights[i] est nul, on saute directement la vérification de dérive, évitant ainsi un déclenchement erroné dû à une division par zéro.
javascript
if (!lastWeights) {
needRebal = true;
rebalReason = 'Premier établissement du portefeuille';
} else if ((now - lastTime) > REBALANCE_HOURS * 3600000) {
needRebal = true;
rebalReason = 'Rééquilibrage périodique (' + REBALANCE_HOURS + 'h)';
} else {
for (var i = 0; i < weights.length; i++) {
if ((weights[i] >= 0) !== (lastWeights[i] >= 0)) {
needRebal = true;
rebalReason = LABELS[i] + ' Changement de direction (long↔short)';
break;
}
if (lastWeights[i] !== 0 &&
Math.abs(weights[i] - lastWeights[i]) / Math.abs(lastWeights[i]) > DRIFT_THRESHOLD) {
needRebal = true;
rebalReason = LABELS[i] + ' Dérive de poids au-delà du seuil';
break;
}
}
}
Une fois le rééquilibrage déclenché, la stratégie calcule le montant notionnel cible pour chaque actif : les valeurs positives représentent une position longue, les négatives une position courte. Ensuite, elle compare avec la position actuelle pour décider d'augmenter, de réduire ou de changer de direction. Lors d'un changement de direction, la position inverse est d'abord fermée avant d'ouvrir la nouvelle direction, afin d'éviter de détenir simultanément des positions longues et courtes.
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));
}
Ainsi, on évite à la fois des frais de transaction excessifs dus à des opérations trop fréquentes et une déviation prolongée du portefeuille par rapport à sa conception initiale. En temps normal, ce mécanisme de rééquilibrage est suffisant pour faire face à la plupart des évolutions du marché. Mais les marchés sont parfois anormaux, d'où la nécessité d'une protection supplémentaire.
Une coupe-circuit d'urgence supplémentaire
En plus du rééquilibrage normal, la stratégie intègre un mécanisme de réduction d'urgence. À chaque cycle principal, elle vérifie toutes les positions ouvertes en les comparant au dernier prix enregistré pour mesurer l'ampleur des mouvements défavorables dans chaque direction. Si une position longue subit une forte baisse ou une position courte une forte hausse de plus de 5 %, la stratégie réduit automatiquement de moitié la position, limitant ainsi les pertes sans attendre le prochain rééquilibrage.
javascript
if (pos.side === 'long') {
drop = (last - cur) / last;
} else if (pos.side === 'short') {
drop = (cur - last) / last;
}
if (drop >= EMERGENCY_DROP) {
Log('🚨 Déclenchement d'urgence ! [' + label + '][' + pos.side + '] Variation défavorable :',
_N(drop * 100, 2) + '%', 'Précédent :', _N(last, 4), '→ Actuel :', _N(cur, 4));
if (mode === 'live') emergencyReduceLive(sym, label, pos.side, EMERGENCY_REDUCE);
else emergencyReducePaper(sym, label, cur, pos.side, EMERGENCY_REDUCE);
}
En mode réel, l'ordre de clôture est passé via l'API de l'échange ; en mode simulation, les fonds propres et la trésorerie sont mis à jour localement, la marge correspondante est libérée proportionnellement à la position, le P&L courant est calculé et l'opération est enregistrée.
Un détail de conception mérite d'être précisé : après le déclenchement de la réduction d'urgence, le prix de référence n'est pas immédiatement réinitialisé. La vérification suivante utilise toujours le prix antérieur au déclenchement comme référence. Ainsi, dans un marché où l'actif continue d'évoluer défavorablement, le mécanisme se déclenchera à chaque cycle, réduisant progressivement la position jusqu'à épuisement, ou jusqu'au prochain rééquilibrage normal qui réinitialisera le prix de référence. Cette conception est intentionnelle : dans un mouvement unilatéral extrême, réduire continuellement est plus efficace pour limiter les pertes qu'une seule réduction ; mais l'effet secondaire est que si le prix dépasse brièvement le seuil puis rebondit rapidement, on risque de manquer le rebond en raison d'une réduction excessive. Dans un marché normal, ce mécanisme est rarement déclenché, mais il est là pour éviter de subir passivement une perte totale lors d'un événement cygne noir.
À quoi ça ressemble une fois en marche
Sur la plateforme, le tableau de bord affiche en temps réel pour chaque actif s'il est en position longue ou courte, son poids respectif, le levier actuel, l'estimation de la volatilité annualisée globale du portefeuille, ainsi que la matrice de corrélation entre les quatre actifs. Le P&L flottant est actualisé toutes les minutes, et le calcul principal de la stratégie ajuste automatiquement la fréquence d'interrogation en fonction de la volatilité du marché.
Cette actualisation toutes les minutes n'est pas réalisée par du multithreading, mais par une sous-boucle imbriquée dans l'attente du cycle principal : toutes les minutes, elle se réveille pour récupérer les derniers prix, mettre à jour le P&L flottant et la courbe de valeur nette. Lorsque le temps cumulé atteint l'intervalle de la stratégie, elle quitte la sous-boucle pour passer au calcul suivant. L'ensemble de la stratégie est entièrement monothreadé, sans risque de concurrence.
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);
}
}
De plus, la stratégie prend en charge un mode simulation qui permet d'exécuter l'intégralité de la logique et d'ajuster les paramètres sans utiliser de fonds réels, puis d'évaluer si le comportement est conforme aux attentes avant de passer en mode réel. Après avoir fait tourner cette configuration en simulation pendant un certain temps, voyons les résultats.
Résultats de la simulation
Pendant la période de test, la stratégie est globalement en profit. Les positions : BTC, XAU, SPY sont longues ; CL (pétrole brut) est courte. Coïncidence : durant cette période, les tensions entre les États-Unis et l'Iran se sont apaisées, la prime de risque géopolitique a diminué, et le prix du pétrole a nettement baissé. La position courte sur le pétrole a été la principale source de profit. L'évolution du marché pendant cette période a été favorable à la stratégie, mais cela ne garantit pas qu'elle le sera à l'avenir. En réalité, cette stratégie comporte encore plusieurs points non résolus, et il serait malhonnête de ne pas les mentionner.
Points non résolus
Au cours de l'élaboration de cette stratégie, plusieurs problèmes n'ont pas été complètement résolus.
Premièrement, la liquidité des contrats RWA est bien inférieure à celle du BTC. Les actifs comme SPY, XAU et CL sont encore très récents sur la chaîne ; le slippage et la profondeur du carnet d'ordres sont inconnus. En simulation, ce problème n'est pas perceptible, mais en réel, il se manifestera.
Deuxièmement, cette stratégie repose sur le maintien d'une certaine diversification entre les actifs. Cependant, en période de panique extrême sur les marchés, les corrélations entre actifs risqués ont tendance à augmenter brutalement, réduisant considérablement l'efficacité de la diversification, précisément au moment où l'on en a le plus besoin.
Troisièmement, les actifs traditionnels ont des périodes de non-cotation pendant lesquelles le prix reste quasiment inchangé, alors que le BTC fluctue 24h/24. Cela conduit la matrice de covariance à sous-estimer la véritable co-mobilité entre les actifs : après la fermeture des marchés américains, le BTC continue de bouger sans données correspondantes pour le SPY. Lorsque les marchés traditionnels rouvrent, l'appréciation des relations de co-mouvement par la stratégie peut déjà être en retard.
Quatrièmement, les données historiques sont limitées, et la stabilité de la matrice de covariance sur des périodes courtes est discutable. Les paramètres comme le coefficient de décroissance de l'EWMA, la volatilité cible et le seuil de rééquilibrage sont des valeurs empiriques, non rigoureusement validées. Pour les décisions de vente à découvert, on utilise le signe de la covariance d'un portefeuille de référence à volatilité égale, ce qui est une approximation technique. Lorsque plusieurs actifs ont simultanément une covariance négative avec le portefeuille de référence, il faut vérifier un par un si la vente à découvert simultanée réduit effectivement le risque du portefeuille, et non l'appliquer directement. Les crypto-actifs présentent des queues épaisses ; la distribution réelle des rendements s'écarte de la normale. Dans des conditions extrêmes, la matrice de covariance sous-estime le risque, ce qui est un biais d'hypothèse qu'il faut accepter avec le cadre actuel.
Cinquièmement, dans un environnement de trading en direct, lors d'un changement de direction, la stratégie attend un délai fixe après avoir émis l'ordre de clôture avant de procéder à l'ouverture suivante, sans attendre la confirmation d'exécution. En cas de réponse lente de l'échange ou de latence réseau élevée, il existe un risque d'ouvrir une nouvelle position alors que l'ancienne n'est pas entièrement clôturée. Le compte de démonstration n'implique pas d'exécution réelle, donc ce problème n'est pas perceptible. Avant de passer en environnement réel, il convient d'évaluer la nécessité d'ajuster le délai d'attente en fonction de la rapidité de réponse de l'échange concerné.
Ces problèmes ne peuvent être détectés en exécutant simplement une simulation. Ils nécessitent une modélisation plus fine et une déduction théorique, en vérifiant rigoureusement chaque hypothèse, pour déterminer si cette logique tient vraiment sur le marché des crypto-monnaies.
Enfin
Le point de départ de cette stratégie est simple : en période de marché baissier des crypto-monnaies, les contrats RWA viennent justement compléter le paysage des grandes classes d'actifs. La finance traditionnelle dispose de décennies de théorie d'allocation accumulée. La rencontre de ces deux éléments mérite d'être explorée. Le code est complet, la logique est transparente, les paramètres sont ajustables. Mais cela reste simplement un point de départ, encore loin d'une stratégie d'allocation d'actifs véritablement éprouvée en conditions réelles. Si vous avez de meilleures idées, n'hésitez pas à les apporter pour l'améliorer ensemble.
Le contenu ci-dessus ne fait que documenter le processus d'exploration de la stratégie et ne constitue en aucun cas un conseil en investissement. Le trading de contrats comporte des risques importants. Les performances en simulation ne préjugent pas des résultats en trading réel. Avant d'engager des fonds réels, veuillez bien comprendre les risques associés.
Code source de la stratégie : Stratégie de parité des risques pour les grandes classes d'actifs RWA
- 1



