From 265c8fb5a1688256ad20bf1dc5dcf61922e5548c Mon Sep 17 00:00:00 2001 From: SII-leiyu <115807123+chaoleiyv@users.noreply.github.com> Date: Tue, 5 May 2026 11:41:16 +0800 Subject: [PATCH] Relax whale detection filters to capture more mid-size trades MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Price range: 0.20-0.80 → 0.10-0.90 - Absolute min trade size: $5K → $3K - Dynamic threshold base: $10K → $5K, range $3K-$50K - Resolution window: 6h-90d → 3h-180d - Anomaly score threshold: 0.65 → 0.55 Co-Authored-By: Claude Opus 4.6 (1M context) --- src/config/settings.py | 4 ++-- src/services/anomaly_detector.py | 4 ++-- src/services/trade_monitor.py | 10 +++++----- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/config/settings.py b/src/config/settings.py index df8f7b9..026c16f 100644 --- a/src/config/settings.py +++ b/src/config/settings.py @@ -51,8 +51,8 @@ class Settings(BaseSettings): # Whale Detection Settings min_trade_size_usd: float = Field(default=1000.0, alias="MIN_TRADE_SIZE_USD") - min_price: float = Field(default=0.2, alias="MIN_PRICE") - max_price: float = Field(default=0.8, alias="MAX_PRICE") + min_price: float = Field(default=0.10, alias="MIN_PRICE") + max_price: float = Field(default=0.90, alias="MAX_PRICE") # Monitoring Settings fetch_interval_seconds: int = Field(default=15, alias="FETCH_INTERVAL_SECONDS") diff --git a/src/services/anomaly_detector.py b/src/services/anomaly_detector.py index 00a4b29..3c3513c 100644 --- a/src/services/anomaly_detector.py +++ b/src/services/anomaly_detector.py @@ -247,7 +247,7 @@ class AnomalyDetector: market: Optional[Market] = None, trader_history: Optional[TraderHistory] = None, market_id: str = "", - min_score: float = 0.65, + min_score: float = 0.55, ) -> Tuple[bool, float, dict]: """ Decide whether a whale trade warrants LLM analysis. @@ -275,7 +275,7 @@ class AnomalyDetector: def filter_whale_trades( self, trades: List[WhaleTrade], - min_score: float = 0.65, + min_score: float = 0.55, ) -> List[WhaleTrade]: """Filter whale trades by confidence score.""" filtered = [] diff --git a/src/services/trade_monitor.py b/src/services/trade_monitor.py index 336ac0a..23c4df0 100644 --- a/src/services/trade_monitor.py +++ b/src/services/trade_monitor.py @@ -653,26 +653,26 @@ class TradeMonitor: end_dt = _dt.fromisoformat(market.end_date.replace("Z", "+00:00")) now_dt = _dt.utcnow().replace(tzinfo=end_dt.tzinfo) if end_dt.tzinfo else _dt.utcnow() hours_to_resolution = max(0, (end_dt - now_dt).total_seconds() / 3600) - if hours_to_resolution < 6: + if hours_to_resolution < 3: return False # too close, like DTE < 3 - if hours_to_resolution > 90 * 24: + if hours_to_resolution > 180 * 24: return False # too far, like DTE > 60 except (ValueError, TypeError): pass # unknown end date, don't reject # --- 4. Size (like premium min=$250K) --- # Base minimum: $5,000 (Polymarket scale vs options $250K) - if activity.usdc_size < 5_000: + if activity.usdc_size < 3_000: return False # --- 5. Dynamic size (like dynamic_premium = base × √(mcap / baseline)) --- # Larger markets require proportionally larger trades to be meaningful - base_size = 10_000.0 + base_size = 5_000.0 baseline_volume = 1_000_000.0 if market and market.volume > 0: threshold = base_size * math.sqrt(market.volume / baseline_volume) - threshold = max(5_000.0, min(threshold, 100_000.0)) # floor $5K, cap $100K + threshold = max(3_000.0, min(threshold, 50_000.0)) # floor $3K, cap $50K else: threshold = base_size