Introduction to Quantamental Trading: How a Macro Thesis Becomes a Rule, a Rank, and a Reproducible Backtest
Every discretionary macro trader carries a mental model that sounds something like this: “quality survives a slowdown,” or “boring stocks compound while glamour stocks round-trip.” The model is usually right more often than it is wrong — and it is usually applied inconsistently, sized emotionally, and abandoned at exactly the wrong moment. That gap between a good thesis and a disciplined application of it is where most discretionary performance leaks away.
Quantamental trading is the attempt to close that gap. It is not the replacement of judgment with a black box. It is the translation of a human, fundamental, macro-aware thesis into an explicit rule — one that scores every eligible stock the same way, every rebalance date, and produces a track record you can audit line by line. The judgment stays; what changes is that it gets written down, tested against a decade of data, and guarded by machinery that refuses to publish results when something is wrong.
This article opens our Macro & Strategy series. Over the coming installments we will walk the full curriculum — point-in-time data, regime detection, factor mining, portfolio construction, validation statistics, and live operations — and every piece will be grounded in the same place: the long/short factor platform we actually built and run. By the end of this piece you will have the pipeline skeleton, the exact Python that turns a thesis into a portfolio, real backtest numbers from our own engine, and the failure modes that the machinery exists to catch.
What “Quantamental” Actually Means
The word is a portmanteau — quantitative process, fundamental inputs — and it describes a specific middle ground. A pure quant shop may trade signals with no economic story at all: microstructure, statistical patterns, order-flow. A pure discretionary investor reads the same 10-K a quantamental system parses, but holds the conclusion in their head. Quantamental sits between: the inputs are the things a fundamental analyst cares about (profitability, cash flow, share issuance, balance-sheet strength, price behavior), and the process is systematic (a scoring function, a ranking, a rebalance schedule, a risk rule).
The crucial mental shift is from picks to rules. A discretionary investor asks, “is this stock attractive?” A quantamental system asks, “what is the attractiveness score of every stock in the universe, computed identically, using only information that existed on the decision date?” That last clause — only information that existed at the time — sounds pedantic and is anything but. It is the difference between a backtest and a fairy tale, and it is important enough that the next article in this series is devoted entirely to it.
The Pipeline: Rank, Select, Hold, Measure
Nearly every cross-sectional equity strategy — value, momentum, quality, low-volatility, and the multi-factor composites built from them — shares one skeleton. At each rebalance date t, over an eligible universe of M stocks:
score: s(i,t) = f( fundamentals(i,t), prices(i,t) ) for each stock i
rank: r(i,t) = rank of s(i,t) across all M eligible stocks
select: LONG the top N by rank
SHORT the bottom N by rank (0 for a long-only book)
hold: until the next rebalance, subject to risk rules (stops, caps)
measure: portfolio return, net of costs, marked daily
Every symbol matters. f is the thesis — the entire economic idea lives inside that one function. fundamentals(i,t) means the fundamental data for stock i as it was knowable at date t (SEC filing dates, not fiscal-period dates). N is the book size — concentration versus diversification. The rebalance frequency sets the trade-off between signal freshness and transaction costs. And “measure” hides the most consequential decision of all: what you report. Average per-trade return and compounding fund return answer different questions, and mixing them is how marketing decks lie.
Notice what is not in the skeleton: no prediction of index direction, no timing call, no price target. A cross-sectional strategy only claims that the top of the ranking will beat the bottom of the ranking. That relative claim is far more modest than a market call — and far more testable.
From Thesis to Reproducible Backtest: Inside the v7 Engine
Theory is cheap, so here is the real thing. Our v7 platform is a contracts-first rebuild of our long/short backtester: a one-way pipeline — selection → engine → measurement → results → dashboard — where each stage only consumes the output of the previous one, and an architecture linter fails the build if any stage reaches backward. What follows is actual code from the repository, lightly trimmed for width.
A thesis in fourteen lines
Take the low-volatility anomaly — the well-documented tendency of boring, low-volatility stocks to deliver better risk-adjusted returns than glamour names. As a discretionary belief it is a paragraph. As a v7 strategy it is this:
VOL_WINDOW = 63 # ~3 months of trading days
class LowVolatility:
config = StrategyConfig(
code="LOWVOL", name="Low Volatility",
n_long=20, n_short=0, rebalance="monthly", long_stop=0.15,
universe=UniverseSpec(mcap_min=3e8, price_min=5,
dollar_vol_min=2e6),
required_inputs=(), min_history_days=VOL_WINDOW)
def score(self, panels, date):
"""Higher = lower trailing vol. PIT: returns index <= date only."""
rets = panels["close_d"].pct_change().loc[:date].tail(VOL_WINDOW)
return -rets.std(ddof=0)
Read it as a contract. The universe is liquid US equities: at least $300M market cap, a $5 minimum price, $2M daily dollar volume. The book is the 20 best-ranked names, long only, rebalanced monthly, each position protected by a 15% stop. The thesis is one line: score every stock by the negative of its trailing 63-day return volatility, so the calmest names rank highest. The .loc[:date] is the point-in-time discipline made visible — the scoring function is physically unable to see a price from the future.
The one-way pipeline
The strategy class is all a researcher writes. The platform does the rest, and the core chain is short enough to quote:
def run_strategy(strategy, panels, *, data_effective_as_of, out_dir, ...):
"""The core chain: engine -> Results -> gate -> generate -> write."""
cfg = strategy.config
eo = engine_run(panels, strategy) # decide at close, fill at open
va = trade_ledger(eo, panels) # View A: per-trade ledger
vb = fund_curve(eo, panels, cfg) # View B: compounding fund NAV
results = assemble(strategy, eo, va, vb, attr, data_effective_as_of)
log_trial(cfg.code, cfg, headline_sharpe=results.metrics.view_b.sharpe)
report = evaluate(results, trial_log_path) # validation gate
results = apply_gate(results, report) # fail => research_only
files = to_dashboard(results)
problems = coherence_check(files) # chart vs snapshots disagree?
if problems:
raise CoherenceError(problems) # publish nothing, keep last-good
Three details are worth slowing down for. First, the engine decides at the prior close and fills at the next open — it never trades on a price it could not have known. Second, the measurement stage produces two views that are never mixed: View A is a ledger of individual trades (distribution statistics — win rate, average trade), View B is a real compounding fund curve (CAGR, Sharpe, drawdown). A per-trade story is never allowed to masquerade as a fund return, or vice versa. Third, every run is logged as a trial before its results are evaluated — so when we later compute how likely a Sharpe ratio is to be luck, the denominator honestly includes everything we tried.
What the output looks like
Running python -m strategies_v7.run --strategy LOWVOL produces, among other artifacts, a dashboard JSON whose summary is the strategy’s honest report card. From the run in our repository (panel start February 2016, data effective as of June 12, 2026), the fund-level View B reads: total return +401.9% versus +353.2% for the S&P 500 (SPY) over the identical window — a CAGR of 16.8% versus 15.7% — with a portfolio beta of just 0.48, a Sharpe ratio of 0.62, and a maximum drawdown of −23.1%. The per-trade View A: 612 closed or open trades, a 62.9% win rate.
| Year | LOWVOL | SPY | QQQ |
|---|---|---|---|
| 2018 | +5.2% | −4.6% | −0.1% |
| 2020 | +11.8% | +18.3% | +48.4% |
| 2022 | −0.1% | −18.2% | −32.6% |
| 2023 | +5.1% | +26.2% | +54.9% |
| 2024 | +11.6% | +24.9% | +25.6% |
The selected years are the story. In 2022 — the worst joint stock-bond year in decades — the sleeve was flat while SPY lost 18% and the Nasdaq-100 lost a third. That is the low-volatility thesis doing exactly what it promises. But look at 2023: the sleeve made 5% while SPY made 26% and QQQ made 55%. A defensive rule pays for its crisis protection by missing the melt-ups, and over the full decade the sleeve trails QQQ’s +643.7% badly. An honest report includes both columns.
The Risk: A Rule Faithfully Executes a Bad Thesis
Here is the part introductions usually skip: making a strategy systematic makes it consistent, not correct. If the thesis is wrong, automation executes the mistake with perfect discipline, every month, at scale. If the data is stale, the rule trades yesterday’s world. If you tested forty variants and published the best one, the beautiful Sharpe ratio is mostly selection bias wearing a lab coat. Systematic ≠ safe — a pipeline is an amplifier, and it amplifies flaws as faithfully as edges.
The v7 answer is a wall of gates that would rather publish nothing than publish garbage:
- Freshness gate — refuses to run at all if the input data is stale, so a signal can never silently be computed on last week’s prices.
- Validation gate (research_only) — a strategy that has not cleared out-of-sample and multiple-testing checks is stamped
research_onlyand cannot present itself as live-eligible. - Coherence gate — if the chart, the snapshots, and the summary artifacts disagree with each other, the whole publish is refused and the last-good output stays in place.
- Output-sanity gate — a final screen on the generated dashboard files themselves; impossible values block the write.
There is also a subtler discipline encoded in the platform’s architecture decisions: the two-view separation exists precisely so that a flattering per-trade average can never be quoted as if it were a fund return, and the trial registry exists so that “we ran it once and it worked” can be distinguished from “we ran it eighty times and kept the winner.” These are not features; they are constraints we imposed on ourselves, because the most dangerous person to fool with a backtest is the person running it.
If you want the narrative version of what this machinery is for, our market coverage shows the same regimes from the other side — the record-setting, dovish-Fed tape of early July 2026 is exactly the kind of momentum-led environment in which a defensive rank quietly lags, and knowing that in advance, from the regime table rather than in hindsight, is the entire point of doing this systematically. The rest of the series lives on the Macro & Strategy hub: next up are the pitfalls of revised data (why point-in-time discipline makes or breaks a backtest), a full worked treatment of the low-volatility sleeve, and eventually the gates themselves — including the real bug they caught. Our standing rules for data sourcing and verification are in the methodology.
The AlphaEdge Take
Quantamental trading is discipline made explicit, not judgment made obsolete. A macro thesis you cannot write as a scoring function is a mood; once written, ranked, and gated, it becomes something you can test, size, and audit — and something that will also faithfully execute your mistakes, which is why the reproducibility and the refuse-to-publish machinery matter more than any single strategy’s returns. Start with the skeleton — rank, select, hold, measure — demand point-in-time data, report both the trade view and the fund view, and treat every backtest as a claim to be attacked rather than a result to be admired.