Skip to content
All strategies

Strategies

QuantRocket 'ValueMomentumTrendCombined' (VMOT) port on USEQ daily: liquidity-screened 12-1 momentum + smoothness (positive-day count) selection, equal-weight, Q-NOV quarterly rebalance, SPY 252-day trend overlay cutting exposure 50%/100% weekly; value and F-score steps NOT portable (no point-in-time fundamentals)

Outcome: Abandoned

VmotMomentumTrendUseq

Outcome Summary

VmotMomentumTrendUseq ported the momentum and SPY-trend parts of QuantRocket's VMOT strategy to USEQ daily bars over 59 large-cap stocks, with SPY as the signal instrument, and dropped the value and F-score screens because no point-in-time fundamentals are available. The hypothesis explicitly asked for O(1) per-bar deque updates, because two earlier USEQ multi-name ports had died on the 300 s sandbox limit. After one iteration, the run stalled in verification and was abandoned after three timeouts ('verifying_stuck_3_timeouts'). It never produced a backtest, optimization or analyst verdict, so its edge was never measured.

Hypothesis

Translation of QuantRocket's open-source Moonshot strategy 'ValueMomentumTrendCombined' (vmot_combined.py, Apache-2.0, credit: QuantRocket LLC; modeled on Alpha Architect's VMOT ETF). LONG-ONLY, multi-instrument US equity strategy on venue USEQ, 1-DAY bars. CODE values are used where they differ from the docstring: VALUE_TOP_N_PCT=20 and MOMENTUM_TOP_N_PCT=20 (the docstring says 10). PORTABILITY, stated plainly: steps 2 (value screen: cheapest 20% by EV/EBIT, EBIT>0, Sharadar ART) and 3 (top 50% by Piotroski……Show moreShow less

Translation of QuantRocket's open-source Moonshot strategy 'ValueMomentumTrendCombined' (vmot_combined.py, Apache-2.0, credit: QuantRocket LLC; modeled on Alpha Architect's VMOT ETF). LONG-ONLY, multi-instrument US equity strategy on venue USEQ, 1-DAY bars. CODE values are used where they differ from the docstring: VALUE_TOP_N_PCT=20 and MOMENTUM_TOP_N_PCT=20 (the docstring says 10). PORTABILITY, stated plainly: steps 2 (value screen: cheapest 20% by EV/EBIT, EBIT>0, Sharadar ART) and 3 (top 50% by Piotroski F-score from 9 Sharadar fundamental components) CANNOT be translated. The factory has no point-in-time fundamentals history; Yahoo supplies prices, splits and dividends only, and src/data/yahoo_quotes.py fetches current-snapshot fundamentals for display, which would be look-ahead. Step 1b (exclude financials/ADRs/REITs) is done by construction of the fixed universe below. In the port, the momentum screen therefore ranks within the whole liquidity-screened universe, where the original ranks only within quality-value stocks. That is a material change: what is left is the momentum + trend half of VMOT, and the analyst should judge it as that. Every other rule is ported exactly. UNIVERSE (fixed, all verified present in the catalog as <SYM>.USEQ-1-DAY-LAST-EXTERNAL; non-financial, non-REIT, US-listed S&P 500 large caps, no ADRs): AAPL MSFT AMZN GOOGL META NVDA AVGO ORCL CSCO ADBE CRM INTC TXN QCOM AMD IBM ACN JNJ PFE MRK ABBV LLY UNH AMGN TMO ABT MDT BMY GILD PG KO PEP WMT COST MCD NKE HD LOW SBUX DIS CMCSA VZ T XOM CVX COP CAT DE HON GE MMM UNP UPS LMT RTX BA LIN (59 stocks), plus SPY.USEQ as the trend instrument. The original TREND_SID FIBBG000BDTBL9 is SPY; SPY is a signal only and is never traded. Primary instrument = SPY.USEQ (its bar drives the daily decision clock); the 59 stocks go in extra_instruments/extra_bar_types. RULES (per daily close t, computed on synchronized closes): (1c) avg_dollar_volume = rolling 90-bar mean of close*volume; rank descending pct across names with data (pandas rank pct, average ties); liquid = rank <= 0.60. (4) momentum = (close[t-22] - close[t-252]) / close[t-252] (NaN if close[t-252]==0 or missing); rank descending pct ONLY among liquid names; have_momentum = rank <= 0.20. (5) positive_days = count of days with close.pct_change() > 0 over the last 252 bars; rank descending pct ONLY among have_momentum names; selected = rank <= 0.50. (6) Equal weight: w_i = 1/N_selected for selected names, 0 otherwise. (7) Quarterly rebalance 'Q-NOV': the stock weights are recomputed only from the signal of the last trading day of February, May, August and November, i.e. the last value inside each Q-NOV period. They are held constant until the next such date; there is no drift rebalancing in between, because Moonshot charges turnover only on weight changes. (8-9) Trend overlay on SPY: below_zero = SPY close / SPY close[t-252] - 1 < 0; below_mavg = SPY close < SPY 252-bar SMA; n = below_zero + below_mavg. This is sampled WEEKLY ('W' = weeks ending Sunday), taking the last trading day of each week (normally Friday's close), and held through the following week. Final weight = w_i if n==0, w_i/2 if n==1, 0 if n==2; the remainder stays in cash. EXECUTION LAG (target_weights_to_positions = weights.shift()): a weight change decided at close t is executed on the next session's bar t+1 with market orders. Positions are resized only when a name's FINAL target weight changes, either at a quarterly reselection or at a weekly trend-count change. Sizing: target notional_i = final_weight_i * account equity at leverage 1.0 (USEQ margin is not used); whole shares, floor; skip orders below min notional. Fees: platform USEQ (zero commission, spread+impact modeled) replaces the original $0.005/share PerShareCommission. PERFORMANCE ENGINEERING (two recent USEQ multi-name ports died on the 300 s sandbox limit): keep per-name fixed-length deques (253 closes, 90 dollar-volumes, 252 positive-day flags with a running sum, 252 SPY closes with a running sum for the SMA). Update O(1) per bar, and do the cross-sectional ranking only once per day after all 60 bars for date t have arrived (key on the bar ts, process when the date's bar set is complete or on the SPY bar), and ONLY on rebalance/trend-sample days. Never rescan history.

USEQ (5.7%) is under-represented against the BINANCE-heavy corpus (61.5%), and this uses 59 unused large-cap equity series rather than BTC. The mechanism (cross-sectional smooth momentum with a market-trend overlay, quarterly holding) is low-turnover and has per-trade capture far above costs, avoiding the fee graveyard. Direction is long-only because the source is long-only. All parameters are fixed at the source defaults to give a faithful, non-optimized test.

verifying_stuck_3_timeouts

Implementation

Stratmill port of QuantRocket's ValueMomentumTrendCombined (Apache-2.0), momentum+trend half only. Long-only USEQ daily book over the 57 fixed non-financial S&P large caps listed in the brief: 90-day dollar-volume liquidity screen (top 60%), 12-1 momentum top 20% among liquid names, then the smoothest 50% by count of up-days over 252 sessions. The selected names get equal weights, reselected only from the last session of each Q-NOV quarter (Feb/May/Aug/Nov). An SPY trend overlay is sampled weekly: exposure is cut 50% for each of 'SPY 252-day return < 0' and 'SPY < SMA252'. Final weights are executed one session later at the close with market orders in whole shares, sized off mark-to-market equity at 1x. SPY is a signal only and is never traded.

Translation notes: (0) The hypothesis says 59 stocks, but its list names 57. All 57 are used, and all 57 plus SPY were checked present in the catalog as 1-DAY USEQ bars. (1) Value (EV/EBIT) and Piotroski F-score steps are omitted because there are no point-in-time fundamentals, so momentum ranks within the whole liquid universe. What is tested is VMOT's momentum+trend half. (2) Universe exclusions are handled by the fixed universe. (3) Resample semantics follow the source code exactly. A Q-NOV or W value is taken……Show moreShow less

Translation notes: (0) The hypothesis says 59 stocks, but its list names 57. All 57 are used, and all 57 plus SPY were checked present in the catalog as 1-DAY USEQ bars. (1) Value (EV/EBIT) and Piotroski F-score steps are omitted because there are no point-in-time fundamentals, so momentum ranks within the whole liquid universe. What is tested is VMOT's momentum+trend half. (2) Universe exclusions are handled by the fixed universe. (3) Resample semantics follow the source code exactly. A Q-NOV or W value is taken from the period's last session and is in force from the first session on or after the period-end calendar label, as resample().last().reindex(method='ffill') does. Then weights.shift() executes it at the next session's close. So a weekly trend change from Friday's close trades at Tuesday's close (Monday is the first session at or after the Sunday label, plus one session of lag). Quarterly changes trade one session after the last trading day when that day is the calendar month-end, otherwise two. This is one session later than the brief's simplified 'decided t, executed t+1' wording, but it is what the source code does. (4) Rankings use pandas pct-rank, descending, with average ties, nested liquid -> momentum -> smoothness exactly as in the source. Each name's windows run on its own bar series, and a name needs a bar on the ranking date. (5) Positions are resized only when a name's final weight changes. Partial resizes are diff market orders on the NETTING venue, and full exits close the position. USEQ zero-commission costs replace the $0.005/share commission. (6) Performance: O(1) deque appends per bar. Ranking over 57 names runs only on quarter-end sessions and the trend count only on week-end sessions. A date is finalized when the first bar of a later date arrives. The base cross-leg barrier is disabled so a late-listed or gapped leg (e.g. ABBV before 2013) cannot stall the book. (7) Sample-size caveat: with ~3-4 names held (57 x 0.6 x 0.2 x 0.5) and quarterly reselection plus weekly 50%/0% trend resizes, expect roughly 15-30 ledger entries per year. That may fall short of the pre-registered min_trades=120 on a short window; it is inherent to the source design.

Outcome Summary

Multi-name USEQ ports with about 60 daily legs and 252-bar lookbacks keep hitting the verification time limit even when written for performance, so later attempts should cut the leg count or warm-up cost, or check runtime against the sandbox budget, before they are submitted.

The run was abandoned at the verification stage with reason 'verifying_stuck_3_timeouts': verification timed out three times, and the backtest review, optimization, analyst and risk stages were never reached.

A long-only USEQ daily port of the momentum and trend half of QuantRocket's VMOT strategy. It picks the smoothest 12-1 momentum leaders from a liquidity-screened, fixed 59-stock large-cap universe, weights them equally, reselects them on a Q-NOV quarterly schedule, and uses a weekly SPY 252-day trend overlay to cut exposure by 50% or 100%. The value and F-score steps were dropped because the platform has no point-in-time fundamentals.

No performance data exists: the backtest report is empty and no optimization was run, so there are no return, Sharpe or trade-count figures.

Analysis

ValueMomentumTrendCombined

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