SPB Git

spb/spboucher.ai Public

spboucher.ai — personal website of Simon-Pierre Boucher.

TypeScript 93.4% HTML 5.5% CSS 1%

Research: add UQO Working Paper No. 11 (Half a Million Prices, Twenty Models)

- /research card + full /research/wp11 detail page (findings, key results,
  data, methodology, reproducibility) with paper PDF served locally
- Home stat bumped to 10 working papers; CV PDF regenerated with WP11

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Simon-Pierre Boucher committed yesterday (Aug 9, 2026) parent eaccaab

Showing 6 changed files with +111 and −1

modified app/page.tsx +1 −1
@@ -37,7 +37,7 @@ import { cn } from "@/lib/utils";
37 37
38 38 const stats = [
39 39 { icon: BookOpenCheck, value: "1", label: "Peer-reviewed publication" },
40 { icon: ScrollText, value: "9", label: "Working papers" },
40 + { icon: ScrollText, value: "10", label: "Working papers" },
41 41 { icon: AppWindow, value: "9", label: "Native macOS apps" },
42 42 { icon: Github, value: "30+", label: "Open-source repositories" },
43 43 ];
modified cv-source/cv.html +7 −0
@@ -240,6 +240,13 @@
240 240 </div>
241 241 <span class="period">2026</span>
242 242 </div>
243 + <div class="entry">
244 + <div class="body">
245 + <p class="title"><span class="num">WP 11</span>Half a Million Prices, Twenty Models: A Systematic Assessment of Hedonic Specifications and Estimation Methods for the Quebec Housing Market, 2021–2026</p>
246 + <p class="desc">Controlled horse race of 20 hedonic models on 514,212 roll-matched sales — spatial controls are first-order (~10 pp of MdAPE); machine learning's edge under random validation reverses under a forward-in-time split. 23 pages.</p>
247 + </div>
248 + <span class="period">2026</span>
249 + </div>
243 250 </section>
244 251
245 252 <section>
modified lib/research-details.ts +91 −0
@@ -20,6 +20,97 @@ export interface ResearchDetail {
20 20 }
21 21
22 22 export const researchDetails: ResearchDetail[] = [
23 + {
24 + "slug": "wp11",
25 + "repo": "https://github.com/spboucher-ai/wp11_uqo",
26 + "hero": {
27 + "headline": "Random cross-validation is the wrong experiment for valuation models",
28 + "subheadline": "Twenty hedonic models raced on 514,212 Quebec sales under identical conditions — machine learning wins the random split and loses the forward-in-time one."
29 + },
30 + "abstract": [
31 + "Hedonic price models underpin mass appraisal, price indices, and housing research, yet specification choices — functional form, time effects, spatial controls, estimation method — are usually made ad hoc. This paper runs a controlled horse race of 20 models on 514,212 roll-matched Quebec residential sales (2021–2026) with assessor-grade structural attributes, scoring every model on the same price-level scoreboard via Duan smearing and Box–Cox inversion.",
32 + "The design crosses four axes: six functional forms (linear to Box–Cox and cubic splines), a time-fixed-effects ladder (none to month), a spatial-fixed-effects ladder (none to a ~1.1 km grid), and six estimation methods (OLS, ridge, random forest, gradient boosting, spatial k-NN comparables). All models face two holdouts: a random 80/20 split and a forward-in-time split trained before 2025 and tested on 2025–2026.",
33 + "Spatial controls are first-order, worth roughly 10 percentage points of median absolute percentage error, but overfit at ~1 km granularity; functional form is second-order, worth about ±2 points. Gradient boosting wins under random validation (MdAPE ≈ 14.4% vs 16.5% for the best linear model), but under the forward-in-time split every model degrades and the ranking reverses — splines reach 19.1% against 21.2% for boosting, at identical log R². Implied price indices and implicit-price profiles agree across forms far more than the accuracy gap suggests."
34 + ],
35 + "findings": [
36 + { "value": "514,212", "label": "roll-matched Quebec sales, 2021–2026" },
37 + { "value": "20", "label": "hedonic models raced on one scoreboard" },
38 + { "value": "~10 pp", "label": "MdAPE improvement from spatial fixed effects" },
39 + { "value": "±2 pp", "label": "MdAPE spread across functional forms" },
40 + { "value": "14.4%", "label": "gradient-boosting MdAPE under the random split" },
41 + { "value": "19.1%", "label": "spline MdAPE under the forward split — beating ML's 21.2%" }
42 + ],
43 + "contributions": [
44 + {
45 + "title": "A controlled horse race, not anecdotes",
46 + "description": "Six functional forms × time-FE ladder × spatial-FE ladder × six estimation methods, all on the same sales, attributes, and price-level metrics — specification advice grounded in one consistent experiment."
47 + },
48 + {
49 + "title": "Spatial controls are first-order",
50 + "description": "Location fixed effects are worth roughly 10 percentage points of MdAPE — an order of magnitude more than functional form — but a ~1.1 km grid begins to overfit."
51 + },
52 + {
53 + "title": "The validation split is the result",
54 + "description": "Gradient boosting beats every linear model under random 80/20 validation, yet under a forward-in-time split the advantage reverses: splines at 19.1% MdAPE versus boosting at 21.2%."
55 + },
56 + {
57 + "title": "Functional form matters less than assumed",
58 + "description": "Across linear, semi-log, log-log, Box–Cox, quadratic, and spline specifications, price-level accuracy moves by only about ±2 percentage points of MdAPE."
59 + },
60 + {
61 + "title": "Economics is stable across specifications",
62 + "description": "Implied price indices and implicit-price profiles agree across functional forms far more closely than the accuracy differences suggest — the economics is robust even where the forecasts are not."
63 + },
64 + {
65 + "title": "A fair price-level scoreboard",
66 + "description": "Log and transformed models are mapped back to dollar space with Duan smearing and Box–Cox inversion, so every model is judged on MdAPE, MAPE, and RMSE in levels."
67 + }
68 + ],
69 + "data": [
70 + {
71 + "title": "Roll-matched Quebec sales",
72 + "description": "514,212 residential transactions (2021–2026), filtered from 745,119 raw sales and matched to assessment rolls for assessor-grade structural attributes — floor area, lot, age, storeys, units, class, physical link."
73 + }
74 + ],
75 + "methodology": [
76 + {
77 + "title": "Functional-form ladder",
78 + "description": "Linear, semi-log, log-log, Box–Cox with λ estimated by profile likelihood, quadratic terms, and cubic splines — curvature tested systematically rather than assumed."
79 + },
80 + {
81 + "title": "Fixed-effects ladders",
82 + "description": "Time effects from none to month dummies; spatial effects from none through municipality to ~5.5 km and ~1.1 km grid cells, isolating where granularity pays and where it overfits."
83 + },
84 + {
85 + "title": "Estimation methods",
86 + "description": "OLS, cross-validated ridge, random forest, gradient boosting with and without coordinates, and spatial k-NN comparables — the machine-learning contenders face the same attributes as the linear models."
87 + },
88 + {
89 + "title": "Two holdout designs",
90 + "description": "A random 80/20 split and a forward-in-time split (train before 2025, test 2025–2026 with carry-forward time effects) — the contrast between them is itself the headline result."
91 + },
92 + {
93 + "title": "Municipality-clustered evaluation",
94 + "description": "Metrics computed on price levels (MdAPE, MAPE, RMSE_ln, R²_ln) with municipality-clustered design throughout."
95 + }
96 + ],
97 + "reproducibility": [
98 + "End-to-end Python pipeline: five numbered scripts from raw sample construction (745,119 → 514,212 sales) to LaTeX tables",
99 + "The 20-model harness lives in src/wp11/models.py with a shared config and plot style",
100 + "9 journal-calibre figures and 7 LaTeX tables regenerated by scripts 04 and 05",
101 + "Full LaTeX source of the 23-page paper in paper/ with sections and bibliography"
102 + ],
103 + "keywords": [
104 + "hedonic pricing",
105 + "model validation",
106 + "machine learning",
107 + "gradient boosting",
108 + "spatial fixed effects",
109 + "Box–Cox",
110 + "housing markets",
111 + "Quebec"
112 + ]
113 + },
23 114 {
24 115 "slug": "wp2",
25 116 "repo": "https://github.com/spboucher-ai/wp2_uqo",
modified lib/research.ts +12 −0
@@ -91,6 +91,18 @@ export const uqoWorkingPapers: ResearchPaper[] = [
91 91 pdf: "/papers/wp10_uqo.pdf",
92 92 repo: "https://github.com/spboucher-ai/wp10_uqo",
93 93 },
94 + {
95 + slug: "wp11",
96 + kind: "wp",
97 + num: "UQO Working Paper No. 11",
98 + pages: "23 pages",
99 + title:
100 + "Half a Million Prices, Twenty Models: A Systematic Assessment of Hedonic Specifications and Estimation Methods for the Quebec Housing Market, 2021–2026",
101 + description:
102 + "A controlled horse race of 20 hedonic models on 514,212 roll-matched Quebec sales — spatial controls are first-order (~10 pp of MdAPE), functional form second-order (±2 pp), and gradient boosting's edge under random validation reverses under a forward-in-time split.",
103 + pdf: "/papers/wp11_uqo.pdf",
104 + repo: "https://github.com/spboucher-ai/wp11_uqo",
105 + },
94 106 ];
95 107
96 108 export const thesisChapters: ResearchPaper[] = [
modified public/cv/Simon-Pierre-Boucher-CV.pdf +0 −0

Binary file not shown.

added public/papers/wp11_uqo.pdf +0 −0

Binary file not shown.