Archetype-Based Population Synthesis
Generating thousands of individually unique synthetic agents from a handful of named archetypes, while keeping the aggregate population's statistics faithful to a target distribution. Verified across two different domains, sharing one underlying pattern.
The pattern, in plain terms
Define a small number of archetypes (four poker player types; six market regimes). Give each archetype a center point and a spread for the traits that matter. Sample individuals from those distributions, with noise so no two are identical, and — where the archetype's parameters call for it — real correlation between traits, not independent noise on each one. The result: a population where every individual is genuinely unique, but the aggregate breakdown matches whatever mix you configured.
Verified by direct execution — 10,000 real agents, not a described result
Generated a 10,000-agent poker player pool with a configured 50/35/12/3% split across Fish/Reg/Shark/GTO:
Fish: target 50%, actual 50.1% (5007 agents) Reg: target 35%, actual 34.5% (3447 agents) Shark: target 12%, actual 12.3% (1230 agents) GTO: target 3%, actual 3.2% (316 agents) Fish VPIP uniqueness: 4991 distinct values across 4991 Fish agents — zero duplicates
The aggregate proportions land within a point of target at 10,000 agents, and every individual's specific behavioral parameters are genuinely unique — not the same handful of templates repeated. Confirmed directly, not assumed from the code.
The same pattern, a second domain
The market-regime version uses the identical structure — six regimes (Immature through Trapped) instead of four poker archetypes, nine market-signal vectors instead of behavioral stats. Generated 500 synthetic markets and measured the within-regime correlation the code claims to inject:
Mature regime (correlation_scale=0.85, correlation-injection triggers above 0.5): Real measured V1-V2 correlation within the regime: 0.564
The correlation is genuinely present in the generated data, not just asserted in a docstring — measured directly on the output, not read off the generating code.
Set your own distribution and generate a real population yourself, in your browser →
Update — correlation bug fixed in the library itself
The interactive version of this page found that the real poker generator drew VPIP, PFR, and aggression as fully independent uniforms — no correlation at all, which didn't match the actual goal of preserving realistic variable correlation. That fix has now been applied to the actual library source, not just the browser demo — verified directly against the fixed file: VPIP-PFR r=−0.837 on the Reg archetype at 20,000-agent scale, ranges still correctly respected.
The honest caveat that applies to both
Every archetype's specific numbers — a Fish's exact VPIP range, a Mature market's exact volatility — are hardcoded constants in the generator, not values fit from historical data. There's no data-loading step, no fitting procedure, anywhere in either file. That's a legitimate way to build and test a generator, but it means any downstream performance number computed on this synthetic population reflects how well a detection method finds patterns the generator was built to contain — not necessarily how it would perform on real, unstructured data. Worth stating plainly rather than letting "realistic populations" imply "calibrated to real history," which hasn't been established for either version.
Comments