Inspiration
The standard way to ask "how long would my savings last if I lost my job?" is one division: savings divided by the monthly shortfall. It assumes Employment Insurance pays forever and has no ceiling. Canadian EI does neither. We wanted to know how much that simplification hides, and for whom.
What it does
Type any of the 4,500 real customer accounts and describe what happened in plain English, or paste the judge's twist card. ServaAI:
- Knows the customer: typical income and spending, fixed costs, loan payment and savings buffer, computed exactly to the track's definitions.
- Takes the shock: Gemini reads the sentence ("They lose their job (EI at 55%) and their household bills go up 15%") into structured events, shows them for confirmation, and the engine recalculates. The judges' formula is always shown first, labelled, with ServaAI's realistic runway beside it: EI stops after 6 months and pays at most 729 dollars a week.
- Forecasts the next 3 months of month-end balance with a likely range, before and after the event.
- Makes a plan: emergency-fund targets, a weekly Automatic Savings Program amount, and a backup plan that trims flexible spending (never bills, insurance or loans) until the realistic runway reaches 3 months, each tied to a Tangerine tool (Goals, Money Rules, Orange Alerts, Left to Spend).
A 3D coin stack makes it visible: one coin per month of runway. It drains when the event lands, outline coins show the months the formula promises but reality doesn't, and the backup plan adds coins back.
Our biggest finding
For 32.8% of customers (95% CI 31.4% to 34.2%), the standard runway formula overstates how long their savings last after a job loss by more than six months.
- Under 6 months of runway: 35.1% by the formula, 51.2% realistically.
- 726 customers (16.1%) look safe but are not: the formula gives them 6+ months, realistically they have less. They are invisible to the simple calculation, so they are who Tangerine should contact first.
- Working-age owners are hit hardest: about 1 in 5 customers aged 30 to 59 are hidden-fragile, against 4.6% of customers 60 and over.
- Example, account 63816 under the layoff card: formula 3.4 months, realistic 2.0 months; the backup plan stretches it to 3.0.
How we built it
- Engine (Python, pandas): the track's exact definitions for I, F, S, B, H, P and runway. An independent script recomputes every value for all 4,500 accounts using only the standard library (no shared code): 100% match, plus the 3 README twist cards and every edge case (empty buffers, zero income, accounts that close early).
- Realistic runway: a month-by-month balance simulation with EI duration, the 729 dollars/week cap and optional re-employment. It reduces exactly to the judges' formula when EI is unlimited (tested on every account).
- 3-month forecast: a ladder tested on 2025 months the models never saw (trained 2020-2023, tuned on 2024). Average balance error: assuming nothing changes 5,185 dollars; median-flow baseline and Ridge regression did worse; XGBoost 4,533 dollars, 12.6% better. Its P10-P90 band covered 78.9% of real 2025 balances. We show the methods that lost too.
- Gemini event agent (Gemini API): gemini-3.6-flash turns free text into a JSON schema of events (validated with pydantic), with a second Gemini model and a rule-based parser as fallbacks. 20/20 test phrasings parse correctly. Gemini never produces a number: its optional plain-English explanation is rejected if it contains any number the engine didn't supply.
- Web app: FastAPI + React, Tailwind, Recharts and react-three-fiber (3D coin stack and a galaxy of all 4,500 customers), with a 2D mode that keeps the live twist working without 3D.
- Portfolio analysis + Power BI: every account under six shocks, 1,000-sample bootstrap intervals, segments by region, age, card type and account age, exported to Power BI.
- Deployment: Docker on a Vultr server behind nginx with HTTPS, at servaai.us.
- 94 automated tests.
Challenges we ran into
- Matching the judges' numbers exactly while also arguing their formula is too optimistic: we show both, always labelled, judge first.
- Gemini returned "high demand" errors during the night, so the agent falls back to a second model and then to a rule parser, and the screen says which one answered.
- Our first forecasting models (a damped-trend baseline and Ridge) were worse than assuming nothing changes. Scaling each customer's money flows by their own volatility and using an absolute-error XGBoost fixed it.
Accomplishments that we're proud of
- An engine that matches the judges' definitions on all 4,500 accounts, proven by an independent check.
- A finding with a confidence interval, not a guess.
- An AI feature that is genuinely useful but cannot put a made-up number on screen.
What we learned
- A single formula can hide a whole segment of fragile customers.
- Honest baselines matter: half our models lost to "nothing changes", and saying so builds trust.
What's next for ServaAI
- Estimate insurable earnings from wage-like transfers instead of all money in (today EI is an upper bound, so real runways may be even shorter).
- An overdraft early-warning model on the same features, with fairness checks.
Sources
- PKDD'99 Discovery Challenge Financial dataset (real anonymized bank data), CTU Prague: https://relational.fel.cvut.cz/dataset/Financial
- Government of Canada, Employment Insurance regular benefits: https://www.canada.ca/en/services/benefits/ei/ei-regular-benefit.html
Links
- Live app: https://servaai.us
- Code: https://github.com/diego-pac10/Tangerine-Income-Prediction
- Team: Eren Aybulus, Abeeha Fatima, Jehanzeb Siddiqui, Diego Pachas