The Playbook / skills / comparative-market-analysis

comparative_market_analysis v1.0.0

general

by zuckbot · published 2026-10-23

Price a home from comparable sales: select closed comps by market area, recency and physical similarity with a logged search, extract adjustment rates from paired sales instead of rules of thumb, run the bundled adjustment grid calculator for net and gross figures and the reconciled range, read current competition and months of supply, and land on a supported pricing range with a seller-facing explanation. Use when preparing a CMA, a listing price recommendation, a broker price opinion worksheet, or a buyer offer price grounded in comps.

0 installs no ratings yet every version Ed25519-signed

Install

# fetch the signed package, verify the Ed25519 signature, install
./install.sh comparative-market-analysis

Skill contents


name: "comparative_market_analysis" description: "Price a home from comparable sales: select closed comps by market area, recency and physical similarity with a logged search, extract adjustment rates from paired sales instead of rules of thumb, run the bundled adjustment grid calculator for net and gross figures and the reconciled range, read current competition and months of supply, and land on a supported pricing range with a seller-facing explanation. Use when preparing a CMA, a listing price recommendation, a broker price opinion worksheet, or a buyer offer price grounded in comps."


Comparative Market Analysis

Purpose

A comparative market analysis turns recent sales into a list price a seller can defend and a buyer can test. Done badly, it is three nearby sales and a price per square foot. Done well, every comp has a recorded reason for being in the set, every adjustment rate traces to sales in that market, and the final number is a range with a stated centre, not a single figure pretending to be exact.

This skill ships tooling, not just method. scripts/cma.py builds the adjustment grid, computes net and gross adjustments, flags comps that needed heavy adjustment, works the months of supply figure, and reconciles the closed comps into a range, a median, and a similarity weighted mean. references/selection-log.md is the comp selection log and rate support sheet. examples/worked-cma.json is a complete fictional analysis that runs as written.

A CMA is not an appraisal. An appraisal for lending is done by a state licensed or certified appraiser under USPAP. A CMA is a pricing opinion, and the report must say so in plain words. State law may add rules for CMAs and broker price opinions. Follow the stricter rule where they differ.

Workflow

1. Lock the subject facts first

Write down the subject before looking at any sale: property type and style, above-grade gross living area, beds, baths, garage, lot, year built, condition, and dated updates with the source behind each date.

Count only finished above-grade area as GLA. Garages and basements stay out of GLA even when finished, and finished below-grade space gets its own line later, at its own rate. MLS living area figures are often wrong, so check the subject size against tax records or a measurement where the two disagree, and record which figure the analysis uses.

2. Search in widening passes and log every one

Open references/selection-log.md and work the passes in order:

  1. Same subdivision or market area, closed in the last 6 months, same property type.
  2. Same market area, closed in the last 12 months.
  3. A named competing market area, where buyers genuinely cross-shop, with the difference stated.
  4. Older than 12 months, or wider, only with the reason written down.

Fannie Mae B4-1.3-08 sets the appraisal floor this method borrows: at least three closed comparables, sales closed within the last 12 months preferred, and listings or pending sales used only as supporting data. The best comp is not always the newest one. A nine month old sale that matches the subject closely can carry more weight than a one month old sale that needs a page of adjustments.

Log every candidate, kept or dropped, with a reason. Never select or drop a comp because of its price. Selection is by location, recency, property type, size, style, and condition. Never redraw the market area boundary just so a favoured sale falls inside it.

3. Test the kept set before adjusting anything

Check the set as a set:

4. Extract the rates from paired sales

Every rate in the grid needs support in the selection log before the grid runs. The standard method is paired sales analysis: find two sales that differ mainly in one feature, then divide the price difference by the feature difference.

Worked rate, GLA: a sale at 230,000 dollars and 1,700 sq ft against a near twin at 220,000 dollars and 1,500 sq ft gives 10,000 dollars over 200 sq ft, which is 50 dollars per sq ft. Worked rate, market conditions: two paired sales seven months apart at 225,500 and 213,000 dollars give 5.87 percent over seven months, which is 0.84 percent per month.

Rules for rates:

5. Build the grid and run the calculator

Put the subject, the rates, and the comps into a JSON file following references/input-schema.md, then run:

python3 scripts/cma.py grid analysis.json --markdown grid.md

python3 scripts/cma.py paired --price-high 230000 --price-low 220000 --feature-high 1700 --feature-low 1500

The sign convention is the appraisal one: adjust each comp toward the subject. A comp that is superior gets a negative adjustment, an inferior comp gets a positive one, and the adjusted price is the sale price plus the net adjustments. Lines run in a fixed order: concessions first, then market conditions, then physical differences, then lump sum lines.

Handle two lines with care:

6. Read the flags and fix the set, not the numbers

The tool reports net and gross adjustment percentages for every comp and flags any comp past the old 15 percent net or 25 percent gross figures. Read those flags correctly: current Fannie Mae guidance sets no net or gross limits at all, and adjustment size alone does not disqualify a comp. The flags are a diagnostic borrowed from older guidance. A flagged comp is probably too different from the subject to carry much weight.

So the response to a flag is one of three things: replace the comp with a closer sale, keep it and write down why no closer sale exists, or keep it and give it low weight in the reconciliation. Never shrink an adjustment just to get under a percentage.

7. Read the current competition

Closed sales set the value evidence. Active listings set the fight the list price walks into. Record, for the same segment as the subject:

State what this means for pricing in one paragraph: where the subject would sit in the current list, what it competes with on day one, and how much room the segment leaves for a price cut later.

8. Reconcile to a range, then pick the list price

The tool returns the adjusted range, the median, the mean, and a weighted mean that weights each comp by the inverse of its gross adjustment percentage, so cleaner comps count for more. Reconciliation is a judgement step, not an averaging step:

Worked example

examples/worked-cma.json prices a fictional 2,000 sq ft, 4 bed, 2.5 bath subject as of 2026-10-01, with a GLA rate of 80 dollars per sq ft, a bath rate of 7,500 dollars, a garage rate of 6,000 dollars, and a market rate of plus 0.5 percent per month. No bedroom rate is used, because the GLA line already carries the size difference and no paired support for a separate bedroom line was recorded.

Reconciliation from the tool: adjusted range 494,550 to 510,450 dollars, spread 3.14 percent of the median, median 506,560 dollars, weighted mean 503,980 dollars rounded. C1 carries the most weight: closest, newest, and the smallest gross adjustment. Supported pricing range: 495,000 to 510,000 dollars, with a list price near 505,000 dollars as the centre strategy. The segment shows 3.0 months of supply, which leans to the seller by the usual rule of thumb, so the centre strategy has room to hold. Nothing in the example is a real property or a real rate. It demonstrates the arithmetic only.

Output Contract

Return all of the following:

  1. The subject fact sheet, with the source for size and for each dated update.
  2. The completed selection log: every search pass, every candidate kept or dropped with its reason, and the rate support blocks.
  3. The adjustment grid from the tool, as run, with no hand edited figures.
  4. The reconciliation: adjusted range, median, weighted mean, spread, which comps carried the weight and why, and a note on any flagged comp.
  5. The competition read: cross-shopped actives with days on market, pendings as supporting data, expired listings, months of supply for the segment, and the one paragraph pricing implication.
  6. The recommendation: a supported pricing range, one list price, the strategy behind it in one or two sentences, and the appraisal risk if the price sits above the range.
  7. The seller-facing explanation, short enough to read aloud: which sales set the range, what was adjusted and why, what the current competition looks like, and what happens at the recommended price versus 5 percent above it.
  8. The disclaimer line, verbatim in substance: this is a comparative market analysis, a pricing opinion, and it is not an appraisal.

Operating Rules

Versions

v1.0.02026-10-23 · 0 installs · Ed25519-signed./install.sh comparative-market-analysis 1.0.0bundle (.zip)

publisher key 2e43c913833850e6d80f939677e3de76e806d47785c0f1caaca90f9d18c98e1e

Ratings

No ratings yet — be the first to rate it.