The design
Every subsequent stage of the project traces to a written rule that predates it.
Claim tested
That a research process can be specified before it is built, rather than emerging from whatever the tooling happened to make easy.
Result
The specification held. Two of its rules turned out to be load-bearing in ways I had not anticipated.
Consequence
The anti-scope became the more useful half of the document.
Why write a specification at all
Because the alternative is that the process quietly becomes whatever the software can do. A screener with a scoring feature produces scores. A tool with a backtesting engine produces backtests. The design decisions then happen by default, made by whoever built the tool, for reasons that have nothing to do with the problem.
Writing the specification first meant the decisions were made deliberately, in advance, and could be pointed at afterwards when something went wrong. That last part turned out to matter more than the first.
Four founding premises
If a later change contradicted one of these, the premise had to be revisited explicitly rather than eroded quietly.
1. Edge is structural, not analytical. Analytical capability is commoditising. What persists is access to places institutional capital cannot go: too small, too illiquid, too foreign, too unaggregated.
2. Numbers from a database, reasoning from the model, judgment and decision from the human. Numeric data is never sourced from a language model. Judgment is never outsourced entirely. The final call is never automated.
3. The forward decision record replaces backtesting. A concentrated, judgment-driven strategy produces too few independent decisions for historical validation. The journal is the validation mechanism.
4. Approximately right beats precisely wrong. If a thesis requires a model to work out, it is too complicated. Coarse ranges, decomposed scores, no composite ranking.
Seven components
Specified in process order. Components 1 to 4 narrow the universe, 5 and 6 verify and decide, 7 records and reviews. Each has a proof-of-concept substitute, because the point of this summer was to run the process manually before writing a line of application code.
| # | Component | Nature | Proof-of-concept substitute |
|---|---|---|---|
| 1 | Market & Data Source Registry | Reference data, human-curated | Markdown document |
| 2 | Philosophy & KPI Directory | Versioned rules | Excel and markdown |
| 3 | Investment Compass | Scored filter, two levels | Excel worksheet |
| 4 | Screener | Mechanical, deterministic | Excel plus scripted data pulls |
| 5 | Knowledge Base | Document store and extraction | Folder of filings plus conversation context |
| 6 | Review Cockpit | Human and model, structured workflow | A long research thread |
| 7 | Decision Journal & Watchlist | Append-only record | Excel, one row per entry |
The anti-scope, which is the interesting half
Most specifications list what will be built. The more useful half of this one lists what will not be, and why. Each of these was tempting.
Two names with an identical composite can be cheap-and-fragile and expensive-and-durable. The composite is precisely the field that hides this.
Too few independent decisions, and inputs that cannot be reconstructed point-in-time even in principle. Backtesting this would be theatre.
A plausible number and a correct number are indistinguishable on the page.
The most heavily mined dataset in existence. No structural reason a student finds something a systematic fund has not.
The final synthesis is exactly the step where the tooling is least reliable.
The rules that earned their keep
No composite scoring killed the obvious first-pass valuation model. I had intended to produce a low, central and high value per company from screener data and rank by the gap to price. It does not work, for arithmetic rather than aesthetic reasons. The rule caught it before I built it.
Approximately right beats precisely wrong is why the screening stage disqualifies and orders but does not value. Precision at the wrong stage is not conservatism, it is a way of manufacturing confidence out of a dataset that cannot support it.
Full functional specification: functionalspec_portfolio.pdf ↗