Der Kryptomarkt hat es in letzter Zeit nicht leicht. BTC ist von seinen Höchstständen gefallen, Altcoins sind noch härter getroffen, viele halten sich zurück oder steigen sogar aus. Aber in dieser Zeit ist eine andere Sache leise in den Fokus gerückt – RWA, also die Tokenisierung realer Vermögenswerte. Gold, US-Aktien, Rohöl – diese Vermögenswerte aus traditionellen Märkten tauchen nun in Form von Kontrakten auf Kryptobörsen auf. Die großen Börsen haben nach und nach Produkte wie SPY (für den S&P 500 ETF), Gold XAU und Rohöl CL eingeführt. Zusammen mit dem bereits vorhandenen BTC entsteht erstmals eine Multi-Asset-Handelsumgebung auf der Blockchain, die US-Aktien, Gold, Rohöl und Kryptowährungen abdeckt.
Bei dieser Konstellation kam mir ein Gedanke: Im traditionellen Finanzwesen gibt es einen sehr klassischen Ansatz namens Risk Parity. Einfach gesagt – lege nicht alle Eier in einen Korb, und wie viele in jeden Korb gelegt werden, hängt davon ab, wie riskant dieser Korb ist. Diese Logik wird im traditionellen Finanzbereich seit Jahrzehnten angewendet. In diesem Bärenmarkt suchen alle nach Möglichkeiten, nicht von einem einzigen Vermögenswert abhängig zu sein. Da der Kryptomarkt jetzt endlich Kontrakte für diese Vermögenswerte hat, habe ich angefangen, diese Logik hier auszuprobieren.
Erst das Risk Parity klar erklären, dann weitermachen
Bevor wir ins Detail gehen, muss ich die vier Zeichen von Risk Parity erklären, sonst wird die spätere Logik schwer zu verstehen sein.
Ein normaler Mensch würde sein Vermögen vielleicht so aufteilen: Ich teile das Geld gleichmäßig in vier Teile, jeder Vermögenswert bekommt 25%. Das klingt ausgewogen, aber das Problem ist, dass BTC an einem Tag um 10% schwanken kann, Gold vielleicht nur um 0,5%. Bei einer gleich großen Position von 25% ist das Risiko, das BTC dir bringt, zwanzigmal so hoch wie das von Gold. Auf den ersten Blick sind alle vier Vermögenswerte gleichmäßig verteilt, aber in Wirklichkeit wird das Schicksal des Portfolios fast ausschließlich von BTC bestimmt, die anderen drei sind nur Beiwerk.
Risk Parity geht umgekehrt vor: Nicht das Kapital wird gleichmäßig verteilt, sondern das Risiko. BTC schwankt stark, also weniger davon; Gold ist stabil, also mehr – aber das ist nur der erste Schritt. Entscheidender ist, dass die Vermögenswerte nicht unabhängig sind. BTC und US-Aktien können in bestimmten Marktphasen zusammen fallen. Wenn zwei Vermögenswerte stark gleichgerichtet sind, macht es wenig Sinn, ihre Risiken gleichmäßig zu verteilen, selbst wenn ihre Volatilitäten sehr unterschiedlich sind. Echte Risk Parity muss sowohl die Volatilität jedes Vermögenswerts als auch seine Korrelation mit anderen Vermögenswerten berücksichtigen. Mit der Kovarianzmatrix wird der marginale Beitrag jedes Vermögenswerts zum Gesamtrisiko des Portfolios gemessen, sodass am Ende jeder Vermögenswert ungefähr gleich viel zum Risiko beiträgt. Der Vorteil dieser Logik ist, dass das gesamte Portfolio nicht zusammenbricht, nur weil ein einzelner Vermögenswert plötzlich einbricht.
Erst die richtigen Vermögenswerte auswählen, dann macht Diversifikation Sinn
Wenn man Risk Parity umsetzen will, muss man zuerst die Vermögenswerte auswählen, die ins Portfolio sollen. Wenn die falschen Vermögenswerte ausgewählt werden, nützen auch noch so präzise Berechnungen später nichts.
Das Portfolio besteht aus SPY, XAU, CL und BTC. Die Auswahl dieser vier hat eine Logik: Ihre Kursbewegungen sind in der Regel nicht vollständig synchron. In wirtschaftlich guten Zeiten steigen Aktien, wenn die Risikoaversion steigt, steigt Gold, bei hohen Inflationserwartungen steigen sowohl Rohöl als auch Gold, der Kryptomarkt ist manchmal gleichgerichtet mit Aktien, manchmal völlig entkoppelt. Gerade weil ihre Korrelationen nicht hoch sind, macht es Sinn, sie zusammen zu haben, um Risiken zu streuen. Wenn alle vier Vermögenswerte jeden Tag zusammen steigen und fallen, ist Diversifikation eine Illusion, und keine Methode kann dich retten.
Nach der Auswahl der Vermögenswerte stellt sich die nächste Frage: Wie viel sollte von jedem Vermögenswert ins Portfolio? Genau das ist es, was Risk Parity berechnen muss.
Wie berechnet man, wie viel jeder Vermögenswert bekommen soll
Die Berechnungslogik der Strategie erfolgt in zwei Schritten.
Im ersten Schritt werden die Kline-Daten der vier Vermögenswerte heruntergeladen und nach Zeitstempel ausgerichtet. Die Strategie verwendet 1-Stunden-Klines (PERIOD_H1) als Dateneingabe. Dieser Schritt sieht einfach aus, aber die RWA-Kontraktprodukte haben manchmal Datenlücken. Wenn zu einem bestimmten Zeitpunkt SPY keinen Kurs hat, wird die gesamte Zeile für diesen Zeitpunkt verworfen. Es werden nur die Zeitpunkte beibehalten, zu denen alle vier Vermögenswerte gleichzeitig Kurse haben, und dann wird damit weitergerechnet.
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]));
}
Nach der Ausrichtung werden die Schlusskursreihen in logarithmische Renditen umgewandelt, also ln(aktueller Kurs / vorheriger Kurs). Logarithmische Renditen werden verwendet statt einfacher prozentualer Veränderungen, weil sie über die Zeit hinweg additiv sind – man kann mehrperiodige Renditen einfach durch Addition der logarithmischen Renditen erhalten, was die Handhabung erleichtert. Zudem sind logarithmische Renditen unter der üblichen Annahme, dass Vermögenspreise einer geometrischen Brownschen Bewegung folgen, normalverteilt, was mit dem Rahmen der Kovarianzmatrix kompatibel ist. Es ist jedoch zu beachten, dass die tatsächlichen Renditen von Krypto-Assets oft fat tails aufweisen – eine Annahmeverzerrung, die man beachten sollte; die Kovarianzmatrix kann in extremen Marktphasen das tatsächliche Risiko unterschätzen.
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;
}
Im zweiten Schritt wird aus diesen Renditereihen die Kovarianzmatrix berechnet. Eine einfache Berechnung des historischen Durchschnitts der Kovarianz ist zu grob. Hier wird eine EWMA-Gewichtung verwendet – aktuelleren Daten wird ein höheres Gewicht gegeben, sodass die Kovarianzmatrix schneller auf Veränderungen der Marktbedingungen reagieren kann.
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 ist der Abklingfaktor. Die Strategie verwendet standardmäßig EWMA_LAMBDA = 0,94, basierend auf der empirischen Einstellung von RiskMetrics für tägliche Daten. Es ist zu beachten, dass RiskMetrics 0,94 für tägliche Daten entwickelt hat. Die Strategie verwendet 1-Stunden-Daten, also eine höhere Frequenz. Wenn die Kovarianzmatrix genauso empfindlich auf aktuelle Änderungen reagieren soll wie 0,94 für Tagesdaten, müsste man den Wert theoretisch näher an 1 setzen. In der Praxis ist 0,94 jedoch auf Stundenebene immer noch ein akzeptabler Ausgangspunkt, da er aktuellen Daten ein höheres Gewicht gibt und historische Daten schneller abklingen. Je nach tatsächlichen Backtest-Ergebnissen kann der Wert weiter angepasst werden. Je näher lambda an 1 liegt, desto länger wirken historische Daten und desto träger reagiert die Kovarianzmatrix auf aktuelle Änderungen. Je kleiner lambda, desto empfindlicher ist die Strategie gegenüber Änderungen der Marktbedingungen, aber auch anfälliger für unnötige Umschichtungen aufgrund kurzfristiger Geräusche.
Nach der Berechnung wird auf der Diagonalen ein Regularisierungsterm hinzugefügt, mit einem Koeffizienten von 0,1 % des Durchschnitts der Diagonalen (eps = diagMean * 0.001). Der Faktor 0,001 wurde durch Tests ermittelt und ist numerisch ausreichend, um die Matrix positiv definit zu halten, während der Einfluss auf die Kovarianzstruktur vernachlässigbar ist. Hinweis: Strenge EWMA-Kovarianz sollte gewichtete Mittelwerte zur Berechnung der Abweichungen verwenden, der Code verwendet jedoch das einfache arithmetische Mittel über das gesamte Lookback-Fenster. Da die Renditen von Finanzanlagen kurzfristig im Mittel nahe Null liegen, ist der Einfluss dieser Vereinfachung vernachlässigbar. In Szenarien, in denen der Mittelwert jedoch signifikant von Null abweicht, entsteht eine kleine Verzerrung.
Mit der Kovarianzmatrix erfolgt dann die eigentliche Risk-Parity-Lösung: Es wird ein Gewichtungssatz gesucht, bei dem jeder Vermögenswert etwa gleich viel zum Portfoliorisiko beiträgt. Bevor die Iteration beginnt, hat die Strategie bereits die Richtung jedes Vermögenswerts durch ein Equal-Volatility-Portfolio der Kovarianz bestimmt, die Ergebnisse sind im Array signs[] gespeichert (+1 für Long, -1 für Short). Während des gesamten Iterationsprozesses werden diese vorab bestimmten festen Vorzeichen verwendet, nur die Gewichtungsgrößen werden angepasst, nicht die Richtungen – dies dient der technischen Stabilität, um zu verhindern, dass die Gewichtungen aufgrund numerischer Störungen während der Iteration zwischen den Richtungen hin- und herspringen.
Dieses Problem hat keine analytische Lösung, daher wird es iterativ angenähert. In jeder Runde wird der aktuelle Risikobeitrag berechnet. Das Gewicht von Vermögenswerten, deren Beitrag zu groß ist, wird verringert, das von Vermögenswerten, deren Beitrag zu klein ist, wird erhöht. Dies wird wiederholt, bis Konvergenz erreicht ist.
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]; // festgelegtes Vorzeichen aus vorheriger Bestimmung
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);
}
// Absolute Normalisierung, so dass die Summe der absoluten Gewichte aller Assets 1 ist
for (var i = 0; i < n; i++) w[i] = nw[i] / ns;
}
Das Konvergenzkriterium ist, dass die Summe der quadrierten Abweichungen aller Risikobeiträge kleiner als 1e-12 ist. Dann werden die Risikobeiträge aller Assets als ausreichend nahe betrachtet und die Iteration stoppt. Die maximale Iterationszahl ist auf 2000 begrenzt, um Endlosschleifen bei einer schlecht konditionierten Kovarianzmatrix zu verhindern. In der Praxis konvergiert das Verfahren meist innerhalb weniger hundert Iterationen. Wird die Obergrenze ohne Konvergenz erreicht, deutet dies auf Probleme mit den Eingabedaten oder der Kovarianzmatrix hin. In diesem Fall wird die Strategie auf gleichgewichtete Long-Positionen zurückgesetzt, um sicherzustellen, dass das System nicht im Leerlauf läuft.
Der Risikobeitrag jedes Assets ist definiert als sein Gewicht multipliziert mit dem marginalen Risiko. Das Ergebnis kann negativ sein, was bedeutet, dass dieses Asset die Gesamtvolatilität des Portfolios senkt.
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;
}
Gewichte können negativ sein – also Leerverkäufe
Die standardmäßige Risikoparitätsstrategie geht normalerweise nur Long, aber da der Kontraktmarkt Leerverkäufe erlaubt, wurde die Strategie erweitert, sodass Gewichte auch negativ sein können.
Die Logik zur Bestimmung ist wie folgt: Zuerst wird ein Referenzportfolio mit gleicher Volatilität berechnet – Assets mit hoher Volatilität erhalten niedrige Gewichte, Assets mit niedriger Volatilität hohe Gewichte. Dann wird für jedes Asset die Kovarianz mit diesem Referenzportfolio betrachtet. Ist die Kovarianz negativ, bedeutet dies, dass das Asset tendenziell gegenläufig zum Portfolio schwankt; ein Leerverkauf hilft, das Gesamtrisiko des Portfolios zu senken, und das Gewicht wird negativ gesetzt, was im Kontraktmarkt einer Short-Position entspricht.
Es sei darauf hingewiesen, dass es sich hierbei um eine technische Näherung handelt und nicht um eine theoretische Lösung der Long/Short-Risikoparität – eine strenge Long/Short-Risikoparität erfordert eine optimierte Nebenbedingung auf Basis der vollständigen Kovarianzmatrix, was rechenintensiver ist. Diese Näherung liefert unter den meisten Marktbedingungen eine sinnvolle Richtungsbestimmung. Wenn jedoch mehrere Assets gleichzeitig eine negative Kovarianz zum Referenzportfolio aufweisen, muss im Einzelfall überprüft werden, ob gleichzeitige Leerverkäufe dieser Assets tatsächlich das Portfoliorisiko senken – dies ist nicht pauschal gültig.
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('[Richtungsbestimmung]', LABELS[i],
'Kovarianz mit gleicher Volatilität:', _N(covWithPortfolio, 8),
'→', dir < 0 ? '🔴 Short' : '🟢 Long');
Sobald die Richtung bestimmt ist, wird sie fest im Array signs[] gespeichert und während des gesamten iterativen Lösungsprozesses nicht mehr geändert. Die Iteration passt nur die Größe der Gewichte an, nicht die Richtung. Nach der Richtungsbestimmung muss noch eine weitere Sache behandelt werden: Wie hoch soll die Hebelwirkung des gesamten Portfolios sein?
Hebelwirkung ist nicht umso besser, sondern richtet sich nach der Volatilität
Die Strategie enthält einen integrierten Hebelmechanismus, der darauf abzielt, die Gesamtvolatilität des Portfolios auf einem vorgegebenen Niveau zu halten. Ein Vergleich: Sie fahren ein Auto mit einer Zielgeschwindigkeit von 60 km/h. Auf der Autobahn bei guten Bedingungen können Sie etwas mehr Gas geben; im Stadtverkehr mit komplizierten Bedingungen nehmen Sie zurück. Der Hebelmechanismus der Strategie funktioniert ähnlich – wenn die Marktvolatilität insgesamt niedrig ist, wird der Hebel erhöht, um das Portfoliorisiko auf das Zielniveau zu bringen; bei hoher Marktvolatilität wird der Hebel automatisch gesenkt und das Engagement reduziert.
Die Strategie verwendet 1-Stunden-Kerzen, ein Jahr hat genau 8760 Stunden, daher wird der annualisierte Faktor direkt als sqrt(8760) berechnet. Bei Verwendung anderer Zeiträume muss dieser Faktor entsprechend angepasst werden: 15-Minuten-Kerzen entsprechen sqrt(35040), 4-Stunden-Kerzen sqrt(2190), Tageskerzen 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);
}
Die annualisierte Volatilität des Portfolios geteilt durch die Zielvolatilität ergibt den anzuwendenden Hebel; gleichzeitig wird eine Obergrenze gesetzt, um außer Kontrolle geratene Hebel in extremen Situationen zu verhindern. Dabei geht es nicht um die Maximierung der Rendite, sondern um Risikobudgetierung – wie viel Risiko man für wie viel Rendite einsetzt, wird im Voraus festgelegt und nicht vom Marktverlauf treiben lassen.
Nach der Berechnung des Hebels kann das Portfolio aufgebaut werden. Gleichzeitig passt die Strategie das Abfrageintervall der Hauptschleife automatisch an die aktuelle Volatilität an: Je höher die Volatilität, desto häufiger wird aktualisiert; bei niedriger Volatilität wird das Tempo verlangsamt, um unnötige Berechnungen und Transaktionskosten zu vermeiden.
javascript
function getAdaptiveSleep(w, cov) {
var av = portVol(w, cov) * Math.sqrt(8760);
if (av > 0.50) return FAST_INTERVAL; // 15 Minuten
else if (av > 0.30) return MID_INTERVAL; // 30 Minuten
else return SLOW_INTERVAL; // 60 Minuten
}
Wann wird umgeschichtet?
Der Markt bewegt sich täglich, und die Gewichte weichen ständig vom ursprünglichen Design ab. Wenn man sie nicht korrigiert, weicht das tatsächlich getragene Risiko des Portfolios nach einiger Zeit erheblich vom erwarteten ab. Die Strategie hat zwei Bedingungen für ein Rebalancing: Erstens zeitgesteuert – nach einer festgelegten Anzahl von Stunden werden die Gewichte neu berechnet; zweitens bei Überschreitung der Abweichung – wenn die tatsächliche Gewichtung eines Assets um mehr als einen Schwellenwert vom Zielgewicht abweicht oder sich die Long/Short-Richtung umkehrt, wird sofort umgeschichtet, ohne auf die nächste zeitgesteuerte Anpassung zu warten.
Bei der Berechnung der relativen Abweichung wird der Nenner als absolutes Gewicht des vorherigen Werts verwendet. Wenn das Gewicht eines Assets extrem klein (nahe Null) ist, wird die relative Abweichung verstärkt, was zu häufigen Rebalancings führen kann. Die Strategie schützt davor: Wenn lastWeights[i] Null ist, wird die Abweichungsprüfung übersprungen, um Fehlauslösungen durch Division durch Null zu vermeiden.
javascript
if (!lastWeights) {
needRebal = true;
rebalReason = 'Erster Aufbau';
} else if ((now - lastTime) > REBALANCE_HOURS * 3600000) {
needRebal = true;
rebalReason = 'Regelmäßiges Rebalancing (' + REBALANCE_HOURS + 'h)';
} else {
for (var i = 0; i < weights.length; i++) {
if ((weights[i] >= 0) !== (lastWeights[i] >= 0)) {
needRebal = true;
rebalReason = LABELS[i] + ' Richtungsumkehr (Long↔Short)';
break;
}
if (lastWeights[i] !== 0 &&
Math.abs(weights[i] - lastWeights[i]) / Math.abs(lastWeights[i]) > DRIFT_THRESHOLD) {
needRebal = true;
rebalReason = LABELS[i] + ' Gewichtsabweichung über Schwellenwert';
break;
}
}
}
Nach Auslösung des Rebalancings berechnet die Strategie den angestrebten Nominalbetrag jedes Vermögenswerts. Positive Zahlen stehen für Long, negative für Short. Dann wird der aktuelle Bestand verglichen, um zu entscheiden, ob aufgestockt, reduziert oder die Richtung gewechselt wird. Bei einem Richtungswechsel wird zuerst die entgegengesetzte Position geschlossen, bevor die neue Richtung eröffnet wird, um ein gleichzeitiges Halten von Long und Short zu vermeiden.
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));
}
So werden weder durch häufigen Handel hohe Gebühren verursacht, noch weicht das Portfolio über längere Zeit von seinem ursprünglichen Design ab. Unter normalen Umständen ist der Rebalancing-Mechanismus ausreichend, um die meisten Marktveränderungen zu bewältigen. Aber der Markt ist manchmal nicht normal, daher ist eine zusätzliche Absicherung erforderlich.
Und eine Notunterbrechung
Neben dem regulären Rebalancing verfügt die Strategie über einen Notfall-Reduktionsmechanismus. In jeder Hauptschleife wird der aktuelle Bestand überprüft und mit dem zuletzt aufgezeichneten Preis verglichen, um die Höhe der ungünstigen Bewegung in jede Richtung zu messen. Wenn Longs stark fallen oder Shorts stark steigen (mehr als 5%), reduziert die Strategie automatisch die Position um die Hälfte, um den Verlust zu begrenzen, ohne auf das nächste Rebalancing zu warten.
javascript
if (pos.side === 'long') {
drop = (last - cur) / last;
} else if (pos.side === 'short') {
drop = (cur - last) / last;
}
if (drop >= EMERGENCY_DROP) {
Log('🚨 Notfallrisiko ausgelöst! [' + label + '][' + pos.side + '] Ungünstige Veränderung:',
_N(drop * 100, 2) + '%', 'Letzter:', _N(last, 4), '→ Aktuell:', _N(cur, 4));
if (mode === 'live') emergencyReduceLive(sym, label, pos.side, EMERGENCY_REDUCE);
else emergencyReducePaper(sym, label, cur, pos.side, EMERGENCY_REDUCE);
}
Im Live-Modus wird die Börsen-Schließungsschnittstelle aufgerufen, im Paper-Modus werden in den lokalen Zuständen die Margin und das Bargeld aktualisiert, die entsprechende Margin proportional zur Positionsgröße freigegeben, der aktuelle Gewinn/Verlust berechnet und ein Handelsprotokolleintrag geschrieben.
Hierbei ist ein Designdetail zu beachten: Nach Auslösung der Notfallreduktion wird der Referenzpreis nicht sofort zurückgesetzt. Die nächste Prüfung erfolgt weiterhin auf Basis des Preises vor der Auslösung. Das bedeutet, dass in einem Markt, der sich kontinuierlich in eine ungünstige Richtung bewegt, dieser Mechanismus in jeder Schleife erneut ausgelöst wird und die Position schrittweise reduziert wird, bis sie aufgebraucht ist oder bis zum nächsten normalen Rebalancing, das den Referenzpreis zurücksetzt. Dieses Design ist beabsichtigt – in extremen Einwegmärkten kann eine kontinuierliche Reduzierung die Verluste besser begrenzen als eine einmalige Reduzierung. Der Nebeneffekt ist jedoch, dass bei einem kurzen Unterschreiten des Schwellenwerts und einer schnellen Erholung eine übermäßige Reduzierung den anschließenden Aufschwung verpassen kann. In normalen Märkten wird dieser Mechanismus fast nie ausgelöst, aber er sorgt dafür, dass man bei einem Black-Swan-Ereignis nicht durchhält, bis alles verloren ist.
Wie sieht das im Betrieb aus?
Nachdem die Strategie auf der Plattform läuft, zeigt das Dashboard in Echtzeit an, ob jeder Vermögenswert long oder short ist, die jeweiligen Gewichte, den aktuellen Hebel, die geschätzte annualisierte Volatilität des Portfolios sowie die Korrelationsmatrix zwischen den vier Vermögenswerten. Die nicht realisierten Gewinne der Positionen werden jede Minute aktualisiert, und die Kernberechnung der Strategie passt die Abfragerichtung automatisch an die Marktvolatilität an.
Diese 1-Minuten-Aktualisierung wird nicht durch Multithreading erreicht, sondern durch eine verschachtelte Unterschleife innerhalb der Hauptschleife während der Wartezeit. Sie wird jede Minute geweckt, um die aktuellen Preise abzurufen, nicht realisierte Gewinne und die Wertentwicklungskurve zu aktualisieren. Nach Erreichen des Strategie-Abfrageintervalls wird die Unterschleife beendet und die nächste Strategieberechnung beginnt. Die gesamte Strategie ist vollständig single-threaded, ohne Concurrency-Risiken.
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);
}
}
Zusätzlich unterstützt die Strategie einen Paper-Modus, in dem die Logik vollständig ohne Einsatz von echtem Geld getestet und Parameter eingestellt werden können. Nach Bestätigung, dass das Verhalten den Erwartungen entspricht, kann entschieden werden, ob auf Live-Handel umgestellt wird. Mit dieser Konfiguration wurde eine Weile im Paper-Modus getestet – sehen wir uns die tatsächlichen Ergebnisse an.
Ergebnisse des Paper-Handels
Während des Testzeitraums war die Strategie insgesamt profitabel. Die Positionsrichtungen: BTC, XAU, SPY alle long, CL (Rohöl) short. In dieser Zeit gab es Anzeichen einer Entspannung im US-Iran-Konflikt, die geopolitische Risikoprämie sank, und der Ölpreis fiel deutlich. Short auf Rohöl war die Hauptgewinnquelle dieses Zeitraums. Die Marktentwicklung in dieser Zeit war günstig für die Strategie, was nicht bedeutet, dass dies in Zukunft immer so sein wird. Tatsächlich gibt es noch einige ungeklärte Punkte bei dieser Strategie, und es wäre unehrlich, diese nicht zu erwähnen.
Ungeklärte Punkte
Bei der Entwicklung dieser Strategie sind mehrere Fragen nicht vollständig gelöst.
Erstens ist die Liquidität von RWA-Kontrakten weitaus geringer als die von BTC. SPY, XAU, CL sind auf der Kette noch neu. Slippage und Orderbuch-Tiefe sind unbekannt – im Paper-Modus spürt man dieses Problem nicht, aber im Live-Handel wird es real.
Zweitens ist die Strategie auf eine gewisse Diversifikation zwischen den Vermögenswerten angewiesen. In extremen Marktpaniken steigt die Korrelation zwischen Risikoanlagen jedoch oft stark an, sodass die Diversifikation weniger effektiv wird – und das ist genau der Moment, in dem man Schutz am meisten braucht.
Drittens haben traditionelle Vermögenswerte außerbörsliche Zeiten, in denen sich die Preise kaum bewegen, während BTC rund um die Uhr schwankt. Dies führt dazu, dass die Kovarianzmatrix die tatsächlichen Verbindungen zwischen den Vermögenswerten unterschätzt – nach Börsenschluss in den USA läuft BTC weiter, aber es gibt keine entsprechenden SPY-Daten für diese Zeit. Wenn der traditionelle Markt öffnet, könnte die Einschätzung der Strategie bezüglich der Verbindungen bereits veraltet sein.
Viertens ist die historische Datenbasis begrenzt, und die Stabilität der Kovarianzmatrix über kurze Zeiträume ist fraglich. Parameter wie der EWMA-Abklingfaktor, die Zielvolatilität und der Rebalancing-Schwellenwert sind Erfahrungswerte und wurden nicht streng validiert. Bei Short-Entscheidungen wird das Vorzeichen der Kovarianz zu einem gleichvolatilen Referenzportfolio verwendet – dies ist eine technische Näherung. Wenn mehrere Vermögenswerte gleichzeitig eine negative Kovarianz zum Referenzportfolio aufweisen, muss einzeln überprüft werden, ob gleichzeitiges Shorten tatsächlich das Portfoliorisiko senkt; dies kann nicht direkt übernommen werden. Kryptowährungen selbst haben fette Enden (fat tails), die tatsächliche Renditeverteilung weicht von der Normalverteilung ab. In extremen Marktsituationen unterschätzt die Kovarianzmatrix das Risiko – dies ist eine Annahmenverzerrung, die im aktuellen Framework akzeptiert werden muss.
Fünftens: In der Live-Umgebung wartet die Strategie nach dem Senden eines Schließauftrags bei Richtungswechsel eine feste Zeitspanne, bevor sie mit der nächsten Eröffnung fortfährt, ohne auf eine Ausführungsbestätigung zu warten. Wenn die Börse langsam reagiert oder die Netzwerklatenz hoch ist, besteht das Risiko, dass eine neue Position eröffnet wird, bevor die alte vollständig geschlossen ist. Simulierte Konten sind nicht an echten Ausführungen beteiligt, sodass dieses Problem nicht bemerkt wird. Vor dem Wechsel zum Live-Handel muss anhand der Reaktionsgeschwindigkeit der jeweiligen Börse bewertet werden, ob die Wartezeit angepasst werden muss.
Diese Probleme lassen sich nicht durch bloßes Ausführen eines simulierten Handels erkennen. Es sind detailliertere Modellierungen und theoretische Ableitungen erforderlich, um jede Annahme sorgfältig zu überprüfen und herauszufinden, ob diese Logik im Kryptomarkt tatsächlich Bestand hat.
Schluss
Der Ausgangspunkt für die Entwicklung dieser Strategie war einfach: Im Bärenmarkt der Kryptowährungen ergänzen RWA-Kontrakte genau das Spektrum der Anlageklassen. Die traditionelle Finanzwelt verfügt über jahrzehntelang etablierte Allokationstheorien. Das Zusammentreffen dieser beiden Dinge ist einen Versuch wert. Der Code ist vollständig, die Logik ist transparent, und die Parameter sind anpassbar. Dennoch ist dies letztlich nur ein Ausgangspunkt und noch weit entfernt von einer Anlageallokationsstrategie, die einem Live-Test standhält. Wenn Sie bessere Ideen haben, laden wir Sie herzlich ein, gemeinsam daran zu arbeiten, sie zu verbessern.
Die obigen Inhalte dokumentieren lediglich den Strategieentwicklungsprozess und stellen keine Anlageberatung dar. Der Handel mit Kontrakten birgt erhebliche Risiken. Die Performance von simulierten Konten spiegelt nicht die Ergebnisse des Live-Handels wider. Bitte informieren Sie sich ausreichend über die damit verbundenen Risiken, bevor Sie echtes Kapital einsetzen.
Strategiequellcode: RWA-Anlageklassen-Risikoparitätsstrategie
- 1



