Insurance · FinTech
Actuarial loss reserving, interactively
Chain ladder modelling in Python with Plotly Dash. Replaced days of manual spreadsheet work with an interactive web app analysts can use in real time.
Domain: Insurance / FinTech / Actuarial Science Engagement: Client project (backend + data science delivery) Team Size: Backend + Data Science
Loss reserving — the actuarial process that estimates future claim payouts from historical data — drives some of the largest numbers on an insurer's balance sheet. The client's existing workflow ran on spreadsheets passed between analysts. That workflow failed on every axis a senior actuary cares about:
They needed a web-based platform that could run industry-standard actuarial chain ladder models on demand, expose the full parameter surface interactively, version every run, and produce regulator-friendly exports — all without asking actuaries to become software engineers.
An interactive analytics platform combining production actuarial mathematics with a working web UI — where senior actuaries control every assumption, less-senior analysts can explore scenarios safely, and every result is traceable back to its inputs.
chainladder Python library — the same reference implementation used by actuarial practitioners globallyEvery analysis run is a versioned, immutable artifact: the input dataset hash, the parameter set, the code version, and the full set of outputs are all persisted together. An analyst (or an auditor) can re-open a six-month-old run and see exactly which numbers came from exactly which inputs under exactly which assumptions. Running "the same" analysis twice produces byte-identical results — random seeds are pinned where models use them; Pandas operations are expressed order-deterministically.
The actuarial module is tested against hand-calculated benchmarks from senior actuaries. Unit tests cover every stage of the chain ladder pipeline; regression tests lock in results for a library of reference triangles so a dependency bump that silently changes a factor selection is caught before it reaches production. Output-layer tests compare Excel export byte-patterns against regulator-facing templates.
Every mutating action writes to an audit log with user, run ID, input hash, and timestamp. Parameter overrides are captured with a free-text justification field so the why of a senior analyst's judgment call is preserved alongside the what. The trail is the answer to "who changed the reserve estimate, when, and based on what?" — which is the question that eventually gets asked.
Runs are scoped to users and teams; concurrent edits don't clobber each other because edits produce new runs rather than mutating existing ones. Shared runs are read-only by default; collaboration happens through explicit forking.
Triangles and bootstrapped uncertainty runs can get large. The pipeline leans on Pandas and NumPy vectorization, avoids Python-level loops in hot paths, and caches intermediate results keyed by the input/parameter hash so a re-render of the same run is near-instant.
| Layer | Technology |
|---|---|
| Backend | Flask, SQLAlchemy, Gunicorn |
| Database | MySQL (PyMySQL) |
| Actuarial core | chainladder 0.8.11 |
| Data Science | Pandas, NumPy, SciPy, Scikit-learn, Statsmodels |
| Visualization | Plotly Dash, Matplotlib, dash-ag-grid |
| File handling | openpyxl, xlsxwriter, dash_uploader |
| Reproducibility | Content-hashed input fingerprints, pinned random seeds, immutable run records |
| Audit | Per-action audit log with user, run, input hash, parameter diff |
The chainladder library is the reference implementation for the method and is maintained by practicing actuaries; re-implementing it would have been both unnecessary and dangerous. Plotly Dash gave us interactive visualization without a separate frontend codebase — analysts manipulate data and see results in real time from a single Python application, which matters because the runtime is dominated by numerical Python anyway. Flask + SQLAlchemy + MySQL kept the serving tier boring and reliable, where boring and reliable is exactly what you want under a regulated workload.
This project sits at the intersection of domain-specific expertise and production software engineering. Building an actuarial platform is not just "wrap a model in a web UI" — it's figuring out how to make the mathematics reproducible, the judgment auditable, the UI honest about uncertainty, and the exports regulator-ready. The engineering disciplines that earn trust here (reproducibility, audit, input validation, versioned runs) are indistinguishable from what serious financial software requires. Delivering that kind of rigor, for a domain most software teams wouldn't touch, is where this engagement earned its keep.
More recent work
Healthcare · Patient management
A six-app healthcare ecosystem — the product our client took to Shark Tank
Patient app, resident web, staff portal, admin dashboard, shared SDK, and an AI emergency dispatcher — all sharing a single backend with role-isolated access. Built for a healthcare startup that was later featured on Shark Tank with the product we delivered.
Read the case study
Transportation · Smart city
Multi-modal routing and cashless ticketing for public transit
Proprietary IP we built and productised — launched on the App Store and Play Store. 150+ APIs, dynamic fare engine, real-time vehicle tracking, ONDC-certified, and a voice AI for 250+ metro stations.
Read the case study
Tell us what you're trying to build. Discovery calls this week, scope within 3 business days.