Consulting Work Blog Contact
← Back to blog

The Dashboard Said +158%. The Ledger Said Minus $2,149.

The Dashboard Said +158%. The Ledger Said Minus $2,149.

For about a month, the stats page of a trading side project I run showed a total P&L of +158.75%. This week an overnight audit of the same database produced a different figure: minus $2,148.88 across 140 completed paper trades. Both numbers were technically true at the same time. And I had built both of them myself.

TL;DR

  • A side project of mine trades on paper money: fake balance, real market prices. Its stats page showed +158.75%; the actual money ledger showed minus $2,148.88 over 140 completed trades.
  • The headline was a sum of per-trade percentages. It counted the 120 trades that resolved and quietly ignored 397 that never did.
  • The question that would have caught it months earlier: what would this number look like if the project was failing?

The setup

The project is simple to describe: an AI reads market news and turns it into trade ideas, which get executed on a paper account. Paper trading means the balance is fake but the prices are real, an honest way to test a strategy before risking actual money. Early on I built a stats page that added up the percentage moves of every signal that hit its target or its stop, and printed the total.

That total kept growing. It crossed +100%, then +150%, and I will be honest: it felt good to look at. I did not study the formula behind it again, because why would I? I wrote it.

What the audit found

I asked my AI assistant to spend a night going through the project, with instructions to be merciless, then run a second independent pass that re-derived every total from scratch. The two passes agreed to the cent. What they agreed on was not pleasant.

The +158.75% was a sum of percentage moves, one number per resolved signal, no position sizes anywhere. A sum of percentages is not a return. If trade one makes 5% and trade two loses 5%, the real money is slightly down, but a percent-sum says zero. Stack hundreds of trades on top and the gap between the metric and reality becomes a chasm.

What fed the +158.75% headline vs what the money said

The worse defect was the survivorship filter. Only signals that resolved (hit their target or their stop) entered the sum; 397 signals that just expired or hung in limbo were invisible to it. Given enough time and enough signals, it drifted up regardless of what the account was doing. The account, meanwhile, was doing this: out of the completed trades, 2 hit take-profit and 50 hit stop-loss.

The most dangerous metric is one that can only go up.

The part that worried me more

The money was paper, so the $2,149 cost me nothing. What actually worried me was the health monitoring, because I trusted it the same way I trusted the stats page. The system had reported “healthy” for 11 consecutive days. Over the same two weeks it had written 10,723 error lines into its logs. One of its strategies had been silent for about six weeks and no alert ever fired, because the process was alive and “alive” was all the health check measured.

Green means the process is running. It does not mean the work is being done. Those are different claims, and my dashboard only ever tested the first one.

How I fooled myself

I keep coming back to one observation: nobody sold me this metric. There was no vendor, no sales deck, no incentive to inflate. I wrote a quick number in the project’s first week to answer “is anything happening”, and it migrated to the front page and became “how is it going” without anyone, including me, re-checking whether it could answer that question. I suspect that is how most vanity dashboards get born inside companies too: not by deception, by promotion without review.

Nobody lied to me. I promoted a debug number into a KPI and stopped reading the formula.

There is a simple test I now apply. Ask of each headline number: what would it show if the thing was failing? For my percent-sum, the honest answer was “roughly the same picture, just a bit slower”. A number that cannot show failure is decoration. If no number on your dashboard would look different during a failure, you do not have a dashboard, you have wallpaper.

What changed

The fix took one evening once the audit named the problems. The headline is now the dollar ledger, the same minus $2,148.88 that hurt to publish to myself. Strategies are measured against a “do nothing” baseline, and the ones that lost money in a statistically convincing way got paused or killed. The health check now verifies that yesterday’s work actually happened, not that a process exists.

What would I do differently from day one? Wire the money number first, before any derived metric, because it is the only number that cannot flatter you. And re-read every formula the day its output starts feeling good: that feeling is exactly when checking stops.

Here is the question I would leave you with: which number on your own dashboard have you never seen go down, and have you checked whether it can?

Stack: Python · Claude API · SQLite

Need something like this for your own business? See how I can help →