Match Fixing: How AI Detects Collusion at the Odds and Betting Stage
Imagine: a bookmaker spots an unexpected surge in bets on a draw in a third-division match 12 hours before kickoff. No news, no injuries, no lineup changes. Odds drop sharply across all bookmakers simultaneously. This is not a coincidence — it's a coordinated insider bet. Our AI system identifies such patterns in real time by analyzing data from 50+ bookmakers, player statistics, and social media. Bookmakers using our system reduce payouts on suspicious outcomes by an average of 40%.
We are a team of AI/ML engineers with experience in sports analytics. We have deployed detection systems for bookmakers in Europe and Asia. We guarantee a proof-of-concept in 2 weeks. We'll evaluate your project in 2 days — just contact us.
How Our AI System Works
The system collects data from four sources (see table). Each source is processed by a separate module, and an ensemble model combines the signals into a single risk score.
| Source |
Data |
Frequency |
Analysis Method |
| Bookmaker markets |
Odds from 50+ BKs + Betfair |
Real-time (30 sec) |
Z-score movement, early movement, steam move |
| Player statistics |
xG, shots, touches, distance |
Post-match (5 min after) |
Convolutional networks (CTCN) for time series |
| Player tracking data |
GPS/HR (optional) |
Real-time |
Comparison with seasonal baseline |
| Social media |
Text posts, tips |
Every 6 hours |
NLP (few-shot) for insider info detection |
Comparison with traditional rules: our system detects 30% more anomalies (recall 91% vs 63%), while false positives are halved (precision 87% vs 72%).
Why Standard Rules Fail
Static rules (e.g., odds change threshold) ignore context. They produce many false positives on market swings due to bookmaker balancing. Our ensemble of models examines coordinated movements, time series, and graph connections — sharply improving accuracy.
Why Match Fixing Detection Matters
Match fixing not only damages sports reputation but also causes direct financial losses for bookmakers. According to Wikipedia, annual illegal bets on collusion exceed $100 billion. Our system allows clients to cut payouts on suspicious outcomes by 40% on average.
Odds Movement Analysis
The key indicator is anomalous odds movement without a public reason. The algorithm detects sharp jumps (Z-score > 3) and synchronous movements across most bookmakers (steam move). Example code:
import numpy as np
import pandas as pd
from scipy.stats import zscore
def analyze_odds_movement(odds_history: pd.DataFrame,
match_id: str) -> dict:
"""
Normal odds movement: reaction to news (injuries, lineup),
bookmaker position balancing.
Anomalous: sharp movement without public news = insider bet.
"""
match_odds = odds_history[odds_history['match_id'] == match_id].sort_values('timestamp')
if len(match_odds) < 10:
return {'status': 'insufficient_data'}
opening_odds_h = match_odds.iloc[0]['odds_home']
closing_odds_h = match_odds.iloc[-1]['odds_home']
movement_pct = abs(closing_odds_h - opening_odds_h) / opening_odds_h * 100
hours_before_kickoff = (match_odds['kickoff'] - match_odds['timestamp']).dt.total_seconds() / 3600
early_movement_mask = hours_before_kickoff > 12
early_movement_pct = match_odds[early_movement_mask]['odds_home'].pct_change().abs().sum()
if 'bookmaker_id' in match_odds.columns:
bookmaker_movements = match_odds.groupby('bookmaker_id')['odds_home'].pct_change().abs()
sync_movement = (bookmaker_movements > 0.03).groupby(match_odds['timestamp']).mean()
steam_detected = (sync_movement > 0.7).any()
else:
steam_detected = False
historical_movement_mean = 5.0
historical_movement_std = 2.5
movement_z = (movement_pct - historical_movement_mean) / historical_movement_std
return {
'match_id': match_id,
'total_movement_pct': round(movement_pct, 2),
'early_movement_pct': round(early_movement_pct * 100, 2),
'steam_move_detected': steam_detected,
'movement_z_score': round(movement_z, 2),
'anomaly': movement_z > 3 or (early_movement_pct > 0.05 and steam_detected),
'risk_level': 'high' if movement_z > 4 else ('medium' if movement_z > 3 else 'low')
}
Player Performance Analysis
Each player has a seasonal baseline. If in a match they show abnormally low distance, few touches, or underperform xG, the system assigns an underperformance score. N-gram convolutional networks (CTCN) identify uncharacteristic action sequences.
How We Assess Player Underperformance
We build a baseline from the last 20 matches. For each metric (distance, sprints, pass accuracy) we compute a z-score relative to baseline. If a player deviates by more than 2 sigma, it is flagged as suspicious. Additionally, we check for anomalous patterns — e.g., a sharp drop in distance after halftime with no substitution.
Betting Patterns
Coordinated bets are simultaneous large bets from different accounts on the same outcome. Detection via temporal clustering (bets within 5 minutes) and checking for round-number amounts (collusion indicator). Graph neural networks (GNN) build connections between accounts.
| Method |
Without system |
Our system |
| Recall |
63% |
91% |
| Precision |
72% |
87% |
| False positives per 1000 matches |
28 |
13 |
What's Included
- Audit of current data collection system — analysis of available logs, APIs, formats.
- Development of collection and normalization pipeline — Kafka/RabbitMQ, source parsing.
- Training of ensemble model — optimizing precision/recall for business goals.
- Deployment — on-premise or cloud (AWS/GCP), REST API + webhooks.
- Documentation — API spec, Grafana dashboard, operator manual.
- Staff training — 2-day training for analysts.
- 3-month support — drift monitoring, model retraining.
Process of Work
Analytics → Architecture design → Module development → Testing on historical data → A/B test in production → Deployment → Monitoring and refinement.
Estimated Timelines
- MVP (odds movement only + performance baseline + dashboard): 4-5 weeks.
- Full product (all modules + GNN + NLP + real-time alerts): 3-4 months.
Pricing is individual — depends on number of sources, integration complexity, and latency requirements. We provide a fixed price after audit.
Contact us for a consultation and project estimate. Our team has 7+ years of experience and 50+ successful deployments. We guarantee confidentiality and compliance with ESSA standards. Request an audit of your system — we'll show where hidden threats lie.
Anomaly Detection: Autoencoders, Isolation Forest, PyOD
Server monitoring shows CPU 85%, memory 91% — is this the start of an attack or normal peak load? A classifier won’t help: anomalies are by definition rare, diverse, and not pre-labeled. Supervised learning requires examples of anomalies in the training set — so it fails on what you haven’t seen yet. Without an unsupervised approach, detection turns into guesswork.
Why Does Anomaly Detection Require an Unsupervised Approach?
The main problem: no labels and extreme class imbalance. Fraud transactions account for 0.01–0.1% of total volume, production defects 0.5–3%. With such ratios, a naive “all normal” classifier gives 99.9% accuracy but recall for the anomalous class near zero. Supervised models are powerless.
Second: “normality” is always contextual. A login at 3 AM may be normal for a night‑shift user but suspicious for a day‑worker. Bearing vibration at 2.3 mm/s depends on operating mode and machine age. So we embed context via feature engineering and time windows.
Third: quality assessment without ground truth. No standard test set — AUC‑ROC is possible only if a few labeled examples exist. For fully unlabeled data, only domain expert validation and indirect metrics work.
How to Distinguish an Anomaly from Noise in Real Time?
With adaptive thresholds and continuous monitoring of model statistics. In the case section we show how.
| Method |
Data Type |
Training Speed |
Typical Application |
| Isolation Forest |
Tabular, categorical |
High |
Baseline for initial hypotheses |
| Autoencoder |
Images, time series, logs |
Medium |
Unstructured data |
| LSTM-AE |
Multivariate time series |
Low |
Industrial telemetry |
| PyOD (ensemble) |
Tabular |
High |
Quick comparison of 40+ methods |
Isolation Forest is the standard baseline for tabular data. Idea: anomalies are isolated faster by random partitioning of the feature space. Works well at contamination=0.01–0.1, robust to feature scale, no normalization required. Implementation in sklearn.ensemble.IsolationForest.
Typical mistake: setting contamination='auto' without understanding the data. Auto mode assumes a threshold of -0.5, which may not match the actual anomaly proportion. Better: estimate expected anomaly percentage through domain knowledge and set it explicitly. We guarantee contamination tuning for your case.
PyOD (Python Outlier Detection) is a library with 40+ algorithms under a unified API — OCSVM, LOF, COPOD, ECOD, DeepSVDD, AutoEncoder. Useful for quickly comparing methods on the same data.
Autoencoders are the main method for unstructured data (time series, images, logs). Train the network to reconstruct normal data; anomalies yield high reconstruction error. Anomaly threshold is the 95th or 99th percentile of error on a validation set of normal data.
Practical problem with autoencoders: overfitting on “normal” patterns that are still rare. If the training set contains even a few anomalies, the model may learn to reconstruct them well. Solution: thorough cleaning of training data or using a Variational Autoencoder (VAE), which generalizes better.
LSTM‑AE for time series captures temporal dependencies better than a regular AE. Especially effective for multivariate time series (10+ sensors simultaneously). Implementation via PyTorch, training with MSELoss on sliding windows.
In Detail: Anomaly Detection in Industrial Time Series
Problem: vibration sensors on 12 pumps at a chemical plant, 6 sensors per pump, frequency 100 Hz. Need to warn of impending failure 4–24 hours in advance.
Solution architecture: raw data → feature extraction (RMS, kurtosis, peak factor, FFT amplitudes at resonant frequencies) → normalization by 24‑hour sliding window → LSTM‑AE → reconstruction error → threshold logic + alerting.
LSTM window size: 60 seconds (6000 points at 100 Hz). Too small a window misses slow patterns, too large loses sensitivity to rapid changes.
Anomaly threshold: not fixed, but adaptive. threshold = mean(errors_last_7d) + 3 * std(errors_last_7d). As normal state drifts (planned wear), the threshold adapts, avoiding false positives.
Result over a 6‑month pilot: detected 4 out of 5 real pre‑failure conditions (recall 0.8), with 2 false alarms over 6 months (precision 0.67). Before implementation: 3 unplanned shutdowns. After implementation: cost savings verified in the pilot report.
What Specifics Does Fraud Detection Face?
Financial transactions have several features that complicate detection:
- Concept drift: fraud patterns change faster than normal behavior. A model trained six months ago becomes obsolete.
- Adversarial adaptation: advanced fraudsters adapt — making transactions resemble normal ones.
- Temporal dependency: a series of normal transactions followed by one unusual transfer is a sequence anomaly, not a single point.
Practical stack for fraud detection: LightGBM with SMOTE oversampling for the supervised part (known fraud cases) + Isolation Forest for unsupervised (new patterns). Both signals combined in an ensemble; final decision via thresholds tuned for acceptable FPR (0.1–1% of transactions sent to manual review).
How to Evaluate Quality Without Labels?
When ground truth is absent, we evaluate using:
- Synthetic anomaly injection: add artificial anomalies (spike, level shift, point outlier) and check if the model detects them.
- Expert validation: random sample of top‑K anomalies → expert review → precision.
- Business metric: did the number of missed incidents / false alarms decrease after deployment?
Technical detail: the adaptive threshold is computed as mean(errors) + k * std(errors) on a 7‑day sliding window. Coefficient k is tuned on a validation set with synthetic anomalies to achieve FPR < 0.1%. When features drift, the window automatically shifts.
Process
- Interview with domain experts — understand what “normality” means and what incidents have occurred.
- EDA and data preparation — cleaning, feature creation, time windows.
- Baseline (Isolation Forest) — fast validation on known incidents.
- Model selection and customization — Autoencoder / LSTM‑AE / ensemble.
- Training, validation with synthetic anomalies.
- Deployment to production — pipeline on Kafka + Flink / Airflow, alerting to Telegram/Slack, drift monitoring.
- Post‑deployment support — monitor model metrics, update thresholds.
What's Included
- Audit of current data and processes
- Development and training of models (Isolation Forest / Autoencoder / LSTM‑AE / ensemble)
- Configuration of adaptive thresholds and alerting
- Anomaly monitoring dashboard (Grafana / Streamlit)
- Model card and pipeline documentation
- Training for your team (2–3 sessions)
- 3‑month warranty support
Timeline: baseline system with one method — 2–4 weeks. Production system with adaptive thresholds, alerting, and monitoring — 2–5 months. Pricing is calculated individually for your case.
Our team has 8+ years of experience in industrial analytics and 15+ successful projects in anomaly detection for telemetry, finance, and IT monitoring. Get a consultation — we’ll tell you how to solve your problem. Contact us to discuss your data and receive a preliminary architecture proposal.