Wiki Labs AI

Methodology

Everything on this site is computed from public property listings. This page says exactly how, and where the method is weak. If a figure here cannot be derived from what follows, it does not get published.

Last reviewed: 2026-08-26.


1. What the numbers are, and are not

These are asking prices, not transaction prices. Every rent and every sale figure is what someone advertised, not what was signed. Malaysian transactions typically close 5 to 15% below asking. We do not have access to transaction data, and we do not pretend otherwise.

Nothing below ten samples is shown. Where a figure would rest on fewer than ten listings, the site prints "insufficient sample" and the sample count instead of a number. A precise-looking figure built on three listings is worse than no figure at all.

Every number carries its sample size and its collection date. If you see a figure without n= and a date beside it, that is a bug. Please report it.


2. Where the listings come from

Two portals, because one is not enough.

Portal What it is What it skews to
Mudah.my Mass-market classifieds Older, smaller, cheaper stock
PropertyGuru.com.my Agent-driven portal Newer, larger, dearer stock

Measured on Bukit Mertajam in August 2026, the same zone read RM1,525 for a median 3-bedroom rent on Mudah and RM1,900 on PropertyGuru, with a median unit 45% larger on PropertyGuru. Neither portal describes the market on its own. The gap between them is a real fact about a zone, so it is published per zone rather than averaged away.

Sampling

Mudah is queried per subarea and paginated. Pages are sampled evenly across the whole reachable result set, not taken from the front.

That detail matters more than it sounds. Mudah sorts newest first. Taking the first N pages made "days on market" measure our own sampling depth instead of the market: Johor Bahru, with 17,000 listings, reported a 4-day median because the newest 600 listings spanned four days, while KLCC, with 1,058 listings we fetched in full, reported 36 days. The difference was our page budget, not the two markets. Spreading the sample fixed it, and de-biased the rent and price medians at the same time.

Mudah stops serving results past roughly 8,000 per query no matter what its own result count claims. PropertyGuru stops past about page 18. Both ceilings are respected, and where a zone's advertised inventory exceeds what can be reached, the zone page says so.

Merging

Listings from the two portals are pooled, but not pooled evenly. If we fetched 600 from each, the merged median would sit halfway between two segments regardless of how much of the real market each portal holds, so the figure would track our page budget rather than the market.

Instead each listing is weighted by how much of its own portal's advertised inventory it stands for:

weight(listing) = portal inventory for this zone / listings sampled from that portal

A Mudah listing drawn from 5,635 advertised units by a sample of 179 speaks for 31 units. A PropertyGuru listing drawn from 1,240 by a sample of 148 speaks for 8. The published figure is the weighted median.

Rent and sale are weighted separately, because the portals hold different shares of each market. One blended weight would under-weight a portal on rent and over-weight it on sale at the same time.

Sample size is still reported as the number of real listings seen, never the sum of the weights. The ten-sample rule is about how much we actually looked at, and no amount of weighting turns three listings into evidence.


3. What gets thrown away

Property type

Only strata residential is kept: condominium, apartment, flat, service residence, studio, duplex, penthouse, SoHo, SoFo, SoVo, townhouse.

Rooms, shop lots, warehouses, office space, semi-detached houses, terraced houses, bungalows and land are removed before any figure is computed.

This is not a small filter. In Bukit Mertajam, 1,277 unique rental listings reduced to 294 strata residential: 21% were warehouses or factories, 16% shop lots, 18% terraced houses, 8% single rooms. The mainland Penang market on Mudah is mostly not apartments. Every zone page publishes how many listings its filter removed.

The allow-list is deliberately an allow-list. A property category we have not seen before is excluded until a human looks at it, because admitting an unknown category silently corrupts every median on the page.

Obviously wrong prices

Rents outside RM200 to RM50,000 a month and sale prices outside RM50,000 to RM20,000,000 are treated as data entry errors, not as deals.

Reposts

Within one portal, the same building plus the same bedroom count plus the same asking price plus the same floor area, all within 3%, is treated as one unit advertised repeatedly.

This rule is a judgement call, not a fact, and the site says so on every zone page. Several agents commonly market one unit on an open listing, and several genuinely different units in one block commonly share a round asking price. On a listing page those two situations look identical. Collapsing them moved the headline median by between -9% and +6% across the Penang zones, direction unpredictable, so each zone publishes what the median would have been without the rule. Treat that gap as the uncertainty band.

Listings with no building identity are never merged this way. Roughly half of Mudah listings carry no building id, and without one there is no evidence two rows are the same unit. A wrong merge deletes real data; a missed merge only leaves a duplicate.

Across portals

The same unit advertised on both portals is counted once. Matching requires the same normalised project name, the same bedroom count, and price and size both within 3%. The Mudah copy survives, because it carries a building id and PropertyGuru does not. The number of cross-portal duplicates found is published per zone.

Block outliers

Within a block of five or more listings, anything above three times or below one third of that block's median price is dropped. Blocks with fewer than five listings are left alone: there is no statistical basis to reject anything.


4. Cash flow

Every formula below is applied exactly as written. Defaults are shown; all of them are adjustable.

Loan

Standard amortising payment:

monthly installment = P * r / (1 - (1 + r)^-n)
    P = price * loan margin        default margin 90%
    r = annual rate / 12           default 4.3%
    n = tenure in months           default 35 years

Annual operating costs

maintenance      = maintenance fee psf * size * 12      default RM0.33 psf
assessment       (cukai pintu)                          default RM600
quit rent        (cukai tanah, strata share)            default RM120
insurance                                               default RM200
agent fee        = monthly rent * 1                     one month per year
vacancy          = monthly rent * 1                     one month per year
repairs reserve  = annual rent * 5%

Yields and cash flow

gross yield  = annual rent / price
net yield    = (annual rent - operating costs) / price
monthly net cash flow = (annual rent - operating costs) / 12 - monthly installment

Cash needed upfront

downpayment      = price * (1 - loan margin)
SPA legal        = price * 1%
MOT stamp duty   = 1% first RM100k, 2% next RM400k, 3% next RM500k, 4% above RM1m
loan stamp duty  = loan * 0.5%
loan legal       = loan * 0.5%
renovation and furnishing                               default RM20,000

cash on cash = annual net cash flow / cash needed upfront. It is negative whenever the deal is, and the site shows that.

The complete ledger: true monthly cost

Cash flow alone is half the story, and publishing only that half made the entire asset class look irrational. Part of every installment is principal: equity the tenant's rent is repaying for the owner.

year-1 monthly principal = average principal portion of the first
                           twelve installments
true monthly cost        = monthly net cash flow + year-1 monthly principal
installment coverage     = monthly rent / monthly installment

Both halves are shown together everywhere. The equity half is real but locked: it is realised only on sale or refinance, and it assumes the value holds. The cash half is what leaves the bank account now. Neither is the whole truth alone, and the site says so beside every calculator.

The model is before income tax. Malaysian rental income is taxable at your marginal rate, so any positive figure shown is better than reality.

Break-even vacancy

How many months a year the unit can sit empty before annual cash flow reaches zero. When a deal loses money even at zero vacancy, the site says "never breaks even" rather than printing a number. Printing 0.0 months would read as "breaks even at full occupancy", which is the opposite of the truth.

A finding worth stating plainly

At the default 90% margin, 4.3% over 35 years, a Malaysian strata unit needs a gross yield of roughly 9% before monthly cash flow turns positive. Very little clears that bar. The realistic lever is a larger deposit, not a better area. Most zones on this site show negative monthly cash flow, and that is the honest answer rather than a fault in the data.


5. Tenant Demand Score

Measured from what the rental market does, not from counting nearby buildings. Two components.

Absorption, weight 0.55

Median days on market for active rental listings. Faster letting means stronger demand.

10 days or fewer  -> 100
60 days or more   -> 0
linear in between

Known limitation. Days on market is measured from the original posting date, and Mudah expires listings at about 60 days. Across 1,680 real listings the observed maximum was 61 days in six of seven zones measured. A very slow market and a moderately slow one therefore look the same here. Treat this component as a floor on how quickly tenants are found, not as an exact figure.

Rent strength, weight 0.45

Gross rental yield: median rent psf * 12 / median sale psf * 100. A high figure means tenants pay well relative to what the asset costs.

3% or below  -> 0
7% or above  -> 100
linear in between

Computed only when both the rent psf and the sale psf clear the ten-sample threshold. A ratio built on a thin sample is not a rate, it is noise dressed up as a percentage.

When the two disagree

If the components differ by 30 points or more, the site says so instead of letting the average hide it. A zone can have excellent rent and slow letting, or fast letting and poor rent. Those are different problems and the average conceals both.

Why it is not built from points of interest

An earlier version scored zones by counting nearby industry, offices, campuses, hospitals, shops and stations. It was abandoned because it did not work, and the failure is worth recording:

Points of interest are still collected and published on each zone page as area context. They explain a zone. They do not score it.


6. Tenant persona

A label for who actually rents in a zone, assigned in this fixed order, first match wins:

  1. Rent psf at or above RM3.00 → expat / high income
  2. More industrial sites than offices nearby, and rent psf at or below RM1.60 → factory worker
  3. At least two campuses or international schools nearby, rent psf at or below RM2.20, and median unit at or below 950 sqft → student
  4. Otherwise → mixed

The order matters. The factory test runs before the student test because university and college tags appear within 5km of almost anywhere in Malaysia, which is exactly what broke the earlier version: it labelled five of seven zones "student", including the KL expat enclave.

"Mixed" is a real answer, not a failure. Where the evidence does not support a single dominant tenant type, the site says mixed rather than guessing.


7. Points of interest

Collected from OpenStreetMap via the Overpass API. Free, no key.

Three limitations, all visible on the zone pages:

  1. One point, not an average. A zone spanning several towns is measured from a single named location, which is printed on the page. Move that point a kilometre and the transit figure can change materially.
  2. Transit is not always rail. Mainland Penang is on the KTM Komuter line, so a high figure there is genuine rail access. Penang island has no rail at all, so the same figure would mean a bus or ferry terminal.
  3. OpenStreetMap coverage is uneven. Malaysian malls are frequently not tagged as malls: several zones show zero malls within 2km despite having large ones. Raw counts are printed beside every figure so this is visible rather than hidden.

When the Overpass query fails, the zone still publishes its full listing metrics and its demand score, and says the area context was not measured. The demand score does not depend on points of interest.


8. The map

Block positions come from OpenStreetMap: one bulk query per zone pulls every named residential building nearby, and our block names are matched against them locally. Matching is conservative on purpose. A name matches only when its normalised form is identical, or when one name's words are wholly contained in the other's with at least one distinctive word; anything ambiguous is dropped, because a dot on the wrong rooftop is worse than no dot. Roughly seven in ten qualifying blocks locate this way; the rest simply do not appear yet.

On the map, a block-level figure (asking psf, rent psf) is coloured only when it clears the ten-sample rule, and grey dots say so. Yield and tenant demand are zone measures painted onto a zone's dots for geography's sake, and the legend says "measured per zone" whenever they are shown.


9. Supply pressure

A block is flagged as oversupplied when 5% or more of its units are on the rental market at once.

This requires a verified total unit count for the block, which we do not yet have for most blocks. Where it is missing, the block is marked "supply not assessed" rather than left blank, because a blank flags column reads as a clean bill of health.


10. Coverage

Zones cover the areas where projects are actively marketed. That is a coverage decision, not an editorial one. Every zone's numbers are computed identically regardless of what is being sold there, and a zone is allowed to look bad. Several currently do.


11. What would change these numbers

Honest list of what we would fix given better data:


Independent data site. Not a developer, not an agency listing page, not investment advice. Figures are asking prices from public listings and may be wrong. Verify anything you are about to act on.