How List.my calculates a valuation estimate
The full pipeline behind the free valuation tool, step by step, with the actual formulas and thresholds.
No black box
This guide sets out exactly how the free valuation tool turns recorded transactions into an estimated market value. It covers every step, the formulas, and the thresholds we actually use.
The estimate is a starting reference, not a formal valuation. Nobody inspects the property, and the figure carries none of the condition and renovation detail a valuer records on site. For anything binding ā a sale, a refinance, a legal filing ā you need a licensed valuer.
Step 1: Pull comparable transactions
We query JPPH subsale records that match your selection:
- Exact match on state, district, mukim and area. A township or postcode search resolves to a list of areas instead.
- Exact match on property type. "Condo" maps to Condominium and Apartment; "terrace" covers single, one-and-a-half, double and two-and-a-half storey terrace houses, including low-cost.
- Transactions from the last 3 years only.
- Progressive size tolerance. We try within 30% of your built-up area first, widen to 50%, then drop the size filter ā whichever first yields at least 3 comparables.
- Capped at the 50 most recent transactions. Three is the minimum; one or two puts the tool into rough-estimate mode.
Step 2: Strip the outliers
Developer bulk transfers and anomalous sales get removed in two phases.
Batch cap. Where the same date and area carry more than 5 transactions, we keep only the 5 highest-priced. Bulk sale and purchase agreements from developers often cluster on one date in one area, and they drag the median down.
Interquartile range filter on psf. We work out price per square foot for each transaction, sort them, then:
Q1 = 25th percentile
Q3 = 75th percentile
IQR = Q3 ā Q1
keep if Q1 ā 1.5 Ć IQR ⤠psf ⤠Q3 + 1.5 Ć IQR
You can switch this off by adding ?outliers=0 to a valuation URL.
Step 3: Weight each sale by how recent it is
Newer sales tell you more about today's market, so each comparable gets an exponential decay weight:
weight = e^(ā0.05 Ć age_months)
| Age | 1 month | 6 months | 12 months | 24 months | 36 months |
|---|---|---|---|---|---|
| Weight | 0.95 | 0.74 | 0.55 | 0.30 | 0.17 |
Add ?recency=0 to a valuation URL for a plain unweighted median instead.
Step 4: Take the weighted median psf
We use the median, never the average ā a single luxury sale wrecks an average. The weighted median sorts the psf values by size, walks the cumulative weight, and picks the value where that cumulative weight crosses half the total.
psf(i) = price(i) Ć· effective_area_sqft(i)
weighted_median_psf = psf(k) where Σ weight(1..k) ℠½ Σ weight(all)
Step 5: Multiply by your built-up area
base_price = weighted_median_psf Ć your_size_sqft
Why work from psf? Location and property type are already fixed by the comparable filter in step 1, so scaling by psf adjusts for your specific unit without counting either factor twice.
Step 6: Apply four adjustments
These are applied multiplicatively.
a. Tenure. Freehold commands roughly a 10% premium over leasehold. Some of that premium already sits inside the comparables, so we apply only the gap:
freehold_ratio = freehold_comps Ć· total_comps
user_premium = 0.10 if freehold, else 0
implicit_premium = freehold_ratio Ć 0.10
tenure_mult = 1 + (user_premium ā implicit_premium)
b. Floor level (high-rise only). We split the comparables that carry floor data into a lower and an upper half, measure the psf gap between them, and extrapolate to your floor against the median floor. Capped at 2% per floor either way. Where fewer than 10 comparables carry floor data, we fall back to 0.5% per floor above or below the median.
premium_per_floor = (upper_psf Ć· lower_psf ā 1) Ć· floor_span
floor_mult = 1 + (your_floor ā median_floor) Ć premium_per_floor
c. Market sentiment, capped at 15%. We compare the average price of the 10 most recent comparables against the 10 older ones behind them.
momentum = (recent10_avg ā older10_avg) Ć· older10_avg
sentiment = clamp(0.5 + momentum, 0.1, 0.9)
sentiment_adj = (sentiment ā 0.5) Ć 0.15 Ć price
d. Market trend, capped at 10%. An ordinary least squares regression on price against the ordinal index of the comparables, normalised to the average price.
slope = (nĪ£xy ā Ī£xĪ£y) Ć· (nĪ£x² ā (Ī£x)²)
trend = slope Ć· avg_price
trend_adj = trend Ć 0.10 Ć price
Putting it together:
estimate = base_price Ć tenure_mult Ć floor_mult + sentiment_adj + trend_adj
Step 7: Build the range
We use 15% of the standard deviation of the comparable prices as a one-sigma proxy:
Ļ = stdev(comparable_prices)
margin = 0.15 Ć Ļ
low = max(0, estimate ā margin)
high = estimate + margin
Step 8: Score the confidence
Confidence starts at 0.5, then moves on four signals:
| Signal | Contribution |
|---|---|
| Comparable count | + min(0.4, count Ć· 50 Ć 0.4) |
| Share under 6 months old | + (recent Ć· total) Ć 0.2 |
| Price consistency (low variation) | + max(0, 0.2 ā Ļ Ć· μ) |
| Sane location premium (0.5 to 2.0Ć) | + 0.1 |
confidence = clamp(sum, 0.10, 0.95)
The labels you see on the result: 0.8 and above is High, 0.6 and above is Medium, 0.4 and above is Moderate, and below 0.4 is Low.
What the estimate does not know
We do not account for the condition of the unit or its renovation, the view, the specific tower or stack in a condominium, the shape or frontage of an individual lot, or any market shock after the JPPH data was published.
The effective_area_sqft value in our dataset is JPPH's best-available area figure ā built-up area for most stratified properties, land area for landed. See how List.my chooses which size to use.
For anything binding ā a sale, a refinance, a legal filing ā use a licensed valuer.
Related reading
Common questions
How does List.my work out a property valuation?
We pull recorded JPPH subsale transactions that match your location, property type and size, strip outliers, weight the remainder so newer sales count more, then take the weighted median price per square foot and multiply it by your built-up area. Four adjustments follow ā tenure, floor level, market sentiment and market trend ā before we build a range and score the confidence.
Why does List.my use the median instead of the average?
A single luxury sale can drag an average well away from what a typical home in the area transacts at. The median sits in the middle of the sales and is far harder to distort. See why we use the median, not the average.
Why are some transactions excluded from the estimate?
Developer bulk transfers and anomalous sales would otherwise skew the figure. We cap same-day clusters in one area at the five highest-priced records, then apply an interquartile range filter on price per square foot to remove the remaining statistical outliers.
How accurate is the List.my valuation estimate?
It depends on how many similar homes have sold nearby and how consistent those prices are, which is what the confidence score reports. Treat the figure as a data-based starting reference. For a sale, a loan or a legal filing you still need a licensed valuer.
Help improve this guide
Spot a mistake or have a clearer example? Send us a correction or start a community discussion so the guide can improve over time.