commit a392e8eab8f0987121cff20e5c875200210a6511 Author: Ralph pricing.frontier@gmail.com Date: Fri Mar 27 04:59:56 2026 +0000

blog: resolve merge conflicts + add benchmark write-ups

Resolve 3 merge conflicts in "Does X Actually Work" series (take fix branch).
Add 2 new posts: fairness audit on ausprivauto0405 and drift detection on freMTPL2.
All API references verified against library source code.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

diff –git a/_posts/2026-03-27-model-drift-detection-fremtpl2-insurance-monitoring.md b/_posts/2026-03-27-model-drift-detection-fremtpl2-insurance-monitoring.md new file mode 100644 index 0000000..61d782c — /dev/null +++ b/_posts/2026-03-27-model-drift-detection-fremtpl2-insurance-monitoring.md @@ -0,0 +1,221 @@ +— +layout: post +title: “Model Drift Detection on 677k Policies: PSI, A/E, and Gini Tests on freMTPL2” +date: 2026-03-27 +categories: [monitoring, pricing, techniques] +tags: [model-drift, psi, ae-ratio, gini-drift, monitoring, frequency-model, poisson-glm, fremtpl2, insurance-monitoring, motor, model-validation] +description: “We fitted a Poisson GLM on the first third of freMTPL2 (677k French motor policies) and monitored it across two later temporal segments without refitting. PSI, A/E ratios with Wilson CIs, segmented age-band analysis, and GiniDriftTest — all from insurance-monitoring.” +— + +The monitoring problem in insurance pricing is not detecting drift. Any actuary with a spreadsheet and quarterly data can eyeball an A/E ratio. The problem is detecting drift systematically, across multiple dimensions, with appropriate statistical thresholds, before the model has been 7% cheap for eighteen months and someone asks why you did not notice sooner. + +We benchmarked insurance-monitoring against freMTPL2 — 677,991 French motor third-party liability policies from OpenML (dataset ID 41214) — to see what a structured monitoring workflow looks like at real portfolio scale. + +— + +## The scenario + +We split freMTPL2 into three equal thirds by row order (row order correlates loosely with policy vintage via the IDpol identifier, following the approach of Noll, Salzmann & Wüthrich, 2020). Period 1 is the training window; periods 2 and 3 are monitoring windows. We fit a Poisson GLM on period 1 and then hold it fixed — no refit, no recalibration — while applying it to periods 2 and 3. + +This mirrors production. Your model was fitted on last year’s data. You are now applying it to this year’s policies. The question is: what has changed, and has the model noticed? + +```python +from insurance_monitoring import (

Back to all articles