polymarket-ultra-bot / scan_markets.py
doulfa's picture
Add market scanner
cebee86 verified
#!/usr/bin/env python3
"""
πŸ“Š Polymarket Bot β€” Backtester / Scanner de marchΓ©s.
Test rapide des stratΓ©gies sur les marchΓ©s actuels sans placer d'ordres.
"""
import asyncio
import json
import logging
import time
from datetime import datetime
from polymarket_bot import (
BotConfig, GammaClient, CLOBDataClient,
ArbitrageStrategy, ValueBetStrategy, LeaderFollowerStrategy,
)
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s | %(name)-20s | %(levelname)-5s | %(message)s",
datefmt="%H:%M:%S",
)
logger = logging.getLogger("scanner")
async def scan_markets():
"""Scanne les marchΓ©s actuels pour les opportunitΓ©s."""
print("""
╔══════════════════════════════════════════════════════════════╗
β•‘ πŸ” POLYMARKET MARKET SCANNER β€” SINGLE PASS πŸ” β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•
""")
config = BotConfig(dry_run=True)
gamma = GammaClient()
clob = CLOBDataClient()
# 1. Charger les marchΓ©s
logger.info("Loading markets from Gamma API...")
markets = await gamma.get_all_active_markets()
logger.info(f"Loaded {len(markets)} active markets")
# Filtrer
filtered = [
m for m in markets
if m.volume >= config.min_market_volume
and not m.closed
and m.active
and m.yes_token
and m.no_token
and not any(tag in config.excluded_tags for tag in m.tags)
]
logger.info(f"After filtering: {len(filtered)} markets")
# 2. Afficher les top marchΓ©s
print("\nπŸ“ˆ TOP 10 MARCHΓ‰S PAR VOLUME:")
print("-" * 80)
sorted_markets = sorted(filtered, key=lambda m: m.volume, reverse=True)[:10]
for i, m in enumerate(sorted_markets, 1):
yes = m.yes_token
no = m.no_token
spread = 1.0 - (yes.price + no.price) if yes and no else 0
print(
f" {i:2d}. {m.question[:60]:<60s}\n"
f" Volume: ${m.volume:>12,.0f} | YES: {yes.price:.2f} | NO: {no.price:.2f} | "
f"Spread: {spread:+.4f}"
)
# 3. Scanner les stratΓ©gies
print("\n\nπŸ” SCANNING STRATEGIES...")
print("=" * 80)
# Arbitrage
print("\nπŸ“Š STRATΓ‰GIE 1: ARBITRAGE")
print("-" * 40)
arb = ArbitrageStrategy(config, clob)
arb_signals = await arb.scan(filtered[:50])
if arb_signals:
for s in arb_signals[:10]:
meta = s.metadata
print(
f" πŸ’° {s.action} | Spread: {meta.get('spread', 0):.4f} | "
f"Size: ${s.size_usd:.2f} | Expected: ${s.expected_profit:.2f}\n"
f" {meta.get('question', '')[:70]}"
)
else:
print(" Aucune opportunitΓ© d'arbitrage dΓ©tectΓ©e (normal β€” marchΓ©s efficaces)")
# Value Bet
print("\n\nπŸ’‘ STRATΓ‰GIE 2: VALUE BET")
print("-" * 40)
vb = ValueBetStrategy(config, clob)
vb_signals = await vb.scan(filtered[:30])
if vb_signals:
for s in vb_signals[:10]:
meta = s.metadata
print(
f" πŸ“ˆ {s.action} | Edge: {meta.get('edge', 0):.4f} | "
f"Kelly: {meta.get('kelly_frac', 0):.4f} | "
f"Size: ${s.size_usd:.2f}\n"
f" {meta.get('question', '')[:70]}"
)
else:
print(" Pas assez d'historique pour dΓ©tecter des signaux (nΓ©cessite plusieurs cycles)")
# Leader-Follower
print("\n\nπŸ”— STRATΓ‰GIE 3: LEADER-FOLLOWER")
print("-" * 40)
lf = LeaderFollowerStrategy(config, clob)
lf_pairs = lf._find_correlated_pairs(filtered[:30])
if lf_pairs:
print(f" {len(lf_pairs)} paires corrΓ©lΓ©es dΓ©tectΓ©es:")
for leader, follower, sim in lf_pairs[:5]:
print(
f" πŸ”— SimilaritΓ©: {sim:.4f}\n"
f" Leader: {leader.question[:60]}\n"
f" Follower: {follower.question[:60]}"
)
else:
print(" Aucune paire fortement corrΓ©lΓ©e trouvΓ©e")
# RΓ©sumΓ©
total_signals = len(arb_signals) + len(vb_signals)
total_expected = sum(s.expected_profit for s in arb_signals + vb_signals)
print(f"""
╔══════════════════════════════════════════════════════════════╗
β•‘ πŸ“Š SCAN SUMMARY β•‘
╠══════════════════════════════════════════════════════════════╣
β•‘ Markets scanned: {len(filtered):>6d}
β•‘ Arb signals: {len(arb_signals):>6d}
β•‘ Value bet signals: {len(vb_signals):>6d}
β•‘ Correlated pairs: {len(lf_pairs):>6d}
β•‘ Total expected: ${total_expected:>10,.2f}
β•‘ Time: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•""")
# Export
scan_results = {
"timestamp": datetime.now().isoformat(),
"markets_scanned": len(filtered),
"arb_signals": len(arb_signals),
"vb_signals": len(vb_signals),
"lf_pairs": len(lf_pairs),
"arb_details": [
{
"market": s.metadata.get("question", ""),
"spread": s.metadata.get("spread", 0),
"expected_profit": s.expected_profit,
"size_usd": s.size_usd,
}
for s in arb_signals
],
}
with open("scan_results.json", "w") as f:
json.dump(scan_results, f, indent=2)
logger.info("Results saved to scan_results.json")
await gamma.close()
await clob.close()
if __name__ == "__main__":
asyncio.run(scan_markets())