Strategy Builder
Build a rule set, run a test, then save only the completed results you like.
Cloudflare + Supabase
Login to view saved SRM data and backtest results.
Build a rule set, run a test, then save only the completed results you like.
Latest SRM rotation state.
Top 7 highlighted by Rotation Score.
Click an ETF to isolate its trail.
Edit the selected market universe.
Only saved completed tests appear here.
Select saved strategies to compare.
Create filters and ranking rules, then run a backtest. The builder does not ask for a strategy name until the result is ready to save.
Filters are applied as AND conditions from top to bottom. A ticker must pass every filter before ranking is calculated.
Days is enabled only for Return and Return rank filters. Current snapshot metrics such as Quadrant, Rotation Score, X, Y, Benchmark, and Legacy lagging do not use days, so their days input is locked.
| Factor | Meaning | Metric | Value | Typical use |
|---|---|---|---|---|
| Return | Lookback-period price return. | return | Number | 126 lookback, > 0 filters positive 126D return. |
| Return rank | Cross-sectional rank by return for the selected lookback. | return_rank | Number | Rank starts at 1. Use <= 10 for top 10 over the lookback window. |
| Rotation Score | Current SRM strength combining relative strength and momentum. | rotation_score | Number | Higher values indicate stronger current relative-strength rotation. |
| Score rank | Rank of the current Rotation Score. | score_rank | Number | Rank starts at 1. Use <= to keep the strongest score group. |
| 20D score delta | Change in Rotation Score over the past 20 trading days. | score_delta20 | Number | Use > 0 to keep ETFs with improving rotation over 20 days. |
| Delta rank | Rank of recent 20D Rotation Score improvement. | delta_rank | Number | Rank starts at 1. Use for strongest recent improvement. |
| Quadrant | SRM phase based on relative strength and momentum direction. | quadrant | Dropdown: Leading, Improving, Weakening, Lagging | Use != Lagging to exclude the weakest quadrant. |
| X / Y | Raw SRM coordinates for relative strength and momentum. | x, y | Number | Raw SRM coordinates. Positive X means stronger relative strength; positive Y means stronger momentum. |
| X score / Y score | Standardized versions of the SRM X and Y axes. | x_score, y_score | Number | Standardized SRM axis scores for cross-sectional filtering. |
| Turnover percentile | Liquidity percentile within the ETF universe. | turnover_percentile | Number from 0 to 1 | Use >= 0.3 or 0.5 to require liquidity. |
| Benchmark | Whether the ticker is the benchmark ETF. | benchmark | Dropdown: true, false | Use == false to prevent the benchmark ETF from being selected. |
| Legacy lagging | Whether the ticker is lagging under the old RS 120D z-score rule. | legacy_lagging | Dropdown: true, false | Use == false to exclude old RS 120D z-score lagging names. |
>=, >, <=, and < compare numeric values. == and != compare exact values. in and not_in accept a comma-separated list for free-text fields.
cash_residual keeps the configured weights and leaves unused weight in cash when fewer tickers pass the filters. renormalize reallocates the selected tickers to 100% invested, matching the previous behavior.
Run test creates a calculation job. A Python worker processes it and uploads the completed run to Supabase.
When the result is satisfactory, edit the suggested name and save the completed run. Saved strategies are shown with their Return value.
The compare tab uses only saved strategies. Open Detail to inspect metrics and trade history.