Strategy Performance Analysis & Recommendations

Date: 2025-12-24 Analysis Period: Since paper trading inception Current Portfolio: $92.46 (down from $100.00, -7.54% P&L)


Executive Summary

The current paper trading portfolio shows a -7.54% loss driven by two catastrophic issues: 1. market_maker_v1 churned 16,156 trades with $0 net P&L (massive wasted effort) 2. value_bet_v1 made 212 BUY-only trades with no exit logic, resulting in concentrated low-probability positions

Meanwhile, mean_reversion_v1 and time_arb_v1 show promise but need parameter tuning, and ml_prediction_v1 has barely traded due to overly conservative cooldowns.


Current Performance Data

Trading Activity (from database)

Strategy Total Trades BUY SELL BUY:SELL Ratio Net P&L
market_maker_v1 16,156 0 0 N/A $0.00
value_bet_v1 212 212 0 INFINITE $0.00 (unrealized losses)
mean_reversion_v1 197 122 75 1.63 $0.00
time_arb_v1 6 6 0 INFINITE $0.00
ml_prediction_v1 6 6 0 INFINITE $0.00

Critical Finding: From paper_trading_state.json analysis, market_maker actually made 16,058 trades (9,308 BUY / 6,750 SELL), but the database shows 16,156 with 0/0 BUY/SELL. This indicates a data recording issue.

Open Positions Analysis

Total Open Positions: 19 positions across 9 markets Unrealized P&L: -$8.24 Strategy Attribution: ALL positions show strategy_id = "unknown" (attribution bug)

Worst Positions: 1. Trump Gold Cards (1-100 in 2025): 838 shares @ $0.0451 → $0.0365 = -$7.18 (-19.0%) 2. LA Chargers Super Bowl: 909 shares @ $0.0402 → $0.0390 = -$1.06 (-2.9%)

Root Cause: These are low-probability bets (<5% price) that value_bet_v1 bought with NO exit logic.


Strategy-by-Strategy Analysis

1. market_maker_v1 - NEEDS MAJOR FIXES

Status: ENABLED Verdict: 🟡 TUNE PARAMETERS - Strategy logic is sound but execution is broken

Issues: - 16,156 trades but $0 P&L: Either churning with zero edge or recording bug - From paper trading state: 9,308 BUY / 6,750 SELL = 1.38 ratio (should be closer to 1.0) - Accumulating one-sided inventory without proper rebalancing - BUY/SELL ratio indicates inventory management is failing

Expected Performance (from research): - Market making should earn 2-4% of traded volume - Expected: $200-800/day with proper execution - Actual: $0

Root Causes: 1. Inventory management not working: Strategy accumulates positions without balancing 2. Spread capture failing: No net profit despite massive trade volume 3. Order sizing bug: May be using wrong size calculations (noted in research log) 4. Attribution tracking broken: All positions show "unknown" strategy

Recommended Fixes: 1. ✅ Fix inventory tracking - Ensure callback from main loop updates strategy state 2. ✅ Reduce position limits - Current max_inventory_pct at 20% is too high 3. ✅ Add minimum spread enforcement - Don't trade if spread < min_spread_pct 4. ✅ Fix order size calculation - Ensure fraction (0.02) not dollar amounts 5. ✅ Fix strategy attribution - Positions should record strategy_id correctly

Recommended Parameters:

market_maker_v1:
  enabled: true
  allocated_capital: 50  # REDUCE from 100
  parameters:
    min_spread_pct: "0.03"     # INCREASE from 0.02 (more selective)
    target_spread_pct: "0.04"  # INCREASE from 0.03
    max_spread_pct: "0.10"     # Keep
    order_size_pct: "0.01"     # REDUCE from 0.02 (smaller positions)
    max_inventory_pct: "0.10"  # REDUCE from 0.20 (tighter control)
    min_volume_24h: "10000"    # INCREASE from 5000 (higher liquidity)
    order_refresh_seconds: 30

Action: KEEP ENABLED but with reduced capital and tighter parameters


2. value_bet_v1 - CATASTROPHIC FAILURE

Status: ENABLED (per dev.yaml) Verdict: 🔴 DISABLE IMMEDIATELY - No exit logic, causing major losses

Issues: - 212 BUY trades, 0 SELL trades - Strategy NEVER exits positions - Accumulated low-probability bets that moved against us - -$8.24 unrealized loss on just 9 positions - Trump Gold Cards position: -19.0% loss alone

Strategy Logic Flaw: - Buys undervalued outcomes based on edge calculation - NO EXIT LOGIC - Never takes profit or cuts losses - Equivalent to "buy and pray" - not a viable strategy

From Research Log (Investigation 26):

"Problem Identified: value_bet_v1 made 206 BUY trades and 0 SELL trades - Strategy only buys, never takes profit - Accumulated $72.59 in unrealized losses - No exit logic implemented"

Recommended Action:

value_bet_v1:
  enabled: false  # DISABLE until exit logic is implemented

If Re-implementing (requires code changes): 1. Add exit when edge disappears (price > entry + min_edge) 2. Add stop loss at -20% from entry 3. Add time-based exit (close after 7 days if no profit) 4. Add position size limits (max 5% per market) 5. ONLY trade markets with >15% price (skip extreme longshots)

Action: DISABLE IMMEDIATELY


3. mean_reversion_v1 - WORKING BUT NEEDS TUNING

Status: ENABLED Verdict: 🟢 KEEP AS-IS with minor parameter tweaks

Performance: - 197 trades (122 BUY / 75 SELL = 1.63 ratio) - According to research log: +$7.49 net P&L in earlier testing - Strategy showing positive edge

From Backtest Results (Investigation 13): - +19.10% total P&L on historical data - 115 trades, 11/42 profitable markets (26% hit rate) - Top markets: Rojas case (+15.5%), Trump tariffs (+5.35%) - Works best on volatile markets with >2% price range

From Live Testing (Investigation 27):

"Mean Reversion Strategy Status: - Today's P&L: +$1.57 (profitable) - Top traded markets: Rojas guilty (53 trades), BitBoy (40 trades)"

Current Parameters (from dev.yaml):

entry_zscore: "1.2"        # Aggressive (was 1.5)
exit_zscore: "0.3"         # Aggressive (was 0.5)
lookback_periods: 8        # Fast (was 10)
min_price_range: "0.01"    # Relaxed (was 0.02)
min_volatility: "0.005"    # Relaxed (was 0.01)
order_size_pct: "0.02"     # 2% per trade
max_hold_periods: 30
stop_loss_pct: "0.08"      # 8%
signal_cooldown: 45        # seconds

Recommended Parameters (optimize for quality over quantity):

mean_reversion_v1:
  enabled: true
  allocated_capital: 100  # Keep full allocation
  parameters:
    entry_zscore: "1.5"        # More conservative (reduce false signals)
    exit_zscore: "0.5"         # More conservative (stay in winners longer)
    lookback_periods: 10       # Slower but more stable
    min_price_range: "0.02"    # INCREASE (focus on volatile markets)
    min_volatility: "0.01"     # INCREASE (require meaningful movement)
    min_volume_24h: "1000"     # Keep
    order_size_pct: "0.02"     # Keep (2% is good)
    max_hold_periods: 30       # Keep
    stop_loss_pct: "0.08"      # Keep (8% is reasonable)
    signal_cooldown: 60        # INCREASE from 45 (avoid overtrading)

Rationale: - Current params are too aggressive (entry_zscore 1.2 generates too many signals) - Backtest shows best performance at zscore 1.5-2.0 entry - Focus on quality signals in volatile markets rather than quantity

Action: KEEP ENABLED with more conservative parameters


4. time_arb_v1 - PROMISING BUT EARLY

Status: ENABLED Verdict: 🟡 KEEP ENABLED but monitor - needs more data

Performance: - Only 6 trades (all BUY, no SELL yet) - Strategy needs time to collect hourly patterns - From backtest: +49.4% avg return, 100% win rate (small sample!)

From Research (Investigation 20):

"BREAKTHROUGH FINDING: Time-based arbitrage shows massive edge! - Total Trades: 8 - Win Rate: 100% - Average P&L per Trade: +49.4%"

Strategy Logic: - Tracks price patterns by hour of day - Buys at historically low-price hours - Sells at historically high-price hours - Needs 24+ observations per market before trading

Current Parameters:

min_hourly_spread: "0.15"     # 15% spread required
min_total_observations: 24    # Need 24+ data points
min_hold_hours: 4
max_hold_hours: 18
min_expected_edge: "0.10"     # 10% minimum return
signal_cooldown: 3600         # 1 hour

Issues: - All 6 trades are BUYS with no SELLs yet - May not be reaching sell hours yet (needs 4-18 hours hold) - Need to verify exit logic is implemented

Recommended Parameters (relax to generate more trades):

time_arb_v1:
  enabled: true
  allocated_capital: 100
  parameters:
    min_hourly_spread: "0.20"      # INCREASE to be more selective
    min_total_observations: 24     # Keep
    min_hold_hours: 4              # Keep
    max_hold_hours: 12             # REDUCE from 18 (faster exits)
    min_expected_edge: "0.15"      # INCREASE from 0.10 (higher quality)
    signal_cooldown: 3600          # Keep (1 hour)
    order_size_pct: "0.03"         # Keep (3%)

Action: KEEP ENABLED but monitor for SELL execution


5. ml_prediction_v1 - UNDERUTILIZED

Status: ENABLED Verdict: 🟡 KEEP ENABLED but reduce cooldown - only 6 trades is too few

Performance: - Only 6 trades since deployment - Model has 72% accuracy, 18.7 Sharpe ratio in backtest - From backtest: 61.74% win rate on 413 trades

From Research (Investigation 32):

"ML Price Prediction Model Results: - Test Accuracy: 71.99% - AUC-ROC: 0.8246 - Sharpe Ratio: 18.72 - Total P&L: +30.22 returns"

Current Parameters:

min_confidence: "0.60"    # 60% confidence
min_edge: "0.05"          # 5% edge
min_volume: "1000"
signal_cooldown: 1800     # 30 MINUTES - TOO LONG
order_size_pct: "0.03"    # 3%
min_yes_price: "0.15"
max_yes_price: "0.85"

Issue: 30-minute cooldown is preventing strategy from trading - With 50 markets, strategy should generate 5-10 signals per hour - Only 6 trades total suggests cooldown is too restrictive

Recommended Parameters:

ml_prediction_v1:
  enabled: true
  allocated_capital: 100
  parameters:
    min_confidence: "0.65"     # INCREASE from 0.60 (higher quality)
    min_edge: "0.05"           # Keep
    max_edge: "0.15"           # Keep cap
    min_volume: "1000"         # Keep
    signal_cooldown: 600       # REDUCE from 1800 (10 min, not 30)
    order_size_pct: "0.03"     # Keep (3%)
    min_yes_price: "0.15"      # Keep
    max_yes_price: "0.85"      # Keep

Rationale: - Reduce cooldown from 30 min to 10 min - Increase confidence threshold to compensate (maintain quality) - Model has proven edge - let it trade more

Action: KEEP ENABLED with reduced cooldown


6. momentum_v1 - DISABLED (CORRECT)

Status: DISABLED in dev.yaml Verdict: 🟢 KEEP DISABLED - Proven to lose money

From Research (Investigation 17):

"Momentum strategies LOSE money in prediction markets. Mean reversion WINS. - Momentum: 19-24% win rate, -0.13% to -1.51% avg P&L - Mean Reversion: 62-65% win rate, +4.95% to +5.34% avg P&L"

From Investigation 21:

"CRITICAL FINDING - Breakout Direction Matters: - Buying after price RISES = LOSING (-0.91%) - Buying after price DROPS = PROFITABLE (+4.36%)"

Conclusion: Prediction markets are mean-reverting, NOT trending - Never chase rising prices - Buy dips, sell rallies - Momentum/trend-following fails systematically

Action: KEEP DISABLED permanently


7. dual_arb_v1 - DORMANT

Status: ENABLED Verdict: 🟢 KEEP ENABLED - Low resource cost, high value when triggers

Strategy: Exploits YES + NO != 1.0 arbitrage opportunities

From Research (Investigation 6):

"No pricing arbitrage found - All 50 markets have YES+NO = 1.0000 exactly"

Current Parameters:

min_profit_threshold: "0.01"  # 1% minimum profit
fee_rate: "0.02"              # 2% fee
max_position_per_market: 25
signal_expiry_seconds: 10

Performance: 0 trades (no opportunities found) - Markets are efficiently priced at sum = 1.0 - Opportunities are rare but highly profitable when they occur - Low overhead to keep running

Action: KEEP ENABLED - no changes needed


Summary Recommendations

IMMEDIATE ACTIONS (Next 1 Hour)

  1. DISABLE value_bet_v1 ✅ CRITICAL
  2. No exit logic = guaranteed losses
  3. Already cost -$8.24 in unrealized P&L

  4. REDUCE market_maker_v1 parameters ✅ HIGH PRIORITY

  5. Cut capital from $100 → $50
  6. Reduce order_size_pct from 0.02 → 0.01
  7. Reduce max_inventory_pct from 0.20 → 0.10
  8. Increase min_volume from $5k → $10k

  9. FIX ml_prediction_v1 cooldown ✅ HIGH PRIORITY

  10. Reduce from 1800s (30 min) → 600s (10 min)
  11. Increase min_confidence from 0.60 → 0.65

PARAMETER TUNING (Next 24 Hours)

  1. TUNE mean_reversion_v1 🟡 MEDIUM PRIORITY
  2. Increase entry_zscore from 1.2 → 1.5 (more conservative)
  3. Increase exit_zscore from 0.3 → 0.5
  4. Increase min_price_range from 0.01 → 0.02
  5. Increase signal_cooldown from 45s → 60s

  6. TUNE time_arb_v1 🟡 MEDIUM PRIORITY

  7. Increase min_hourly_spread from 0.15 → 0.20
  8. Reduce max_hold_hours from 18 → 12
  9. Increase min_expected_edge from 0.10 → 0.15

MONITORING (Ongoing)

  1. VERIFY market_maker_v1 fixes work
  2. Check BUY:SELL ratio approaches 1.0 (not 1.38)
  3. Verify net P&L becomes positive
  4. Monitor open positions don't exceed 10% per market

  5. VERIFY strategy attribution

  6. All positions should show correct strategy_id (not "unknown")
  7. Track P&L per strategy accurately

  8. MONITOR ml_prediction_v1 trade frequency

  9. Should generate 10-20 trades per day (not 6 total)
  10. Verify 65% confidence threshold maintains quality

# Development Configuration
env: dev
debug: true

initial_capital: 100

risk_limits:
  max_capital_per_market: 50
  max_capital_per_strategy: 100
  daily_loss_limit: 25
  max_drawdown_pct: 0.05
  slippage_tolerance: 0.03

db_path: data/pqap_dev.db

# UPDATED: Disabled value_bet, reduced market_maker, tuned params
enabled_strategies:
  - dual_arb_v1
  - market_maker_v1      # REDUCED capital and limits
  - mean_reversion_v1    # TUNED for quality over quantity
  - time_arb_v1          # MONITORING
  - ml_prediction_v1     # REDUCED cooldown

strategies:
  dual_arb_v1:
    enabled: true
    allocated_capital: 100
    parameters:
      min_profit_threshold: "0.01"
      fee_rate: "0.02"
      max_position_per_market: 25
      signal_expiry_seconds: 10

  market_maker_v1:
    enabled: true
    allocated_capital: 50          # REDUCED from 100
    parameters:
      min_spread_pct: "0.03"       # INCREASED from 0.02
      target_spread_pct: "0.04"    # INCREASED from 0.03
      max_spread_pct: "0.10"
      order_size_pct: "0.01"       # REDUCED from 0.02
      max_inventory_pct: "0.10"    # REDUCED from 0.20
      min_volume_24h: "10000"      # INCREASED from 5000
      min_price: "0.10"
      max_price: "0.90"
      order_refresh_seconds: 30

  mean_reversion_v1:
    enabled: true
    allocated_capital: 100
    parameters:
      entry_zscore: "1.5"          # INCREASED from 1.2
      exit_zscore: "0.5"           # INCREASED from 0.3
      lookback_periods: 10         # INCREASED from 8
      min_price_range: "0.02"      # INCREASED from 0.01
      min_volatility: "0.01"       # INCREASED from 0.005
      min_volume_24h: "1000"
      order_size_pct: "0.02"
      max_hold_periods: 30
      stop_loss_pct: "0.08"
      signal_cooldown: 60          # INCREASED from 45

  time_arb_v1:
    enabled: true
    allocated_capital: 100
    parameters:
      min_hourly_spread: "0.20"    # INCREASED from 0.15
      min_observations_per_hour: 2
      min_total_observations: 24
      order_size_pct: "0.03"
      min_hold_hours: 4
      max_hold_hours: 12           # REDUCED from 18
      min_volume_24h: "1000"
      signal_cooldown: 3600
      min_expected_edge: "0.15"    # INCREASED from 0.10

  ml_prediction_v1:
    enabled: true
    allocated_capital: 100
    parameters:
      min_confidence: "0.65"       # INCREASED from 0.60
      min_edge: "0.05"
      max_edge: "0.15"
      min_volume: "1000"
      signal_cooldown: 600         # REDUCED from 1800
      order_size_pct: "0.03"
      min_yes_price: "0.15"
      max_yes_price: "0.85"

  # DISABLED STRATEGIES
  momentum_v1:
    enabled: false  # Loses money systematically

  value_bet_v1:
    enabled: false  # No exit logic - CRITICAL BUG

Expected Outcomes

If Recommendations Implemented:

Short Term (24 hours): - Portfolio should stabilize around current level - market_maker should show positive net P&L (even if small) - ml_prediction should generate 10-20 trades - No new value_bet positions accumulating

Medium Term (1 week): - Portfolio should recover to breakeven or slight profit - mean_reversion and ml_prediction should drive gains - time_arb positions should start closing profitably - market_maker should show consistent small profits

Long Term (1 month): - Target: 5-10% positive P&L - Best performers: mean_reversion (~5% edge), ml_prediction (~3-4% edge) - market_maker: 1-2% from spread capture - time_arb: Occasional large wins (20-40% when signals trigger)

Key Performance Indicators to Monitor:

  1. BUY:SELL Ratio - Should approach 1.0 for all strategies
  2. Strategy Attribution - All positions should have correct strategy_id
  3. Net P&L by Strategy - Track which strategies are profitable
  4. Trade Frequency - ML should trade 10-20x/day, not 6 total
  5. Position Concentration - No single position >5% of portfolio

Risk Warnings

Current Risks:

  1. Large concentrated positions - Trump Gold Cards and Chargers positions are 70% of portfolio
  2. Attribution bug - Can't track which strategy is responsible for losses
  3. market_maker churning - 16k trades with no profit is resource waste
  4. Low-probability bets - Positions at <5% price rarely win

Mitigation:

  1. ✅ Disable value_bet to stop accumulating longshots
  2. ✅ Add position limits per market (max 5% of portfolio)
  3. ✅ Fix attribution tracking
  4. ✅ Reduce market_maker order size to prevent accumulation

Conclusion

Current State: Down -7.54% due to two major issues: 1. market_maker churning with no edge (16k trades, $0 P&L) 2. value_bet accumulating losing positions (no exit logic)

Recommended Actions: 1. 🔴 DISABLE value_bet_v1 immediately 2. 🟡 TUNE market_maker_v1 (reduce capital, tighter params) 3. 🟡 TUNE mean_reversion_v1 (more conservative entry) 4. 🟡 TUNE ml_prediction_v1 (reduce cooldown from 30 min → 10 min) 5. 🟢 KEEP time_arb_v1 and dual_arb_v1 as-is (monitor) 6. 🟢 KEEP momentum_v1 disabled (proven loser)

Expected Recovery Timeline: - 24 hours: Stabilize losses, stop bleeding - 1 week: Return to breakeven - 1 month: 5-10% profit if strategies perform as backtested

High Conviction Strategies (based on backtest and research): 1. mean_reversion_v1: +19% in backtest, 65% win rate 2. ml_prediction_v1: +30 returns, 72% accuracy, 18.7 Sharpe 3. time_arb_v1: +49% avg in backtest (small sample, needs validation)

Proven Losers: 1. momentum_v1: -0.7% avg, 20% win rate (KEEP DISABLED) 2. value_bet_v1: No exit logic, -$8.24 unrealized (DISABLE NOW)

System Overview

Polymarket API

Market data source

Data Collector

Every 5 minutes

SQLite Database

Price history + trades

Strategy Engine

Signal generation

ML Model

XGBoost (72% acc)

Execution Engine

Paper trading

Dashboard

You are here!

Telegram

Alerts & updates

Trading Strategies

Each strategy looks for different market inefficiencies:

Dual Arbitrage Active

Finds when YES + NO prices don't add to 100%. Risk-free profit.

Mean Reversion Active

Buys when price drops too far from average, sells when it recovers.

Market Maker Active

Places bid/ask orders to capture the spread.

Time Arbitrage Active

Exploits predictable price patterns at certain hours.

ML Prediction Active

Uses machine learning to predict 6-hour price direction.

Value Betting Disabled

Finds underpriced outcomes based on implied probability.

Data Storage (Single Source of Truth)

All data lives on EC2. Local machines are for development only. The EC2 instance is the authoritative source for all market data, trades, and positions.
Database Purpose Location
market_history.db Price snapshots every 5 minutes (8.2 MB) EC2 (primary)
pqap_prod.db Trades, positions, P&L history EC2 (primary)
paper_trading_state.json Current portfolio state EC2 (primary)

Environment Architecture

EC2 (Production)

  • Runs 24/7
  • All databases live here
  • Executes all trades
  • Single source of truth

Local (Development)

  • For code changes only
  • Syncs code to EC2
  • No production data
  • Can be turned off

Environment Details

Component Details
Dashboard URL https://pqap.tailwindtech.ai
Server AWS EC2 (us-east-1)
SSL Let's Encrypt via Traefik
Mode Paper Trading (simulated)

How It Works (Simple Version)

1. Data Collection: Every 5 minutes, we fetch prices from Polymarket for 50 markets and save them to our database.

2. Analysis: Our strategies analyze this data looking for patterns - like prices that moved too far from normal, or markets where the math doesn't add up.

3. Signals: When a strategy finds an opportunity, it generates a "signal" - a recommendation to buy or sell.

4. Execution: The execution engine takes these signals and simulates trades (paper trading). Eventually, this will place real orders.

5. Monitoring: This dashboard shows you what's happening. Telegram sends alerts for important events.