The Macro Lens framework
This page is the canonical specification for how Macro Lens reads the market every weekday morning. It is the transparency artifact — the one place where the technical detail is fully exposed so that any serious reader, RIA, regulator, or skeptic can verify the work.
The framework has a version number. Current version is v1.0. Revisions are announced here with effective dates and rationale.
What we measure — six market signals
Every weekday morning, before any AI is involved, the engine computes six market signals from publicly available daily close prices:
| # | Signal | What it reads |
|---|---|---|
| 1 | Tech leadership | Whether semiconductors are leading the broader market — a proxy for growth and risk appetite |
| 2 | Consumer health | Whether discretionary spending is rotating into defensive staples — the consumer cycle in real time |
| 3 | Rates and risk-taking | Whether financials are leading utilities — the rate environment and risk-on signal |
| 4 | Broad participation | Whether small companies are participating in the rally or being left behind — the breadth signal |
| 5 | Credit conditions | Whether high-yield corporate bonds are outperforming long Treasuries — the leading-indicator signal of stress |
| 6 | Inflation pressure | Whether energy is leading the broader market — the commodity / inflation read |
Each signal is computed as a ratio of two ETFs. The specific ETF pairs used are documented internally and are not particularly important to a reader; what matters is what the ratio measures. The signals together cover growth, the consumer cycle, the rate regime, breadth, credit stress, and inflation pressure — the six axes that broadly govern US-market behavior.
How each signal is classified
For each signal, the engine computes two moving averages on the daily close price ratio:
- Fast — a 21-day simple moving average (approximately one trading month)
- Slow — a 50-day simple moving average (the most-watched intermediate-term reference)
The classification rule for each signal is mechanical:
| State | Condition |
|---|---|
| Constructive | the ratio is above its fast line and the fast line is above the slow line |
| Cautious | the ratio is below its fast line and the fast line is below the slow line |
| Mixed | any other configuration |
The 21- and 50-day periods are deliberate. They align with how institutional flows are framed and avoid the whipsaw of shorter periods. They are not optimized to a backtest, and they are not changed without a published methodology revision.
How the aggregate read is built
The aggregate market read is derived from the count of signals in each state:
| Aggregate read | Count condition | Confidence |
|---|---|---|
| All clear | 5 or 6 signals constructive | High |
| Mostly clear | 4 signals constructive | Medium |
| Mixed signals | anything else | Low |
| Some caution | 4 signals cautious | Medium |
| Cautious | 5 or 6 signals cautious | High |
A reader who downloads the same ETF closing prices from any free source — yfinance, Yahoo Finance, Google Finance, the Wall Street Journal, an SEC filing — and reproduces the moving averages will arrive at the same aggregate read. The math is reproducible from public data. That reproducibility is the entire point.
Edge cases the engine must handle
The engine is built for the live tape, which is messy. It explicitly handles:
-
Insufficient data. If a signal does not have at least 50 days of price history (rare, only on a newly-listed ticker), it is marked "no data" and excluded from the count. Aggregate confidence drops to "low" if any signal is missing.
-
Stale data. If the most recent close is more than four calendar days old, the engine logs a warning. Markets close on weekends and holidays, so the four-day tolerance covers long weekends without firing false alarms.
-
Data fetch failure. If the price feed returns empty for any ticker, the engine retries once after a short delay. If that also fails, it falls back to the last persisted aggregate read and the morning brief explicitly notes the data issue.
-
Same-day repeat calls. The aggregate read is computed at most hourly during market hours and at most every six hours after close. Repeated calls hit a cache, which keeps the engine cheap and prevents redundant external API calls.
What the framework does NOT do
- It does not predict short-term price direction. A constructive read is not a buy signal; a cautious read is not a sell signal.
- It does not generate buy or sell signals on individual stocks. Macro Lens addresses the market and the regime — never specific securities.
- It does not "time the market" in the literal sense.
- It does not replace fundamental analysis or risk management or the diversification a sensible investor already maintains.
What it does do, reliably, is keep the reader positioned with the prevailing flow of capital and out of the way when that flow reverses. Across history, that alone is more durable than most signal frameworks designed for retail.
Versioning policy
The framework is versioned. The current version is v1.0.
Future revisions may:
- Add additional signals — for example, a volatility overlay, a breadth confirmation signal, or a rates-sensitivity ratio
- Adjust aggregation thresholds based on observed false-positive rates
- Add a momentum confirmation layer
Version history is maintained on this page with effective dates. This is how a serious analytical publication treats its own infrastructure.
How the AI synthesis layer fits in
The framework above produces a single structured output every morning: the aggregate read, the per-signal states, and a small set of narrative hooks (which signals are leading, which are lagging, which are close to a state change). That structured output is the input to the AI synthesis layer.
The AI's job is to translate that structured input into plain-language prose. It is constrained — by prompt and by post-output validation — from contradicting the framework. If the framework reports constructive, the prose sounds constructive. If the framework reports cautious, the prose sounds cautious. The AI carries voice; the framework carries the analytical weight.
This separation is the single most important design decision in the product. Generic AI-fintech products mix the two layers, which is why their output is unreliable. Macro Lens keeps them clean.
Reproducibility — the trust artifact
If you want to reproduce a Macro Lens read for any historical date:
- Pull daily close prices for SMH/SPY, XLY/XLP, XLF/XLU, IWM/SPY, HYG/TLT, XLE/SPY for the prior 200 days
- Compute the 21-day and 50-day simple moving averages of each ratio
- Classify each ratio as constructive / cautious / mixed using the rule above
- Count and aggregate using the table above
You will arrive at exactly the same aggregate read the engine arrived at. There is no proprietary feed, no private model, no hand-tuning. That reproducibility is what we publish — and it is the foundation of every brief and every "Should I worry?" answer.
Methodology version 1.0 · Last updated: 2026-05-04
Revisions to the framework will be announced on this page and in the methodology page with effective dates and rationale.