Actuary · Data scientist · Business analyst · Team lead

Working Tools, Actuarial Method

I'm a Fellow of the IFoA and a CFA Charterholder with seventeen years in UK life, health and longevity insurance, most recently owning annuity rate changes and building the data science team behind them. The tools below show how I work: an AI proposes, and code you can read does the computing and the checking.

Broad Experience
Actuarial · Data and MI · Data Science · AI, across UK life, health and longevity insurance
Lead and Deliver
Business analyst, small-team manager and project lead, primarily working in Agile and Kanban
FIA · CFA · MBA
Fellow of the IFoA, 2014 · CFA Charterholder, 2020 · MBA, Quantic
Academics
MSc Computer Science & AI, University of York, 2024 · MSc Theoretical Physics, Imperial · BSc Mathematics and Physics, Warwick

Three demo working tools

Recent Work

Actuarial Ideas and Data Science are open to anyone; the other tools need a link from me, since most of them call a paid model: ask for access and I'll send one.

80,000 rows, split oncetrain 60% · validation 20% · sealed holdout 20%Agentedits train.py, the only file it can changenew train.pyFixed harnessfits the GLM on train; the agent cannotedit itno forbidden factorsobjective.pyscores the fit on the validation rowsDid the score fall?yes: keep the changeno: revert itSealed holdout20% of rows, never shown to the agent;scored on every fit, revealed at the endMortality problemScore, lower is betterNo model: greedy forward search, 36 fits7,140.20Live agent: DeepSeek V4.1 Flash7,140.87Scored when the charge was 2 per parameter:0.67 apart is a dead heat. Neither took channel,the factor planted with no signal.

Predictive modelling · GLMs · AI agents

Auto Research: An Agent That Searches for a GLM

Problem
Choosing a GLM’s structure (which factors, what shape for age, which interactions) is where most of a pricing or experience analysis goes, and an automated search can overfit, or reach for a factor it must not use.
Built
Karpathy’s autoresearch loop pointed at actuarial GLMs. An agent edits one file, a fixed harness it cannot touch fits and scores the model, and a change is kept only if the score falls. Four problems (mortality, motor frequency and severity, competitor price) have structure planted in the data, and every fit runs in the browser.
About the drawing

The agent’s loop, and its control: on the mortality problem a mechanical search with no model scores level with the live agent.

Side AAdmin extract, 483Side BValuation input, 452Match rows440 pairedonce B’s leading zeros go andits double load is droppedThe gap£157,668valuation input belowthe admin extractCauses, tested on the rows×12 on side B’s 57 annuity incomes:a month against a yearexplains £136,727;the 4p of rounding offered, not taken26 lapsed and 17 new since 30 June, onside A only; 12 rows loaded twice on Bnone has a partner in the other file:£20,738 set aside, not explainedThe model’s four ideas for what was leftone the engine’s own again, one a repeat,two no help: turned downFour premiums altered by hand£203 left unexplained,£251 counted row by rowThe bridge, A to B£399,038£241,370A: adminexplained−£136,727set aside−£20,738left−£203B: valuation

Data · Validation

Reconcile: Why Two Datasets Disagree

Problem
Every actuarial team reconciles, whether admin extract to valuation input or one quarter to the next, and most of the afternoon goes on finding the reason for the difference.
Built
An engine that matches two files, measures the gap by group, and tests twelve common causes (leading zeros, pence, a missing filter, duplicate rows, gross against net) against the actual rows. It then bridges one total to the other and exports the chain as Python.
About the drawing

The worked example: annuity income held a month on one side and a year on the other explains £136,727 of the £157,668 gap; lapses, new business and a double load set aside £20,738; and £203 on four premiums altered by hand stays unexplained.

Eight plansABCFGDEHA–C, F, G: shownD, E: held backH: to work outModelproposes the calculation, step by stepPythonExcel formulasRun both on every examplea miss goes back to the modelHeld back: D, Escored once, at the endThe recorded run, Low models1Fund rolled forward; guarantee foundshown: 5 of 5, but sent back: entry age unusedand its maturity formula would take the peak2Entry age dropped; maturity from the last yearShown5 of 5Held back2 of 2The guarantee pays the premiums back on B, Fand held-back D. H, given no answer, isworked out: 36,031.05.

Modelling · Validation

Backsolve: Recovering a Calculation From Its Results

Problem
Legacy calculations often survive only as inputs and outputs: a spreadsheet nobody can explain, or quotes from a system being retired.
Built
A tool that takes worked examples, has a model propose the calculation step by step with every assumption recorded, then writes it as both Python and Excel formulas and runs both against every example.
About the drawing

The recorded run of the example, eight unit-linked savings plans: it finds the fund rolled forward year by year and the money-back guarantee, sees that entry age changes nothing, and reproduces the two plans held back from it to the penny.