Real conditional edge · low-frequency overlay New listings / post-pump fade Bybit perps (349 new listings) 365 days of listings

NewByPerp — Short New
Bybit Perp Listings

When a new Bybit perp’s launch-day pump exhausts (volatility contraction + breakdown below VWAP/EMA50), short it. The condition-based version nets +17.4% expectancy/trade, PF 2.73, 73% win rate over 30 trades, with 98.9% MC P(exp>0) — but only on crypto-native perps, ~2.5 trades/month.

Validated conditional edge · too rare to be core · crypto-native only
+17.4%
Expectancy / trade
+17.2% after fees · PF 2.73 (2.70 net) · 30 trades
98.9%
P(exp > 0) Monte Carlo
10k sims · 95.3% P(exp > 5%)
73.3%
Win rate
Median return +26.9% · stop-hit 16.7%
~2.5/mo
Trade frequency
Low-frequency overlay, not a core strategy

Verdict

The naive “short at day 7, hold 90 days” version raw-works (+28% avg, 82% WR over 90d) but every trade suffers 10–15%+ adverse excursion — any realistic stop erases the edge. The condition-based version (short only after the pump shows volatility contraction + breakdown below VWAP/EMA50, launch-to-date return >+30%) fixes it: +17.4% expectancy/trade, PF 2.73, 73.3% WR, stable across walk-forward splits (+17.4–17.6%), 98.9% MC P(exp>0).

Key boundary: the short edge exists only on crypto-native perps — stock-ETF perps (AAPL, TSLA, NVDA, QQQ…) trend up post-listing and shorting them loses money. With ~2.5 trades/month it is a low-frequency overlay, not a core strategy; the small sample (30 trades) and fat-tailed MAE (avg 32.6%) remain the honest risks.

The thesis & findings

Thesis

New Bybit perps have market makers contractually obliged to provide liquidity (commonly 7-day TWAP over ~90 days). When the obligation ends, MMs withdraw → price/volume should drop.

Two asset classes

Stock-ETF perps (2026 wave) trend up — shorting loses (−0.9% d7→14, −1.8% d7→30). The edge exists only on crypto-native perps.

The MAE problem

Every trade sees adverse movement (median 15–20%, many >50%). At a 10% stop expectancy goes negative; only a 30% stop keeps +6.5%. Time-based entry cannot be risk-managed.

Pump continuation

Launch-day pumps predict continuation, not reversal (day-0 >+10% → +51% avg over next 7 days). The fade only works AFTER the pump exhausts.

Optimal strategy entry (all must hold at close)

ConditionRuleWhy
Volatility contractionATR(14) < SMA(ATR, 20)The pump's volatility is dying
Below valueClose < prior-day VWAP (typical price)Price no longer above value
Below trendClose < EMA50Medium-term trend has turned down
Confirmed pumpLaunch-to-date return > +30%There IS a pump to exhaust
ExecutionShort next day's open · stop entry + 3.0×ATR(14) trailing · max hold 30 days · 1 trade/symbol

Verified backtest

MetricValueNote
Trades30≈2.5/month over the studied window
Win rate73.3%
Expectancy / trade+17.41%+17.20% after fees
Profit factor2.73×2.70× after fees
Avg win / loss+37.44% / −37.69%Symmetrical fat tails; median +26.9%
Avg MAE / stop-hit32.6% / 16.7%The MAE problem — needs the trailing stop
Monte Carlo (10k)P(exp>0) = 98.9%P(exp>5%) = 95.3% · P(exp>10%) = 84.5%
What didn't work: volume-spike-at-entry filter (too rare), distribution-day-only entry (21 trades, negative expectancy), EMA20+EMA50 combo (over-filters), and the inverted long-pump→short-distribution idea (short leg negative).

How it was tested

Data

349 new USDT perps listed in the last 365 days; 321 with ≥14 days history; daily OHLCV + turnover from Bybit public REST; split into 162 crypto-native vs 109 stock-ETF.

Validation

10k Monte Carlo (98.9% P(exp>0)); walk-forward 60/40, 70/30, 80/20 splits with stable expectancy (+17.4–17.6%); fees applied (+17.2% net).

Deployment recommendation

Crypto-native only, age >50 days, exclude stock-ETF; run as signal-only overlay; the repo's full list is in the README.

Risks

Small sample (30 trades), fat-tailed MAE, listing-venue regime changes (the 2026 stock-ETF wave behaved differently).

Run it yourself

python scripts/fetch_listings.py   # pull new listings + OHLCV
python scripts/backtest_optimal.py # condition-based short backtest
python scripts/montecarlo.py       # 10k sims