Meridian scores US equities every day and serves those scores over an API, so all of my strategies rank on the same numbers. It started as a single composite score. It is now four components, because I measured the composite and it did not do what I wanted it to.
Four components
The engine is organised into four standing parts. A does prediction in returns space: direction, magnitude and confidence. B does cross sectional ranking from the factor groups. C classifies the market regime. D handles risk, treating volatility as a factor that feeds both the regime work and per-stock sizing.
Work items now advance a component. The project used to be organised by milestone, which made it hard to say what was actually finished and what was still research.
Why did I believe it?
That was the question underneath the whole reorganisation. I had a composite score I was serving to my own strategies, and when I asked myself why I believed it, I did not have a good answer. So I went and graded it properly.
I re-graded in returns space, using a decile long-short realised return and a Newey West t stat, instead of a rank information coefficient against a bucketed target. Rank IC turned out to be overstating how tradable the signal was. There was a positive rank IC that did not turn into a positive dollar long-short, decile monotonicity was negative, and most of the drag was in the long leg.
Worse, the signals with real evidence behind them were sitting on the bench while the composite I was actually serving measured a t stat of 0.31. The conditional alpha signal cleared my own gate and was not blended. The risk group carried the largest IC weight and was not blended either. The problem was not the modelling. It was that nothing was making me connect the things that worked.
Right signals, and signals that are wrong differently
What I am looking for is two things. Signals that are right, and signals that are wrong in a different direction from everything else I already have.
The second one sounds backwards. But a factor that is wrong the same way as the rest of the book is not telling me anything I did not already know, and it will not help me when the book is wrong. One that fails on different names, or in different regimes, is pointing at the gap. That is where the next piece of work is.
It is also why grading is per face and not per factor. A signal can be useless for ranking and still carry information about direction, and if I only ever scored it one way I would throw it out before finding that out.
Activation gates
Every component now has an explicit activation gate, and activation is per face rather than per factor. Rank IC governs the ranking face. A returns-space decile long-short bar governs the direction and magnitude faces. A factor can be active for ranking and still only a candidate for returns.
It means a signal that ranks well does not get treated as a tradable one by accident, which is the mistake I had already made once.
Point in time discipline
Fundamentals are fetched on filing date rather than period end date. Using period end would leak 30 to 60 days of information into a backtest. Sentiment and analyst queries are bounded on both the published date and the fetched date, so an article the vendor backfilled after the score date cannot show up in a historical run. Macro series come out of the database with a release date, because a live API call returns the latest revision rather than what was known at the time.
Trailing twelve month figures need all four quarters present. If one is missing the output is null. A three of four sum understates the annual figure, and I would rather have a gap in the data than a number that is quietly wrong.
Serving
Meridian reads the scores the data platform produces and serves them over an authenticated API, with caching and weight composition on top. Strategies call the API instead of each one recomputing its own factors.