Rime

A daily regime allocator for leveraged equity ETFs

A systematic daily allocator that rotates between leveraged equity ETF exposure, a volatility hedge, and cash.
Published

April 2026

Weaver Capital LP · deployed strategy · Python, pandas, NumPy, Alpaca API, Streamlit

Rime is a daily allocator. Each morning it splits capital between leveraged equity ETF exposure, a volatility hedge, and cash. It’s been running live on Alpaca since April 2026.

There are three parts to it: a base signal, a macro and risk overlay sitting on top of that, and the infrastructure that runs the whole thing unattended. The sections below take them in that order.

1.86
Sharpe, simulated
2012–2025 · SPY 0.92
1.58
Sharpe excluding 2020
the honest number
−17%
Max drawdown, simulated
SPY −34% same window
~44%
Average gross exposure
not fully invested

The gap between those two Sharpe figures is 2020. The volatility hedge had an enormous run during the COVID crash, and a stretch like that lifts the headline number for the whole period. Both are on this page because 1.58 is the better guide to what the strategy does in an ordinary year.

Figures above are simulated results from a historical backtest over 2012–2025, not live trading results. Simulated performance has inherent limitations: it is constructed with hindsight, does not reflect the impact of real order flow, and does not guarantee future results. A live track record is available on request.

The problem

Leveraged index ETFs decay in choppy markets. They rebalance daily, so the compounded return depends on the path and not just the endpoint. A sideways market grinds them down even when the index finishes flat. Holding one indefinitely is a bet that volatility stays low.

Rime asks something narrower: can you hold that exposure only while the drag is small, and be somewhere else the rest of the time?

How it decides

The base signal. A shallow decision tree over a set of trend and volatility state variables. It’s shallow on purpose. Fourteen years of daily bars isn’t a big sample, and every extra split is another chance to fit noise.

The macro and risk overlay. The macro layer leans on cross-asset series that tend to move ahead of equities rather than alongside them. Over that sits a volatility circuit breaker, which cuts leveraged exposure when volatility spikes. It runs on hysteresis, so the level that switches it on isn’t the level that switches it off, and the allocation doesn’t thrash around a single threshold. A rebalance deadband covers everything: if the target hasn’t moved much, nothing trades.

The specific state variables, macro series, and thresholds aren’t published here. Happy to walk through them in an interview.

The infrastructure

One decision function. Research and production call the same function. There’s no notebook that approximates what the live system does, because that gap is the usual way a backtested strategy quietly stops being the strategy you tested. State persists between runs, so the live system’s view of the current regime survives a restart instead of being rebuilt from a truncated window.

Data quality gates. Bad ticks, stale bars, and missing sessions get caught before anything reaches the allocator. If the feed looks wrong, the system sits out.

47 pytest tests across the signal tree and the risk overlays, covering regime transitions, breaker behavior at the hysteresis boundaries, and deadband logic. Mostly they exist so I can change things without guessing.

Validation

One backtest number doesn’t tell you much, so I put it through a few things that could have killed it:

Walk-forward folds Parameters fit on one window, evaluated on the next, rolling forward. No single global fit.
Pre/post-2020 splits 2020 is an outlier regime that flatters almost any volatility-responsive strategy. Reported separately for exactly that reason.
Slippage & commission stress Costs scaled well past realistic levels to find where the edge disappears.
Block bootstrap Resampling in blocks to preserve autocorrelation, testing whether results depend on the specific historical path.

Of those four, the 2020 split is the one that changed how I report the strategy. Quoting only the number that includes it would overstate what Rime does in a normal year, which is why both figures sit at the top of this page rather than buried down here.

What I’d do next

  • Swap the shallow tree for a probabilistic regime model, and check honestly whether it beats the rules instead of assuming it will.
  • Model execution against intraday liquidity rather than assuming a fill at the daily close.
  • Widen the macro overlay carefully. More inputs are more degrees of freedom.