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.
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 | Metric | Value | Typical use |
|---|---|---|---|
| Return | return | Number | 126 lookback, > 0 filters positive 126D return. |
| Return rank | return_rank | Number | Rank starts at 1. Use <= 10 for top 10 over the lookback window. |
| Rotation Score | rotation_score | Number | Higher values indicate stronger current relative-strength rotation. |
| Score rank | score_rank | Number | Rank starts at 1. Use <= to keep the strongest score group. |
| 20D score delta | score_delta20 | Number | Use > 0 to keep ETFs with improving rotation over 20 days. |
| Delta rank | delta_rank | Number | Rank starts at 1. Use for strongest recent improvement. |
| Quadrant | quadrant | Dropdown: Leading, Improving, Weakening, Lagging | Use != Lagging to exclude the weakest quadrant. |
| X / Y | x, y | Number | Raw SRM coordinates. Positive X means stronger relative strength; positive Y means stronger momentum. |
| X score / Y score | x_score, y_score | Number | Standardized SRM axis scores for cross-sectional filtering. |
| Turnover percentile | turnover_percentile | Number from 0 to 1 | Use >= 0.3 or 0.5 to require liquidity. |
| Benchmark | benchmark | Dropdown: true, false | Use == false to prevent the benchmark ETF from being selected. |
| Legacy lagging | 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.
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.