AQAI QuantAI research lab for systematic strategies

Automated analysis

This analysis was drafted by our research engine and has not been checked by a human editor. It may contain errors. It separates the paper’s own results from our tests, and any figures called ours come from our own backtest.

Our automated analysisOur backtest

Forecast-triggered re-plans cut drawdowns, rarely outgrow a 21-day calendar

A 373-stock MPC system beat simulated SPY during crashes even with random picks, suggesting lower beta than SPY.

2026-11-03 · 8 min read · Trend/Beta Allocation and Event-Triggered Rebalancing · US equities, with SPY as a market signal and benchmark.

Reviewing: Interpretable Allocation and Model-Predictive Rebalancing of Equity Portfolios, Tested on Real and Synthetic Markets · Jeffrey D. Varner · Read it on arxiv

Our backtest of this idea

Our automated quick test, not the paper's

Global Positive-Growth Cobb–Douglas Allocation with Event-Triggered Replanning

Backtest period 2020-01-01 to 2024-07-01 · hypothetical, net of modelled costs

Why these figures are not the paper's (1)

Our own audit found this run does not follow the paper faithfully (9)

  • Eq. (4), online fit with an exponentially decaying calibration prior.: Use finite trailing 252-return EWLS with decay 2^(-1/63), including the decision-close return, without calibration pseudo-observations. (invalidates: Direct numerical replication of Table 2, Table S9 and Table S10 source results)
  • Eq. (7), constrained allocation with budget, name caps, volatility, spread-priced share-change budget and hedge-on beta cap.: Use the hedge-off constraints, a trailing SPY volatility cap, all existing holdings in turnover, and a binding ten-percent platform name cap instead of max(0.10,1.5/13). (invalidates: Direct numerical replication of source allocation weights and Tables 2, S9 and S10)
  • Eq. (3), execution cost: C(q) = c̄ S_i^o |q| + κ (|q|/A_i) S_i^o |q|.: Use V_i=|q_i|*adjusted_open_i and C_i=0.0005V_i+0.001V_i²/ADV63_i from dollar volume. (invalidates: Exact replication of source cost totals and Table S9 cost increases)
  • Appendix Eq. (S5), recursive sums: S_w ← δS_w+1, S_x ← δS_x+g_M(t), S_y ← δS_y+g_i(t), S_xx ← δS_xx+g_M(t)², S_xy ← δS_xy+g_i(t)g_M(t).: Recompute the corresponding weighted sums on the finite trailing regression window, dropping all older observations. (invalidates: Expanding-prior coefficient-path replication)

5 further finding(s) are described in the note.

These are our findings about our own implementation, not criticisms of the paper. Read the figures below as a description of what we ran.

Jan 2020Total 8.5%Jul 2024
Sharpe
0.89
Total Return
8.5%
Max Drawdown
-2.7%
CAGR
1.8%
Volatility
2.1%
Beta vs SPY
0.06
Trades
1,492

What the paper reports for its own strategy

  • Real backtest, 2025-01-02 to 2026-09-04, hedge off, median of 30 runs, net of 5bp half spread + linear impact, prices excluding dividends: terminal wealth ratio WT/W0 of 1.031-1.697 across 70 cells, vs SPY buy-and-hold 1.317
  • Global gamma 13 names, hedge off, same period and costs: WT/W0 1.248-1.520 across weighting rules (CD 1.520)
  • Gamma per sector 33 names, hedge off: WT/W0 1.086-1.234 (below SPY 1.317 in every cell)
  • Hand-picked 13 (author-chosen list), hedge off: WT/W0 1.443-1.697
  • Hedge on, global gamma 13 names: WT/W0 1.203-1.589 (Table S7)
  • Max drawdown reduction from triggers vs calendar-only on real prices: up to 0.053 (hedge off, global gamma), smaller in 55 of 70 cells

Re-planning after a portfolio misses its forecast buys drawdown protection at a trading cost: about 0.01 less drawdown in the median cell. On real prices, the reduction reached 0.053 with the hedge off. Varner measures this through paired runs. Each of 4,200 real runs has a calendar-only twin, sharing its seed, selection rule, weighting rule and hedge setting. Switching off the band exit and drawdown stop leaves that twin to re-plan every 21-day interval.

Across 2025-01-02 to 2026-09-04, the triggered portfolio had a smaller median maximum drawdown in 55 of 70 hedge-off cells. The largest reduction was 0.053. With the hedge on, the count rose to 61 of 70 and the reduction reached 0.054. Yet median terminal wealth improved in only 38 and 26 of those 70 cells. Differences between cells ranged from -0.093 to 0.191 of initial wealth without the hedge, and from -0.180 to 0.183 with it.

Trading cost rose by 3 to 33% against the calendar twins, or 4 to 45% with the hedge on.

The 400 simulated sell-offs tell much the same story. Drawdown fell in 65 to 70 of 70 cells, with reductions reaching 0.022. Wealth improved in 33 and 28 cells in the burst set, compared with 51 and 56 in the bear set. Varner's conclusion is direct: "The triggers therefore limited losses more than they added growth, and the protection they gave did not grow with the depth of the decline." The ablation is the contribution here. Where event-triggered rebalancing is usually defended through no-trade-region theory, this paper measures it against a matched calendar control. The comparison covers every cell in the real main comparison and both stress sets.

Inside the allocation rule

The system assigns every stock a score called gamma. To calculate it, a single-index fit supplies expected growth: an intercept plus beta times a 252-day exponential moving average of SPY growth. The score takes the hyperbolic tangent of that expected growth divided by absolute beta, with absolute beta floored at 0.1 and raised to the power xi. Xi represents the market state. It comes from SPY's EMA21/EMA63 ratio, scaled by a gain of 21.23. When the short average is below the long average, xi is positive; this occurred on 75 of the 420 trading days. Positive xi penalises high-beta stocks, while negative xi rewards them. The defensive tilt therefore arrives after the market has turned.

Selection by gamma takes either 13 names from the whole universe or three per sector (33 names). Other choices include an epsilon-greedy bandit for each sector, random selection, and two lists chosen beforehand by the author. Seven weighting rules determine share counts. Four use consumer-theory utilities, treating gamma as the preference weight. Under the budget alone, Cobb-Douglas allocates invested wealth in proportion to gamma. The remaining three are minimum variance, tangency and a 130/30 book.

Every rule faces a 10% name cap, increased to 11.5% at 13 names, as well as a turnover budget. Portfolio volatility is capped at SPY's 2014-2024 level, 17.3% annualised. The optional hedge limits portfolio beta to max(0, 1 - xi). It also allows up to five names with zero or negative beta, called the hedge pool.

At a re-plan, the controller generates 1,000 multi-asset geometric Brownian motion (GBM) paths over the next 21 trading days. Re-planning happens when 21 days have elapsed, when wealth crosses the forecast's 1.96-SD band, or when it drops 8% below its peak. After that drop, the peak resets. Early decisions accounted for between 0.20 and 0.61 of re-plans per cell. Each decision solves the same capped allocation problem again, starting from current holdings. As the paper explicitly says, this "does not by itself reduce exposure." The 8% stop prompts another allocation decision; it contains no requirement to move toward cash. The data comprise 373 S&P 500 names calibrated on 2014-2024. Costs are a 5 bp half spread plus linear impact, and neither side receives dividends.

Why do random picks beat simulated SPY in crashes?

Varner goes beyond the single real path by using synthetic markets. These come from per-asset JumpHMM generators developed in earlier work with Alswaidan, combined here with drifting betas and sector factors. A generator uses a hidden Markov model of binned daily growth, interrupted by occasional multi-day jump episodes. From 10,000 paths, he retained 600 typical futures. He also selected a burst set, the 200 deepest SPY drawdowns among paths containing a jump episode, and a bear set, the 200 deepest among paths without one.

Every cell median exceeded both simulated SPY and the equal-weight universe in both stress sets. The weakest bear-set cell finished at 0.774, against 0.718 for SPY and 0.753 for equal weight. The corresponding burst-set figures were 0.924, 0.865 and 0.916. Even with the triggers disabled, the weakest cells finished at 0.772 and 0.930.

Random selection cleared those benchmarks too. The paper concludes that "the margin came from shared parts of the system, not from stock selection or re-plan timing," with Varner identifying lower market exposure as the likely explanation. I agree. The paper's beta measurements support that reading: mean portfolio beta without the hedge ranged from 0.229 to 0.850 in the bear set, where SPY's median growth rate was -0.199 per year.

Our own rough arithmetic illustrates the issue. Simulated SPY finished the bear set at 0.718; a portfolio with beta 0.5 takes roughly half that market loss before stock selection contributes anything. The paper also notes that the uncapped equal-weight universe beat SPY by 0.035 in the bear set and 0.051 in the burst set. Some of the gap therefore comes from the generator. Varner acknowledges that the volatility cap was never disabled. I did not find a SPY-plus-cash benchmark matched to the portfolio's beta. Until that comparison exists, I read the stress performance as an exposure result.

The hedge's results fit this explanation. It reduced median wealth in 50 of 70 real cells, with a median change of -0.033. In the bear set, it increased wealth in 65 of 70 cells, with a median change of +0.029.

Selection mattered more than weights

The allocation comparison is easier to interpret. Holding selection fixed, the seven weighting rules produced a median spread of 0.14 in terminal wealth. Changing selection produced a median spread of 0.518. Excluding the hand-picked lists leaves 0.274 against 0.135.

At 13 names, global gamma finished between 1.248 and 1.520, compared with 1.031 to 1.160 for 13 randomly selected names. SPY finished at 1.317. The distinction was less clear at 33 names: sector gamma's 1.086 to 1.234 and the bandit's 1.140 to 1.239 overlapped random sector selection's 1.127 to 1.205. Larger baskets also weakened the edge. At 200 names, random Cobb-Douglas finished at 1.211, ahead of global gamma at 1.185.

A favourable window, a persistent generator

Varner identifies the limitations himself. He designed the 13-name rules after seeing the per-sector results, and describes that comparison as exploratory. The universe consists of current index members that traded every day from 2014 to 2026; the paper acknowledges the survivorship bias. The hand-picked list returned 1.443 to 1.697, a result that, in his words, "cannot be separated from chance." Real SPY landed at the 70th percentile of simulated SPY. This was a favourable window.

In typical futures without the hedge, global gamma beat 13 random names drawn from the full universe in 62.3 to 71.2% of paths. But the generator assigns each stock a constant intercept. The correlation between calibration and trading-window intercepts was 0.10 in those simulations, compared with -0.12 in reality. The paper itself says this gave score-based selection more help than the real market did.

The bear futures expose that weakness. Without the hedge, global gamma at 13 names beat 13 random names in just 28.0 to 38.0% of paths under gamma-weighted rules. MinVar and Tangent ignore gamma when setting weights. They reversed the comparison, winning in 70.0% and 71.0% of paths.

What happened in our build?

We implemented global gamma at 13 names using Cobb-Douglas weights and no hedge. Our universe was the yearly top-500-by-capitalisation, and our run covered January 2020 to July 2024. The following figures are ours: an 8.53% total return, about 1.8% a year, with 2.13% annualised volatility and a 2.69% maximum drawdown. The run made 1,492 trades. For the same cell, the paper reports 1.520, roughly 52% over 20 months, against SPY's 1.317. Our return is far lower. Different windows, universes and cost models prevent a like-for-like reading of the gap.

The volatility and drawdown help diagnose our result. A portfolio that passed through the 2020 crash and 2022 with a worst drawdown of 2.69% and beta to SPY of 0.06 behaved like a mostly-cash book. The paper's hedge-off real-data cells had mean betas between 0.388 and 0.903.

Several differences are known. Our window was harsher. We charged $0.004 per share with a $1 minimum, executed at the close instead of the next open, and capped individual names at 10% rather than 11.5%. These differences all push our result down, though by much less than the observed gap. Removing survivorship should also have a cost. Even so, the paper's random controls on its biased universe returned 1.031 to 1.274.

Our explanations for the near-cash behaviour remain hypotheses. The share-change budget is one candidate: we priced it at the mean price of a 500-name union containing some very high-priced shares. Other candidates are cash targets when every score is non-positive, solve failures that leave holdings frozen, and a volatility cap estimated from trailing 252 returns. We also fitted scores without the paper's calibration prior. Noisier scores could remove the selection edge, though that too is a hypothesis. We cannot account for the gap from what we can see. It tells us about our implementation first.

A beta-matched SPY-plus-cash control and a run without the volatility cap would change my reading of the stress results. The drawdown reduction from the triggers already stands.

Our backtest stops at 2024-07-01, and everything after that date is deliberately left untouched so the same strategy can be checked out of sample later.

How our backtest worked

The steps the code we ran actually executed, from its strategy card. Ours, not the paper's — it is one automated implementation of the idea, not the authors' own.

At each supported SPY session close:
  Update actual holdings, cash accrual, wealth and separate trigger/lifetime peaks.
  Apply the applicable yearly top-500 membership; flag unverified screen availability.
  Estimate annualized log-growth EWLS alpha/beta and residual covariance.
  Compute SPY EMA trend state xi and expected growth mu_i = alpha_i + beta_i * market_growth_EMA.
  Score gamma_i = tanh(mu_i / max(abs(beta_i), 0.1)^xi).

Replan at initialization, yearly eligibility changes, or economic triggers:
  Priority: drawdown > 8%, horizon >= 21 sessions, two-sided forecast-band exit.
  Rank eligible names by descending gamma, then ascending symbol_key.
  Select at most 13 strictly positive scores; otherwise target cash.
  Maximize sum(gamma_i * ln(target_shares_i)) subject to:
    long-only shares, nonnegative cash, 10% name cap,
    trailing-SPY volatility cap and spread-priced share-change budget.
  Set unselected targets to zero; remove targets <= 0.1% of wealth.
  If the constrained solve fails, retain the entire actual book; do not equal-weight.
  Build 1,000 fixed-share wealth forecasts over 21 sessions.
  Reset forecast time, including after failed solves.

Specification execution:
  Queue targets for subsequent real adjusted opens; sell before buying.
  Scale purchases to available cash, including specified execution costs.
  Retain pending targets when an open is unavailable; never fabricate fills.

Reported platform execution:
  The charged-cost record identifies daily MOC fills at the official close.
  This differs from the specification's next-open policy; the truncated code
  does not establish which execution path generated the complete blotter.