After publishing the initial Fair Value Sweep Strategy for Polymarket Trading Bot, I received strong feedback and ran deeper diagnostics. The corrected backtest (with proper taker fees, rolling realized volatility, and decisive resolution labels) showed the edge had become marginal to slightly negative.
Here are the most promising update paths I’m currently exploring to revive this convergent taker strategy for 5-minute Up/Down markets.
Current Limitations (Recap)
- Binance lead (~2.4s) still exists, but fees + slippage often erase the small edge.
- No regime filter → trades in both chop and trend.
- Static fee buffer doesn’t adapt to liquidity or volatility.
- Single-slot focus limits compounding.
Potential Upgrade Terms (v2 Ideas)
1. Adaptive Fee & Liquidity Buffer
Instead of a fixed min_edge_after_fees, make the threshold dynamic:
def adaptive_threshold(self, fv: float, best_ask: float, book_depth: float):
base_buffer = self.base_fee + self.slippage_estimate
liquidity_factor = 1.0 / (1 + book_depth / self.depth_threshold)
vol_factor = 1 + (self.current_vol / self.avg_vol) * 0.5
return fv - (base_buffer * liquidity_factor * vol_factor)
This tightens the required edge in deep books and widens it in thin/volatile conditions.
2. Regime-Aware Sweep (Hybrid with Deep Bid Catch)
Add a lightweight regime filter so the sweeper only activates in favorable conditions:
- Chop + Moderate Volatility: Full sweep window
- Strong Trend: Reduce size or disable entirely
- High Volatility near expiry: Widen buffer or pause
This combines the best of both strategies I’ve been testing.
3. Multi-Exchange Fair Value Ensemble
Don’t rely only on Binance. Blend multiple CEX feeds with weights:
def ensemble_fair_value(self):
binance_fv = self.compute_fv("binance")
bybit_fv = self.compute_fv("bybit")
coinbase_fv = self.compute_fv("coinbase")
weights = [0.55, 0.30, 0.15] # based on historical lead time
return np.average([binance_fv, bybit_fv, coinbase_fv], weights=weights)
Reduces single-feed risk and improves accuracy.
4. Dynamic Position Sizing + Kelly Variant
Replace fixed size with volatility-adjusted Kelly:
def dynamic_size(self, edge: float):
edge_decimal = edge # e.g. 0.035 (3.5% edge)
vol = self.current_vol
kelly_fraction = (edge_decimal / vol**2) * self.kelly_safety_factor
return self.bankroll * min(max(kelly_fraction, 0.005), 0.08) # 0.5%–8% bounds
This scales up during high-conviction sweeps and scales down when edge is thin.
5. Stale Quote Confirmation Layer
Add a short confirmation window (300–800ms) before sweeping:
- Require the ask to remain stale for N consecutive ticks.
- Filter out obvious spoofing or rapid maker repricing.
6. Cross-Market Correlation Boost
For correlated assets (e.g., BTC + ETH 5m markets running simultaneously), use joint probability to strengthen conviction.
Updated Performance Target
With these upgrades, the goal is to push the strategy back into +0.80 to +1.40 expected value per entry after fees while maintaining the clean “sweep and hold to resolution” lifecycle.
Integration Remains Seamless
All upgrades plug directly into the modular architecture from my main bot post:
- Same
MarketLifecycleand auto-redeem flow - Same capital guard and kill-switch
- Still runs
live: falseuntil live fills confirm +EV
Next Steps in Research
I’m currently implementing v2 with adaptive threshold + regime filter + ensemble fair value. Early paper results (last 7 days) look more stable than the original version.
The core insight remains powerful: CEX feeds lead on-chain books — the question is how to extract that lead profitably after fees and execution realities.
Would you like me to open-source any of these upgraded components once validated?
If you have more questions, please feel free to contact me at any time: https://t.me/FatherSon97
Top comments (0)