-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Labels
analyticsAdvanced analytics featuresAdvanced analytics featuresenhancementNew feature or requestNew feature or requestphase-2Phase 2: Market IntelligencePhase 2: Market Intelligence
Description
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 indicatorsGET /api/analytics/sharp/game/:gameId- Sharp indicators for gameGET /api/analytics/sharp/performance- Historical sharp vs public performanceGET /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
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
analyticsAdvanced analytics featuresAdvanced analytics featuresenhancementNew feature or requestNew feature or requestphase-2Phase 2: Market IntelligencePhase 2: Market Intelligence