DDeterministic Macro ModelResearch framework · development through 2022

Our backtesting and evaluation framework

Follow the evidence,
from inputs to outcomes.

See how economic news becomes a forecast and a portfolio, then how we test whether a change improves the result.

Part 1 · How the model works

How does economic news become a portfolio?

First understand the investment process. Then see how our framework tests changes to it.

  1. 01 · Economic surprises

    What differed from expectations?

    Subtract the consensus forecast from each actual release. Divide by the spread of earlier forecast misses so different releases can be compared.

    Surprise = (actual − consensus) ÷ earlier miss standard deviation
  2. 02 · Model inputs

    Summarize the economic picture.

    Average the available standardized releases into Growth and Inflation signals. Add financial conditions, geopolitical risk and eligible policy information; the reference model also includes specified interactions.

    A positive surprise means above consensus; it does not automatically mean “buy stocks.”
  3. 03 · Return forecasts

    Learn from earlier months.

    The reference model uses a separate Ridge regression for each asset’s next-month return. Ridge limits coefficient size. Training-only input limits and policy-history checks address unstable inputs.

    The method experiment compares Ridge with simpler forecasts using its own shared input set.
  4. 04 · Black–Litterman

    How much should we trust the forecast?

    Combine the model’s predictions with reference returns implied by the 45 / 35 / 20 mix and historical asset risk. Earlier completed forecast errors determine view uncertainty; greater uncertainty reduces a forecast’s influence.

    This produces adjusted return estimates. Portfolio weights are chosen in the next step.
  5. 05 · Portfolio allocation

    Turn estimates into holdings.

    Choose weights using adjusted returns, how the assets move together, risk and a penalty for changing holdings. Apply allocation limits, then account for trading costs.

    SPY: U.S. stocks · IEF: U.S. Treasuries · LQD: investment-grade corporate bonds

A small surprise example

If the actual release is 100, consensus is 90 and the earlier miss standard deviation is 5, the standardized surprise is +2: (100 − 90) ÷ 5.

Illustrative numbers, not an observed release. This measures surprise relative to expectations, not how good the economy is.

What is our contribution?

The underlying investment process is the starting point. Our contribution is a framework for testing added signals and forecasting methods under controlled conditions, with longer forecast horizons planned.

Inputs and forecasting methods can change within an experiment. The portfolio construction rules stay shared within that comparison.

What do risk, uncertainty and allocation limits mean here?

Risk and uncertainty are different.

Asset risk (Σ) describes how SPY, IEF and LQD moved together over the earlier 36 months, with at least 24 required. Forecast uncertainty (Ω) uses the variance of each asset’s earlier completed prediction errors, with at least 12 required.

The reference returns are implied by the chosen benchmark mix and historical risk. They are not a separate economic forecast.

A stronger forecast need not mean a larger weight.

The allocation step considers all three assets together. The corrected reference allows SPY 20–70%, IEF 15–60% and LQD 10–40%, with weights adding to 100%, on a one-percentage-point grid.

Holdings drift between trades. Costs are 5 basis points per dollar traded, using the full absolute change in weights. The 45 / 35 / 20 mix is the initially funded reference, not a reset every month.

Follow one saved decision

See the whole chain for one month.

Corrected reference model · saved development results only · starts with the earliest decision. This explains one model’s mechanics; the signal and method experiments have different specifications.

1 · Information at the decision

The starting inputs

These are input values before the model’s training-window processing. Growth and Inflation average standardized release surprises. Index values and surprise scores use different units.

Economic histories include later revisions and assumed availability dates. This is not a complete reconstruction of what was known in real time.

2 · Learn from earlier outcomes

What could training use?

Missing values, input limits, scaling and Ridge tuning use earlier training data. Unsupported policy features contribute zero.

The inputs alone do not explain why an individual forecast moved; that requires examining the fitted coefficients and processed features.

3 · Predict, then account for uncertainty

From raw forecasts to Black–Litterman estimates

All returns below refer to the same upcoming holding period. The bars share one scale across assets, stages and selected dates.

Saved return estimates and earlier error dispersion by asset
AssetRaw Ridge forecastAfter Black–LittermanEarlier error spread

Earlier error spread is the square root of the saved error variance used in Ω, expressed in percentage points; it is not a confidence interval or RMSE. Black–Litterman combines the reference, asset covariance and forecast uncertainty. It does not simply clip forecasts or shrink each one toward zero.

4 · Choose and trade weights

What did the model hold?

“Before trade” includes the previous holdings’ drift. Trading costs are deducted at entry; both sides of a switch count toward traded weight.

5 · Observe the later outcome

What happened afterward?

The realized return was unavailable when the decision was made. Open it after inspecting the forecasts and weights.

Reveal the later outcome

One month illustrates the process. It does not establish skill; use the full matched sample to judge performance.

This walkthrough reads saved results. It does not rerun the model or inspect the reserved test. Download the saved research results.

Part 2 · How we test changes

Five steps, with a record of each decision.

The saved outputs let us inspect where a result came from rather than looking only at the final return.

  1. 01

    Set the information cutoff

    Build macro surprises and risk inputs using the observations treated as available by the decision. Keep source dates and availability assumptions.

  2. 02

    Train and predict

    Learn from earlier completed returns. Fit missing-value treatment, input limits, scaling and tuning within each training window.

  3. 03

    Account for uncertainty

    Black–Litterman combines forecasts with a historical-risk reference. Each model’s uncertainty comes from its own earlier completed forecast errors.

  4. 04

    Build and trade the portfolio

    Choose SPY, IEF and LQD weights within fixed limits. Trade after the decision, account for drift and charge the same cost rule.

  5. 05

    Evaluate what happened

    Compare prediction errors, returns, daily losses, turnover and costs. Check the full sample before focusing on individual episodes.

Follow one saved monthly decision through these steps →

Controlled experiments

What changes—and what stays fixed?

“Same rules” applies within an experiment. The two completed studies have different input sets and slightly different coverage.

StudyWhat changesWhat stays fixedCurrent sample
Added signalsOne added input group: claims, credit or curveOriginal wider-input Ridge pipeline, dates and portfolio rules
Forecasting methodsHistorical mean, OLS, Ridge, Elastic Net; then separate lag/interaction extensionsShared eligible rows, training procedure and portfolio rules; core methods share inputs
Forecast horizonsPlanned: one-, three- and six-month return targetsTarget alignment, completed-target rules and trading design must be specifiedOne month evaluated; longer targets not run

No unfinished training outcomes

A return target must finish before it can enter training or an earlier-error estimate. The same timing check applies inside tuning folds.

Compare the same dates

Use matched observations within each study. A method with a shorter usable history cannot quietly receive an easier comparison period.

Carry the portfolio forward

Holdings drift with asset returns and are not reset at episode boundaries. Costs use the full weight change from those drifted holdings.

Two levels of evaluation

A good return is only part of the evidence.

Simple benchmarks make the added value of macro information easier to assess.

First: were the predictions useful?

Compare each asset with a forecast of its past average return.

  • Average miss (MAE): how far off were forecasts?
  • RMSE: did large mistakes dominate?
  • OOS R²: did squared errors beat the past-average forecast?
  • Extreme predictions: were any forecasts implausibly large?

Then: did the portfolio improve?

Use the same construction and cost rules within the study.

  • Total return after trading costs
  • Largest daily fall from a previous peak
  • Trading turnover, costs and weight-limit frequency
  • Performance across years, episodes and rolling windows

Rolling windows overlap, and small episodes are not independent experiments. Bootstrap intervals are exploratory and conditional on the saved portfolio paths; they do not refit models or correct for trying multiple variants.

Reliability is part of evaluation

A case study: the framework caught unstable forecasts.

The original model’s +589% SPY prediction exposed a sparse policy input with a tiny training scale. We traced it, compared repairs, and reran a corrected reference model. This is a quality check within the research—not its whole contribution.

The correction uses earlier-data input limits and explicit policy-history and variation checks. The original 23.99% remains a diagnostic comparison. The initial added-signal runs have not yet been repeated with this corrected specification.

Prediction checks

Which fixes stopped the extreme predictions?

Compare prediction errors first, then portfolio returns. The original model is shown to explain what changed.

Forecast quality · selected asset, identical dates
VersionMAE ↓RMSE ↓OOS R² vs. mean ↑Largest |forecast||Forecast| >20%

R² = 1 − model squared error ÷ expanding-mean squared error, using the same months. Negative means worse than the historical mean. The 20% flag is an inspection rule, never a return cap. Zero flags does not establish good forecasts.

Selected forecastRealized returnHistorical-mean forecast
Every flagged forecast · all assets in the selected sample
VersionDecisionAssetForecastRealizedLargest feature contribution
Accuracy by calendar year · selected asset and version

Common portfolio dates, with continuous holdings. Partial years are labeled. These small windows are diagnostics.

Holding yearMonthsSelected RMSEMean RMSEOOS R² vs. meanLargest |forecast|

Then inspect the portfolio tradeoff

All rows use the same 44 allocated development months and the same BL, trading costs and weight bounds. Each model uses its own prior completed forecast errors for view uncertainty. Portfolio results do not determine which forecast repair is acceptable.

Full common portfolio history · unaffected by the forecast sample selector
VersionNet total returnDaily max drawdownMonthly turnoverTrading costs*Months at any weight bound

*Sum of monthly trading-cost fractions, in basis points, rather than a compounded return drag. At-bound counts refer to rebalance weights. A lower return can accompany a more reliable forecast.

Reproduce the January 2020 failure from the original inputs

January 31 decision · February holding interval · original model
AssetTraining target meanAll feature contributionsReconstructed forecast6m change coefficient*6m change contributionActual return

*Coefficient is in decimal return per training standard deviation. Multiplying it by −5,454.09 reproduces the policy-change contribution before percentage display rounding.

Source workbook snapshots through the decision · levels and differences in percentage points
SheetSource dateOriginal levelChange from preceding snapshot
Policy rows whose return targets had finished by January 31
Feature monthPolicy source dateTarget exit6m policy level6m policy change

What remains before the final test?

The corrected reference rules and evaluation criteria are pinned by the locked-version record below. Confirm with the team whether 2023 onward remains unexamined and obtain separate authorization for the reserved-period run. The development commands reject reserved holding months.

Revised macro histories and assumed publication lags remain a separate limitation. A real-time vintage archive would require additional work, including ALFRED vintages where supported.

Inspect the corrected reference model’s results and locked rules

Updated model · development results

Does the model beat a simple forecast?

We fixed the model’s unstable predictions, then tested it against a simple approach: predict each asset’s past average return. Both forecasts use the same portfolio rules and trading costs.

Model’s total return, after costs
Past-average forecast portfolioSame months, portfolio rules and costs
Largest predicted monthly move
Largest portfolio fallFall from an earlier peak, using daily values
How far off were the monthly predictions? Smaller is better.
AssetModel’s average missPast-average forecast’s miss

“Average miss” ignores whether the prediction was too high or too low. A 5-percentage-point miss means predicting +2% when the actual return is −3%, for example. These numbers use the same 44 portfolio months.

See the detailed forecast scores
AssetModel MAEPast-average MAEModel RMSEPast-average RMSEOOS R² · portfolio monthsOOS R² · all forecast monthsAll improvement checks passed?

MAE is the average miss shown above. RMSE gives more weight to large mistakes. OOS R² compares the model’s squared errors with the past-average forecast: positive is better, negative is worse. We require positive R² and no worse MAE in both sets of months before describing an asset’s forecast as improved. These development comparisons do not establish statistical significance.

How did the portfolios perform?
Model / comparisonTotal return after costsLargest fall from a peakAverage traded each monthTrading costs*

The past-average forecast uses the same Black–Litterman step and portfolio rules as the model. Fixed mixes and SPY-only provide additional comparisons, with different risk levels. *Costs are the sum of monthly cost rates; 1 basis point is 0.01%. This is not the compounded reduction in returns.

What did we fix?

The original model once predicted a monthly SPY return of about +589%. A policy input had very little observed history and barely changed in training, so a new value was magnified during scaling. We now limit unusual inputs using earlier training data and switch off policy inputs until they have enough history and variation. The updated model has no predictions beyond ±20% in this development sample. The old 23.99% portfolio return remains below for comparison; it is not the updated result.

How much policy history is enough to use an input?

We require enough original observations and enough variation before using a policy input. Filled-in or carried-forward values do not create new observations. If an input fails these checks, it has no effect on the forecast.

The exact rules are 12 distinct source observations, three distinct values when rounded to one-basis-point bins, and a standard deviation of at least one basis point before and after filling missing values and limiting extreme inputs. One basis point is 0.01 percentage points. These fixed safeguards are repeated in every training and tuning window; they are not proof that an input helps predict returns.

Policy inputOriginal observationsDistinct values · 1bp binsObserved standard deviation · ppAfter processing · ppUsed? / reason

The rules are locked. Final testing comes next.

We chose these rules after reviewing the development data, so the results above are not a final test. This version has not been tested on 2023 onward. Before using those years for a final test, the team needs to confirm that they have not already influenced the model’s design. The data also include later revisions, and some release dates are assumed; fixing the predictions does not remove those limits.

Download and check the exact rules

Limits and the final test

State what the evidence cannot yet establish.

The development work supports comparisons and diagnostics. It is not an untouched confirmation of a selected strategy.

Revised histories

Some economic values were revised later. Availability lags approximate historical access; they do not reconstruct all real-time vintages.

Short evaluation history

There are few independent stress episodes. Year and boundary checks help describe sensitivity but do not establish broad robustness.

Different study scopes

The original signal study, compact model comparison and corrected reference answer different questions. Their results should not be pooled into one ranking.

Reserved years not evaluated here

The team must confirm whether 2023 onward remains unexamined before a separately authorized final test. Longer forecast horizons also remain untested.

Read the experiment

Exact settings and data sources

Download research results (.json)
Longer training history

Adjusted SPY, IEF, and LQD prices begin in 2010. Training begins February 2015, requires 36 completed targets, and expands each month. BL waits for 12 earlier forecast errors.

One addition per experiment

The same Ridge → BL → allocation pipeline is rerun for the original and three added-condition versions. Fixed robustness checks change only preprocessing/shrinkage or the inclusion of policy fields. Claims, credit spread, and yield curve are tested separately, without choosing settings for each episode.

Trade after the decision

Decide at 8 p.m. New York on the last trading day. Enter the next trading day’s close and hold until the next rebalance close. The displayed holding month names the entry month.

Same portfolio rules

Starting mix 45 / 35 / 20. SPY 20–70%, IEF 15–60%, LQD 10–40%. Risk aversion 2.5, BL τ = 0.05. Costs are 5 bp per dollar traded from drifted holdings.

How this differs from the original MVP results

The research baseline is a fresh run, using longer price history, exact next-trading-close execution, completed targets only, and imputation fitted separately inside each tuning fold. Daily drawdowns also differ from the original monthly drawdowns. Compare signal experiments with the baseline on this page; the original MVP remains available in its tab.

Data limits and the reserved test

Claims, ANFCI, and GPR use revised histories with availability lags, not a complete real-time vintage archive. The workbook’s policy paths start in September 2019; earlier missing policy fields use training-only medians, or zero when the entire training column is missing. These are exploratory development results. No post-2022 strategy decisions are evaluated. The January 3, 2023 quote only closes December 2022’s holding interval.

These episode labels are evaluation windows, not information supplied to the model. The COVID market-shock window is not the same as the official recession chronology. Drawdown recovery is reported only within the selected window.

Units, forecast stability and audit settings

The combined robust-input sensitivity clips inputs to training-only 1st/99th percentiles and uses the fixed Ridge grid 1, 10, 100, 1000. Preprocessing and target-availability checks are repeated in every tuning fold. Separate clipping-only and shrinkage-only experiments isolate those two changes. The policy coverage safeguard disables each policy feature until it has 12 observed training values, inside every fold. This fixed sensitivity threshold does not certify a stable model. There is no cap on predicted returns. Without-policy sensitivity removes five policy-path fields over identical evaluation dates; it cannot reconstruct missing policy history.