A
AXIOM

Post-mortem

The number said DCF. It wasn’t a DCF.

The most important thing I shipped on AXIOM was a deletion. The layer that made the demo look smartest, a machine-learning correction on top of the valuation, was the layer that made the headline number a lie. Here is what was wrong, and the three pivots that fixed it.

The tell

The headline read $531. The real DCF was $380. The sensitivity table below it, running an honest DCF, agreed with the $380, and quietly contradicted the number at the top of the page.

That $151 gap was multiple expansion and ML fudging, stacked on a cell labelled DCF Fair Value. It was not dishonest by design; it grew one reasonable step at a time. But once a page argues with itself, the only fix is to tear out the thing that has no clean interpretation, even when it is the part that demos well.

The rebuild

Three pivots.

01 / 03

Make the DCF honest.

BEFORE

The headline blended a DCF with EV/EBITDA and P/E, then multiplied the result by an ML “correction factor.” Each step made sense locally: add multiples for context, blend them in, patch the errors with ML. The sum was a number with no clean financial meaning.

AFTER

Stripped back to a single DCF: PV of ten years of free cash flow, plus terminal value, plus cash, minus debt, over shares. No blending, no multiplier, no analyst anchor. The sensitivity table now runs the same formula, so the headline and the table can never disagree again. Deleted the calibrator, the blend weights, the analyst anchor, and a backtest file that hardcoded a 9.5% WACC for every company regardless of sector or leverage.

02 / 03

ML should learn the signal, not patch the output.

BEFORE

The old model learned “when our prediction was wrong by X%, correct future predictions by X%.” That is circular: it patches its own mistakes without understanding why it was wrong. It could never generalise, because it was trained on its own error, not on the market.

AFTER

Rebuilt around three cross-sectional factors, each Z-scored within sub-sector. Value: DCF price over market price, minus one. Momentum: 12-month return versus the sector ETF, dropping the most recent month, the Jegadeesh-Titman factor. Quality: free-cash-flow yield. The model now learns what actually predicts sector-relative outperformance, not how far off it was last year.

03 / 03

Measure what a ranking model is for.

BEFORE

Evaluation was mean absolute error on price predictions. That is meaningless for a ranking model. A model can be 30% off on price and still be an excellent signal if it ranks the winners above the losers.

AFTER

Switched to Information Coefficient, the rank correlation between predicted attractiveness and subsequent excess return. Real signal means IC above zero with a t-statistic of at least 2. Added hit rate by quintile: does the top quintile actually beat the median? The report now says whether the model adds value, instead of flattering it.

What’s still waiting on time

The signal stays hidden until the data earns it.

The factor infrastructure is live: three signals computed daily across the tracked universe and logged to disk, retrained on price history since 2022. But the ranking is not shown to users, and won’t be, until it clears a statistically significant IC (t-stat of at least 2) over at least 24 months of out-of-sample data.

A fourth factor, whether a company’s margin is improving or declining, needs twelve months of daily snapshots before it can be computed. That data arrives in 2027. Until then it stays out of the model rather than getting faked in.

The honest one-liner

From: apply a DCF, blend it with multiples, slap an ML multiplier on top, call it DCF Fair Value.

To: run a clean DCF, score companies on three independent factors, let the data say whether the model works.