Methodology
How the model thinks
Six sliders, four scenarios and one growth rate per postcode area, anchored to open data. Five feedback loops are named and represented by sliders, not yet run as loops.
Six sliders, four scenarios, every neighbourhood.
Six sliders set the macro conditions you want to test: ECB rate, income growth, new supply, gentrification, policy risk and rental scarcity. Four preset scenarios, Baseline, Boom, Crisis and Policy, give you a starting point. A scenario is a combination of slider settings that represent a coherent state of the world. The model runs the numbers for the neighbourhood you have selected and returns a ten-year price trajectory with upper and lower bounds. The trajectory is not a prediction. It is the range implied by the conditions you have set.
The band is never zero, not even today, because every starting value carries measurement error. It widens with every year into the future.
Four presets
Each scenario is a slider configuration, not a forecast. Pick one to see the growth rate those conditions imply. Scenario figures are 10-year averages. Every scenario starts from today’s ECB rate and moves with it: Boom sits a point below, Crisis 0.75 points above, Policy at today’s rate. Boom is capped by each city’s best decade starting in 2013 or later, under today’s lending rules, from CBS price data. Crisis is a scenario of rising rates. No decade since 1995 saw rates rise, so its floor is a choice: the worst decade for the Netherlands minus one point at today’s rate, moving with the Baseline when the rate moves. A sharp fall in a single year does not show, because the model grows prices at one constant rate.
Baseline
The current market, taken as the starting point. ECB 2.50% and the latest CBS figures. The slider configuration the model defaults to on load.
Boom
Low rates, tight supply, rising gentrification and light regulation, with incomes growing as in the Baseline. The ECB rate sits a point below today’s level. Boom may not pass any city’s best decade starting in 2013 or later plus one point, at rates from 2% to 3.5%. Lending rules were looser before 2013, so earlier decades do not set the cap.
Crisis
Credit gets dearer: the ECB rate sits 0.75 points above today’s level, incomes grow no faster than in the Baseline and new supply arrives at the wrong time. Every city must stay above the worst decade for the Netherlands since 1995 minus one point, measured at today’s rate and moving with the Baseline when the rate moves. That floor is a choice, because no decade since 1995 saw rates rise.
Policy
Rent regulation tightens and pressure on investors rises. Incomes grow as in the Baseline and the ECB rate stays at today’s level, whatever that level is. The policy risk slider brakes the growth rate, so it lands between Crisis and Baseline. The strength of that slider, 1.4 points per step, is a chosen value, not one fitted to data.
Five loops, represented by sliders.
Property markets move in loops: a price change alters the conditions that set the next price change. These five matter most in Dutch cities. The model does not run them as loops yet. Four are represented by a slider or term that moves the annual growth rate by a fixed amount, and herding is a label. The growth rate does not respond to the prices it produces, so the trajectory is a smooth curve, not a cycle. Building the loops into the trajectory is planned.
Click any loop to see how it moves and what it does.
†The credit-amplification strength is chosen, not data-derived.
This term is the distance of the ECB rate from its neutral point of 2%, weighted by how many homes in the area are owner-occupied. Owner-occupied areas lean more on mortgages, so a rate change moves them more. It is the part of the credit loop the model runs, and it does not feed back: cheaper credit raises the growth rate, but the higher prices do not raise borrowing again. The strength (0.005) is a chosen value, not fitted to data. Dutch open data has no quarterly price levels at gemeente level to fit it against. An extra weight that scaled this term by the trend in new mortgage lending was removed on 2 October 2026, because lending volume moves with house prices and so partly explained prices with prices.
‡Herding is a label, not a term in the growth rate.
None of the five loops feeds back in the model today. Uitponden, the construction freeze and rental buffer collapse are represented by the policy risk, supply and rental scarcity sliders, and credit amplification by the credit term. Each adds a fixed amount to the annual growth rate, whatever prices did the year before. Herding adds nothing. It is a label: the model flags herding when growth rises above +6.5% or falls below −2%, because no open data series allows a herding effect to be estimated. Building the loops into the trajectory is planned.
Ten data feeds, three refresh cadences.
Every feed is open data with its licence stated at the source. The full list with licences and check dates is on the Sources and method page.
| Source | What it provides | Cadence | Last fetched |
|---|---|---|---|
| ECB SDMX | Deposit facility rate | Weekly | 13 October 2026 |
| CBS 85036NED | Average WOZ value, Amsterdam | Annual | 11 June 2026 |
| CBS 86144NED (HICP) | Inflation for the Netherlands, year on year | Weekly, published monthly by CBS | 13 October 2026 |
| Inside Airbnb | Short-term rental listings and host mix per postcode | Quarterly | 15 October 2026 |
| Gemeente Amsterdam, nieuwbouwplannen | Planned new homes by tenure per district | Quarterly | 15 October 2026 |
| CBS Kerncijfers wijken en buurten | Income, owner-occupancy and population per postcode | Annual | 13 October 2026 |
| Gemeente Amsterdam, Maps Data | Spatial price per square metre per postcode (Woningwaarde) | Annual | 11 June 2026 |
| CBS 83625NED | Average sale prices of existing homes, Amsterdam, 2016 to 2025 | Annual | 29 May 2026 |
| CBS 85792NED | Price change of existing homes against a year earlier, latest quarter, Amsterdam and the Netherlands | Weekly, published quarterly by CBS | 15 October 2026 |
| CBS 83671NED | Residential building permits, Amsterdam | Quarterly | 15 October 2026 |
Data current as of 15 October 2026
calibration
The model uses open-data anchors and a stack of coefficients. One conversion, from WOZ value to market value, is taken straight from data. For the other coefficients the direction follows from how the housing market works, not from a fit, and the size is chosen. The neighbourhood figures were also tested against CBS data. One mechanism works as a threshold, not an added term. The tables below name which is which.
Live anchors
| Anchor | Source | Cadence |
|---|---|---|
| ECB deposit rate | ECB | Weekly |
| CBS average WOZ value | CBS 85036NED | Annual |
| NL HICP | CBS 86144NED | Weekly, published monthly by CBS |
| CBS KWB neighbourhood data | CBS KWB 85984NED, 86165NED | Annual |
Taken from data
| Coefficient | Value | Anchored to |
|---|---|---|
| WOZ × market ratio | 1.22 | CBS average sale price 2025 divided by CBS average WOZ value on 1 January 2024 (Amsterdam shown) |
Selected coefficients
The direction of each effect follows from how the housing market works, not from a fitted result, unless the row says it was tested. The size of each effect is chosen, not estimated.
| Knob | Magnitude | Status |
|---|---|---|
| ECB rate effect per point | 0.02 | Chosen. Each point of ECB rate moves growth by 2 percentage points a year. The direction follows from borrowing capacity: a lower rate lets the same income carry a larger mortgage. That is economic reasoning, not a fit. A city-level price series cannot confirm it, because the ECB sets rates in response to the economy. |
| Neighbourhood effects (CBS per postcode) | 0 to 0.005 | Tested against CBS WOZ growth 2016 to 2025. Owner-occupancy, income and the benefits share are set to zero. New build keeps the model’s smaller steps. Centred per city and capped at 2 points, both chosen. Differences between postcode areas are small because the data did not support larger ones. How this was tested |
| Credit amplification (LEVERAGE_COEFF) | 0.005 | Chosen. CBS 85792NED publishes a quarterly price index for Amsterdam, but one city-level series cannot separate the credit term from the ECB slider, which moves with the same rate. See ADR-001. Why |
| Rental scarcity per slider step | 0.008 | Chosen. Without open rent data per postcode, the neighbourhood multiplier is neutral everywhere. |
Mechanisms represented by sliders
Uitponden pulse
Landlords sell rented homes when tax and yield arithmetic turns against renting. Represented by the policy risk slider as a fixed term, without feedback.
Construction freeze
Construction cost and grid congestion hold back new building. Represented by the supply slider as a fixed term, without feedback.
Rental buffer collapse
Fewer rentals push would-be renters to buy. Represented by the rental scarcity slider as a fixed term, without feedback.
Credit amplification
Mortgage capacity moves with the rate. Represented by the credit term, the ECB rate weighted by owner-occupancy, as a fixed term, without feedback.
Threshold mechanism
Herding works as a label, not a coefficient. It shows when growth is above +6.5% or below −2%. It does not add a separate growth term.
Limits
The model is a scenario projection tool with named feedback mechanisms and named anchors. It is not an agent-based model. It is not a network model. It is not a regression. It does not produce point forecasts. The output is a scenario range with upper and lower bounds under a stated set of choices, starting from the average WOZ value of the postcode area converted to a market value.
Working on
- Estimating the strength of the credit term. CBS 85792NED publishes a quarterly price index for Amsterdam and the other G4 cities, but a city-level series moves with the ECB rate as a whole and cannot separate the credit term from the ECB slider. That needs variation between postcode areas over time, which open data does not yet give. Until then the strength stays a chosen value. See ADR-001.
Why
CBS table 85792NED publishes a quarterly price index for Amsterdam and the other G4 cities, and table 83625NED annual sale prices per gemeente. Both are city-level series. The ECB slider and the credit term move with the same rate, so one city-level series cannot tell their strengths apart. The credit term stays at 0.005, a chosen value. Its direction follows from borrowing capacity, not from a fit: a lower rate lets the same income carry a larger mortgage, and areas with more owner-occupiers lean more on mortgages. A city-level series cannot confirm the direction either, because the ECB sets rates in response to the economy. See ADR-001.
OLS
OLS (ordinary least squares) finds the coefficient value that minimises the average squared gap between what the model outputs and what was observed in the data.
calibration anchors
ECB deposit rate
2.50%
ECB SDMX · Eurozone · 13 October 2026
Average sale price
€631k
CBS 83625NED · Amsterdam-gemeente GM0363 · 2025
NL prices, YoY
+8.6%
CBS 85792NED M005355 · Nederland · annual 2025
Amsterdam prices, YoY
+3.6%
CBS 85792NED M005355 · Amsterdam-gemeente GM0363 · annual 2025
NL HICP
3.0%
CBS 86144NED (M001500, HICP YoY) · Nederland · Sept 2026
Anchors marked with a pulsing dot refresh weekly from live feeds. The others follow the cadence of their source in the table above.
Where the model is silent.
The model returns scenario ranges, not point forecasts. A point forecast is a single number: flat X will be worth €Y in five years. The model does not do that. It shows you what a range of plausible conditions implies for the trajectory, which is a different and more honest kind of output.
Sale prices per postcode are not in the public data. The government publishes average sale prices per municipality. Below that, the model starts from the average WOZ value of each postcode area and converts it with the city-wide ratio of sale prices to WOZ values. It is an estimate, not a direct observation.
Extreme events sit outside the calibrated range. A financial crisis like 2008, a sudden tightening of mortgage lending rules, or a major legislative change to the rental market would move prices in ways the sliders cannot capture. The model is calibrated on the range of normal market variation. Use it for structural thinking, not for tail-risk scenarios.