Strategies
ADA Hedged Funding Carry at Binance's Interest-Rate Floor: Long ADAUSDT Spot + Short ADAUSDT USD-M Perp While the Trailing 3-Day Mean Funding Is >= 0.01%/8h, Flat When It Turns Negative (1H bars, delta-neutral, ~50% time-in-market)
Outcome: Abandoned
AdaHedgedFundingCarryFloor1H
Outcome Summary
AdaHedgedFundingCarryFloor1H tried to harvest ADA perp funding with a hedged spot-long/perp-short pair, gated on the trailing 3-day mean funding sitting at or above the 0.01%/8h protocol floor. Its funding-only pre-study (no basis P&L) looked promising at +3.22% net per episode across 26 episodes. Over 4 iterations the code gained total-equity sizing, liquidation-buffer resets and anti-churn rules, but it never passed verification. The run was abandoned because Layer 1 static analysis flagged an abs()-based funding timestamp lookup as look-ahead, so no backtest, optimization or analyst review ever took place.
Hypothesis
verification_loop: Verification failed (Layer 1 — static analysis): - Look-ahead: a supplementary observation is selected by ABSOLUTE distance to the bar timestamp, which returns the NEXT observation when it is closer than the previous one. Use self.supp_as_of(key) (latest at or before the bar) or an explicit `ts <= bar.ts_init` filter — never abs(). (line 241)
Implementation
Delta-neutral ADA funding carry: long ADAUSDT spot + equal-quantity short ADAUSDT USD-M perp while the trailing 9-print (3-day) mean 8h funding is >= 0.01%/8h (Binance's interest floor) and the basis is >= 0. Exit when the mean is < 0 and the basis is <= 5bp, after a 24h minimum hold. Hard exit if the mean is < -0.01%/8h or funding goes stale. Each pair is sized from total book equity (0.8 x total / 2 per leg). The perp account is kept margin-safe with 3x venue leverage and a liquidation-buffer reset. Orphan or mismatched legs are flattened, with a 24h re-entry cooldown.
Verification Results
Verification failed (Layer 1 — static analysis): - Look-ahead: a supplementary observation is selected by ABSOLUTE distance to the bar timestamp, which returns the NEXT observation when it is closer than the previous one. Use self.supp_as_of(key) (latest at or before the bar) or an explicit `ts <= bar.ts_init` filter — never abs(). (line 241)
When the pair is open and _entry_px==0, seed _entry_px from the perp position's avg_px_open.
The hedge-check anchor _entry_px and the _rehedge_pending flag are only in-memory. After a paper/live restart with the pair open, _entry_px=0 and the 40% re-hedge check is silently disabled for the rest of the episode. The comment says 'persisted across restarts', but nothing reconstructs them from open positions.
Optional: log a 'naked_leg_unwind' counter so any such events show up in diagnostics.
The two legs are submitted as independent market orders. If one is rejected (e.g. the spot CASH leg is short of cash after fees), the naked-leg guard closes the other leg on the next bar. That is safe, but it costs a full round trip, and at 1.0 leverage with a 0.5 capital_frac a failure like this should be rare. There is no alternative to this; it is noted for the analyst.
Keep it only if the base contract allows it.
min_bars_required() override shadows the base method (static-analysis warning). It is harmless because no price indicators are used and the funding window has its own full-window check.
Analysis
Iteration History
Verification failed (Layer 1 — static analysis): - Look-ahead: a supplementary observation is selected by ABSOLUTE distance to the bar timestamp, which returns the NEXT observation when it is closer than the previous one. Use self.supp_as_of(key) (latest at or before the bar) or an explicit `ts <= bar.ts_init` filter — never abs(). (line 223)
Verification failed (Layer 1 — static analysis): - Look-ahead: a supplementary observation is selected by ABSOLUTE distance to the bar timestamp, which returns the NEXT observation when it is closer than the previous one. Use self.supp_as_of(key) (latest at or before the bar) or an explicit `ts <= bar.ts_init` filter — never abs(). (line 239)
Outcome Summary
Point-in-time funding lookups must use self.supp_as_of()/supp_window() or an explicit ts <= bar.ts_init filter; any abs()-distance timestamp match is a hard Layer 1 error that blocks the strategy before it can be backtested.
After 4 iterations the run was abandoned in a verification loop. Layer 1 static analysis kept rejecting the code for look-ahead because it picked the supplementary funding observation by absolute distance to the bar timestamp (line 241), which can return the next print.
A delta-neutral ADA funding carry: hold long ADAUSDT spot and short ADAUSDT USD-M perp while the trailing 9-print (3-day) mean funding is at or above Binance's 0.01%/8h interest-rate floor, and go flat when the mean turns negative. The aim was to collect the structural payment that longs make to shorts.
No pipeline backtest or optimization metrics exist for this run: the backtest report is empty and no optimization report was produced. The only numbers are from the hypothesis's funding-only pre-study, which excluded basis P&L: 26 episodes over 2020-01 to 2026-09, mean +3.22% per episode net of a 0.30% round trip, 77% of episodes net-positive, and about 50% time in market.
Abandon Reason
verification_loop: Verification failed (Layer 1 — static analysis): - Look-ahead: a supplementary observation is selected by ABSOLUTE distance to the bar timestamp, which returns the NEXT observation when it is closer than the previous one. Use self.supp_as_of(key) (latest at or before the bar) or an explicit `ts <= bar.ts_init` filter — never abs(). (line 241)
Backtest Review
- Sharpe
- 0.23
- Total return
- 5.85%
- Max drawdown
- 0.45%
- Trades
- 102
- Win rate
- 50.0%
- Profit factor
- 1.06
Backtest and paper results are hypothetical. Trading involves risk of loss.