A multi-agent system that takes an econometric estimate from real housing-market data and stress-tests how robust it is. The headline question:
What is the price–rent elasticity of home values across US metros?
The system estimates that elasticity, then re-runs it under a battery of perturbations to ask: does the coefficient survive fixed effects, sub-samples, outlier handling, and placebo tests — or was it an artifact of confounding?
data_agent ──EstimationRequest──▶ estimation_agent ──BaselineEstimate──▶ robustness_agent
(real Zillow (panel) (baseline OLS) (coef + panel) (battery + verdict)
panel)
| Agent | Role |
|---|---|
data_agent.py |
Fetches a real multi-metro panel from Zillow Research (ZHVI home values + ZORI rents), builds log(value) / log(rent) series, sends it on. (Recode of the old zillow_agent.py.) |
estimation_agent.py |
Runs the baseline spec: pooled OLS of log home value on log rent, with HC1 robust SEs. Forwards the point estimate. |
robustness_agent.py |
Runs the robustness battery and reports a verdict + score. (Recode of the old valuator_agent.py.) |
Supporting modules:
econ.py— pure-numpy OLS (classical + HC1 robust SEs), fixed-effects demeaning, and the robustness battery. No statsmodels dependency.panel.py— builds the Zillow panel across metros.models.py— shared uAgents message models.
For the coefficient of interest, the checker runs:
- Baseline — pooled OLS, robust SEs.
- Metro fixed effects — within-metro demeaning. The key omitted-variable-bias check: if the coefficient collapses or flips here, the baseline was confounded.
- Classical vs robust SEs — does inference change?
- Outlier trimming — drop 1st/99th percentile of rent.
- Time-window split — first half vs second half of the sample.
- Jackknife by metro — drop each metro once; report the spread.
- Permutation placebo — shuffle rent; a real effect should collapse toward zero (reports a permutation p-value).
It then produces a robustness score (0–100) that gates hard on the fixed-effects result, plus sign stability, significance consistency, coefficient spread, and the placebo. Score ≥ 75 → ROBUST, 50–74 → FRAGILE, < 50 → NOT ROBUST.
One-process demo (recommended — no address copy-pasting):
pip install -r requirements.txt
python bureau.pyOr run the three agents in separate terminals (data_agent.py,
estimation_agent.py, robustness_agent.py), pasting each printed address into
the upstream agent's *_ADDRESS constant.
Zillow Research public CSVs (no API key required), updated monthly:
- ZHVI — Zillow Home Value Index (typical home value, 35th–65th pct)
- ZORI — Zillow Observed Rent Index (typical asking rent)
- ZHVI is a typical value, not a median sale price.
- The price–rent elasticity here is an associational baseline; the project's contribution is the robustness machinery around it, which is what reveals whether such an estimate would survive scrutiny.
- A separate San Jose Housing Research Agent (deployed on Agentverse) serves live single-metro snapshots over the ASI:One chat protocol.