Skip to main content
FIGHTIQ·LAB
DASHH2HNETWORKSIGNALSBACKTESTCYCLESCORRELATIONSBUILDER
⌘K
LIVE16:24:53 UTCv0.1
FIGHTIQ · LAB

METRIC CYCLES

304 BUCKETSBUCKET · MONTHLYERA · ALLWC · ALL

Time-series view of a per-fight metric across the UFC era. Pick a metric and a bucket size, and see the raw value, a centered moving-average trend, an OLS slope per year, a month-of-year seasonal cycle, and the buckets sitting furthest from trend. Time-series trends do not imply future direction; the methodology footer carries the full disclaimer.

KO RATE · TIME SERIESFLAT
PERIODMar 1994 → May 2026
N_BUCKETS304
N_FIGHTS8,606
SLOPE / YR-0.496 pp/yr
95% CI[-0.660 pp/yr, -0.331 pp/yr]
SEASONAL AMP7.68 pp
KO RATE · BUCKET RAW + TRENDbar = raw bucket mean · line = centered moving-average trend (edge-shrunk window) · no extrapolation outside the data
SEASONAL CYCLE · MEAN RESIDUAL BY MONTH-OF-YEARpositive = ko rate ran ABOVE trend in that calendar month, on average across all years · negative = below trend · 0-bar months had no contributing buckets
TOP 5 · LARGEST RESIDUAL FROM TRENDresidual = raw bucket mean − trend value · sign indicates direction · descriptive only
#PERIODKO RATE (RAW)TRENDRESIDUALN_FIGHTS
1Jul 199687.5%45.0%+42.5pp8
2Mar 200970.0%35.1%+34.9pp10
3Sep 200112.5%44.9%-32.4pp8
4Jul 199975.0%43.7%+31.3pp8
5Dec 199412.5%42.4%-29.9pp8
Data source: gold dataset (ufc_gold_dataset_final.csv) — one row per UFC fight with method, end-round, total fight time, and per-fighter strike/grappling counters. Produced by the FightIQ Data lane and read directly off disk.
Metric: KO RatePer-fight binary: 1 if the fight ended by KO/TKO, 0 otherwise. Averaged across the bucket gives the share of bucket fights ending by KO/TKO. NC/Overturned/CNC/DQ rows are dropped from the denominator upstream.
Eligibility: each fight must have a parseable Event_Date inside the active era window. Bouts ending in No Contest, Overturned, Could Not Continue, or Disqualification are excluded from every bucket via the canonical classifyMethodForEra policy — the universe-level NC drop is applied once per fight regardless of which metric is active, so n_fights per bucket is comparable across metrics. Per-metric null values (e.g. a missing Total_Fight_Time_Sec for the duration metric) further skip that fight from the bucket average but it still counts toward n_fights. Buckets with fewer than 5 fights are dropped from the series — they would otherwise wobble the trend on sample-size noise.
Trend: centered moving average with edge-shrink — not zero-padded. Window: 13-bucket window (~13 months), radius 6. At the series edges the window contracts to the available buckets on the same side; no synthetic past or future values are invented. Trend is undefined for a bucket only when every neighbour in the shrunk window also has a null raw value.
Slope per year: ordinary-least-squares fit of the raw bucket value (y) against the bucket-midpoint year-fraction (x). slope = Σ(x − x̄)(y − ȳ) / Σ(x − x̄)². 95% confidence interval uses the standard OLS slope standard error: SE = √(RSS / (n − 2) / Σ(x − x̄)²), CI = slope ± 1.96 · SE. Shown when n_buckets ≥ 4; below that the slope is degenerate and we suppress the CI.
Trend strength tag uses |slope / sd(raw)| (unit-free magnitude of the annual drift expressed in standard-deviations-per-year): FLAT < 0.05 · DRIFTING 0.05–0.15 · TRENDING ≥ 0.15. These bands are descriptive only — a TRENDING tag does not imply the trend will continue or that it’s exploitable.
Seasonal cycle (monthly bucket only): for each calendar month m (1..12), seasonal[m] = mean(residual[i] for buckets i in month m), where residual[i] = raw[i] − trend[i]. Months with zero contributing buckets render as 0-height bars so the 12-month axis stays complete. The headline seasonal amplitude is the peak-to-trough swing across the 12 months. We suppress this block on quarterly / yearly buckets — a quarter-bucket spans 3 months and would smear seasonality across the calendar.
Top-5 residual table: buckets sorted by |residual| descending. A positive residual means the raw bucket value sat ABOVE the trend; negative means below. The residual ranking is floored at n_fights ≥ max(min_fights, 8) — rate-style metrics are discretized by 1/n_fights, so a 7-fight bucket can hit a large residual purely from sample-size granularity. The chart, trend, and slope CI still use every bucket meeting the min-fights guard; only this table tightens. A large residual can reflect a genuine cluster in that period, surviving sample-size noise, or a trend-line edge artefact. We are not labelling these as anomalies to exploit.
Drop accounting for this query: from 8,719 total fights on disk, 0 were outside the active era window or had an unparseable date, 0 were outside the active weight class, 113 were dropped as NC / Overturned / Could Not Continue / DQ, and 0 buckets were dropped below the min-fights guard — leaving 304 buckets covering 8,606 fights in the series.
Honest framing: time-series trends do not imply future direction. A TRENDING slope tag describes the historical drift only — selection effects (which weight classes opened over time, which referees worked which years), changes in scoring practice, and the changing UFC card cadence can all produce trend-like patterns that don’t replicate forward. The residual table identifies WHERE the trend line missed in the past; it is not a signal of where it will miss next. Informational only.
MODEL OK°BOOKS: 12/12°LATENCY: 84ms°EDGES: 47°SIGNALS: 6 / 1H°UID #LAB-W1°·Tue, May 26