Binance COIN-M Inverse Perp Negative-Funding Carry Basket — Long-Only, Multi-Asset, Harvest the Miner-Hedge Short Pressure That Keeps Coin-Margined Funding Persistently Negative (4H Bars, 0.06% RT Venue, 3-Parameter)
Outcome: Abandoned
CoinMNegativeFundingCarryBasketLong
Outcome Summary
This hypothesis moved the factory's promoted negative-funding carry basket to Binance COIN-M inverse perps, betting that persistent hedger short pressure and lower fees would make the carry larger. After 3 iterations the backtest showed +81.5% over 641 trades at 0.67% per trade, but with a 40.5% drawdown and a 31% loss in the LUNA window. Splitting the trade ledger showed that funding contributed only about +$2k net of costs, roughly 0.015% per trade, while most of the profit was long coin beta with negative alpha. The analyst abandoned it at backtest review, before optimization, because tuning could not lift the carry above costs.
A LONG-ONLY, MULTI-INSTRUMENT funding-carry basket on BINANCE_CM (COIN-M inverse perpetuals) — the single most under-explored venue in the book at 2.8% of 1458 experiments against a >=5% quota, with only 41 lifetime attempts. It is a direct transplant of the factory's PROMOTED carry mechanism ('5-Asset Crypto Majors 4H Negative-Funding-Rate Long-Only Carry Basket', Sharpe 1.97, at paper) onto a venue where the same edge is STRUCTURALLY LARGER and CHEAPER to harvest. Why COIN-M specifically: coin-margined perps……Show moreShow less
A LONG-ONLY, MULTI-INSTRUMENT funding-carry basket on BINANCE_CM (COIN-M inverse perpetuals) — the single most under-explored venue in the book at 2.8% of 1458 experiments against a >=5% quota, with only 41 lifetime attempts. It is a direct transplant of the factory's PROMOTED carry mechanism ('5-Asset Crypto Majors 4H Negative-Funding-Rate Long-Only Carry Basket', Sharpe 1.97, at paper) onto a venue where the same edge is STRUCTURALLY LARGER and CHEAPER to harvest. Why COIN-M specifically: coin-margined perps are the natural hedging instrument for miners, long-term holders, and BTC/ETH-denominated treasuries, who systematically SHORT them to hedge coin inventory without selling spot. That persistent one-sided short pressure pushes COIN-M funding negative more often and more deeply than the equivalent USD-M contract — and when funding is negative, LONGS ARE PAID. On top of that, COIN-M round-trip taker cost is ~0.06% versus ~0.10% on USD-M, a 40% cost reduction that directly widens the carry margin on a strategy whose entire PnL is a small recurring cash flow. Mechanism: at each 4H close, for every basket member whose current funding rate is sufficiently negative, hold an equal-weight LONG inverse perp and collect funding every 8h; exit when the carry decays. Universe anchors on the two deepest-history COIN-M contracts (BTCUSD_PERP, ETHUSD_PERP) plus liquid alt perps (SOLUSD_PERP, XRPUSD_PERP, BNBUSD_PERP, DOGEUSD_PERP) — ALL current perpetuals, never a bare index name and never an expired dated quarterly. Only 3 tuned parameters (entry_funding, exit_funding, max_positions) to hold down the best-of-N selection inflation that killed 202 prior hypotheses via overfit. No liquidation feed (avoids L3), no options legs (avoids L2), and strictly SINGLE-VENUE so it is not a two-legged cross-margin carry (avoids L1's most reliable fee_edge death entirely — there is one leg, two fills, ~6bps total).
broken_mechanism (code: fee_edge for the carry component). The profit does not come from the funding carry the hypothesis describes. The trade ledger shows funding +$25.9k against price +$70.6k, with commission $14.5k and impact $9.4k. The carry alone nets about +$2k over 641 trades, roughly +0.015% per trade against the 0.10% BINANCE_CM floor. The +81% headline (0.67% per trade) is unhedged long coin beta: alpha -0.003, IR -0.83, forecast IC -0.026 (t=-2.6) and a 40.5% drawdown. QA's concern is borne out. Optimizing would only tune how much beta the book holds and cannot lift the carry above costs. Hedging the coin leg would be a different, delta-neutral hypothesis, and its carry as measured here is already below cost. Scope: long-only, unhedged negative-funding carry on Binance COIN-M at 4H. The promoted USD-M sibling should get the same funding-versus-price PnL split.
Implementation
Long-only COIN-M inverse perp carry basket across BTC/ETH/SOL/XRP/BNB/DOGE USD_PERP on 4H closes: hold up to max_positions equal-USD-face longs in the legs with the most negative point-in-time funding (<= entry_funding), exit when funding rises to >= exit_funding or goes stale. Sized in whole contracts off the stable USD balance only.
Iteration 3 fixes the critical sizing blowup: removed _usd_equity(), which valued the runner's return-neutral seeded coin collateral (50 BTC, 500 ETH, 1M SOL/XRP/BNB/DOGE) at full USD mark and inflated per-leg notional ~1000x. Sizing now uses get_account_equity() (stable USD balance, ~$100k) only; per_leg_usd = equity*gross_exposure*leverage/max_positions, and a hard gross cap (open USD face + pending slots + new order <= equity*gross_exposure*leverage) is checked before every entry, so max gross is <= 0.9x equity at leverage 1. Primary-leg double submission is prevented because _primary_selected is only set when the primary has no open position, no in-flight entry and no pending close; the base template additionally only calls should_enter when flat. Signal/funding logic is unchanged. Edge concern acknowledged: the long inverse leg carries full coin beta, so price drift may dominate carry; that is the hypothesis as stated and the analyst should judge it on avg_trade_return_pct.
Verification Results
Remove gross_exposure from _param_bounds and fix it at 0.9, so the search space matches the pre-registered 3 parameters.
The hypothesis says only 3 tuned parameters (entry_funding, exit_funding, max_positions), but _param_bounds also exposes gross_exposure over [0.0, 1.0]. gross_exposure only scales size, not the signal. Still, it is a 4th optimisable dimension, and its lower bound of 0 allows a do-nothing configuration.
Acceptable as is. If the full-history run shows many waiting_on_extra_legs diagnostics, start the backtest window from the latest listing date in the universe.
The base template's alignment barrier holds back primary processing until every extra leg has a bar at the same timestamp. A missing bar on any one of the six COIN-M perps therefore stalls the whole basket for that bar. That includes exits on the other legs. Some alt perps were listed later or have gaps, so this can happen.
Consider a 1.5x interval (43200 s) so one delayed print does not churn positions. Leave it as is if a strict stale-exit is preferred.
funding_lag_seconds is 28800, exactly one 8h settlement interval. If a funding print is late or missing, a held leg goes stale and is force-exited, and re-entered on the next print. That costs a round-trip with no signal change.
The sandbox made 103 trades over about 1 year at +0.18% per trade on notional, with Sharpe 0.06, PF 1.13 and beta 0.016. The skew is +2.9 and kurtosis 31.8, so PnL looks driven by price tails, not steady carry. That fits a long inverse leg holding full coin beta. When analysing the full backtest, split PnL into funding cash flow and price change. Also check that funding_folded credits inverse legs in the same coin units as their realized PnL. If price change dominates, the 'carry' label is wrong. One more point: the long inverse leg is paid in coin, but sizing reads only the stable USD balance, so returns do not compound.
Backtest Review
Sharpe
0.53
Total return
81.46%
Max drawdown
40.45%
Trades
641
Win rate
53.5%
Profit factor
1.45
Large sample: 641 closed long trades from 2021-09 to 2026-04, all six legs traded, and no open position at the end, so the headline is not inflated by unrealized gains.
Ledger accounting reconciles. Funding is credited per trade in the same USD ledger as price PnL.
Headline per-trade return of 0.67% is above the 0.10% COIN-M floor; PF is 1.45.
QA's concern is confirmed. Splitting the trade ledger gives: funding +$25.9k, price +$70.6k, commission -$14.5k, modelled impact -$9.4k. About 73% of gross PnL is coin price movement, not carry.
The carry alone nets about +$2k over 641 trades after costs, roughly +0.015% per trade. That is below the 0.10% COIN-M floor.
The price component is beta, not edge: alpha -0.0034 and information ratio -0.83 against the equal-weight COIN-M basket, correlation 0.61. The forecast IC is -0.026 (t=-2.6).
2022, the year with the most funding ($16.4k), earned about $0 on price and lost 31% in the LUNA window. 2023 and 2024 (bull markets) supplied $52k of price PnL.
Max drawdown is 40.5% (CI up to 64.6%) against the 20% futures default, with a 317-day recovery.
Nothing traded before 2021-09-07 because the alignment gate waited for the SOL leg, so about 13 months of history went unused.
Iteration History
Verification failed (Layer 4 — QA review) [class=premise_falsified]: - The core economic premise is refuted (in fact inverted) by the data. The hypothesis claims COIN-M funding is PERSISTENTLY NEGATIVE from miner-hedge short pressure, so longs get paid. The developer measured the actual ~1-year COIN-M funding history and found the MEAN rate is POSITIVE (~+0.000033) with only 23-34% of prints negative per symbol — on average longs PAY, the opposite of the harvested edge. A long-only negative-funding carry fights a……Show moreShow less
Verification failed (Layer 4 — QA review) [class=premise_falsified]:
- The core economic premise is refuted (in fact inverted) by the data. The hypothesis claims COIN-M funding is PERSISTENTLY NEGATIVE from miner-hedge short pressure, so longs get paid. The developer measured the actual ~1-year COIN-M funding history and found the MEAN rate is POSITIVE (~+0.000033) with only 23-34% of prints negative per symbol — on average longs PAY, the opposite of the harvested edge. A long-only negative-funding carry fights a positive-mean funding regime and cannot systematically collect carry. Sandbox confirms: total_return -4.17%, Sharpe -0.144 (CI [-0.80, 0.58]), alpha -0.0043, information_ratio -0.74 vs equal-weight basket, end_unrealized -7.3%. avg_trade_return_pct 0.1198% only marginally clears the true 0.10% floor and doesn't sum to a positive book. The promoted USD-M sibling worked because USD-M supplies the negative regime; the COIN-M transplant fails because that regime doesn't exist. Re-coding cannot make COIN-M funding persistently negative.
- Two supporting premises are also wrong: (a) the fee-advantage claim (0.06% RT, '40% cheaper') is false — venue_configs charges ~0.10% RT on COIN-M (same as USD-M taker), so the thin ~0.01%/8h carry needs multi-day holds to break even; (b) COIN-M funding data exists only 2025-05-25 to 2026-05-04, so the '5.8-year' backtest is really a ~1-year, 117-trade recent-only sample (funding_events_available 402).
Verification failed (Layer 2 — synthetic scenarios): Parameters used: ['exit_funding', 'min_notional', '_param_bounds', 'entry_funding', 'max_positions', 'gross_exposure', '_optimization_plan', 'funding_lag_seconds'] Check that __init__ sets all attributes from self.parameters.get(). - steady_uptrend: AttributeError: '_MockCache' object has no attribute 'account_for_venue' (bar timestamp: 1735689840000) - steady_downtrend: AttributeError: '_MockCache' object has no attribute 'account_for_venue' (bar timestamp:……Show moreShow less
Verification failed (Layer 2 — synthetic scenarios):
Parameters used: ['exit_funding', 'min_notional', '_param_bounds', 'entry_funding', 'max_positions', 'gross_exposure', '_optimization_plan', 'funding_lag_seconds']
Check that __init__ sets all attributes from self.parameters.get().
- steady_uptrend: AttributeError: '_MockCache' object has no attribute 'account_for_venue' (bar timestamp: 1735689840000)
- steady_downtrend: AttributeError: '_MockCache' object has no attribute 'account_for_venue' (bar timestamp: 1735689840000)
- flat_ranging: AttributeError: '_MockCache' object has no attribute 'account_for_venue' (bar timestamp: 1735689840000)
- volatility_spike: AttributeError: '_MockCache' object has no attribute 'account_for_venue' (bar timestamp: 1735689840000)
- zero_volume: AttributeError: '_MockCache' object has no attribute 'account_for_venue' (bar timestamp: 1735689840000)
- price_gap: AttributeError: '_MockCache' object has no attribute 'account_for_venue' (bar timestamp: 1735689840000)
- missing_supplementary_data: strategy crashes when supplementary data is absent (AttributeError: '_MockCache' object has no attribute 'account_for_venue'; keys absent: funding_rates, funding_rates_by_instrument; bar timestamp: 1735689840000). Supplementary series are best-effort — in the real backtest, paper and live a referenced key can be missing or empty, and the strategy must go flat, not crash. Fix: read series through self.supp_as_of(key, default=None) / self.supp_window(key, n) (or self.parameters.get('supplementary_data', {}).get(key)), check for None / empty, and return a neutral signal (0.0) when the data is unavailable.
Verification failed (Layer 4 — QA review) [class=code_defect]: - [edge_concern] Even after the sizing fix, the funding-carry PnL per trade is small: at ~-0.01%/8h entry, a multi-day hold collects a few tenths of a percent against 0.10% round-trip taker on BINANCE_CM (venue table is 0.05%/side, not the hypothesis's 0.06% RT). The inverse long also carries full coin-price beta, so price drift will dominate carry. The analyst should check whether funding accrual really reaches avg_trade_return_pct. - [critical]……Show moreShow less
Verification failed (Layer 4 — QA review) [class=code_defect]:
- [edge_concern] Even after the sizing fix, the funding-carry PnL per trade is small: at ~-0.01%/8h entry, a multi-day hold collects a few tenths of a percent against 0.10% round-trip taker on BINANCE_CM (venue table is 0.05%/side, not the hypothesis's 0.06% RT). The inverse long also carries full coin-price beta, so price drift will dominate carry. The analyst should check whether funding accrual really reaches avg_trade_return_pct.
- [critical] Sizing blowup: _usd_equity() values EVERY coin balance on the BINANCE_CM account at full USD mark. The backtest runner (runner.py ~L511, inverse_support.coin_m_starting_balances) seeds return-neutral collateral for every CM leg: 50 BTC, 500 ETH and 1,000,000 units each of SOL, XRP, BNB and DOGE. That seed is meant to be valued only as a DELTA. Summed at mark it is hundreds of millions of USD on top of the $100k USDT. So _per_leg_usd = equity*0.9/4 is roughly 1000x+ real capital. The sandbox shows exactly this: avg_position_pct 191,906%, $383.8M traded notional, $190k commission, $1.36M impact, a single trade losing $4.42M, and liquidation on 2025-05-25 with -100% return. The book requests gross notional orders of magnitude above equity x max_leverage. (line 120) — fix: Size off real capital only. Use self.get_account_equity() (the stable USD balance, $100k), or value coin balances as delta-from-initial (snapshot balances on the first bar and add only (balance - initial) * mark). Also cap gross independently: per_leg_usd <= equity * leverage / max_positions with equity bounded by the stable balance. Assert sum of open leg notionals <= equity * leverage before each entry.
- [warning] Entries for extra legs are submitted directly from calculate_signal. For the primary leg the base template routes through should_enter/position_size. Both use the same per-leg budget, which is consistent. However, the primary's _primary_selected is set before the base template checks its own position/pending state. Confirm the base template does not double-submit the primary while an entry is in flight. (line 236) — fix: Optional: submit the primary through the same explicit path as the extras, or rely on base-template in-flight guards and document that.
- [warning] The sandbox reported only 67 funding events available over the window. With 6 legs at 8h settlement over ~1749 days, many thousands would be expected. COIN-M funding parquet exists (coinm_funding/<SYM>_PERP for all 6 legs) and the per-leg wiring via funding_rates_by_instrument is correct. Still, the 67 count may reflect accrual only on the single (liquidated) position. The staleness guard (funding_lag 8h) will exit or prevent entry if coverage has gaps. — fix: After fixing sizing, verify each leg's funding series covers the backtest window, and that funding_events_available scales with held position-days.
Size off real capital only. Use self.get_account_equity() (the stable USD balance, $100k), or value coin balances as delta-from-initial (snapshot balances on the first bar and add only (balance - initial) * mark). Also cap gross independently: per_leg_usd <= equity * leverage / max_positions with equity bounded by the stable balance. Assert sum of open leg notionals <= equity * leverage before each entry.
Sizing blowup: _usd_equity() values EVERY coin balance on the BINANCE_CM account at full USD mark. The backtest runner (runner.py ~L511, inverse_support.coin_m_starting_balances) seeds return-neutral collateral for every CM leg: 50 BTC, 500 ETH and 1,000,000 units each of SOL, XRP, BNB and DOGE. That seed is meant to be valued only as a DELTA. Summed at mark it is hundreds of millions of USD on top of the $100k USDT. So _per_leg_usd = equity*0.9/4 is roughly 1000x+ real capital. The sandbox shows exactly this: avg_position_pct 191,906%, $383.8M traded notional, $190k commission, $1.36M impact, a single trade losing $4.42M, and liquidation on 2025-05-25 with -100% return. The book requests gross notional orders of magnitude above equity x max_leverage.
Optional: submit the primary through the same explicit path as the extras, or rely on base-template in-flight guards and document that.
Entries for extra legs are submitted directly from calculate_signal. For the primary leg the base template routes through should_enter/position_size. Both use the same per-leg budget, which is consistent. However, the primary's _primary_selected is set before the base template checks its own position/pending state. Confirm the base template does not double-submit the primary while an entry is in flight.
After fixing sizing, verify each leg's funding series covers the backtest window, and that funding_events_available scales with held position-days.
The sandbox reported only 67 funding events available over the window. With 6 legs at 8h settlement over ~1749 days, many thousands would be expected. COIN-M funding parquet exists (coinm_funding/<SYM>_PERP for all 6 legs) and the per-leg wiring via funding_rates_by_instrument is correct. Still, the 67 count may reflect accrual only on the single (liquidated) position. The staleness guard (funding_lag 8h) will exit or prevent entry if coverage has gaps.
Outcome Summary
On a long-only funding-carry strategy, split PnL into funding and price components before judging it: a healthy per-trade headline can be market beta, and the USD-M sibling that was promoted should get the same split.
At backtest review the analyst abandoned it as broken_mechanism (fee_edge for the carry component). About 73% of gross PnL came from unhedged long coin beta (alpha -0.003, IR -0.83, forecast IC -0.026), and the carry alone was below the 0.10% BINANCE_CM floor. Optimization and later stages were not reached.
A long-only, equal-weight basket of six Binance COIN-M inverse perpetuals (BTC, ETH, SOL, XRP, BNB, DOGE) on 4H bars that held a contract while its funding rate was sufficiently negative. The idea was that persistent short hedging by miners and holders pays longs a carry that is larger and cheaper to collect than on USD-M.
The initial backtest returned +81.5% over 641 long trades with Sharpe 0.53, average trade return 0.67% of notional and profit factor 1.45, but it had a 40.5% max drawdown with a 317-day recovery. The ledger split showed funding +$25.9k against price +$70.6k, less $14.5k commission and $9.4k impact, so the carry alone netted about +0.015% per trade.
Backtest and paper results are hypothetical. Trading involves risk of loss.