Skip to content
All strategies

Strategies

KitchenSink ML (QuantRocket) price/volume/breadth subset: numpy ridge forecast of next-week return, weekly long top-10 / short bottom-10 among 68 US large caps on USEQ daily bars

Outcome: Abandoned

KitchenSinkRidgeWeeklyLSUseq

Outcome Summary

KitchenSinkRidgeWeeklyLSUseq operationalized QuantRocket's TheKitchenSinkML framework without the fundamental, sector, VIX and TRIN data the platform lacks: a numpy ridge regression ranked 68 large caps weekly into a 10-long / 10-short dollar-neutral book. On a reliable sample of 3,597 closed positions it lost 7.9% with Sharpe -0.16, PF 0.973 and five of seven years negative; nearly all of its gains came in the 2022 rate-shock regime while the normal-volatility tercile lost 13.9%. The forecast's IC was -0.10, so at backtest review the analyst abandoned it before optimization (iteration 1) for negative expectancy unrelated to costs. The rejection covers only this operationalization, not the full source framework.

Hypothesis

Derived by the Research Lead from QuantRocket's open-source MoonshotML strategy 'TheKitchenSinkML' (kitchensink_ml.py, Apache-2.0; credit QuantRocket LLC). The source is an ML framework, not a complete strategy: MODEL = None, so the user supplies the estimator and trains it in a separate walk-forward. Its fundamental, Piotroski F-score, ADR and sector features need Sharadar fundamentals and a securities master that this platform does not hold. VIX and NYSE TRIN are also unavailable (the source itself fills those……Show moreShow less

Derived by the Research Lead from QuantRocket's open-source MoonshotML strategy 'TheKitchenSinkML' (kitchensink_ml.py, Apache-2.0; credit QuantRocket LLC). The source is an ML framework, not a complete strategy: MODEL = None, so the user supplies the estimator and trains it in a separate walk-forward. Its fundamental, Piotroski F-score, ADR and sector features need Sharadar fundamentals and a securities master that this platform does not hold. VIX and NYSE TRIN are also unavailable (the source itself fills those two with 0.5 when missing). This hypothesis is therefore an operationalization, not a port. It keeps every price, volume, technical and market-breadth feature, the target, the liquidity filter, the top/bottom-10 selection, equal weights, weekly rebalance and the one-day entry lag exactly as written. The Research Lead chose the estimator (a closed-form numpy ridge regression, since strategies may import only numpy), the training schedule and the universe. UNIVERSE: 68 fixed large-cap US stocks across all sectors (listed in instruments), daily 1-DAY bars on USEQ. SPY.USEQ is a signal source only and is never traded. Survivorship caveat: the list is today's large caps, not point-in-time membership; the source's universe was every Sharadar US stock. Names with insufficient history (e.g. META before 2013) are simply absent from the cross-section until their features exist. FEATURES (computed per stock at each daily close, exactly as in the source): (1) Cross-sectional percentile ranks (pct=True, NaN->0.5) of these returns: 1-year return excluding the last month = close[t-22]/close[t-252]-1, 1-month (22d), 1-week (5d), 2-day and 1-day. (2) Binary flags for each of those five returns > 0. (3) price_below_10 and price_below_2. (4) Rank of the 63-day mean dollar volume (close*volume). (5) Rank of the 63-day std of daily returns. (6) Volatility spike = |1d return| / 63d std, as the flag >= 2 and as a rank. (7) Volume spike = volume / 63d mean volume, as the flag >= 2 and as a rank. (8) Bollinger position = (close winsorized to the 20d +/-2sd bands - lower) / (upper - lower). (9) The source's 14-day RSI variant: rolling mean of gains / rolling mean of |losses|, min_periods 1, mapped 1-1/(1+RS) with RS NaN->0.5. (10) 14-day stochastic on closes. (11) 14-day money-flow ratio using close*volume, same mapping as the RSI. (12) Market features broadcast to all stocks: spy_above_200d (SPY close > its 200d SMA); the McClellan oscillator = (EMA19 - EMA39 of (advances - declines)/issues across the 68-stock universe) * 10, clipped to +/-50, NaN->0; per-stock new 52-week high and new 52-week low flags; Hindenburg omen = (share of names at a new 252d high > 2.8%) AND (share at a new 252d low > 2.8%) AND SPY > SPY 50 days ago, held for 30 days after firing. Dropped features (data absent): every Sharadar fundamental rank, the F-score components and rank, are_adrs, sector one-hots, vix, trin. TARGET: forward 5-day return close[t+5]/close[t]-1. MODEL: features are standardized (z-scored using the training window's mean and std) and fit by ridge regression, pooled across stocks and dates. Training samples are the last trading day of each week in a trailing train_years window; only samples whose 5-day target is fully known at the training date are used (no look-ahead). The model is refit every retrain_weeks weeks. Until the first fit has at least min_train_weeks weeks of samples, the strategy stays flat. EXECUTION: next_open_fill on the session venue is supported. On the first trading day of each ISO week, at the close, predict every stock, apply the liquidity filter and select names, and send market orders that fill at the next session's open. The source holds from the day after the signal, so the one-day lag is preserved. Positions are held unchanged until the next weekly rebalance. Sizing: weight = signal / count of nonzero signals, so a full book is +1/20 per long and -1/20 per short. Gross exposure is 1.0x equity and the book is dollar-neutral; leverage 1.0 on the Reg-T margin account. Fees: zero commission plus the modeled USEQ spread/impact (~0.02-0.05% RT); the source's $0.005/share commission is replaced by our venue's cost model. No stops: the source has none, and adding them would change the strategy. COST ARITHMETIC: in 68 large caps, the weekly return spread between the top and bottom decile of a working forecaster is plausibly 0.4-0.8% per name-week. A per-trade capture of ~0.3% (half of a 0.6% spread) compares with a 0.05% round trip, about 6x cost. Turnover is at most 100% of gross per week. Performance claims from the source are unverified; our backtest decides.

USEQ is 8.3% of the corpus, and long_short is under-represented (21%). The design needs only OHLCV (L189) and differs in mechanism from prior USEQ pairs and contrarian-cohort runs: it is a multi-feature learned cross-sectional forecast rather than a single anomaly.

no_edge: negative_expectancy (fee-floor check: avg_trade_return_pct -0.057% vs the USEQ floor of +0.05%; commission is 0 and impact plus borrow are small, so fees are not the cause and the gross edge is about zero). On a reliable sample of 3,597 closed positions (2018-09 to 2024-01), PF is 0.973, Sharpe -0.16, return -7.9% and drawdown 22.5%; five of seven years are negative. The executed weekly forecast has IC -0.10 (t = -1.7, n = 266), so the ranking carries no positive information. This matches the lesson-120……Show moreShow less

no_edge: negative_expectancy (fee-floor check: avg_trade_return_pct -0.057% vs the USEQ floor of +0.05%; commission is 0 and impact plus borrow are small, so fees are not the cause and the gross edge is about zero). On a reliable sample of 3,597 closed positions (2018-09 to 2024-01), PF is 0.973, Sharpe -0.16, return -7.9% and drawdown 22.5%; five of seven years are negative. The executed weekly forecast has IC -0.10 (t = -1.7, n = 266), so the ranking carries no positive information. This matches the lesson-120 signature of thousands of trades with PF about 1. The only tunables are ridge_alpha, train_years and retrain_weeks; regularization strength and the training window cannot reverse the sign of a near-zero, slightly negative IC, so a 2-hour optimization would only fit noise. Profit is concentrated in the 2022 rate-shock regime (+11.5%), and the normal-vol tercile lost 13.9%. Scope: this rejects only the Research Lead's operationalization: a pooled closed-form ridge on the price, volume and breadth subset of QuantRocket's TheKitchenSinkML, on 68 of today's large caps, rebalanced weekly. It does not test the source framework with its fundamental, F-score, sector, VIX and TRIN features, a nonlinear estimator, or the source's broad Sharadar universe; those need data this platform does not hold.

Implementation

Weekly dollar-neutral cross-sectional long/short book on 68 US large caps (USEQ daily bars). Every session close it updates a 255-session aligned close/volume panel. From that panel it computes the KitchenSinkML price, volume, technical and breadth features: cross-sectional pct ranks and >0 flags of 12-1m, 1m, 1w, 2d and 1d returns; price<10 and price<2 flags; 63d dollar-volume rank; 63d volatility rank; volatility-spike and volume-spike flags (>=2) and ranks; Bollinger position; the source's RSI, 14d close……Show moreShow less

Weekly dollar-neutral cross-sectional long/short book on 68 US large caps (USEQ daily bars). Every session close it updates a 255-session aligned close/volume panel. From that panel it computes the KitchenSinkML price, volume, technical and breadth features: cross-sectional pct ranks and >0 flags of 12-1m, 1m, 1w, 2d and 1d returns; price<10 and price<2 flags; 63d dollar-volume rank; 63d volatility rank; volatility-spike and volume-spike flags (>=2) and ranks; Bollinger position; the source's RSI, 14d close stochastic and money-flow ratio; and SPY>200d SMA, the McClellan oscillator (adjust=True EMA19-EMA39 of net advances x10, clipped +/-50), new 52-week high/low flags, and a Hindenburg omen held 30 sessions. That is 27 features. The last session of each ISO week is stored as a pooled training sample whose target is the forward 5-session return, added only once fully known. On the first session of each ISO week, a z-scored closed-form ridge regression is used: refit every retrain_weeks calendar weeks (Monday-anchored week index) on the trailing train_years of resolved samples, first fit only once 52 weeks exist. It predicts every stock, keeps names in the top 60% of 90d average dollar volume, goes long the 10 best and short the 10 worst predictions at equal weight (+/-1/20 each), and holds until the next weekly rebalance. Orders decided at the close fill at the next session open. SPY.USEQ is the signal-only primary leg (market features) and is never traded.

Implements the Research Lead's operationalization as specified: same features, target, liquidity filter, top/bottom-10 equal weights, weekly first-session rebalance with next-open entry, a numpy ridge estimator, and tunables ridge_alpha / train_years / retrain_weeks with every fixed value from the plan; _optimization_plan is attached verbatim. Execution choices the brief did not fix: (1) Every leg is resized to its equal target weight at each weekly rebalance, matching the source's weight-based book. A name that……Show moreShow less

Implements the Research Lead's operationalization as specified: same features, target, liquidity filter, top/bottom-10 equal weights, weekly first-session rebalance with next-open entry, a numpy ridge estimator, and tunables ridge_alpha / train_years / retrain_weeks with every fixed value from the plan; _optimization_plan is attached verbatim. Execution choices the brief did not fix: (1) Every leg is resized to its equal target weight at each weekly rebalance, matching the source's weight-based book. A name that stays on the same side is trimmed or topped up within one open position, so the positions ledger books it as one trade spanning several weeks. (2) Margin-safe sequencing. At leverage 1.0 a 1.0x gross book leaves no initial-margin room to open new legs while old legs are still open. So at the rebalance close the strategy sends only closes and trims (they fill at the next open), and sends opens and increases from on_order_filled once nothing is still working. Untested assumption: in the backtest engine an order sent at the open fill reaches the venue after the synthetic open tick, so new legs are expected to fill at that session's close rather than its open (one session later than the closes). A reversal is always close-then-open, never one order. (3) Per-leg notional = MTM equity x gross_exposure x leverage x margin_headroom(0.95) / 20. Gross is about 0.95x, not 1.0x, leaving room for open-to-fill moves of up to about 7% before peak_margin_utilization would cross the 1.02 hard gate. margin_headroom is not in the plan and stays fixed. (4) Training samples include all 68 names (pooled); the liquidity filter applies only at selection. Universe: the 20 declared names plus 48 sector-diverse large caps listed before 2005 (COP SLB EOG KO PEP PG WMT COST MCD HD LOW NKE SBUX TGT CAT BA HON GE MMM UPS DE LMT RTX UNP INTC CSCO ORCL IBM QCOM TXN ADBE AMD VZ T CMCSA DIS AMGN BMY MDT TMO GILD AXP BLK USB NEE DUK SO APD). META (2012-05-18) is the binding leg, so the common history starts mid-2012. The model needs about 255 sessions of features plus 52 weekly samples (~520 sessions), which fits inside the 1600-bar declared warmup, including a 5-year train window (~1515 sessions). Survivorship bias from today's large-cap list is acknowledged in the hypothesis. Cost note: about 20 names turn over per week at ~0.03% round trip on USEQ; the per-trade edge must clear the 0.05% USEQ floor.

Verification Results

Acceptable as is. In the full backtest, check that the fill timestamps of the opening legs are within one session of the closes. State the lag in the description so the analyst can account for it.

Order sequencing. Closes and trims go out at the rebalance close and fill at the next session's open. New legs and increases are sent from on_order_filled only after every working order has cleared. By the developer's own untested assumption, they therefore fill later than the hypothesis's next-open entry: at that session's close or the following open. The cause is the fixed 1.0x leverage with 1.0x gross on a margin account, which is a reasonable forced choice. Still, about half of each rebalance enters up to one session late, which shifts the holding window relative to the source's one-day lag.

Keep it, but disclose it. Alternatively, add margin_headroom to the contract's fixed set.

margin_headroom=0.95 is not in the frozen plan. It makes realised gross about 0.95x instead of the fixed gross_exposure 1.0. This is a small scale difference with no structural change: the book stays dollar-neutral at equal weights.

No change is required. Note that the effective backtest starts mid-2012 (training then needs about 520 more sessions before the first trade).

The base template's cross-leg alignment barrier makes the primary wait until all 68 same-timeframe legs have a bar at the primary timestamp. META only starts in May 2012, so nothing is processed before then; the developer states this. A single-name halt or missing bar skips that whole session for the panel. The point-in-time data is correct, but the panel can lose rows on data gaps.

Make sure the paper warmup covers at least train_years plus 1 year, or persist the resolved samples.

Restart persistence. day_count, cached_day and last_ts_ns are excluded from persistence, but last_week_idx, last_rebalance_week_idx and the EMA state are persisted. After a paper restart, the warmup replay rebuilds the panel, so this is mostly consistent. However, the training samples (resolved_samples) are rebuilt only as far as the warmup reaches. The backtest is unaffected.

The sandbox covers only about 53 sessions. Its avg_trade_return_pct of 0.447% (102 closed trades, PF 1.27) is one unoptimized draw over a short window, so it says nothing about the edge. The universe is today's 68 large caps (survivorship bias, acknowledged in the hypothesis). A pooled linear ridge on about 27 mostly rank features plausibly has a weak IC. Judge the result on full-history pooled OOS, not on this sandbox. The short leg's win rate was 0.33 against 0.71 for the long leg. In a rising window that pattern hints at market beta in the ranking, so check whether the long/short spread survives in down markets. Runtime: 232 s for the sandbox and an estimated 1092 s baseline, so optimization compute may be heavy (advisory).

Backtest Review

Sharpe
-0.16
Total return
-7.92%
Max drawdown
22.46%
Trades
3597
Win rate
50.1%
Profit factor
0.97

Implementation looks faithful to the operationalization: the book is dollar-neutral 10/10, rebalances weekly with next-open fills, peak entry leverage is about 1.01, accounting reconciles, and end_unrealized_pct is only 0.13.

The sample is reliable: 3,597 closed positions over 2018-09 to 2024-01 (META's 2012 listing plus the 1,600-bar warmup binds the start), with metrics_reliable = true.

Per-trade economics are below the floor: avg_trade_return_pct is -0.057% against a USEQ floor of +0.05% (preferred +0.10%). Commission is zero, and impact ($3.5k) plus borrow ($1.1k) total about 4.6% of traded notional in bps terms, so costs are not the cause. The gross edge is about zero or negative.

PF is 0.973, Sharpe -0.16 (95% CI -0.93 to +0.68), total return -7.9%, max drawdown 22.5%, and the drawdown took 1,393 days to recover. Five of seven calendar years are negative (2021 alone is -13%).

The executed forecast's IC is -0.103 (t = -1.68, n = 266 weekly obs), so the ridge forecast ranks slightly in the wrong direction. Net edge is -1.4 bp per name-week.

The equity curve is regime-driven: the stressed tercile returned +11.0% (almost all from the 2022 rate shock, +11.5%), while the normal tercile lost 13.9% (Sharpe -1.27). The model is a regime bet, not a stable cross-sectional forecaster.

QA's concern is borne out. The short leg's win rate is 0.458 against 0.546 for the long leg, consistent with a weak, beta-contaminated ranking rather than spread capture.

Outcome Summary

With only price, volume and breadth features, a linear pooled ridge on a small fixed large-cap universe produced no cross-sectional ranking information. A future iteration needs different information (fundamentals, a broader universe or a nonlinear estimator) rather than parameter tuning, and the profit concentrated in the 2022 rate shock shows that regime-driven PnL can look like an edge.

At backtest review the analyst chose abandon for no_edge / negative_expectancy: per-trade return was -0.057%, below the +0.05% USEQ floor, and commission was zero with small impact and borrow costs, so costs were not the cause. Optimization was skipped because tuning ridge_alpha, train_years or retrain_weeks could not reverse a near-zero, slightly negative IC.

It used the price, volume, technical and breadth features of QuantRocket's TheKitchenSinkML to train a pooled closed-form numpy ridge forecast of next-week return, then held a weekly dollar-neutral book long the top 10 and short the bottom 10 of a fixed universe of 68 US large caps on USEQ daily bars.

From 2018-09 to 2024-01 it closed 3,597 positions and lost 7.9% (Sharpe -0.16, 95% CI -0.93 to +0.68, PF 0.973) with a 22.5% max drawdown. avg_trade_return_pct was -0.057%, and the executed weekly forecast had an IC of -0.10 (t = -1.7, n = 266).

Analysis

TheKitchenSinkML

Analysis

kitchensink_ml.py

Time series / date functionality#

Backtest and paper results are hypothetical. Trading involves risk of loss.