Skip to content

View original

EthBtcRatioFearGreedRiskAppetiteRotation

Hypotheses

Crypto Risk-Appetite Rotation on the ETH/BTC RATIO PERP — Long-Short ETHBTC.BINANCE Driven by the EXOGENOUS Daily Fear & Greed Index (single tradable ratio contract, DAILY bars, vol-targeted, long the ratio in greed / short it in fear)

Hypotheses

A LONG-SHORT, SINGLE-INSTRUMENT, MARKET-NEUTRAL-BY-CONSTRUCTION strategy on ETHBTC.BINANCE — the Binance USD-M perpetual whose price IS the ETH/BTC ratio. The traded object is not a coin's USD price but the market's internal risk curve: ETH is the liquid high-beta major, BTC the reserve asset, and the ratio is the cleanest single-contract expression of aggregate crypto risk appetite. The signal is a NON-PRICE, EXOGENOUS, market-wide series: the daily alternative.me Crypto Fear & Greed index (supp key `fear_greed`, 3,146 daily values since 2018-02, 0-100, built from market-wide volatility, volume, dominance, social and survey inputs). Economic claim (NEW, not a momentum/carry/reversal re-skin): aggregate risk appetite is a SLOW, PERSISTENT state variable — it tracks retail participation, stablecoin issuance and leverage build, which change over weeks, not days — and marginal flows move DOWN the risk curve into ETH while it is elevated and back UP toward BTC when it deteriorates. So the sentiment state should forecast the RELATIVE (ETH-vs-BTC) drift, a quantity that has no USD beta in it at all. I measured this before proposing, on ETHBTC.BINANCE_SPOT-1-DAY (2,917 bars, 2018-08-02..2026-07-27) joined point-in-time to `fear_greed`. Forward log returns of the ratio by index bucket: FGI 0-25 : 5d -0.60%, 10d -0.98%, 21d -0.96% (n=682) FGI 25-45 : 5d -0.44%, 10d -0.98%, 21d -2.10% (n=754) FGI 45-55 : 5d -0.35%, 10d -0.58%, 21d -1.82% (n=447) FGI 55-75 : 5d +0.71%, 10d +1.27%, 21d +2.40% (n=732) FGI 75-100 : 5d +0.21%, 10d +0.31%, 21d +0.38% (n=281) The sign break sits exactly at the index publisher's own neutral band (~45-55), the spread between the fear and greed regimes is ~3-4% per 21 days, and each bucket holds hundreds of observations — this is not an event study on a handful of episodes. CONTROLS (this is the part that distinguishes the idea from the factory's dead families). On the same 8-year ratio series, full notional, 0.10% round-trip costs: always-SHORT the ratio = Sharpe 0.16; always-LONG = -0.16; a 56-day TSMOM on the ratio itself (the obvious pure-price competitor) = Sharpe 0.22; the Fear&Greed band rule = Sharpe 0.65-0.85 across EVERY variant tested (smoothing 3/5/7 days x bands 45/55, 40/60, 50/50), 7-9 of 9 calendar years positive, 2.9-8.1% net per round trip. The index therefore carries directional information about the ratio that is NOT in the ratio's own price history, and the result is not a disguised short bias on a pair that fell over the sample. Re-run on the TRADED contract itself (ETHBTC.BINANCE-1-DAY perp, 1,237 bars, 2023-04-27..2026-09-14, 41 months, costs 0.05%/side + measured funding): smoothing 3 / band 45-55 gives 34 entries, Sharpe 0.74 unlevered (0.62 at a 20% vol target), +3.11% net per trade, 3 of 4 years positive, avg hold ~30 days.

Hypotheses

Implements the hypothesis exactly: the traded object is the single ETHBTC ratio perpetual (no USD beta by construction), and the signal is the exogenous market-wide Fear & Greed index rather than any price transform of the ratio itself - the ratio's price enters only through the vol scaler. The band boundaries are the publisher's own neutral band (45/55), the smoothing is the 3-day mean the hypothesis measured, and the hysteresis reproduces the tested 'band rule' (state persists through the neutral zone) rather than a flat-in-the-middle variant. Venue: BINANCE futures is required because the strategy is genuinely long AND short - a spot venue could not express the fear leg - and ETHBTC only exists as a perpetual with daily data (2023-04-27..2026-09-14, 1237 bars) on that venue; leverage is left at 1.0 because the vol target at 15% keeps notional at ~0.5x equity, well under 1x, so no margin amplification is used or needed (nothing in the code multiplies by leverage). I sanity-checked the wiring on the real catalog series before coding: joining ETHBTC.BINANCE-1-DAY to fear_greed point-in-time, the 3-day/45-55 band rule gives ~16 direction changes over the 3.4-year perp history, exposure ~0.5x equity at a 15% vol target, and 3 of 4 calendar years positive - i.e. it trades (no zero-trade risk in Layer 3) and per-trade returns are multiple percent, far above the fee floor. One caveat for the reviewer, implemented as asked rather than worked around: the catalog instrument ETHBTC.BINANCE is stored with quote_currency USDT while its price (~0.033) is really BTC-denominated, so engine quantity = USD notional / 0.033 is ~30x the economically real unit count; PnL and returns are correct (qty * dprice = equity * ratio return), but the market-impact model's participation = qty / bar_volume will clamp at 1.0 and charge a flat ~71 bps per fill. That is an instrument-metadata artifact, not a real cost; at ~30 fills over the full history it is a ~1.4% round-trip tax the measured per-trade edge (several percent) still clears, but the analyst should read impact_cost on this run with that in mind. I chose a 15% vol target rather than the hypothesis's 20% purely as a risk choice (it holds max drawdown near 30% instead of ~37% with essentially the same Sharpe); the optimizer can search 0.05-0.40 via _param_bounds.

Hypotheses

data_wall: unmeasurable on the only shortable ratio contract, verified on the trade ledger rather than predicted from thresholds. 14 regime flips in 928 days, one of which supplied 103.6% of net PnL while the other 13 net -$1,431. Not a cost failure, not a code failure, not a falsified premise.

Implementation

Long-short, single-contract risk-appetite rotation on ETHBTC.BINANCE (the Binance USD-M perpetual whose price is the ETH/BTC ratio), on DAILY bars. The only directional input is the exogenous daily alternative.me Crypto Fear & Greed index (supplementary key `fear_greed`, 0-100, full history since 2018), read point-in-time via supp_window(). calculate_signal() returns a continuous decision variable every bar: the `fgi_smooth_days`-observation mean of the index minus the publisher's neutral mid (50), i.e. roughly -45..+45. The position state is a band rule with hysteresis: smoothed index above `greed_band` (55) -> long the ratio (risk flows down the curve into ETH), below `fear_band` (45) -> short the ratio (flows back up into BTC), inside the neutral band the prior state is held, so the book is always in one direction and turns over only ~5 times a year (avg hold several weeks). Exits fire only on a regime flip. Sizing is volatility-targeted: notional = equity * min(max_notional_frac, target_annual_vol / realized_vol), where realized_vol is the ratio's own annualized vol over a rolling `vol_lookback_bars` window maintained incrementally (deque + running sum/sum-of-squares, O(1) per bar); quantity = notional / price. If the index is unavailable the signal is 0.0 and the strategy stays flat - there is no price-based fallback.

Verification Results

Do not widen the bands to manufacture trades -- that would break the hypothesis's tested rule. Instead, freeze the pre-registered point (fgi_smooth_days=3, fear_band=45, greed_band=55) and let the optimizer search only the two risk parameters (target_annual_vol, vol_lookback_bars), so the signal geometry is not fitted to 17 observations.

Verification Results

Trade count over the full backtest window is ~17 round trips (16 regime flips, verified by replaying the band rule over the actual fear_greed series against the ETHBTC.BINANCE daily window), while _param_bounds exposes 6 optimizable parameters. This is a low-power sample for walk-forward optimization: 3 WF windows would hold roughly 5 decisions each.

Verification Results

Engine-side, not strategy-side: the supp collector is not resolving funding for the ETHBTC symbol on the BINANCE venue. Worth checking the symbol mapping before the full backtest so the analyst sees funding-inclusive PnL; magnitude is small enough that it does not change the verdict either way.

Verification Results

Funding is NOT folded into the sandbox result (funding_folded: false, funding_events_available: 0), yet ETHBTC funding history does exist on disk (data/supplementary/fundingRate/ETHBTC/all.parquet: 3,676 8-hourly events, 2023-04-24..2026-08-31, mean +0.0015% per interval ~= +1.6%/yr, 730 non-zero). The book is always in the market with ~0.5x equity notional and holds for weeks, so unmodelled funding is a real (if small) cost/credit stream: at ~0.5x exposure, ~+0.8%/yr paid on the long legs and credited on the short legs.

Verification Results

No strategy-code change (the strategy has no BTC/USD feed with which to convert to true contract units, and adding one would import USD beta into a deliberately neutral book). Flagging so the analyst does NOT read impact_cost_pct or the ECONOMICS 'impact <= 50% of gross' gate literally on this run, and so the instrument's base/quote metadata can be corrected engine-side.

Verification Results

Instrument-metadata artifact, correctly disclosed by the developer and confirmed here: ETHBTC.BINANCE is registered in the catalog as a CurrencyPair with base_currency='ETHBTC' and quote_currency='USDT' (price/size precision 8), even though the price (~0.033) is BTC-denominated. Consequence chain: qty = equity*scale/0.033 is ~30x the economically real contract-unit count, so the impact model's participation = qty/bar_volume clamps at 1.0 and charges a flat ~66-71 bps per fill (sandbox: $1,195.41 of impact over 4 fills, impact_cost_pct 6.58). PnL and fees are UNAFFECTED and correct (qty*dprice = notional * ratio_return; commission = 0.05% of the true USD notional), so the distortion is conservative -- it can only produce a false negative, never a false promotion. With ~34 fills over full history the cumulative artificial drag is on the order of 20-25 percentage points of equity against a claimed ~3%/trade gross edge.

Verification Results

Harmless at daily granularity on this history, but if the optimizer selects a long vol_lookback, note that the first ~6 months of the window are non-trading. Priming the returns buffer from self._bars (the base class already holds them) inside the first calculate_signal call would remove the double warmup.

Verification Results

Effective warmup is longer than min_bars_required() suggests. calculate_signal() is only invoked after min_bars_required() = vol_lookback+5 = 50 bars, and _prev_close/_rets are populated ONLY inside calculate_signal, so the realized-vol gate (n >= max(5, vol_lookback//2) = 22) needs a further ~22 bars; should_enter() returns None until then because _realized_vol == 0.0. Real warmup is ~72 bars of 1237 (5.8%) at defaults, rising to ~185 bars if the optimizer picks vol_lookback_bars=120.

Verification Results

No change needed -- the loader explicitly blesses this as 'point-in-time honest at daily granularity', and on a ~30-day average hold a few minutes of timing is immaterial. Recorded so nobody re-litigates it as look-ahead later.

Verification Results

Minor signal-timing optimism inherent to the framework's fear_greed convention, not a strategy bug. alternative.me values are stamped 00:00 UTC of day D (load_fear_greed docstring) and daily bars are close-stamped, so the bar closing at 00:00 D reads the value stamped 00:00 D, which the publisher releases a few minutes after midnight, while the entry fills at that same close price. supp_window uses bisect_right so ts == bar_ts is included.

Verification Results

STATISTICAL POWER, not code. I re-derived the decision count on the real series (data/supplementary/fear_greed/all.parquet joined to the ETHBTC.BINANCE-1-DAY window 2023-04-27..2026-09-14): the 3-day smoothed 45/55 band rule with hysteresis produces exactly 16 direction changes = ~17 round trips over 3.4 years, NOT the '34 entries' the hypothesis quotes (that figure appears to count fills, i.e. exit+entry per flip). Sharpe SE over a 3.4-year span is ~0.54, so the hypothesis's claimed 0.74 is ~1.4 sigma; and _param_bounds exposes SIX searchable parameters (fear_band, greed_band, fgi_smooth_days, vol_lookback_bars, target_annual_vol, max_notional_frac) against 17 independent decisions -- an overfitting surface the optimizer will happily fill. Two mitigations worth weighing at backtest_review rather than another coding iteration: (a) there is NO longer-history alternative -- ETHBTC.BINANCE_SPOT has 2018-2026 but is a CASH venue that cannot express the short (fear) leg, and ETHBTCUSDT.BYBIT starts only 2024-06, so the 3.4-year perp is the longest shortable ratio contract in the catalog; (b) the hypothesis's out-of-contract evidence (8-year spot ratio, bucket n=281..754, control Sharpes: always-short 0.16, always-long -0.16, 56d TSMOM 0.22 vs band rule 0.65-0.85 across every smoothing/band variant) is genuinely stronger than the tradable window and is the right prior to lean on. Recommend the analyst pre-register the parameter set (the publisher's own 45/55 band, 3-day smooth) and treat any optimizer gain over that point as noise. Second, smaller concern: the sandbox regime split is -12.06% / Sharpe -0.85 in the stressed-vol tercile against +12.9%/+16.6% in calm/normal -- i.e. the risk-appetite signal appears to work in trending sentiment and lose when vol spikes, which is the soft gate the analyst reads; on 2 sandbox trades this is not evidence, but it is the first thing to look at on full history.

Backtest Review

Trades implement the hypothesis exactly: 14 alternating LONG/SHORT ratio positions, ~60d holds, no price-derived directional input. No mechanism mismatch.

Backtest Review

Costs are not the issue: avg_trade_return_pct 10.2% vs a 0.15% floor, commissions 1.02% of gross, funding credited (-$3,881) and still net positive.

Backtest Review

The pre-proposal 8-year spot bucket study (n=281..754) with explicit controls (always-short 0.16, always-long -0.16, 56d TSMOM 0.22 vs band rule 0.65-0.85) is genuinely strong research.

Backtest Review

ONE trade is the whole result: 2025-04-25→2025-09-01 LONG made +$41,544 vs a book total of +$40,113 (103.6%); the other 13 trades net -$1,431. Top 2 = 139.7%.

Backtest Review

The greed/long leg does not work here (2/7 winners, -$38,156 ex-top-trade); 92% of PnL comes from the fear/short leg during the 2024 ETH/BTC downtrend — the 'disguised short bias' the hypothesis tried to rule out.

Backtest Review

14 decisions vs 6 searchable parameters; hard validity floors are structurally unreachable (14 trades vs 30; a last-20% holdout holds 2-3 trades vs ≥10).

Backtest Review

Flagged for engineering, not the abandon ground: the daily series prints alternating ~+11%/-10% pairs on days the equity curve moves <1% (139,692.35→140,990.41), so annualized_volatility 125.71%, var/cvar, sortino, calmar, regime_performance, stress_windows and probabilistic_sharpe are untrustworthy — and the optimizer's objective is that same mtm Sharpe. max_drawdown 31.60% and the trade ledger ARE consistent and were what I used.

Outcome Summary

EthBtcRatioFearGreedRiskAppetiteRota-7216e6fc78

Outcome Summary

The strategy took the daily Fear & Greed index — a non-price, market-wide series — and used it to hold the ETH/BTC ratio perpetual long in greed and short in fear, with volatility-targeted sizing and hysteresis in the publisher's neutral band. Backtested on 928 days of ETHBTC.BINANCE it produced +40.14% with Sharpe 0.69, profit factor 2.00 and a 31.60% drawdown, comfortably clearing cost viability at 10.2% average per-trade return. But the 14 regime flips were too few to validate: one long trade accounted for 103.6% of net PnL, the remaining 13 lost $1,431, and most of the profit came from the short leg during the 2024 ETH/BTC downtrend — the disguised short bias the hypothesis had explicitly tried to rule out. The analyst abandoned it at backtest review, before optimization, on the grounds that the edge was unmeasurable on the only shortable ratio contract rather than demonstrably absent.

Outcome Summary

A signal that only flips a handful of times per year cannot generate enough trades on a short-history contract to be statistically validated, so slow regime strategies need either a much longer tradable history or a design that produces many more independent decisions.

Outcome Summary

The backtest-review gate returned 'abandon' before optimization: with 14 decisions against 6 searchable parameters, the hard validity floors were structurally unreachable (14 trades vs a 30 minimum, ~3 implied holdout trades vs 10), and the result rested on a single trade. The abandon reason was recorded as a 'data_wall' — unmeasurable on the only shortable ratio contract — not a cost failure, code failure, or falsified premise.

Outcome Summary

Trade the ETHBTC.BINANCE ratio perpetual long in greed and short in fear using the exogenous daily alternative.me Crypto Fear & Greed index as the sole directional signal, on the claim that aggregate risk appetite is a slow state variable that forecasts ETH-vs-BTC relative drift.

Outcome Summary

Over 928 daily bars (2023-04-27 to 2025-11-09) the backtest returned +40.14% total (CAGR 16.36%) with Sharpe 0.69, profit factor 2.00, 31.60% max drawdown and just 14 trades (7 long, 7 short) at an avg_trade_return_pct of 10.2%. One long trade (2025-04-25 to 2025-09-01, +$41,544) supplied 103.6% of net PnL while the other 13 trades netted -$1,431, and 92% of profit came from the fear/short leg.
Strategy report

Backtest and paper results are hypothetical. Trading involves risk of loss.