Skip to content

[Phase 2] Sharp vs Public Money Indicators #6

@WFord26

Description

@WFord26

name: "Phase 2: Sharp vs Public Money Indicators"
about: Identify which side professional bettors are backing
title: "[Phase 2] Sharp vs Public Money Indicators"
labels: enhancement, phase-2, analytics
assignees: ''

Overview

Detect and display indicators showing which side "sharp" (professional) money is backing versus "public" (recreational) money. This helps users understand market sentiment and make informed betting decisions.

Business Value

  • Fade the Public: Historical data shows fading heavy public sides can be profitable
  • Follow Sharp Money: Sharp bettors win long-term
  • Market Understanding: Educates users on betting market dynamics
  • Contrarian Opportunities: Identify when to go against the crowd

Technical Requirements

Database Changes

model SharpMoneyIndicator {
  id                  String   @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
  gameId              String   @map("game_id") @db.Uuid
  marketType          String   @map("market_type") @db.VarChar(20)
  calculatedAt        DateTime @default(now()) @map("calculated_at") @db.Timestamptz(6)
  
  // Indicators
  lineMovement        String   @map("line_movement") @db.VarChar(20)
  sharpSide           String   @map("sharp_side") @db.VarChar(20)
  publicSide          String   @map("public_side") @db.VarChar(20)
  
  // Confidence
  sharpConfidence     Int      @map("sharp_confidence")  // 1-10
  contraindicators    String[] @map("contraindicators")
  
  // External data (when integrated)
  publicBettingPct    Decimal? @map("public_betting_pct") @db.Decimal(5,2)
  publicMoneyPct      Decimal? @map("public_money_pct") @db.Decimal(5,2)
  
  game Game @relation(fields: [gameId], references: [id])
  
  @@index([gameId])
  @@index([sharpSide])
  @@index([calculatedAt])
  @@map("sharp_money_indicators")
}

Backend Services

File: src/services/sharp-indicator.service.ts

class SharpIndicatorService {
  async detectSharpSide(gameId: string): Promise<SharpIndicator>
  async calculateConfidence(indicators: Indicator[]): Promise<number>
  async trackPublicBetting(gameId: string): Promise<PublicData>
  async findContrarian Opportunities(): Promise<Game[]>
  async getHistoricalPerformance(): Promise<Stats>
}

Sharp Money Indicators (Internal Detection)

Indicator 1: Reverse Line Movement

  • Line moves toward side with less public betting
  • Example: 70% public on favorite, line moves to underdog
  • Strength: Strong (8/10)

Indicator 2: Steam Move on Underdog

  • Multiple sharp books move line toward underdog
  • Within short timeframe (< 5 minutes)
  • Strength: Very Strong (9/10)

Indicator 3: Opening Line Trap

  • Opening line "baits" public to one side
  • Sharp books immediately move opposite direction
  • Strength: Strong (8/10)

Indicator 4: Low Odds Premium on Favorite

  • Favorite has worse odds than expected
  • Indicates books taking heavy public action
  • Strength: Medium (6/10)

Indicator 5: Coordinated Bookmaker Movement

  • Sharp books (Pinnacle, Circa, BetCRIS) move together
  • Recreational books (DraftKings, FanDuel) lag behind
  • Strength: Strong (7/10)

Detection Algorithm

function detectSharpSide(game: Game): SharpIndicator {
  const indicators = [];
  let confidence = 0;
  
  // Check for reverse line movement
  if (hasReverseMovement(game)) {
    indicators.push('reverse_movement');
    confidence += 8;
  }
  
  // Check for steam moves
  const steamMoves = getSteamMoves(game);
  if (steamMoves.length > 0) {
    indicators.push('steam_move');
    confidence += 9;
  }
  
  // Check sharp book behavior
  const sharpBooks = ['pinnacle', 'circa', 'betcris'];
  const sharpMovement = getBookmakerMovement(game, sharpBooks);
  if (sharpMovement.consensus) {
    indicators.push('sharp_consensus');
    confidence += 7;
  }
  
  // Normalize confidence to 1-10 scale
  confidence = Math.min(10, Math.round(confidence / indicators.length));
  
  return {
    sharpSide: determineSharpSide(indicators),
    publicSide: determinePublicSide(indicators),
    confidence,
    indicators
  };
}

External Data Integration (Future)

Public Betting Sources (when API available):

  • Action Network API
  • Sports Insights
  • Pregame.com

Data Points:

  • % of bets on each side (ticket count)
  • % of money on each side (dollar volume)
  • Sharp vs public money split

API Endpoints

  • GET /api/analytics/sharp/live - Current sharp indicators
  • GET /api/analytics/sharp/game/:gameId - Sharp indicators for game
  • GET /api/analytics/sharp/performance - Historical sharp vs public performance
  • GET /api/analytics/sharp/trends - Sharp money trends by sport/team

Frontend Components

Dashboard Widget: SharpMoneyAlert.tsx

  • Shows games with high sharp confidence
  • Visual indicator: 🔥 (hot), ⚡ (sharp), 📊 (data)
  • Click to see full breakdown
  • Filter by confidence threshold

Detailed Modal: SharpIndicatorBreakdown.tsx

  • List all indicators detected
  • Confidence score with explanation
  • Historical win rate for this pattern
  • "Follow Sharp Money" or "Fade Public" recommendation

Performance Dashboard: SharpVsPublicPerformance.tsx

  • Line chart: Sharp side win rate over time
  • Table: Best performing indicators
  • Sport-specific breakdowns
  • Your record following sharp indicators

Visual Design

Sharp Money Badge:

┌─────────────────────┐
│ 🔥 SHARP ACTION    │
│ Confidence: 9/10    │
│ Side: UNDER 48.5    │
│ Indicators: 4       │
└─────────────────────┘

Indicator Icons:

  • ↩️ Reverse Line Movement
  • ⚡ Steam Move
  • 🎯 Sharp Book Consensus
  • 📉 Opening Line Trap
  • 💰 Money Disparity

Acceptance Criteria

  • Database migration completed
  • Sharp indicator detection algorithm implemented
  • Scheduled calculation every 15 minutes
  • Dashboard widget showing sharp opportunities
  • Detailed indicator breakdown modal
  • API endpoints documented
  • Historical performance tracking
  • Unit tests for detection logic

Dependencies

  • Line movement tracking (Phase 1)
  • Bookmaker analytics
  • Historical game results for validation

Estimated Effort

  • Backend: 6 days
  • Frontend: 4 days
  • Testing & Validation: 2 days
  • Total: 12 days

Success Metrics

  • Detect 10-15 sharp indicators per day
  • 55%+ win rate on high-confidence sharp plays (historical validation)
  • Users click through on 30%+ of sharp alerts
  • Positive user feedback on feature accuracy

Future Enhancements

  • External public betting data integration
  • Machine learning for indicator weighting
  • "Trap game" detection algorithm
  • Sharp bettor tracking by bookmaker account limits

Metadata

Metadata

Assignees

No one assigned

    Labels

    analyticsAdvanced analytics featuresenhancementNew feature or requestphase-2Phase 2: Market Intelligence

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions