Zum Inhalt springen

Original anzeigen

CryptoLowVolAnomalySpotBasketLongOnly

Hypothesen

Krypto-Niedrigvolatilitätsanomalie, Long-Only-Selektion (kein Short-Leg): Halte die 5 Namen mit LOWEST-realisierter Volatilität aus einem festen liquiden Spot-Universum von 25 Coins, gleichgewichtet, 10-Tage-Rebalancing auf DAILY-Bars, Buch skaliert auf ein Ex-ante-Vol-Ziel von 15% — reines OHLCV, kein Gate, kein ergänzender Feed

Hypothesen

Eine LONG-ONLY, SELECTION-BASED Cross-Sectional-Strategie (explizit NOT dollarneutral, NOT beta-gehedgt, NO Short-Bein) auf BINANCE_SPOT in einem FIXED liquiden Universum mit 25 Namen. Alle 10 Tagesbars wird jeder Coin nach seiner eigenen nachlaufenden 20-Tage-realisierten Volatilität eingestuft, und die 5 LOWEST werden gleichgewichtet gehalten; das gesamte Buch wird dann mit einem einzelnen Faktor min(1.0, 0.15 / mean_RV_of_the_5) skaliert, sodass das Portfolio eine annualisierte Volatilität von ~15% anstrebt und 1.0x Nominalwert niemals überschreitet (kein Leverage, Cash-Konto). Es gibt keinen Momentum-Term, keinen Trendfilter, kein Regime-Gate, keinen ergänzenden Feed und keinen Schwellenwertparameter — die realisierte Volatilität ist das ENTIRE Signal und wird als RANK verwendet, nicht als Ein/Aus-Gate. Ich habe dies gemessen, bevor ich es vorgeschlagen habe, anhand des Katalogs, anstatt es nur zu behaupten. Durch direktes Dekodieren der Nautilus-Festkomma-Bars (BINANCE_SPOT täglich, 25/25 Namen vorhanden, 2017-10-27 -> 2026-09-19, ~9 Jahre) liefert die obige Konfiguration eine Sharpe-Ratio von +0.74 NET des vollständigen 0.20% Spot-Round-Trips, 13.4% annualisiert bei 18.1% Volatilität, einen maximalen Drawdown von -33.6%, 430 Einstiege und eine durchschnittliche Rendite pro Trade von 1.37% des Positionsnominalwerts. Pro Kalenderjahr: 2018 -19%, 2019 +17%, 2020 +49%, 2021 +40%, 2022 -26%, 2023 +40%, 2024 +41%, 2025 +6%, 2026 -5% — 6 von 9 Jahren positiv, und sie übersteht BOTH vollständige Bärenmärkte. CRITICAL ROBUSTNESS EVIDENCE (dies ist eine Replikationsprüfung, NOT ein Proxy-Bein — die Strategie handelt nur BINANCE_SPOT): Die identische Ranking-Regel wurde unabhängig auf BYBIT linearen Perpetuals und BINANCE USD-M Perpetuals ausgeführt. In einem datumsangeglichenen 2022-2026-Fenster stimmen die beiden Handelsplätze bis auf die zweite Dezimalstelle überein — niedrigste-Vol-Sharpe +0.58 (Bybit) vs. +0.57 (Binance), höchste-Vol +0.11 vs. +0.11, Jahresrendite 31.0% vs. 30.4% — gegenüber einer gleichgewichteten Benchmark von +0.25/+0.21. Derselbe Effekt reproduziert sich über drei unabhängige Datenpipelines der Handelsplätze. In einem nicht angeglichenen Fenster schienen die Handelsplätze voneinander abzuweichen (0.38 vs. 1.01); dies war rein ein Artefakt des Verlaufsbeginns (Bybits Universum ist vor 2022 unvollständig), das ich isoliert habe, anstatt es als Ergebnis zu berichten. Ökonomische Ursache und WHO PAYS: Dies ist die Low-Volatility-/Lotterie-Präferenz-Anomalie (Bali-Cakici-Whitelaw; Frazzini-Pedersen), und Krypto ist ihr reinster Lebensraum. Coins mit hoher realisierter Volatilität sind dort, wo sich leverage-suchender und lotteriesuchender Retail-Flow konzentriert — sie werden hochgekauft, weil Käufer für die CHANCE einer großen Auszahlung bezahlen, nicht für die erwartete Rendite. Diese Käufer sind die Gegenpartei: Sie zahlen systematisch zu viel für Volatilität und akzeptieren schlechte risikoadjustierte Renditen. Die Messung ist eindeutig und stellt die zentrale falsifizierbare Behauptung dar — über 2022-2026 erzielten die 5 HIGHEST-Volatilitätswerte ~9% annualisiert, während die 5 LOWEST ~31% erzielten, wobei das High-Vol-Basket etwa die doppelte Volatilität trug. Die Prämie ist kein Preistrend-Effekt: Ich habe verifiziert, dass ein Trailing-Momentum-Ranking auf ehrlichen, nicht überlappenden Fenstern (t=+1.25) ein anderes und schwächeres Profil erzeugt als ein Volatilitäts-Ranking (t=+3.30 roh, +2.53 datumsgeclustert).

Hypothesen

Stellt das 25-Namen-Universum der Hypothese und die maximale Bruttoexposure von 1.0 wieder her, während der reine OHLCV Low-Volatility-Ranking-Mechanismus beibehalten wird.

Hypothesen

verification_loop: Verifikation fehlgeschlagen (Layer 2 — synthetische Szenarien): Verwendete Parameter: ['n_hold', 'cash_buffer', 'min_notional', '_param_bounds', 'rebalance_days', 'rv_lookback_days', 'target_annual_vol', 'max_gross_exposure', 'rebalance_tolerance'] Prüfen Sie, dass __init__ alle Attribute aus self.parameters.get() setzt. - steady_uptrend: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (bar timestamp: 1735692060000) - steady_downtrend: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (bar timestamp: 1735692060000) - flat_ranging: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (bar timestamp: 1735692060000) - volatility_spike: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (bar timestamp: 1735692060000) - zero_volume: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (bar timestamp: 1735692060000) - price_gap: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (bar timestamp: 1735692060000)

Umsetzung

Long-only-Binance-Spot-Basket, der die fünf Werte mit der niedrigsten realisierten Volatilität aus einem festen 25-Coin-Universum hält, alle zehn Tagesbars rebalanciert und auf 15% annualisierte Volatilität skaliert wird, mit einer 1.0x Bruttoexposure-Obergrenze.

Verifizierungsergebnisse

Verifikation fehlgeschlagen (Layer 2 — synthetische Szenarien): Verwendete Parameter: ['n_hold', 'cash_buffer', 'min_notional', '_param_bounds', 'rebalance_days', 'rv_lookback_days', 'target_annual_vol', 'max_gross_exposure', 'rebalance_tolerance'] Prüfen Sie, dass __init__ alle Attribute aus self.parameters.get() setzt. - steady_uptrend: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (bar timestamp: 1735692060000) - steady_downtrend: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (bar timestamp: 1735692060000) - flat_ranging: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (bar timestamp: 1735692060000) - volatility_spike: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (bar timestamp: 1735692060000) - zero_volume: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (bar timestamp: 1735692060000) - price_gap: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (bar timestamp: 1735692060000)

Ergebnisübersicht

CryptoLowVolAnomalySpotBasketLongOnl-7a915cf1a2

Ergebnisübersicht

Die Strategie testete ein Long-only-Binance-Spot-Portfolio ('Basket'), das die fünf Coins mit der niedrigsten Volatilität aus einem 25-Coin-Universum hielt. Obwohl die Hypothese positive historische Ergebnisse meldete, schlug die Verifikation in jedem synthetischen Szenario aufgrund eines Decimal/float-TypeError fehl, sodass die Strategie vor dem Backtesting oder der Optimierung verworfen wurde.

Ergebnisübersicht

Stellen Sie sicher, dass Decimal- und Float-Arithmetik vor der synthetischen Verifikation konsistent behandelt wird.

Ergebnisübersicht

Sie wurde nach drei Iterationen verworfen, weil die Layer-2-Verifikation fehlschlug: Alle sechs synthetischen Szenarien lösten einen Decimal/float-TypeError aus. Spätere Phasen wurden nicht erreicht.

Ergebnisübersicht

Sie versuchte, eine Krypto-Low-Volatility-Anomalie auszunutzen, indem sie die fünf Werte mit der niedrigsten realisierten Volatilität aus einem festen 25-Coin-Binance-Spot-Universum hielt.

Ergebnisübersicht

Die Hypothese meldete eine Netto-Sharpe-Ratio von 0.74, eine annualisierte Rendite von 13.4%, einen maximalen Drawdown von -33.6%, 430 Einstiege und eine durchschnittliche Rendite pro Trade von 1.37%. Es wurde kein Pipeline-Backtest- oder Optimierungsbericht aufgezeichnet.

Iteration History

Verifizierung fehlgeschlagen (Layer 4 — QA-Review) [class=code_defect]: - [edge_concern] Die Sandbox-Ökonomie ist gesund und intern konsistent, daher ist die Profitabilität NOT der Grund für diesen Fehlschlag. avg_trade_return_pct 3.73% x avg_position_pct 8.25% x 95 Trades = ~29% des Eigenkapitals vs. total_return 32.07% — das Ledger stimmt mit der Equity-Kurve überein (kein Buchhaltungsfehler), und 3.73%/Trade übertrifft den 0.20% BINANCE_SPOT Round Trip um ~18x, bei Kommissionen von nur 2.64% des Bruttobetrags. Zwei Dinge, die der Analyst mitnehmen sollte: (1) Der gemeldete Sharpe 0.547 ist intern nicht konsistent mit CAGR 19.26% auf annualized_volatility 8.12% — die tägliche MTM-Serie bewegte sich an nur 580 von 2401 Tagen, während das Buch 5 Spot-Legs durchgehend ab ~Nov-2022 hält, sodass die risikoadjustierten Kennzahlen (Sharpe, Sortino, Vol, VaR, Calmar) im Vergleich zum realisierten Ledger verwässert/spärlich sind. Symptom nennen, keine Ursache behaupten. (2) Die Regime-Attribution zeigt bereits ruhig +42.6% (Sharpe 1.40) vs. normal -4.1% und gestresst -3.7%, d. h. die Low-Vol-Prämie ist in dieser Stichprobe ein Phänomen ruhiger Regime — aber diese Terzile werden über ein Fenster berechnet, das mehrheitlich flach ist (siehe kritisches Problem), also erst nach Korrektur des Fensters erneut betrachten, statt jetzt danach zu handeln. - [critical] UNIVERSE MAKES 58% OF THE BACKTEST WINDOW STRUCTURALLY UNTRADEABLE, CORRUPTING EVERY RISK METRIC. Die Cross-Leg-Alignment-Barriere der Basisvorlage (base_template.py _maybe_process_primary + _sync_extra_iids) verzögert die primäre Bar, bis EVERY das zusätzliche Leg mit demselben Zeitrahmen eine Bar mit genau diesem Zeitstempel hat, und diese Strategie erfordert zusätzlich eine vollständige Zeile in _row_for(). Ich habe die Erste-Bar-Daten in data/catalog für alle 25 Legs überprüft: Die bindenden Namen sind APTUSDT.BINANCE_SPOT (erste 1-DAY Bar 2022-10-20) und ICPUSDT.BINANCE_SPOT (2021-05-12). Das primäre BTCUSDT.BINANCE_SPOT beginnt 2017-08-18, und der vollständige Backtest übergibt kein Startdatum (backtest_agent._run_backtest sendet nur `end`), sodass die Engine von 2017-08 -> 2026-09 (~9.1J) läuft, während das Buch seine erste Order erst ab ~2022-11-10 platzieren kann (APT Listing + 21 ausgerichtete Warmup-Zeilen). ~5.25 von 9.1 Jahren (58%) sind auf dem Tagesraster als flache 0.00%-Tage markiert. Die Sandbox demonstriert dies bereits exakt: Die Stress-Fenster covid_crash_2020, china_ban_2021, luna_collapse_2022 und rate_shock_2022 (Jan-Okt) liefern alle genau 0.0000%, während ftx_collapse_2022 (beginnend 2022-11-06) das erste ist, das mit -8.20% von null abweicht. Konsequenzen, von denen keine vom Optimizer oder Analysten rückgängig gemacht werden kann: (a) Das Ziel von Phase-2 ist der Sharpe, berechnet auf einer Serie, die mehrheitlich aus Nullen besteht — die Sandbox meldet 0.547, während das CAGR desselben Buchs über seine ACTIVE-Spanne 19.26% ist; (b) rund fünf Kalenderjahre werden exakt 0.00% melden und als nicht-positiv gegen die Validitätsuntergrenze für den Anteil positiver Jahre zählen; (c) die eigenen vorab registrierten Behauptungen der Hypothese — Sharpe +0.74 über 2017-2026, 6 von 9 Jahren positiv, 'übersteht BOTH vollständige Bärenmärkte' (2018 -19%, 2022 -26%) — können überhaupt nicht erzeugt werden, da 2018 und die ersten zehn Monate von 2022 innerhalb des toten Fensters liegen; (d) die Terzile des realisierten-Vol-Regimes werden über eine Serie berechnet, deren Mehrheit tote Tage sind. Dies ist ein Sizing-/Konfigurationsfehler mit einer offensichtlichen Lösung, keine Aussage über den Edge: Die Trading-Logik selbst ist korrekt (siehe Notizen). (Zeile 49) — Fix: Wähle ein Universum, dessen Mitglieder alle über das Fenster existieren, das gemessen werden soll, und gib in der Config-Begründung an, welches Fenster das ist. Verifizierte Erste-Bar-Daten im Katalog für das aktuelle 25: APT 2022-10-20, ICP 2021-05-12, dann FIL 2020-10-16 / AAVE 2020-10-16 / NEAR 2020-10-15 / AVAX 2020-09-23 / UNI 2020-09-18 / DOT 2020-08-19 / SOL 2020-08-12, dann BCH 2019-11-29 / HBAR 2019-09-30 / DOGE 2019-07-06 / ALGO 2019-06-23 / ATOM 2019-04-30 / LINK 2019-01-17, dann VET 2018-07-26 / ETC 2018-06-13 / TRX 2018-06-12 / XLM 2018-06-01 / XRP 2018-05-05 / ADA 2018-04-18, und BTC/ETH 2017-08-18, BNB 2017-11-07, - [warning] Das Buy-Sizing bei einer Rotation ist durch `available = get_account_equity() * cash_buffer` begrenzt, gelesen AFTER, nachdem die Exit- und Trim-SELLs in den Zeilen 279-298 übermittelt wurden. Im Backtest ist dies korrekt, weil die SimulatedExchange von NT Market-Orders innerhalb derselben Engine-Iteration ausführt, sodass der USDT-Saldo die Verkäufe bereits widerspiegelt. Im Paper-/Live-Betrieb ist das nicht der Fall: Market-Orders bleiben bis zum nächsten Tick offen, sodass die Strategie bei einer Rotation, die 2-3 Namen verkauft, um 2-3 neue zu finanzieren, den Cash-Stand vor dem Verkauf sieht, jedes Defizit mit `ratio < 1` skaliert und unterinvestiert. Da gehaltene Namen nur dann neu dimensioniert werden, wenn sie außerhalb des +/-25%-Toleranzbands driften, kann das Defizit bis zu einer späteren Rotation bestehen bleiben. Eine Backtest-/Paper-Divergenz, kein Korrektheitsfehler des Backtests. (Zeile 309) — Fix: Entweder `available` als (Cash + Nominalwert der gerade übermittelten Exits/Trims) berechnen, oder das Buy-Leg einer Rotation auf die nächste Bar nach Abwicklung der Verkäufe verschieben (eine um eine Bar verzögerte Buy-Queue, verankert an der Rebalance-Periode). Wenn es unverändert bleibt, dies explizit in der Begründung angeben, damit die Paper-Parity-Prüfung die Divergenz nicht als Fehler wertet. - [warning] Datenausfälle bei einem einzelnen Leg legen das gesamte Buch lahm. `_row_for()` gibt None zurück, es sei denn, EVERY eines der 25 Legs verfügt über eine Bar mit exakt dem Zeitstempel der primären Bar, und die Barriere der Basisvorlage blockiert unabhängig davon die primäre Bar in derselben Situation. Eine fehlende Tages-Bar bei einem einzelnen Namen (Erfassungslücke, Börsen-Halt) überspringt stillschweigend die Zeile dieses Tages und hinterlässt eine Lücke im Log-Return-Fenster, das für die realisierte Vol verwendet wird; ein Name, der vollständig aufhört zu publizieren (Delisting), friert die Strategie für immer mit offenen Positionen ein. Das Verhalten ist eher konservativ als falsch, aber es ist unsichtbar — nichts protokolliert oder zählt die übersprungenen Tage. (Zeile 88) — Fix: Übersprungene Zeilen zählen (ein `self._skipped_rows`-Int wird von der Basisvorlage automatisch persistiert) und eine Warnung protokollieren, wenn ein Leg für mehr als ~2 aufeinanderfolgende primäre Bars fehlt, sodass ein Delisting als Diagnose statt als stillschweigend flaches Buch erscheint.

Iteration History

Verifikation fehlgeschlagen (Layer 4 — QA-Überprüfung) [class=hypothesis_mismatch]: - [edge_concern] Der Smoke-Backtest ist profitabel, aber die Performance wird nicht als Korrektheitsurteil verwendet. - [critical] Die Hypothese erfordert ein festes 25-Coin-Binance-Spot-Universum, aber die Implementierung konfiguriert nur 14 Instrumente. Das Halten von 5 Werten wählt daher 5/14 statt 5/25 aus, was die Cross-Sectional-Strategie wesentlich verändert. (Zeile 45) — Fix: Stellen Sie das exakte 25-Namen-Universum in extra_instruments und extra_bar_types wieder her und führen Sie anschließend Verifikation und Backtesting erneut aus. Alternativ revidieren Sie die Hypothese formell auf die 14-Namen-Variante. - [critical] Die Hypothese erlaubt eine maximale Bruttoexposure von 1.0x, aber die Implementierung setzt max_gross_exposure auf 0.95 und begrenzt sie bei 0.95. (Zeile 29) — Fix: Verwenden Sie ein Maximum von 1.0 oder ändern Sie die Hypothese explizit, um die 0.95-Obergrenze vorab zu registrieren.

Verwerfungsgrund

verification_loop: Verifizierung fehlgeschlagen (Layer 2 — synthetische Szenarien): Verwendete Parameter: ['n_hold', 'cash_buffer', 'min_notional', '_param_bounds', 'rebalance_days', 'rv_lookback_days', 'target_annual_vol', 'max_gross_exposure', 'rebalance_tolerance'] Überprüfen, dass __init__ alle Attribute aus self.parameters.get() setzt. - steady_uptrend: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (Bar-Zeitstempel: 1735692060000) - steady_downtrend: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (Bar-Zeitstempel: 1735692060000) - flat_ranging: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (Bar-Zeitstempel: 1735692060000) - volatility_spike: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (Bar-Zeitstempel: 1735692060000) - zero_volume: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (Bar-Zeitstempel: 1735692060000) - price_gap: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (Bar-Zeitstempel: 1735692060000)
Strategiebericht

Stratmill ist ein Tool für Research und Paper-Trading, keine Finanzberatung und kein Broker. Backtest- und Paper-Trading-Ergebnisse sind hypothetisch. Der Handel ist mit Verlustrisiken verbunden.