A sophisticated simulation framework for modeling how government policies affect economic outcomes, citizen wellbeing, and social dynamics in a society of 1000+ agents.
This simulator models a complete micro-economic society with realistic agents that have:
- Economic attributes: Income, savings, debt, employment status
- Behavioral traits: Stress, satisfaction, confidence, spending preferences
- Learning capabilities: Agents adapt behavior based on past experiences using reinforcement learning
- Social dynamics: Protests, migration, and dissatisfaction
The simulation tracks macroeconomic variables (inflation, unemployment, GDP, inequality) and allows users to adjust government policies in real-time to observe impacts.
-
Citizen.py - Individual agent model
Citizenclass with realistic attributes and decision-making logicCitizenMemoryclass for learning and experience tracking- Monthly updates including employment, income, spending, debt, and psychological state changes
-
EconomyModel.py - Macroeconomic dynamics
EconomicStatedataclass tracking economy-wide variablesEconomyModelclass managing inflation, unemployment, GDP, wealth distribution- Real relationships between consumption, money supply, employment, and inflation
-
PolicyEngine.py - Government policy management
PolicySetdataclass for all policy variablesPolicyEngineclass for dynamic policy adjustment- Pre-built scenario functions (crisis response, UBI, green energy, etc.)
-
SimulationEngine.py - Core simulation loop
SimulationEngineorchestrating the monthly timestep loop- Agent updates, social event processing, economy updates
SimulationAnalyzerfor post-simulation analysis
-
Learning.py - Agent learning and adaptation
ReinforcementLearnerimplementing Q-learning for agent behaviorUtilityFunctionusing economic utility theoryBehavioralLearningAgentcombining learning with utility maximization
-
Dashboard.py - Interactive Streamlit interface
- Real-time visualization of economic trends
- Policy adjustment sliders
- Charts for inflation, unemployment, GDP, social unrest
- Event logging (protests, migration)
- Data export functionality
-
Calibration.py - Parameter tuning and validation
RealWorldCalibrationwith historical economic dataSimulationCalibratorfor automatic parameter adjustmentParameterSensitivityAnalysisfor tornado and Monte Carlo analysis
-
Experimentation.py - Scenario testing framework
Experimentclass for individual simulationsExperimentSuitefor running multiple experimentsExperimentBuilderwith pre-built scenario suitesParameterVaryingExperimentfor grid search and sensitivity analysis
- Main.py - Command-line interface with 7 example scenarios
- Dashboard.py - Interactive web dashboard (requires Streamlit)
- 1000+ individual agents with realistic demographics and economics
- Dynamic employment status (employed, unemployed, retired, student)
- Behavioral feedback loops: Stress → spending → inflation → stress
- Learning from experience: Agents improve decisions over time
- Inflation modeling: Consumption-driven and cost-push inflation
- Employment dynamics: Job loss/finding based on economic conditions
- Wage dynamics: Inflation pass-through and labor market effects
- GDP calculation: Based on consumption, investment, and government spending
Dynamically adjust policies:
- Income tax rate (0-70%)
- Interest rate (0-15%)
- Fuel/energy tax (0-50%)
- Unemployment benefits (0-100%)
- Universal basic income (0-$2000/month)
- Welfare support (0-$500/month)
- Stress system: Affects spending, health, and protest probability
- Satisfaction tracking: Overall life quality metric
- Economic confidence: Affects savings and borrowing decisions
- Social unrest index: Aggregate measure combining unemployment, inequality, inflation
- Q-learning: Agents learn which actions improve their situation
- State discretization: Agents track (employment, wealth, stress) states
- Utility maximization: Economic preferences influence consumption/saving
- Habit formation: Consumption preferences adapt over time
Pre-built policy scenarios:
- Conservative Economy: Low taxes, minimal welfare
- Social Market Economy: Balanced tax and welfare
- Universal Basic Income: Strong UBI with higher taxes
- Green Energy Transition: High fuel taxes for renewable incentives
- Financial Crisis Response: Zero rates and enhanced benefits
- Austerity Program: High taxes, low spending
- Sensitivity analysis: Tornado diagrams showing parameter impacts
- Scenario comparison: Side-by-side policy outcome analysis
- Historical calibration: Match simulation to real-world data patterns
- Crisis simulation: Model pre/during/post crisis scenarios
- Inequality analysis: Deep dive into wealth distribution effects
# Clone or extract the project
cd "Policy Sand Box"
# Install dependencies
pip install numpy pandas streamlit plotlyOption 1: Command-line examples
python Main.pyChoose from 7 different example scenarios to run.
Option 2: Interactive Dashboard
streamlit run Dashboard.pyOpens a web interface for real-time policy adjustment and visualization.
from SimulationEngine import SimulationEngine
sim = SimulationEngine(population_size=1000)
results = sim.run_simulation(timesteps=120) # 10 yearssim = SimulationEngine(population_size=1000)
# Set policy
sim.policy_engine.set_policy("universal_basic_income", 1000)
sim.policy_engine.set_policy("income_tax_rate", 0.35)
# Run simulation
sim.run_simulation(timesteps=120)
# Check results
print(f"Unrest: {sim.economy.state.social_unrest_index:.2f}")
print(f"Unemployment: {sim.economy.state.unemployment_rate*100:.1f}%")from Experimentation import ExperimentBuilder
# Test different UBI levels
suite = ExperimentBuilder.create_policy_sensitivity_suite(
"universal_basic_income",
[0, 500, 1000, 1500, 2000]
)
suite.run_all(population=500, timesteps=60)
comparison = suite.compare_results()
print(comparison)sim = SimulationEngine(population_size=500)
# Normal economy
sim.policy_engine.set_policy("interest_rate", 0.05)
sim.run_simulation(timesteps=24)
# Crisis hits - policy response
sim.policy_engine.set_policy("interest_rate", 0.0)
sim.policy_engine.set_policy("unemployment_benefit_rate", 0.8)
sim.run_simulation(timesteps=12)
# Recovery
sim.policy_engine.set_policy("unemployment_benefit_rate", 0.6)
sim.run_simulation(timesteps=24)- Each timestep = 1 month
- 120 timesteps = 10 years
- Citizens age in real-time
-
Inflation: Driven by consumption relative to production
- Higher consumption → Higher inflation
- Inflation lags (inertia effect)
- Supply shocks (fuel prices) cause immediate inflation spikes
-
Unemployment: Determined by job loss/finding rates
- Employment decreases with high unemployment (discouraged workers)
- Job finding increases with economic growth
- Wage effects: High unemployment suppresses wage growth
-
Citizen Behavior: Based on psychological and economic factors
- High stress → Increased spending (coping behavior)
- High debt → Reduced consumption and increased stress
- Job loss → Immediate stress increase, confidence drop
-
Social Unrest: Aggregate of individual grievances
- Unemployment + Inequality + Inflation drive unrest
- High unrest leads to protests and migration
- Can reach critical threshold (>0.6) indicating system instability
The simulation is calibrated to match real-world patterns:
- Baseline unemployment: ~5% natural rate
- Target inflation: ~2% (standard central bank target)
- Wage growth: Partially follows inflation (wage-price spiral)
- Inequality: Gini coefficient tracking wealth concentration
- Employment sensitivity: Job loss increases with economic downturn
Test how sensitive outcomes are to parameter changes:
from Calibration import ParameterSensitivityAnalysis
sensitivity = ParameterSensitivityAnalysis.tornado_analysis(
sim,
{"consumption_to_inflation_multiplier": (0.05, 0.25)},
output_metric="social_unrest_index"
)Test all combinations of multiple parameters:
from Experimentation import ParameterVaryingExperiment
exp = ParameterVaryingExperiment(
base_config={"interest_rate": 0.05},
varying_params={
"income_tax_rate": [0.2, 0.3, 0.4],
"universal_basic_income": [0, 500, 1000]
}
)
results = exp.run_grid_search(population=300, timesteps=60)Export simulation results for external analysis:
from Calibration import DataExporter
DataExporter.export_to_csv(sim, "simulation_data.csv")
DataExporter.export_to_json(sim, "results.json")
DataExporter.export_citizen_data(sim, "citizens.csv")- 0.0-0.3: Stable society, no major issues
- 0.3-0.6: Moderate discontent, growing protests
- 0.6-1.0: Crisis conditions, high migration, system instability
- Unemployment <5%: Strong labor market
- Unemployment 5-8%: Normal range
- Unemployment >8%: Recession conditions
- Inflation 1-3%: Target range
- Inflation >5%: Problematic price growth
- Stress <0.4: Content population
- Stress 0.4-0.7: Moderate anxiety
- Stress >0.7: Crisis conditions
- Satisfaction >0.7: Most citizens happy
- Satisfaction <0.4: Widespread unhappiness
- Simplified model: Real economies have much greater complexity
- Homogeneous agents: All citizens follow same decision logic (real behavior is heterogeneous)
- No international trade: Closed economy model
- Limited sectoral detail: Generic "manufacturing, service, tech, agriculture"
- Discrete age progression: Doesn't include births/deaths
- Linear policy effects: Complex policies have non-linear real-world effects
Possible extensions:
- Multi-region modeling: Different regions with trade
- Sectoral shocks: Industry-specific disruptions
- Heterogeneous agents: Agents with different utility functions
- Political dynamics: Elections and policy constraints
- Supply-side economics: Production capacity constraints
- Financial markets: Stock/bond market dynamics
- Real asset modeling: Housing, capital investment
- Keynesian consumption function and multiplier effect
- Phillips curve (unemployment-inflation relationship)
- Supply and demand dynamics
- Behavioral economics (Kahneman, Tversky)
- Reinforcement learning (Sutton & Barto)
- Q-learning for agent adaptation
- Utility maximization (consumer choice theory)
- Cobb-Douglas production/utility functions
- OECD Economic Indicators
- World Bank Development Indicators
- IMF World Economic Outlook
- Federal Reserve Economic Data (FRED)
This project is provided as an educational tool for understanding economic policy impacts through agent-based simulation.
For questions or issues:
- Check the examples in Main.py
- Review docstrings in each module
- Experiment with Dashboard.py for interactive exploration
- Analyze sensitivity results to understand which parameters matter most