Synthetic data
Generators
A generator in Equilibrium Labs is fully specified by three things: a calibration target (the real-world moments it is fit to reproduce), a sampling procedure (the model that produces synthetic records), and a seed (the source of randomness). Given the same three inputs and the same generator version, output is deterministic — down to row order.
The household panel generator
household_panel is the flagship generator: it produces synthetic household-level economic panel data calibrated to EU-SILC moments — income deciles, household size distribution, employment status shares, and regional composition. It’s calibrated against eu-silc-2023-v2 and generates a panel at whatever sample size you request.
from equilibrium import synthetic
sample = synthetic.generate("household_panel", n=10_000, seed=20260801)
sample.shape
# (10000, 34)Each row is a synthetic household, not a resampled real one — no real respondent record is ever copied or perturbed into the output. The sampling procedure draws from a fitted joint distribution over the calibration target’s moments, so aggregate statistics track the target closely (see calibration targets for how fit is measured) while individual rows carry no correspondence to any real household.
Determinism from seeds
The seed argument controls every source of randomness in the sampling procedure. This matters for two reasons: reproducibility (a colleague running synthetic.generate("household_panel", n=10_000, seed=20260801) against the same generator version gets your exact sample) and auditability (a reviewer can regenerate a disputed sample from its recorded seed rather than trusting a static file). Every run also emits a provenance manifest that records the seed alongside the generator version, the calibration target version, and an environment lockfile hash — so “same inputs, same output” is checkable, not just claimed.
The same three-part contract extends to other generators as they ship — labour_market_flows and firm_registry are planned alongside household_panel, each to be calibrated to its own target and versioned independently.