About — Labour Economics Model Simulator
This project shows how core labour economics concepts interact with Singapore-specific policies.
It is not an official forecast or policy advisory tool.
Overview
The simulator models an equilibrium in a simplified labour market where a gross wage w clears supply and demand. Singapore’s institutional features enter via three levers on the employer side (CPF employer rate, SDL, and a per-worker levy) and two levers on the supply side (CPF employee rate and a foreign-worker quota that scales the foreign labour pool). Additionally, we introduce a simple rule that lets trade unions push wages above the normal market-clearing level. This union feature follows a common Western modelling convention (a proportional wage markup over the competitive wage) and is used here for teaching and “what-if” exploration.
Important context (NTUC vs. Western unions)
Singapore’s NTUC operates within a tripartite, cooperative system (government–employers–unions). In practice, higher NTUC coverage is more associated with wage stability, employability, training, and orderly adjustments (via NWC guidelines), rather than with large wage premia above market levels. The simulator’s union markup is therefore a didactic simplification, not a claim about NTUC’s real-world effects.
Economic Model
Employer cost (proportional + fixed):
w_emp = (1 + τ_e + τ_sdl) · w + λ
Take-home wage:
w_net = (1 − τ_p) · w
Demand (linear):
D(w) = a − b · w_emp
Local supply (linear):
S_local(w) = c + d · w_net
Foreign supply (quota-scaled):
F(q) = F0 · q
Total supply:
S_tot(w, q) = S_local(w) + F(q)
Competitive wage (no unions):
w_c = (a − bλ − c − F0·q) / [ b(1+τ_e+τ_sdl) + d(1−τ_p) ]
Union markup:
φ = k · θ, w = w_c · (1 + φ)
Unemployment gap:
Unemp = max{ S_tot(w,q) − D(w), 0 }
Parameter Meanings (defaults shown in UI)
| Symbol / Key | Description | Effect |
|---|---|---|
a |
Demand intercept (max demand if wage ~0) | ↑ a → ↑ w |
b |
Demand slope (sensitivity to employer cost) | ↑ b → ↓ w |
c |
Local supply intercept | ↑ c → ↓ w |
d |
Local supply slope (response to net wage) | ↑ d → ↓ w |
τ_e |
Employer CPF rate | ↑ → employer cost ↑ → ↓ w_c |
τ_p |
Employee CPF rate | ↑ → net wage ↓ → supply shifts down → ↑ w |
τ_sdl |
SDL proportional rate (≈0.25%) | ↑ → employer cost ↑ → ↓ w_c |
λ (lambda_levy) |
Per-worker fixed levy (e.g., FWL in wage units) | ↑ → demand shifts down → ↓ w_c |
F0 |
Foreign labour baseline (millions) | ↑ → supply ↑ → ↓ w_c |
q |
Quota strength (scales foreign pool) | ↑ → supply ↑ → ↓ w_c |
θ (theta) |
Union coverage proxy (0–1) | ↑ → markup ↑ → ↑ w, employment ↓ |
k |
Union bargaining elasticity | ↑ → markup sensitivity ↑ |
How to Use
- Open the homepage and move the sliders on the left.
- The right panel updates three metrics: Wage (gross, with union), Employment (demand), and Unemployment gap.
- The Plotly chart shows the demand and total supply curves; the red marker indicates the simulated wage/employment point.
- Use the “Advanced Parameters” panel for shape calibration (a, b, c, d, F0, k, plotting range).
Interpreting Results
- Gross wage rises when employee CPF increases: workers need higher gross pay to offset lower take-home, shifting supply down in net-wage terms.
- Employer cost increases with higher employer CPF or SDL or per-worker levy: demand shifts down, reducing competitive wage.
- Looser quota (q) raises foreign supply and tends to reduce the competitive wage.
- Higher union coverage increases the wage markup; employment may fall and unemployment gap widen.
Architecture & Tech Stack
- Backend: Flask (Blueprints), Python, NumPy
- Frontend: Jinja2 templates, Bootstrap 5, Plotly.js, vanilla JS (Fetch + debounce)
Developer
- Name: Allen Pan
- Email: n2301225g@e.ntu.edu.sg
- GitHub: github.com/panyilun3