Log In

How we handle appreciation when data is incomplete?

Real-world data is messy. Properties don’t sell every year, and we often only see a few key dates (like purchase and sale).

Our appreciation logic is designed to use only real transaction data without guessing or filling in missing years.

We do this in two layers:

  • Individual property appreciation

  • Zipcode-level appreciation

1. Individual property appreciation

For each property, we only use the prices and dates we actually have (purchase, sale, or any intermediate recorded value).

  • We look at changes between each pair of real data points in time, in order.

  • If several years are missing in between, we treat it as one longer period (for example, 5 years between purchase and sale).

  • The time_diff_years value simply tells us how many years passed between those two real data points (this can be more than 1 year).

  • We never guess prices for missing years and never interpolate.

From that, we calculate an annualized appreciation rate (a “per year” growth rate) over the actual time between the known prices.

2. Zipcode-level appreciation

When we zoom out to the zipcode level, we want to know:

“How were properties in this area generally performing around a given year?”

To do that:

  • Each property has a span: from its first known date to its last known date (for example, from purchase in 2010 to sale in 2015).

  • That property is considered “active” for every year it spans (2010, 2011, 2012, 2013, 2014, 2015 in this example).

  • For each year, we only include properties that were active during that year.

  • Each property contributes its annualized appreciation rate (which already accounts for its exact holding period).

  • For that year, we then compute median and/or average appreciation based on all active properties.

This means each year’s zipcode number reflects the performance of properties that covered that year, not necessarily properties that sold exactly in that year.

Simple example

Property A

  • 2010: Bought for $100,000

  • 2015: Sold for $150,000

What we calculate:

  • Total gain: $50,000 (50% increase)

  • Time period: 5 years

  • Annualized appreciation: ≈ 8.45% per year

We don’t try to fill in what happened in 2011, 2012, 2013, or 2014.

We simply say: over 5 years, this property grew about 8.45% per year.

For zipcode analysis, Property A’s 8.45% is counted for each year from 2010 through 2015.

Now add Property B:

  • Suppose Property B, based on its own transactions, has an annualized appreciation of 10% per year and is active in 2012 and 2014.

For year 2012:

  • Property A contributes 8.45%

  • Property B contributes 10%

The zipcode’s appreciation for 2012 would be roughly the average of those two (≈ 9.23%), or the median if we use median.

Key takeaway

  • We only use real transaction prices and dates.

  • We do not estimate missing years or invent values.

  • We measure true growth over the actual holding period and then assign that performance to every year the property was active.

  • Zipcode appreciation by year represents how properties that spanned that year performed on average, not a strict year-to-year comparison of the exact same set of properties.