A personal Bay Area housing market tracker for Steve. Aggregates monthly market data from Redfin's public Data Center across 14 target cities, then layers on quant-trading-style indicators (Bollinger, RSI, MACD) and a heuristic Opportunity Score to surface buyer-friendly windows.
It is not per-listing data — see scanner for the planned per-listing reminder bot (v0 stub today).
city_market_tracker.tsv000.gz from redfin-public-data.s3.us-west-2.amazonaws.comscripts/build_data.py when Redfin publishes new monthRaw filtered dataset committed to repo at data/redfin_market_tracker_cities.tsv.
San Mateo · Redwood City · San Jose · Mountain View · Sunnyvale · Cupertino · Palo Alto · Santa Clara · Foster City · San Carlos · Belmont · Burlingame · Millbrae · Los Altos.
San Jose is city-wide for now (Redfin's bulk file doesn't ship South San Jose neighborhood polygons — for South San Jose specifically we'd need ZIP-level: 95111, 95116, 95118, 95119, 95120, 95121, 95122, 95123, 95124, 95136, 95138, 95139, 95148. Easy follow-up.)
| Median sale | Median closed sale price across homes sold that month. |
| Median list | Median asking price of homes listed. |
| PPSF | Price per square foot ($/sqft). Normalizes price across home sizes. |
| DOM | Days On Market. Median number of days a home was listed before going pending. Low DOM = hot market; high DOM = inventory piling up. |
| Inventory | Active listings at month-end. |
| New listings | Listings that went live this month. |
| YoY / MoM | Year-over-year / month-over-month percent change. |
| Sale-to-list | Ratio of sale price to original list. >1.0 means buyers are paying over asking. |
| % > List | Percent of homes that sold above their list price (bidding-war indicator). |
| Off-market in 2 weeks | Percent of new listings that went pending within 14 days (urgency indicator). |
| SMA(n) | Simple Moving Average over n months. The trend. |
| EMA(n) | Exponential Moving Average. Like SMA but weighs recent months more heavily — reacts faster. |
| Bollinger Bands(20, 2σ) | Mid = SMA(20). Upper/lower = mid ± 2 standard deviations of the last 20 months. Tagging upper band = price is 2σ above recent average ("hot"). Lower band = "cool" or oversold. |
| RSI(14) | Relative Strength Index. Compares average gains to average losses over 14 months. >70 = overbought, <30 = oversold. |
| MACD(12,26,9) | EMA(12) − EMA(26) and its 9-month signal line. Histogram crossing zero from below = uptrend momentum kicking in. Crossing from above = downtrend. |
Caveat: these indicators were designed for daily equity prices. Applied to monthly housing medians, they're directional — useful for "hot vs cool" intuition, not for timing exact entries.
Heuristic. Higher = more buyer-friendly. Composed of:
score = 50 + min(20, PRICE_DROPS × 100) // share of homes with price cuts + clip(-10, INVENTORY_YOY × 30, 15) // inventory expanding = good for buyer + clip(-15, -MEDIAN_SALE_YOY × 100, 15) // negative YoY = cheaper - SOLD_ABOVE_LIST × 20 // bidding wars = bad - OFF_MARKET_IN_TWO_WEEKS × 15 // urgency = bad - max(0, (SALE_TO_LIST − 1.0) × 200) // paying premium = bad
Not financial advice. Calibration based on intuitive priors, not rigorous backtest. Useful for spotting regime shifts; not for timing.
data/market.json (~2.5 MB)