Methodology
How a mix-adjusted asking-price index is built
A mix-adjusted asking-price index measures advertised price per square meter while holding the composition of what is advertised fixed. Offers are grouped into cells of district, property type and layout; where a market publishes how its official statistic weights regions, regions are combined with those fixed weights over a trailing 90 days, each month's figure is that same calculation ending with the month, and a monthly change is published only when its sample is the same kind in both windows and 12 split-half estimates agree within 1.0 percentage point.
The problem: mix shift, and the cells that remove it
A median asking price over everything advertised this month is a statement about what is advertised, not about prices. If more large flats come to market, the median rises with no flat repriced; if a cheap region's portals grow their stock, it falls. Apartments cost roughly twice as much per square meter as houses, so even the split between the two moves a headline further than most real price changes do: in one comparison of two markets, the published gap between their headline levels was +47 percent, and +38 percent once both were put on the same 50/50 apartment-house mix. That 9-point difference is composition, not price.
A mix-adjusted index removes composition in two places. Between cells, it holds the weight of each segment fixed across the step being measured, so a change in what is advertised cannot move the index by itself. Within cells, it works on price per square meter rather than total price, so a shift toward larger flats inside a segment does not read as inflation. Eurostat's handbook on residential property price indices calls this family stratification, or mix adjustment, and it is the standard alternative to hedonic regression when the attributes available are few, but the sample is large.
The unit of the index is therefore a cell of property type, region and layout. Each offer is assigned to exactly one, and everything downstream is computed per cell first. The table lists the three dimensions and the floors each cell must clear.
| Dimension | Values | Why it is in the key |
|---|---|---|
| Property type | Apartment, house, and separately sale and rent | The largest price-per-m2 difference in the market; never chained across |
| Region | First-level administrative regions of the market | Regional stock moves independently; a capital-city surge must not be read as a national one |
| Layout | Number of rooms (studio, one room, two rooms, and so on) | Small units carry a per-m2 premium, so a shift toward studios would otherwise read as a price rise |
| Cell floor | At least 5 offers in a cell in both months for the cell to chain | A median of three offers is noise |
| Step floor | At least 10 cells and at least 4,000 offers behind a step | A chain over few cells is not a mix adjustment |
| Level floor | At least 400 offers behind a month's level | A level is one weighted mean; one layout row can legitimately span only 8 regional cells |
Publication floors of the Bytero Live index engine.
Where regional weights exist: one method for the level and the change
Where a market publishes how its official asking-price statistic weights its regions, the index uses that structure, so its headline can be set beside the official figure and still be broken down further than the official figure is. Slovakia is the first such market. There is one table of cells, district by property type by layout, over a trailing 90 days. A cell's value is the mean price per square meter of its adverts after the extremes are excluded (anything outside 1.5 times the interquartile range). A region is its cells combined by number of adverts. The national figure is the regions combined with fixed weights, each region's long-run share of the country's property transactions, and not the advert mix of the day. Every breakdown, by type, layout, region or district, is the same arithmetic on a subset of the same cells, which is why each one reconciles to the headline.
The method was calibrated against the seven figures the official statistic publishes for Slovakia for the second quarter of 2026 (all homes, apartments, houses, and one- to four-room apartments) and lands within 1.8 percent of every one. Tukey's fence was the only outlier rule that put all seven inside 2 percent. It is a textbook definition, not a number tuned to the target. A script re-scores the method against the figures as published today and fails past 2.5 percent, so the agreement is checked and not asserted. Five-room apartments sit about 9 percent away on a thin, mixed sample and are shown but not claimed.
The change comes from the same table. A month's figure is this calculation over the 90 days ending with that month, so a quarter-end month is the quarter the official statistic publishes, and a monthly change is the difference between two such figures, read the way a change between two published quarters is read. The latest figure compares today's 90 days with the 90 days one month earlier. Because adjacent windows overlap by two thirds, the series moves gradually and turns a month or so after the market does. A completed month is computed once and fixed three days after it closes, so published history does not move.
A change is published only when it can carry its claim. Its two windows must come from the same mix of sources (total-variation distance of at most 0.15, because a portal that stops answering moves both split halves alike and precision cannot see it), neither may hold under half the other's adverts, at least 4,000 adverts must stand behind it, and its split-half standard error must stay within 1.0 percentage point. A change that fails any of these is a dash. The level is still shown.
Not seasonally adjusted. The long public series we can check show weak seasonal swings: the Eurostat rent index for Slovakia since 2010 has no month that is reliably above average, and a September rise from new students renting is not visible in it; asking prices for flats since 2020 show a small autumn dip. Our own dense records begin in April 2026, which is too short to estimate a seasonal pattern, so none is removed. When two full years exist the adjustment will be tested, and shipped only if it improves the series.
| Part | Rule | Parameter |
|---|---|---|
| Window | Trailing days behind every level and every month | 90 |
| Cell value | Mean price per m2 inside the fence | 1.5 x interquartile range |
| Region | Cells combined by advert count | n per cell |
| National | Regions combined with fixed transaction shares | Published coefficients, 2019 revision |
| Houses | Price per m2 of the advertised area | Not a standard area |
| Step gate | Same sources in both windows, volume, floor, precision | 0.15, 0.5, 4,000, 1.0 pp |
| Own records from | Daily price points for every advert | April 2026; earlier months are borrowed and faint |
Bytero price method v1, frozen: parameters change only at a quarter boundary, with a changelog line. Rents use the same method; no authority publishes a rent level to check them against, so rent figures are marked unvalidated.
Markets without regional weights: monthly medians and the chained Laspeyres step
Where a market has no published regional weights, the level and the change are built as follows. The index is chain-linked month to month with the earlier month's weights, which is the Laspeyres convention: the basket is the one that existed before the change being measured. Levels are kept in real currency per square meter rather than rebased to 100, so a reader sees a price, not an abstraction. The computation per step is short.
- 01
Median per cell per month
For each cell, the median asking price per m2 over its offers in the month. The median, not the mean, so a single mispriced offer cannot move a cell.
- 02
Select the cells that chain
Only cells present in both the earlier month and the current month with at least five offers in each. A cell that appeared or vanished contributes nothing to the step.
- 03
Weight with the earlier month
Step ratio = Σ (n_prev × median_cur) / Σ (n_prev × median_prev) over the chaining cells, where n_prev is the earlier month's count in the cell. The current month's counts never enter the weights, so growth in one segment's stock cannot move the index.
- 04
Chain
Level_cur = Level_prev × ratio, walking forward from the first month that clears the floors. There is no fixed base period; every step compares adjacent months on the same basket, and the chain carries the basket forward.
- 05
Publish the level separately
Each month also gets an unchained level: the count-weighted mean of its own cell medians over cells with at least five offers, published when at least 400 offers stand behind it. This is what the market costs now and needs no chain.
The gate: split-half standard error
A chained step over a thin month produces a confident-looking number that is sampling noise. The gate measures every step before it is published. Offers are hashed into two halves by a deterministic hash of their identity and each half is chained independently; if the market moved, both halves see it, and if the step is noise, they disagree. Twelve fixed splits give the step's standard error, and a step whose error exceeds 1.0 percentage point is returned as null. The split is deterministic on purpose: a random split would re-roll nightly and make borderline steps flap in and out of a public page. The table shows the calibration against a wider, independent set of splits.
| Series | Engine standard error (pp) | Independent reference (pp) | Verdict |
|---|---|---|---|
| A dense sale series, every step | 0.10 to 0.27 | 0.12 to 0.35 | Published |
| A dense rent series, every step | 0.12 to 0.52 | 0.13 to 0.34 | Published |
| A thinner sale series, every step | 0.65 to 0.74 | 0.78 to 0.87 | Published |
| A sale step on a month with a change-log sample | 2.20 | 2.00 | Withheld |
| A sale step before the flat curve started | 2.34 | 1.40 | Withheld |
| Rent steps chained over two cells | 6.9 to 33 | 12 to 27 | Withheld |
Bytero Live stability probe, which re-runs the engine's own cells and splits and fails if a published step is one the wider evidence calls noise; current state, zero failures.
Three estimator choices, made by measurement
The gate's design was settled empirically rather than by preference, and each alternative failed in a specific way. An analytic, split-free error estimate was tried first and rejected: it conflates genuine divergence between segments with sampling error and disagreed with the split evidence by factors between 0.4 and 8. Averaging five splits was optimistic: on dense steps the mean matched the reference (0.16 against 0.15 pp), but on thin ones it read 0.31 against a reference 0.86 and twice published a step that the wider evidence called noise. Taking the worst split over-corrected and withheld an entire sale trend that the reference endorsed. The fix was more evidence, not a cleverer statistic: twelve splits, and the mean is steady.
The two floors are deliberately different because they guard different things. A level is a single weighted mean of one month's cells; a step is a ratio of two such quantities in different months and needs an order of magnitude more sample before that ratio is measurable, hence 4,000 offers against 400. The step floor also protects the error estimate itself: below a few thousand offers the split-half measurement is unreliable, and the two straggler steps the calibration caught, on 3,258 and 1,340 offers, were exactly there, with the engine reading the error just under the threshold and the wider evidence just over it. Levels are gated too, on their own floor: one rent month priced a market at 23.90 EUR/m2 next to a 13.80 neighbor, on 64 offers, and was withheld.
A level survives a broken chain; a trend does not. Where a step is withheld, the basket has to be re-anchored and the two sides are no longer comparable, so the trend line stops and the break is recorded. The re-anchored levels are deliberately not plotted as a line: in one market they ran 3,084, 3,265, 3,341 and 3,766 across four months whose steps had just been refused, and a reader would have taken that for a 17 percent rise nobody measured. Each month's own level is still shown as a figure.
The flat curve: why a change log is not a sample
The thing that makes a market publishable is not the method but the shape of its price history. If a price point is written only when a price changes, the history is a change log, and a median over it is a median of the movers, not of the market: a biased sample, not a thin one. If a price point is written for every advertised property in every period, whether or not the price moved, the history is a census and the monthly median means what it says. In one measurement over 30 days, a census market carried 12.58 price points per advertised property while three change-log markets carried 1.12, 1.01 and 1.02.
The remedy is the flat curve: a sweep that writes a price point for every property it confirms as still advertised, at an unchanged price, on a fixed cadence. Cadence is the cost control. A daily point in every market would be about 1.1 million rows and 120 MB of storage a day; a weekly point is a seventh of that, about 480 MB a month across three markets, and still gives the monthly index four observations per property. A market gains a publishable trend roughly two months after its flat curve starts, when it first has two consecutive months of representative sample to chain. The rule follows for any index built on advertised prices: unless the history holds a point per property per period, the index is measuring who repriced.
Back-extension, currency and provenance
Months before a market's own history, and months its sample cannot carry, come from published statistics rescaled to the index's own level, so the line stays in real money. Every month is flagged with its source, and the chart draws borrowed stretches faint.
| Flag | Source of the month | Method |
|---|---|---|
| own | The index's own records | As described above; a step between two own months keeps the gate's verdict |
| aggregate | Sale: the market's house price index (Eurostat prc_hpi_q, quarterly) or a national asking-price series where one exists; rent: the Eurostat HICP sub-index for actual rentals for housing (COICOP 04.1) | Quarterly levels interpolated log-linearly between quarter midpoints, then rescaled to the anchor month; interpolation invents no level, only the path between two published ones |
| projected | The aggregate's own trailing-12-month growth | Carries the aggregate across the seam to the anchor when the published series stops a quarter or two short |
| Currency | Offers quoted in a currency other than the market's own | Converted at a fixed rate per row, never a floating one, so no exchange-rate movement can enter the index; an earlier single-currency filter had dropped about 16,000 offers, 14 and 13 percent of two monthly samples |
Bytero Live methodology notes. One earlier bug is instructive: back-extension used to recompute month-over-month from levels and resurrected a +73.7 percent rent month off five cells that the gate had rejected; a step between own months now keeps the gate's answer.
Asking prices are not transaction prices
An index on advertised prices reads what sellers ask, never what buyers paid. Asking prices lead realized prices and do not equal them: the gap is a regional baseline that widens when mortgage rates rise and as an offer ages unsold, and it is not constant across a cycle. The official alternative is the transaction-based house price index that national statistical offices compile under the EU regulation and Eurostat republishes quarterly about a quarter and a week after the reference period, which is an index, not a level, and lags the market by a quarter or more, whereas asking prices lag by days. The two are complementary: the transaction index sets direction and revision discipline, the asking-price index gives a current level per square meter by region and layout. The price data-source guide sets out what each family can and cannot answer.
Three further metrics are withheld when a market cannot support them. Days on market is measured from first observation, so it cannot exceed the observation window and is withheld unless the window comfortably contains it. Offer flow needs both arrivals and departures; before a market's removal sweep runs, removals are always zero and a net figure describes coverage, not supply. And a bulk re-ingestion, a whole-catalog refresh that stamps hundreds of thousands of rows at once, is detected when a week's arrivals exceed 25 percent of the book, and both flow and days on market are withheld for that week.
Reading the index
- A null step is a statement. It means the month's sample could not carry a measurement to within 1.0 percentage point, not that prices were flat. The chart breaks rather than joining two different baskets.
- Level and trend are different products. A level says what the market costs this month on its own sample; a trend says how it moved on a fixed basket. A market can publish the first without the second.
- The headline is a within-market series. It blends apartments and houses in whatever proportion the market advertises, so it is not a ranking between markets; the caption states the mix and the by-type table is where a like-for-like comparison belongs.
- Faint stretches are borrowed. Months flagged aggregate or projected come from published statistics rescaled to the index level; the tooltip names the source.
- Per square meter, asking, mix-adjusted. Every figure is a price per square meter of advertised stock with composition held fixed; none is a transaction price, and none is a valuation of any one property.
- Recalibrate, never loosen. The thresholds are calibrated against an independent set of splits by a harness that fails on a bad publish; a change to any floor is re-run through it before it ships.
In practice
Bytero publishes an index built exactly this way as Bytero Live: standardized asking price per square meter by property type, region and layout, monthly, with every step gated on its split-half error, levels gated on their own floor, and every borrowed month flagged. The page for each market states its mix and its chain breaks; availability by market is on the coverage page.
Questions
Why per square meter and not total price?
Because total price mixes size with price. A month with more large flats advertised would show a rising median with no flat repriced. Price per square meter removes size within a cell, and cell weights remove composition between cells.
What is a chained Laspeyres index?
An index where each month is compared with the previous one on the previous month's basket, and the ratios are multiplied forward. Laspeyres means the earlier period supplies the weights; chained means the basket is refreshed every step rather than fixed at a base year.
Why is a step sometimes missing while the level is shown?
The two are gated separately. A level is one weighted mean and needs 400 offers; a step is a ratio of two medians in different months and needs 4,000 offers, ten cells and a split-half standard error of at most 1.0 percentage point. A thin month can price itself but cannot measure its own change.
Is the index seasonally adjusted?
No. The long public series that can be checked show weak seasonal swings in Slovak asking prices and rents, and our own dense records begin in April 2026, which is too short to estimate a seasonal pattern. A change between two months is therefore a raw change.
Why does the monthly change move gradually?
Each month's figure covers the 90 days ending with it, so two neighboring months share about two thirds of their adverts. That makes the series stable and comparable with a published quarter, at the price of turning a month or so after the market does.
Is this a house price index?
No. Official house price indices are transaction-based, quarterly and lagged. This is an asking-price index: current, monthly, per square meter, but a measure of what sellers ask. The two are complementary, and the gap between them is not constant.






