---
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:

- At least three closed comps, each verified for price, closing date, and terms against a second source where one exists.
- Bracketing: at least one comp larger and one smaller than the subject on GLA, and where the data allows, one priced above and one below. If the set cannot bracket a feature, write down why.
- Same property type throughout. A condo is not a comp for a detached house, however close it sits.
- Foreclosure and short sale comps are labelled, with a note on how common they are in the segment, their condition, and any stigma. Do not assume one equals the subject.
- Distance recorded as straight line miles from the subject. There is no fixed mileage cap. There is a question to answer for every distant comp: why is this sale, from over there, evidence about this street?

### 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:

- One pair is a lead, not a rate. Use a rate only when several pairs point the same way, and record the range they produced.
- A rate copied from another town, a cost book, or a rule of thumb is not support. Fannie Mae B4-1.3-09 makes the point directly: a 20 dollar per sq ft GLA rate is wrong when the market shows 100 dollars.
- Do not charge twice for the same space. If GLA carries the size difference, a separate bedroom line needs its own paired support, or it stays at zero.
- Condition and location are usually lump sums, not per unit rates. Support each one with named sales or with cost and depreciation reasoning stated plainly.

### 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:

- Concessions: adjust for the effect the concession had on that comp price, which is the difference between what it sold for with the concession and what it would have sold for without it. That is not automatically the cost of the concession, dollar for dollar, and a positive concession adjustment is never acceptable.
- Market conditions: apply the monthly rate from the contract date, or the closing date when the contract date is unknown, to the valuation date. Each comp gets its own figure. A single flat percentage across all comps hides the whole point of the line.

### 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:

- Active listings a buyer would cross-shop, with asking price and days on market. A listing sitting at 90 days in a segment that usually sells in 30 is a price buyers have already voted on.
- Pending sales and their days on market, as supporting data only. They have not closed, so they never enter the reconciled range.
- Expired and withdrawn listings from the last six months, with the last asking price. They mark the ceiling the market refused.
- Months of supply from the tool: active listings divided by sales per month. About five to six months is the commonly cited balanced band, less leans to the seller, more leans to the buyer. It is a rule of thumb for reading pressure, not a standard, and it must be computed for the subject segment, not the whole town.

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:

- Give the most weight to the comps with the smallest gross adjustments, the closest locations, and the most recent closings, in that order of importance.
- If the adjusted spread is wide, over about 10 percent of the median, say what drives it: a weak comp, a fast moving market, or a subject feature no sale shares. A wide spread reported honestly beats a tight one manufactured by dropping an inconvenient sale.
- Land on a supported range first, then a list price inside it with the strategy stated: price at the centre for a normal sale pace, toward the low end where supply is heavy or a fast sale matters, toward the high end only where supply is thin and the seller accepts a longer wait and a real chance of a later cut.
- Name the appraisal risk where the list price sits above the reconciled range. A financed buyer still needs the lender appraisal to support the contract price, and the CMA is not that document.

### 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.

- C1: sold 512,000 dollars one month ago, 2,100 sq ft. Market conditions plus 2,560, GLA minus 8,000. Net minus 5,440, gross 2.06 percent, adjusted price 506,560 dollars.
- C2: sold 485,000 dollars four months ago, 1,850 sq ft, 2 baths. Market conditions plus 9,700, GLA plus 12,000, baths plus 3,750. Net plus 25,450, gross 5.25 percent, adjusted price 510,450 dollars.
- C3: sold 530,000 dollars two months ago, 2,200 sq ft, 3 baths, 3 garage spaces, with 5,000 dollars of concession impact and superior condition. Market conditions plus 5,300, concessions minus 5,000, GLA minus 16,000, baths minus 3,750, garage minus 6,000, condition minus 10,000. Net minus 35,450, gross 8.69 percent, adjusted price 494,550 dollars.

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

- Never invent a sale, a price, a closing date, or a rate. A figure with no source gets cut or labelled as an assumption the reader can see.
- Never drop a close, recent, similar sale because its price points the wrong way. Log it, explain any real reason to exclude it, or include it.
- Never present a price per square foot shortcut as a CMA. Dividing one sale price by its size prices the land, the location, and the house as if they were all floor area.
- Never average the adjusted prices and call that the answer. Weight by similarity, and show the range.
- Never use an active listing or a pending sale as a closed comp, however tempting its price looks.
- Never state the old 15 percent and 25 percent adjustment figures as current Fannie Mae limits. Current guidance has no such caps. They are a warning flag only.
- Never let the seller target net, a neighbour claimed sale price, or a tax assessment set the range. Each can be context. None is comp evidence.
- Date the analysis. A CMA in a moving market goes stale, and the report should say the date after which the rates, especially the market conditions rate, need to be rebuilt.
- Keep the seller explanation free of appraisal language. Words like appraised value promise a document this is not.
