● Quant · ML · Credit risk / NWU Potchefstroom, ZA
Tjay Burger
I build models for decisions under uncertainty. Credit scorecards written from scratch, causal uplift models, quantile volatility forecasts for JSE banks. Each one tested against the ways it can fail.
- SCORECARD.AUC0.737sa-credit-scorecard
- GINI0.473sa-credit-scorecard
- KS0.355sa-credit-scorecard
- XGB.AUC0.753sa-credit-scorecard
- INCLUSION.GAP14.7%sa-credit-scorecard
- CATE.CORR0.927causal-credit-uplift
- PEHE.CF0.0015causal-credit-uplift
- QINI.T7.74causal-credit-uplift
- TOP10.JACCARD0.409causal-credit-uplift
- JSE.BANKS6quantile-volatility
- HORIZON5dquantile-volatility
- ASSETS9regime-monitor
- SCRAPES.OK336/340ghostcheck-sa
01 · Work
Every metric comes from the repo it links to. Where a repo has no committed result, the page says so. The particles behind each chapter are built from the same data or formula.
01/05Credit scorecard · ML
Two WOE scorecards on 307,511 real applications, one with bureau data and one without. The interesting part is where they disagree.
- Holdout AUC, bureau scorecard
- 0.737
- Gini
- 0.473
- Holdout in the inclusion gap
- 14.7%
- Illustrative missed lending
- ≈R4.9bn
From the repo README, seed 42 holdout. Hover a bar for the rate.
02/05Causal inference · ML
Who changes because you treated them? T-learner vs CausalForestDML on a real email RCT, then on synthetic credit data where the true effect is known.
- corr(pred, true CATE), causal forest
- 0.927
- PEHE, causal forest
- 0.0015
- Persuadables in its top decile
- 100%
- Qini, T-learner on Hillstrom
- 7.74
Real curves from dashboard/public/data/phase1.json and phase2.json. Toggle the phase.
Qini coefficient: T-learner 91.34 · CausalForestDML 87.66
03/05Volatility forecasting · Quant
Distributional forecasts of 5-day realized volatility for six JSE banking groups. A band, not a point, scored with pinball loss and coverage.
- JSE banks: SBK, FSR, ABG, NED, CPI, INL
- 6
- Quantiles forecast
- q10 · q50 · q90
- Horizon, annualized RV
- 5d
- Target interval coverage
- 80%
Drag τ. This is the loss function from the repo's methodology, plotted exactly. No model output.
Lτ(y, q) = max(τ(y − q), (τ − 1)(y − q)). At τ = 0.90, under-forecasting volatility costs 9.0x as much as over-forecasting by the same amount.
04/05Market regimes · Quant
Labels the current regime for crypto, US ETFs and JSE stocks from volatility, trend and drawdown, then has an LLM explain the structured output, never predict prices.
- Assets: BTC, ETH, SOL, SPY, QQQ, NPN, SOL.JO, SBK, MTN
- 9
- Trend-strength threshold
- ±3%
- Drawdown regime cut-offs
- −5/−10/−20%
- KMeans clusters (optional)
- 4
Move the sliders. The labels follow the exact rules in models/regimes.py.
risk_regime
medium_volatility_sideways
- volatility
- medium
- trend
- sideways
- drawdown
- normal
05/05Data engineering · Quant + ML
How long do South African job listings really stay open? A daily scraper over ten employers' career sites, POPIA-safe by design, running at R0.
- Employers, 5 Workday + 5 SuccessFactors
- 10
- Scrapes returned ok
- 336/340
- Days of daily runs
- 34
- Infrastructure cost
- R0
From history/runlog.json. Gaps are failed scrapes. Click an employer to isolate it.
02 · Approach
How the work is built
Credit and market risk punish confident mistakes. So the order is fixed: explain the model, try to break it, then put it behind an API.
01
Interpretable first
Start with a scorecard a committee can sign: WOE bins, IV, points, PDO. If a black-box model wins, it has to win on the same features, with SHAP showing where.
02
Causal when the decision is a treatment
Default classifiers answer the wrong question for limit increases, collections, and offers. Uplift models answer who the treatment moves, and who it harms.
03
Shipped, not notebooked
FastAPI, Streamlit, or a Vercel front-end. The model is not done until someone who is not me can run an applicant through it.
The inclusion gap defaults at 12.1%. Riskier than agreed accepts, far safer than agreed rejects. A bureau-only model treats them as one group.
03 · Quant projects
Smaller work
A hackathon trading agent and two university group projects. Less polish than the case studies, same rule about numbers.
Options agent on the volatility risk premium
Hackathon build, paper trading only. Sells premium when implied vol is more than 2 points above 20-day realized vol, buys when it is cheaper, and sits out in between. A separate risk gate prices spreads at worst-case fills and caps loss at 2% of equity per trade. In a proxy backtest on six tickers over about 2.1 years, vol mean-reverted after 67.9% of 53 sell signals and 58.0% of 69 buy signals. No options P&L is claimed.
- alpaca-py
- Volatility
- Risk gate
SO₂ across 41 US cities
STTN327 group project, five people, and I led it. I built the mixed-effects and random forest models and presented the comparison.
- Mixed effects
- Random forest
- R
Ride-hailing cancellations in SQL
CMPG321 research project. I wrote the SQL behind a study of trip cancellations, safety metrics and fleet quality.
- SQL

04 · Contact
Tjay Burger
Final-year BSc Computer Science and Statistics at North-West University, Potchefstroom. Exams finish 16 November 2026. Moving to the Western Cape and looking for junior quant, ML or credit-risk roles in Stellenbosch, Cape Town or remote. Python, R and SAS, plus SQL.
tjayburger2004@gmail.comMore about how I work