SentimentTiltedBtcAltRotationNeutralBybit
Hypotheses
Continuous Sentiment-Tilted BTC-vs-Alt Rotation on BYBIT — Beta-Neutral Long/Short Book Whose Gross Tilt Is Sized Proportionally to the Daily Crypto Fear & Greed Index (Always-On, Never Flat, Banded Rebalance, 5 Alts Hedged by a Trailing-Beta BTC Leg, DAILY Bars)
Hypotheses
An ALWAYS-ON, BETA-NEUTRAL, LONG-SHORT rotation book on BYBIT linear perpetuals whose only signal is an EXOGENOUS, NON-PRICE, publicly published daily series: the Crypto Fear & Greed Index (`fear_greed` supp key, 3,146 daily observations 2018-02-01 -> 2026-09-15, already wired through supp_loaders.py + static_analysis type map + synthetic_scenarios). The book is a high-beta ALT basket (SOLUSDT, AVAXUSDT, LINKUSDT, DOTUSDT, ADAUSDT, equal-weight) hedged by a BTCUSDT leg sized at the basket's TRAILING 90-DAY REGRESSION BETA to BTC. Net market exposure is therefore ~0 by construction and the book's PnL is the RELATIVE rotation between the risk curve's top (BTC) and its middle (large-cap alts), not alt market beta.
The tilt is CONTINUOUS, not an event trigger. Let s_t = clip((FGI7_t - 50) / 50, -1, +1) where FGI7 is the 7-day mean of the index read POINT-IN-TIME via supp_as_of('fear_greed') (never an abs()-nearest match). Alt-basket notional = +s_t * G; BTC notional = -s_t * G * beta_t. In GREED (s_t > 0) the book is long alts / short BTC; in FEAR (s_t < 0) it is long BTC / short alts; near Neutral it is small but still on. G is set by a 30-day realized-vol target on the spread (12% annualized).
THIS IS THE ANALYST'S OWN DIRECTIVE, IMPLEMENTED. The prior run ExtremeFearFlightToQualityBtcVsAltBasketLS was abandoned 2026-09-13 as `data_wall`, and the abandon note said verbatim: 'For the Research Lead: the Fear & Greed series is worth keeping — a continuous sentiment-tilt formulation (size the BTC-vs-alt spread proportionally to the index daily) would give a measurable sample from the same premise.' That run died because a threshold trigger fired 28 times in 5 years and 25 of them sat in the 2021-22 bear. Sizing continuously off the SAME series converts 28 discrete events into ~1,795 overlapping daily observations of a live book — which is exactly what the deflation/holdout steps need. Two further failure modes are structurally removed: (i) the flagged engine symptom was 'impossible non-zero daily returns during the 18 months the book is FLAT' — this book is NEVER flat, so that variant of the multi-leg marking artifact cannot arise; (ii) the abandon note found the second leg's PnL was 'residual alt-market beta whose sign flips yearly' — the trailing-beta BTC hedge is the direct fix, replacing dollar-neutrality (which leaves ~+0.25 residual beta because large-cap alts run beta ~1.25 to BTC) with genuine beta-neutrality.
DEGREES OF FREEDOM, STATED EXPLICITLY (per lesson L122 — no '3-parameter' novelty claim is made here). Tunables: fgi_smooth_days=7, rebalance_band=0.25, beta_lookback_days=90, target_vol_annual=0.12, max_gross_leverage=1.5. SELECTION choices, each justified economically rather than by backtest: (a) VENUE = BYBIT because BINANCE is 69.6% of 3,151 experiments against a <=40% target while BYBIT is 0.2% against a >=5% target — a portfolio-construction choice, not a performance one; Bybit's 0.02%/0.055% maker/taker is the same fee class as Binance USD-M, so the economics below are venue-invariant, and Bybit plumbing is validated (1,011 daily bar dirs in the catalog, prior Bybit runs reached completed backtests with trades, satisfying lesson L103's 'no brand-new venue' rule). (b) TIMEFRAME = DAILY is forced, not fitted: the Fear & Greed Index is published exactly once per day; no higher-frequency version of the signal exists. (c) SYMBOLS chosen by liquidity + sector diversity + continuous Bybit history from 2021-10-16 (verified in catalog: SOL 2021-10-16, AVAX 2021-09-16, LINK 2020-10-22, DOT/ADA 2021-03-19, BTC 2020-03-26), spanning fast L1 / subnet L1 / oracle / interop L0 / legacy L1. ETH is DELIBERATELY EXCLUDED from the basket — it is a mid-quality asset that partially shares BTC's flight-to-quality bid and would dilute the mechanism. (d) SIGNAL FAMILY: the FGI LEVEL, never a price return — no lookback band was searched.
What this is NOT: not a TSMOM/dual-timeframe clone (L112) — there is no price-momentum term anywhere; not a supplementary GATE on a directional perp trade (L111) — the series is a continuous position SIZER on a market-neutral spread and the gross move it selects for is stated below at 5x round-trip; not a short-horizon cross-sectional reversal basket (L113) — holds average ~4 weeks and the basket is never re-ranked on recent returns; not a cross-venue funding/basis differential (L121) — single venue, single account, no funding-spread claim; not an options structure (L102), not a calendar/event overlay (L104), not an ETF regime rotation (L99).
BTC usage note: BTC appears ONLY as the beta hedge leg, never as the alpha source. The mechanism IS the BTC-dominance cycle, so a BTC leg is mechanically required — this is not another BTC price-series re-mine, and the five alts carry the signal.
Hypotheses
Iteration 2 fixes exactly the reported failure and nothing else. The gate said the metrics were unjudgeable: Sharpe +0.23 (arithmetic mean of the dense MTM daily series) against a compounded total_return of -1.64%. That sign disagreement is volatility drag on a book that was far too small to say anything: the vol-targeted gross G was multiplied by the RAW tilt s_t, whose average magnitude is only ~0.3 (the index lives mostly between 30 and 70), so the deployed book ran at ~0.3 x the declared 12% vol target, i.e. ~3-4% annualized -- five years of the mechanism could only ever produce a +-2% total return, which is statistical noise and why the two series could disagree in sign. The single change is a scale normalisation: s_t is divided by its own trailing mean |s| (252-day bounded deque, running sum, floored at 0.10, capped at 3.0) before sizing. Because the divisor is one positive scalar, the sign and every day-to-day ratio of the continuous tilt are IDENTICAL -- the hypothesis's 'sized proportionally to the index' property is preserved exactly -- but the book now runs at the intended ~12% annualized vol (book vol = |tilt| * target_vol, unit-mean by construction), so the five-year PnL is large relative to drag and the equity curve and its daily series must agree in sign either way. Everything the earlier layers already passed is untouched: imports, class structure, the point-in-time supp_window read, the trailing-beta hedge, the band, the incremental O(1)-per-bar statistics, and the gross cap min(max_gross_leverage, config.leverage) * equity (leverage is read in sizing, so it is not set-but-unused; average gross is ~0.7x equity, well inside the 1.5x cap and the venue's 20x). New constants are declared in parameters with matching _param_bounds for the clamps.
Hypotheses
abandon_class=artifact, with an independent negative-expectancy finding so the abandon holds on either branch. The daily MTM series is incoherent with the equity curve and with the book's own leverage, so the Sharpe the optimizer would maximize is unusable; symptom stated only, no cause asserted — fourth consecutive multi-leg run with cancelling MTM day-pairs, warranting an engine-side review of multi-leg daily marking. Separately the coherent trade ledger shows PF 1.054, negative mean/median per-trade return, one-trade-dependent dollars, a hedge leg that loses more than the alts make, and funding consuming 74% of gross.
Implementation
Always-on, beta-neutral BTC-vs-alt rotation on BYBIT linear perps (1-DAY bars). The only signal is the exogenous daily crypto Fear & Greed Index, read point-in-time via supp_window('fear_greed'): s_t = clip((FGI7-50)/50, -1, +1). The equal-weight alt basket (SOL/AVAX/LINK/DOT/ADA) is held at +tilt*G and BTC at -tilt*G*beta, with beta the trailing 90-day regression beta of the basket on BTC, so net market exposure is ~0 and the book expresses only the BTC-dominance rotation. G is a 30-day realized-vol target on the spread return, and gross notional is hard-capped at 1.5x equity (leverage 2.0 venue margin). A no-trade band of 25% per leg keeps turnover and the ~0.11% Bybit round trip down; missing Fear & Greed data flattens the book (no price fallback).
Verification Results
Either normalise by the trailing RMS of s (so E[tilt^2]=1 by construction) instead of the mean |s|, lower tilt_cap to ~2.0, or lengthen vol_lookback_days / add an ex-post realized-vol governor that scales gross down when trailing book vol exceeds target_vol_annual. Whatever is chosen, re-state the achieved vol in the report so the pre-registered risk profile is testable.
Verification Results
Volatility targeting overshoots badly. Book vol = |tilt| * target_vol_annual only if E[tilt^2]=1, but tilt is the raw tilt divided by its trailing MEAN |s| and then clipped at tilt_cap=3, so E[tilt^2] > 1 (fat right tail whenever sentiment is extreme); on top of that the gross is set from a 30-bar trailing spread vol that lags regime shifts, and min_spread_vol=0.05 lets gross reach 2.4x equity before the 1.5x gross cap binds. Sandbox realized 29.3% annualized vol and a 38.6% max drawdown on a book advertised at 12% — a ~2.4x overshoot. Not a correctness bug (the gross notional cap min(max_gross_leverage, config.leverage)*equity = 1.5x is enforced on GROSS, correctly, and is inside the venue's leverage), but the deployed risk is not the declared risk and the drawdown the Risk Officer will see is driven by it.
Verification Results
Carry this note into the backtest review: judge economics on the daily MTM/equity series, turnover x round-trip, and total_commission — not on avg_trade_return_pct or total_trades. If the hard sample-size gate blocks it, the honest sample here is ~1,175 effective daily observations of an always-on book, which is the whole point of the continuous-tilt reformulation.
Verification Results
Position-ledger metrics are structurally meaningless for this book and must not be gated on. The venue OMS is NETTING and the band-rebalancer never fully closes a leg unless the target falls under min_leg_notional, so 1,775 bars and 447 fills collapse into 12 'positions' with an avg holding period of 587 days and avg_trade_return_pct = -11.15%. That -11.15% is a per-position return over ~19 months of continuous re-sizing, NOT a per-round-trip edge, so the 0.15%/trade fee floor and the minimum-sample-size validity gate both misfire on this strategy in both directions. The real cost check is turnover-based and it passes: turnover 3.35 against Bybit's ~0.11% round trip is ~0.37%/yr of cost on a 12%-target-vol book, and total_commission was $1,021 over 4.9 years.
Verification Results
Reword the docstring/rationale to 'proportional up to a slowly-varying trailing scale factor', and declare tilt_norm_days / tilt_cap / min_tilt_norm as what they are — additional degrees of freedom (they already appear in _param_bounds), so the pre-registration and the optimizer agree on the searchable surface.
Verification Results
The _normalised_tilt docstring and the config rationale both claim the normalisation 'preserves the sign and every day-to-day ratio of the raw tilt' and that positions remain 'exactly proportional to s_t'. That is not literally true: the divisor is a 252-day trailing mean |s| recomputed every bar, so the ratio between two days' positions equals the ratio of their s only when the divisor is unchanged between them. The drift is slow and the economic character (continuous, signed, sentiment-proportional tilt) is preserved, so this is not a hypothesis substitution — but it is a second, path-dependent signal transform layered on the stated one, and it should be described as such. Related: the first min_tilt_obs=20 sized bars use a hard-coded default_tilt_norm=0.30 rather than any measured quantity.
Verification Results
Log a warning (self.log.warning) inside each handler with the instrument id, or count them into _entry_diag, so a silent degradation is visible in the run diagnostics instead of being indistinguishable from 'sentiment was neutral'.
Verification Results
Broad exception swallowing on the order and position paths: _position_for, _signed_notional, _trade_to (_submit_entry_instrument and _submit_exit_position) all catch bare Exception and continue silently. A systematic failure — instrument not in cache, a quantity type change, a rejected order — would present as a permanently flat or permanently one-sided book that still reports a clean run rather than as a loud error. The sandbox shows the happy path works (447 fills, ~0.25 fills/bar, so the band and the signed-notional read are both functioning), so this is a robustness note, not an active defect.
Verification Results
Optional robustness check for the analyst: re-run once with the FGI window shifted back one print (read as-of bar.ts_init - 1 day). If the result changes materially, the edge is living inside the publication boundary rather than in the sentiment cycle.
Verification Results
The Fear & Greed read is exactly contemporaneous with zero margin. alternative.me stamps each print at that day's 00:00 UTC and the daily bar's close-stamped ts is the same 00:00 UTC instant, so supp_window's inclusive <= bound returns the print published minutes after the bar it decides on. This matches the convention the framework itself documents (src/backtesting/supp_loaders.py load_fear_greed: 'the value publishes minutes after midnight, so a <=-lookup is point-in-time honest at daily granularity'), and it is not the abs()-nearest look-ahead — supp_window is strictly one-sided and bounded, which is correct. Flagging only because the book's entire signal rides on that single series with no lag buffer.
Verification Results
Sandbox (smoke test, unoptimized): total_return -5.41%, PF 0.948, max_drawdown 38.6%, realized annualized vol 29.3% against a declared 12% target, and the engine itself set metrics_reliable=false with an explicit Sharpe/return sign incoherence ('judge on the equity curve') — the same multi-leg MTM marking symptom flagged on three prior multi-instrument runs. Two things for the analyst to check first on full history: (1) hedge quality — regime terciles read calm -13.3%, normal +36.5%, stressed -20.2%, i.e. all the P&L sits in the middle vol tercile, which is what a beta-hedge that is right on average but wrong at the tails looks like; the trailing 90d OLS beta is estimated on daily log returns without any shrinkage or vol-scaling, so residual alt beta in fast regimes is the first suspect, exactly the leg the predecessor run died on. (2) whether the FGI level carries any sign information at all on the BTC-vs-alt spread once the book is correctly scaled — this iteration only fixed the SCALE (the previous run's +-2% five-year range), so a near-zero mechanism would now show up as a large-amplitude random walk rather than a flat line. Do NOT read the position-ledger metrics as an edge statement (see issue 2).
Backtest Review
Hypothesis implemented as written — point-in-time FGI read, continuous tilt, trailing-beta BTC hedge, banded rebalance, 132 trades at ~53-day holds; no mechanism mismatch.
Backtest Review
The scale fix worked narrowly: the book is no longer a ±2% flat line (equity 100k → 176k → 111k).
Backtest Review
ARTIFACT (verified on the detail file): equity curve runs 100,000 → 110,922 (+10.9% total, max DD 48.6%) with ~29% curve-implied vol and average trade leverage 0.117 on a gross capped near 1x equity — yet the daily-return series prints repeating cancelling ±20-30% pairs (2024-06-13 −22.66%/+30.58%, 2024-10-05 −22.43%/+28.84%) and the report claims annualized_volatility 154.65% and cagr 2.3364 against total_return 10.92%. Mutually exclusive inside one report. sharpe 0.7409 (mtm_equity_curve basis), var_95, cvar_95, downside_deviation all derive from that series — and that Sharpe is the optimizer's objective.
Backtest Review
Independent negative expectancy: 132 trades, net +$7,658 on $100k over 3.2 traded years, PF 1.054, mean per-trade −1.40%, median −3.03% vs a ~0.11% Bybit round trip; top 5 trades = 781% of net PnL (other 127 lose ~$52k); 2024 realized −$18.3k.
Backtest Review
QA concern #1 confirmed: the BTC hedge leg is the loss centre (−$48,982 over 22 legs vs alts +$56,640; longs +$74,493 vs shorts −$66,835, −2.12%/trade).
Backtest Review
QA concern #2 confirmed: with scale corrected, FGI shows no sign information — a large-amplitude random walk (48.6% DD for +10.9%), exactly the near-zero-mechanism signature QA predicted.
Backtest Review
Funding −$21,850 is 74% of the +$29,508 gross price capture: long-alt/short-BTC in greed is negative carry.
Backtest Review
Realized vol ~29% vs the declared 12% target — the 2.4x sizing miss QA saw in the sandbox persists.
Analysis
Backtest gate:
- metrics unreliable: Incoherent: Sharpe 0.23 disagrees in sign with total_return -1.64% — the Sharpe is computed from the mtm_equity_curve series while the return comes from the equity curve. Judge on the equity curve.
Outcome Summary
SentimentTiltedBtcAltRotationNeutral-b5d468c8c8
Outcome Summary
SentimentTiltedBtcAltRotationNeutralBybit implemented an analyst directive from an earlier abandoned run: instead of a threshold trigger on the Fear & Greed Index, size a beta-neutral BTC-vs-alt-basket spread continuously off the index every day, on BYBIT daily bars. After a second iteration corrected the tilt normalisation (the first version ran at ~0.3x the 12% vol target and produced a ±2% flat line), the book traded 132 times over five years for +10.92% total return, Sharpe 0.7409, and a 48.55% max drawdown. The pre-optimization backtest review abandoned it as an artifact — the daily MTM series printed cancelling ±20-30% day pairs and 154.65% annualized vol that cannot coexist with the equity curve, the fourth consecutive multi-leg run with that symptom — and separately found the coherent trade ledger negative-expectancy, with the BTC hedge leg losing more than the alts made and funding eating 74% of gross. Optimization, analyst review and risk review were never reached.
Outcome Summary
Fixing the sizing scale so a sentiment tilt actually runs at its vol target reveals whether the signal carries sign information — here it did not, and a trailing-beta hedge leg plus negative funding carry can cost more than the alpha basket earns.
Outcome Summary
The backtest-review gate returned abandon before optimization ever ran: abandon_class=artifact, because the daily mark-to-market series (repeating cancelling ±20-30% day pairs, annualized_volatility 154.65% and cagr 2.3364 against a +10.92% total return) was incoherent with the equity curve, making the Sharpe the optimizer would maximize unusable. An independent negative-expectancy finding (PF 1.054, negative mean and median per-trade return, top 5 trades = 781% of net PnL) meant the abandon held on either branch.
Outcome Summary
An always-on, beta-neutral BYBIT long/short book that sized a 5-alt basket against a trailing-beta BTC hedge continuously in proportion to the daily Crypto Fear & Greed Index, betting the BTC-vs-alt rotation tracks sentiment rather than price momentum.
Outcome Summary
Over 1,775 daily bars (2020-03-26 to 2025-02-02) the backtest showed +10.92% total return, Sharpe 0.7409 (CI -0.199 to 1.598), max drawdown 48.55%, and 132 trades at ~53-day average holds with profit factor 1.054, win rate 36.4% and avg_trade_return_pct -5.48%. The backtest review also found the BTC hedge leg lost $48,982 against +$56,640 from the alts, funding cost $21,850 (74% of gross price capture), and realized vol ran ~29% versus the declared 12% target.
Backtest and paper results are hypothetical. Trading involves risk of loss.