exp_1165

Contrarian 52W Regime Momentum Recovery Quality Hybrid (State-Arbitrated Relay, v1165)

← All V2 experiments
Relative return
1.157x
Excess vs bench
15.67%
Benchmark
CAPW_UNIV
Rolling windows
179 · monthly
Mean strategy gain
32.30%
Mean benchmark gain
14.08%
Mean excess gain
18.22%
Dispersion (ref)
18.02%
Win-rate vs bench (ref)
99.44%
Worst / best ratio (ref)
0.998x / 1.426x
Logic variants
4
Updated
Jul 21, 2026
Anchored windows (reference — strategy vs benchmark)
Kept from V1 for continuity; the objective ranks on the full rolling set, not these four.
WindowStrategyBenchmarkRatio
2006-07-03 … 2011-06-30 7.82% 2.22% 1.055x
2011-07-01 … 2016-06-30 22.71% 13.74% 1.079x
2016-07-01 … 2021-06-30 66.57% 20.63% 1.381x
2021-07-01 … 2026-06-26 43.31% 15.48% 1.241x
All rolling windows — the objective set (equal-weighted mean ratio)
Strategy Benchmark (CAPW_UNIV) Excess
2006200720082009201020112012201320142015201620172018201920202021 -20%0%20%40%60%80%
rolling 5y windows, monthly step — 179 windows · mean ratio 1.157x · beat benchmark in 178/179
#WindowStrategyBenchmarkRatio
1 2006-07-31 … 2011-07-29 7.68% 1.79% 1.058x
2 2006-08-31 … 2011-08-31 8.41% 0.21% 1.082x
3 2006-09-29 … 2011-08-31 7.89% -0.14% 1.080x
4 2006-10-31 … 2011-10-31 6.71% 0.23% 1.065x
5 2006-11-30 … 2011-11-30 5.57% -0.05% 1.056x
6 2006-12-29 … 2011-11-30 5.11% -0.32% 1.054x
7 2007-01-31 … 2012-01-31 4.19% 0.93% 1.032x
8 2007-02-28 … 2012-01-31 3.65% 1.43% 1.022x
9 2007-03-30 … 2012-03-30 6.60% 3.09% 1.034x
10 2007-04-30 … 2012-04-30 5.23% 2.42% 1.027x
11 2007-05-31 … 2012-05-31 3.17% 0.60% 1.026x
12 2007-06-29 … 2012-06-29 4.22% 1.92% 1.023x
13 2007-07-31 … 2012-07-31 4.47% 2.69% 1.017x
14 2007-08-31 … 2012-08-31 4.56% 2.95% 1.016x
15 2007-09-28 … 2012-09-28 4.01% 3.20% 1.008x
16 2007-10-31 … 2012-10-31 3.40% 2.60% 1.008x
17 2007-11-30 … 2012-11-30 4.87% 3.45% 1.014x
18 2007-12-31 … 2012-12-31 5.28% 3.69% 1.015x
19 2008-01-31 … 2013-01-31 9.01% 5.85% 1.030x
20 2008-02-29 … 2013-02-28 7.88% 6.82% 1.010x
21 2008-03-31 … 2013-03-28 10.01% 7.73% 1.021x
22 2008-04-30 … 2013-04-30 9.71% 7.51% 1.020x
23 2008-05-30 … 2013-04-30 9.07% 7.81% 1.012x
24 2008-06-30 … 2013-06-28 14.22% 9.33% 1.045x
25 2008-07-31 … 2013-07-31 17.90% 10.48% 1.067x
26 2008-08-29 … 2013-07-31 19.58% 10.52% 1.082x
27 2008-09-30 … 2013-09-30 21.73% 11.48% 1.092x
28 2008-10-31 … 2013-10-31 25.90% 15.76% 1.088x
29 2008-11-28 … 2013-10-31 27.38% 17.46% 1.084x
30 2008-12-31 … 2013-12-31 29.43% 18.44% 1.093x
31 2009-01-30 … 2013-12-31 31.24% 20.64% 1.088x
32 2009-02-27 … 2014-01-31 34.24% 21.63% 1.104x
33 2009-03-31 … 2014-03-31 35.44% 20.60% 1.123x
34 2009-04-30 … 2014-04-30 33.32% 19.00% 1.120x
35 2009-05-29 … 2014-04-30 32.99% 18.32% 1.124x
36 2009-06-30 … 2014-06-30 35.27% 19.01% 1.137x
37 2009-07-31 … 2014-07-31 31.11% 17.39% 1.117x
38 2009-08-31 … 2014-08-29 29.95% 17.70% 1.104x
39 2009-09-30 … 2014-09-30 28.59% 16.64% 1.102x
40 2009-10-30 … 2014-09-30 33.58% 17.08% 1.141x
41 2009-11-30 … 2014-11-28 32.60% 16.82% 1.135x
42 2009-12-31 … 2014-12-31 31.27% 16.28% 1.129x
43 2010-01-29 … 2014-12-31 33.74% 17.23% 1.141x
44 2010-02-26 … 2015-01-30 32.00% 15.80% 1.140x
45 2010-03-31 … 2015-03-31 29.52% 15.40% 1.122x
46 2010-04-30 … 2015-04-30 26.70% 15.38% 1.098x
47 2010-05-28 … 2015-04-30 28.72% 17.09% 1.099x
48 2010-06-30 … 2015-06-30 35.25% 17.45% 1.152x
49 2010-07-30 … 2015-06-30 34.15% 16.43% 1.152x
50 2010-08-31 … 2015-08-31 29.64% 15.76% 1.120x
51 2010-09-30 … 2015-09-30 27.27% 13.61% 1.120x
52 2010-10-29 … 2015-09-30 26.64% 13.06% 1.120x
53 2010-11-30 … 2015-11-30 27.16% 15.09% 1.105x
54 2010-12-31 … 2015-12-31 25.27% 13.55% 1.103x
55 2011-01-31 … 2016-01-29 22.27% 11.90% 1.093x
56 2011-02-28 … 2016-01-29 21.29% 11.53% 1.088x
57 2011-03-31 … 2016-03-31 21.49% 12.90% 1.076x
58 2011-04-29 … 2016-04-29 20.51% 12.39% 1.072x
59 2011-05-31 … 2016-05-31 21.59% 12.94% 1.077x
60 2011-06-30 … 2016-06-30 22.41% 13.30% 1.080x
61 2011-07-29 … 2016-07-29 22.97% 14.52% 1.074x
62 2011-08-31 … 2016-08-31 22.33% 15.19% 1.062x
63 2011-09-30 … 2016-09-30 24.90% 16.32% 1.074x
64 2011-10-31 … 2016-10-31 20.93% 14.02% 1.061x
65 2011-11-30 … 2016-11-30 22.86% 14.66% 1.072x
66 2011-12-30 … 2016-12-30 21.68% 14.92% 1.059x
67 2012-01-31 … 2017-01-31 22.37% 14.63% 1.068x
68 2012-02-29 … 2017-02-28 22.98% 14.78% 1.071x
69 2012-03-30 … 2017-02-28 22.44% 14.43% 1.070x
70 2012-04-30 … 2017-04-28 22.21% 14.61% 1.066x
71 2012-05-31 … 2017-05-31 24.33% 15.98% 1.072x
72 2012-06-29 … 2017-05-31 23.97% 15.44% 1.074x
73 2012-07-31 … 2017-07-31 24.26% 15.43% 1.076x
74 2012-08-31 … 2017-08-31 24.80% 15.12% 1.084x
75 2012-09-28 … 2017-08-31 24.34% 14.77% 1.083x
76 2012-10-31 … 2017-10-31 26.08% 16.12% 1.086x
77 2012-11-30 … 2017-11-30 26.67% 16.79% 1.085x
78 2012-12-31 … 2017-12-29 26.70% 16.93% 1.084x
79 2013-01-31 … 2018-01-31 29.05% 17.57% 1.098x
80 2013-02-28 … 2018-02-28 28.65% 16.21% 1.107x
81 2013-03-28 … 2018-02-28 27.53% 15.81% 1.101x
82 2013-04-30 … 2018-04-30 23.89% 14.25% 1.084x
83 2013-05-31 … 2018-05-31 19.47% 14.57% 1.043x
84 2013-06-28 … 2018-05-31 21.92% 14.97% 1.060x
85 2013-07-31 … 2018-07-31 20.42% 14.83% 1.049x
86 2013-08-30 … 2018-07-31 22.31% 15.59% 1.058x
87 2013-09-30 … 2018-09-28 23.74% 15.84% 1.068x
88 2013-10-31 … 2018-10-31 17.96% 12.89% 1.045x
89 2013-11-29 … 2018-10-31 17.43% 12.60% 1.043x
90 2013-12-31 … 2018-12-31 15.39% 9.93% 1.050x
91 2014-01-31 … 2019-01-31 14.65% 12.37% 1.020x
92 2014-02-28 … 2019-02-28 12.16% 12.38% 0.998x
93 2014-03-31 … 2019-03-29 14.14% 12.76% 1.012x
94 2014-04-30 … 2019-04-30 16.52% 13.73% 1.025x
95 2014-05-30 … 2019-04-30 15.70% 13.54% 1.019x
96 2014-06-30 … 2019-06-28 15.40% 12.81% 1.023x
97 2014-07-31 … 2019-07-31 16.35% 13.30% 1.027x
98 2014-08-29 … 2019-07-31 15.56% 12.80% 1.024x
99 2014-09-30 … 2019-09-30 16.05% 12.70% 1.030x
100 2014-10-31 … 2019-10-31 15.93% 12.91% 1.027x
101 2014-11-28 … 2019-10-31 15.55% 12.60% 1.026x
102 2014-12-31 … 2019-12-31 17.85% 14.16% 1.032x
103 2015-01-30 … 2019-12-31 17.61% 14.85% 1.024x
104 2015-02-27 … 2020-01-31 18.05% 14.04% 1.035x
105 2015-03-31 … 2020-03-31 12.54% 8.56% 1.037x
106 2015-04-30 … 2020-04-30 18.57% 11.65% 1.062x
107 2015-05-29 … 2020-05-29 19.11% 12.61% 1.058x
108 2015-06-30 … 2020-06-30 20.48% 13.64% 1.060x
109 2015-07-31 … 2020-07-31 23.70% 14.60% 1.079x
110 2015-08-31 … 2020-08-31 29.75% 18.07% 1.099x
111 2015-09-30 … 2020-09-30 29.91% 17.05% 1.110x
112 2015-10-30 … 2020-10-30 28.32% 14.60% 1.120x
113 2015-11-30 … 2020-11-30 35.87% 17.43% 1.157x
114 2015-12-31 … 2020-12-31 37.75% 18.65% 1.161x
115 2016-01-29 … 2021-01-29 64.52% 19.26% 1.379x
116 2016-02-29 … 2021-02-26 66.01% 19.79% 1.386x
117 2016-03-31 … 2021-03-31 68.85% 19.42% 1.414x
118 2016-04-29 … 2021-03-31 70.61% 19.66% 1.426x
119 2016-05-31 … 2021-05-28 66.75% 20.42% 1.385x
120 2016-06-30 … 2021-06-30 66.02% 21.06% 1.371x
121 2016-07-29 … 2021-06-30 66.57% 20.63% 1.381x
122 2016-08-31 … 2021-08-31 67.42% 21.75% 1.375x
123 2016-09-30 … 2021-09-30 64.23% 20.22% 1.366x
124 2016-10-31 … 2021-10-29 67.45% 22.50% 1.367x
125 2016-11-30 … 2021-11-30 64.73% 21.87% 1.352x
126 2016-12-30 … 2021-11-30 67.18% 21.75% 1.373x
127 2017-01-31 … 2022-01-31 58.21% 20.17% 1.316x
128 2017-02-28 … 2022-02-28 56.18% 18.51% 1.318x
129 2017-03-31 … 2022-03-31 58.52% 19.46% 1.327x
130 2017-04-28 … 2022-03-31 59.22% 19.46% 1.333x
131 2017-05-31 … 2022-05-31 55.65% 15.59% 1.347x
132 2017-06-30 … 2022-06-30 52.13% 13.08% 1.345x
133 2017-07-31 … 2022-07-29 51.84% 15.16% 1.319x
134 2017-08-31 … 2022-08-31 51.60% 13.72% 1.333x
135 2017-09-29 … 2022-08-31 51.34% 13.56% 1.333x
136 2017-10-31 … 2022-10-31 52.40% 11.86% 1.362x
137 2017-11-30 … 2022-11-30 51.19% 12.52% 1.344x
138 2017-12-29 … 2022-11-30 51.63% 12.46% 1.348x
139 2018-01-31 … 2023-01-31 47.11% 11.01% 1.325x
140 2018-02-28 … 2023-02-28 46.22% 11.03% 1.317x
141 2018-03-29 … 2023-02-28 47.76% 11.72% 1.323x
142 2018-04-30 … 2023-04-28 47.12% 13.01% 1.302x
143 2018-05-31 … 2023-05-31 44.74% 12.95% 1.281x
144 2018-06-29 … 2023-05-31 46.15% 13.01% 1.293x
145 2018-07-31 … 2023-07-31 51.50% 14.67% 1.321x
146 2018-08-31 … 2023-08-31 47.92% 13.51% 1.303x
147 2018-09-28 … 2023-08-31 48.96% 13.56% 1.312x
148 2018-10-31 … 2023-10-31 45.96% 12.60% 1.296x
149 2018-11-30 … 2023-11-30 46.81% 14.58% 1.281x
150 2018-12-31 … 2023-12-29 51.43% 17.26% 1.291x
151 2019-01-31 … 2024-01-31 50.63% 16.27% 1.295x
152 2019-02-28 … 2024-01-31 50.79% 15.94% 1.301x
153 2019-03-29 … 2024-03-28 57.35% 17.50% 1.339x
154 2019-04-30 … 2024-04-30 53.74% 15.50% 1.331x
155 2019-05-31 … 2024-05-31 57.96% 18.12% 1.337x
156 2019-06-28 … 2024-06-28 56.93% 17.99% 1.330x
157 2019-07-31 … 2024-07-31 52.75% 17.70% 1.298x
158 2019-08-30 … 2024-08-30 52.34% 18.41% 1.287x
159 2019-09-30 … 2024-09-30 56.02% 18.65% 1.315x
160 2019-10-31 … 2024-10-31 56.37% 17.87% 1.327x
161 2019-11-29 … 2024-11-29 59.87% 18.64% 1.348x
162 2019-12-31 … 2024-12-31 53.39% 17.62% 1.304x
163 2020-01-31 … 2025-01-31 56.94% 18.07% 1.329x
164 2020-02-28 … 2025-02-28 55.54% 19.00% 1.307x
165 2020-03-31 … 2025-03-31 54.30% 19.24% 1.294x
166 2020-04-30 … 2025-04-30 48.65% 16.49% 1.276x
167 2020-05-29 … 2025-04-30 47.07% 15.80% 1.270x
168 2020-06-30 … 2025-06-30 48.61% 18.19% 1.257x
169 2020-07-31 … 2025-07-31 46.18% 17.87% 1.240x
170 2020-08-31 … 2025-08-29 44.31% 16.69% 1.237x
171 2020-09-30 … 2025-09-30 47.91% 18.57% 1.247x
172 2020-10-30 … 2025-09-30 48.88% 19.43% 1.247x
173 2020-11-30 … 2025-11-28 44.71% 17.77% 1.229x
174 2020-12-31 … 2025-12-31 45.29% 16.92% 1.243x
175 2021-01-29 … 2025-12-31 29.29% 17.20% 1.103x
176 2021-02-26 … 2026-01-30 34.51% 17.04% 1.149x
177 2021-03-31 … 2026-03-31 30.20% 14.07% 1.141x
178 2021-04-30 … 2026-04-30 37.27% 16.03% 1.183x
179 2021-05-28 … 2026-04-30 38.57% 16.22% 1.192x
Notes
mode=explore; family=contrarian-52w-regime-momentum-recovery-quality-hybrid New hybrid family built as a state-arbitrated relay instead of a static blend. It preserves the strong parent edge in recovery leaders off 52-week highs, but only pays for deeper drawdowns when repair, liquidity continuity, and operating durability confirm them. In healthy tapes, repaired leaders outrank deeper contrarian names; in choppier tapes, controlled pullbacks with improving trend get priority; in transitions, quality-backed turnarounds can beat pure momentum; in risk-off, the model triages for durable, liquid, lower-vol franchises that are merely bruised rather than broken. Explicit arbitration rule: when momentum leadership and contrarian depth conflict, stock-state gates decide the sleeve. Deep drawdown names must pass a repair-and-durability gate to avoid falling knives; shallow drawdown leaders need trend persistence to outrank cheaper-looking laggards; transition tapes favor improving quality recoveries over both raw momentum and raw depth. Deliberate metric coverage this run: active momentum uses 3m, 6m, and 12_1; trend/recovery uses both 200d distance and 52-week-high distance; volatility is active through realized vol; liquidity uses volume, dollar-volume, and trading-days continuity; income uses dividend yield in defensive branches only; valuation rotates to forward_pe and peg in transition/risk-off while pe is deliberately zeroed; growth uses forward_eps plus operating-income and free-cash-flow growth; quality uses operating and free-cash-flow margins; size uses market_cap only as a small negative tilt in strong tapes. Deliberate weight-0 metrics: return_1m_pct, return_12m_pct, dividend_ttm, pe, eps_growth_pct, revenue_growth_pct, shares_outstanding, close, adj_close, high_52w, ma_200d, eps_ttm, revenue_ttm, operating_income_ttm, free_cash_flow_ttm.
Lesson notes
#869 · degrade · relative_return Δ -0.2690 · parent exp_758 · Jul 21, 2026 · auto/explore; benchmark CAPW_UNIV
explore/contrarian-52w-regime-momentum-recovery-quality-hybrid: relative_return 1.1567x (delta -0.2690 vs exp_758); win-rate 99.4413%, worst-window 0.998068, dispersion 18.0235%.
Monthly picks — top stocks selected each month (whole timeline)
timeline — 240 months · top 15 each
Month 123456789101112131415
2006-07-31 ATI EXPD MNST MRK GRMN CPB CMI DDS FTI T LVS CME VLO TEX SLG
2006-08-31 MRK ILMN T GEN ICE LMT DDS SLG ADM LH BXP NVDA MO CVS VNO
2006-09-29 T ILMN AAPL ORCL MRK KSS NVDA GEN CRM HOG HUM BXP LMT TJX VNO
2006-10-31 KSS AKAM GS AAPL ATI CRM ALGN T M AIV MS CTSH ORCL MRK ANF
2006-11-30 GS AAL ALGN ICE AKAM MAT ILMN AT HOG REGN MS SLG CMCSA KSS MRK
2006-12-29 ATI MAY LVS HOG ICE VNO GS CMCSA MTCH WYNN NVDA ILMN ES TWX EQIX
2007-01-31 MAY UAL TWX ICE GS LVS PCAR CMCSA AT MTCH TEX MGM LMT CSCO BKNG
2007-02-28 WYNN ICE DOC MAT SPG KMX BXP AT PSA CRM AKAM TEX UIS NEE ON
2007-03-30 ICE ON MAY MAT CF NRG MGM NEE WY MTCH SYK AEP FSLR WYNN CRM
2007-04-30 PEG CF ETR MOS MAY ES SYK MAT SRE ICE GT BAX CMI FE ATI
2007-05-31 ETR PEG EIX HON MCD CMI MRK STLD AMZN DLTR ALGN CI NRG PWR BAX
2007-06-29 CLF AMZN NRG ICE ANDV HON CI AAPL NOV NVDA DLX MLM MGM WBD OKE
2007-07-31 KMG CF AAPL AMZN AXON DJ ICE CE CLF VRSN MGM MOS HON MTW MA
2007-08-31 AXON FCX FSLR DECK COP KMG AMZN ALGN HON CAT CVX MA CE LIN IBM
2007-09-28 BIIB WYNN COP FLR SLB CVX AXON LVS CSCO CMI FCX GME NOV VRTX DE
2007-10-31 GRMN EXPE AMZN FLR FTI LVS BIIB NOV WYNN NVDA MPWR MGM BKR CLF GOOGL
2007-11-30 FTI GOOG GOOGL FLR FCX AMZN WYNN LVS FMC NOV GRMN CLF AAPL APA BIIB
2007-12-31 MCD ISRG GOOGL GOOG BRK-B MRK CME HPQ FSLR KO VRSN CF NEE MA FLR
2008-01-31 FSLR MOS ESRX HUM BRK-B OXY PRGO VRSN CRL KO MUR ISRG PEG CF WDC
2008-02-29 CF MOS HAL BKNG OXY FSLR CVX DVN WDC ABT PEG J WHR ESRX BLK
2008-03-31 CF MOS HAL BIIB WHR BKNG DVN WDC ABT MO AFL OXY IBM JCI CL
2008-04-30 CF MOS JCI HAL DVN WDC OXY BKNG CVX RRC APA J EQT UNP CLF
2008-05-30 MA HAL MOS CF APA OXY FSLR BKNG CSX DVN BBBY NBR WDC UNP CVX
2008-06-30 MA MOS CF WDC OXY HAL BBBY DFS NBR APA HP FMC D BKNG X
2008-07-31 MEE MOS CF BTUUQ X MA HP ESV WWY HAL CLF WDC ABT D APOL
2008-08-29 CF ESV MCD APOL BCR BTUUQ CEPH ATGE BAX SRCL MBI MHS MEE RE RTN
2008-09-30 MCD ABT BCR ED ESV APOL CEPH MBI ATGE PRGO SWN D BNI SRCL CPB
2008-10-31 ABT MCD AON ED MRSH D WWY MBI CLX BAX MDLZ CHD CPB NSC HPQ
2008-11-28 AON MCD ABT ED D KR DLTR CLX KMB SHW SJM CPB DAL MRSH CHRW
2008-12-31 AON ABT MCD BMY GILD DLTR ED KR SHW CHRW XOM MRK WM AMGN CVX
2009-01-30 ABT MCD XOM BMY GILD OXY CVX DLTR AON ELV ED PCG CL SJM MDLZ
2009-02-27 ABT MCD XOM GILD AON PCG ED BMY CAG VTRS BIIB CVX IBM OXY BKNG
2009-03-31 BKNG BMY IBM CF CVX MS AMT GOOG VTRS ED OXY ADI BIIB AKAM AON
2009-04-30 BKNG EBAY CF NVDA UPS MS MRVL AZO IBM GRMN AKAM AON WDC OXY ICE
2009-05-29 EBAY CF FCX MOS BKNG WDC MS STX OXY CIEN EOG GNW CNX STLD ASH
2009-06-30 EBAY PRU BKNG FCX GNW MSI MTG STLD GGP THC GT MS NFX IP AAPL
2009-07-31 EBAY MOS GNW PRU FITB BKNG GGP LNC CF MEE PFG WLL MSI MS FCX
2009-08-31 FITB HIG FNMA LVS BKNG AIG FMCC COF MEE SLG EBAY MAC PRU HOG LNC
2009-09-30 FNMA FMCC FITB MTG AIG GNW LVS PALM BKNG COF MGM EBAY HIG MU TXT
2009-10-30 GNW FMCC BKNG HIG FNMA BC LVS SANM SSP FLEX EBAY BX FCX STX INCY
2009-11-30 LVS JBL FCX STX GNW BKNG FLEX HIG PSKY TT CTSH STI BC VSTNQ DD
2009-12-31 BKNG KMG FCX DDS VSTNQ TT WBD STI MAC F GOOG IP SLG AMD GNW
2010-01-29 BKNG AMD MU CLF STX CAR F SLG ATI DD MTW DDS WLL JBL WYNN
2010-02-26 AMD MU NYT MTG MTW JBL ATI BKNG SSP LVS F BC UIS STX HUM
2010-03-31 F AAL SANM LVS UAL DDR CLF HBAN ZION MGM SSP BKNG FFIV XRX MTW
2010-04-30 CLF MTG UAL BKNG BBWI DECK LVS DDS VIAV AAL DDR LPX BC PVH HBAN
2010-05-28 MTG ZION BC UAL MBI PVH BBWI MGM CLF VIAV HST URI LPX HBAN RF
2010-06-30 ZION BBWI SBUX NTAP NEM AAL LVS AIG DDS WLL COR BMY UHS HBAN HAS
2010-07-30 NEM AIG BBWI KDP NTAP AKAM SBUX BMY AZO HAS HSY BKNG GS CLF CB
2010-08-31 NEM BKNG BMY BBWI NTAP CLF CB CTSH AZO AXP KDP LVS EW VZ D
2010-09-30 BBWI BKNG NTAP CLF NEM CCU VZ BMY LVS CTSH CASY AKAM AZO MBI CB
2010-10-29 MBI BKNG LYB EMN NEM BBWI NTAP CTSH TPL AKAM TXN CB VZ COO BMY
2010-11-30 NTAP BKNG TXN LVS BBWI F WLL INTC RCL WYNN ILMN HON ADI ETN EMN
2010-12-31 LVS DECK FFIV TXN VRTS BKNG BBWI TPR ILMN MGM ADI AIG EW EXPD MBI
2011-01-31 WLL CIEN DECK ETFC BWA CLF FCX XEC CXO PXD ALXN JOY TXN CMI CTXS
2011-02-28 VIAV NVDA MAY TEX ANDV VLO ETFC URI FLR MOS HOG DE NOV WLL TXN
2011-03-31 VIAV CIEN MAY PSKY COP KLAC NOV SWKS TER XOM NVDA CBRE TTWO BKNG ANDV
2011-04-29 VIAV ANDV REGN BKNG BIIB PSKY COP NBR IRM MTW HUM CBRE ECHO HP CIEN
2011-05-31 BKNG BIIB BBWI CAT REGN CXO PXD KKR ANDV ELV ALXN GR GT JOY FDO
2011-06-30 BKNG ANF REGN DDS BBWI GT BIIB WYNN KKR HUM CVX COP CAT ELV D
2011-07-29 D CEPH BIIB REGN BKNG WCG MNST COG ADS EP GR WYNN KSU CVX COP
2011-08-31 CF BKNG BIIB AAPL MOS WYNN KLAC CVX COP VZ DUK IBM DLTR VFC PM
2011-09-30 CF BKNG KLAC DUK AAPL VZ BIIB DLTR XOM VFC CVX CTRA COP AZO MOS
2011-10-31 KLAC CF DUK MAY DLTR AAPL BKNG BIIB DG MNST VZ AZO VFC TJX CL
2011-11-30 KLAC BIIB VFC CF DLTR DECK XOM AEE CVX PFE AAPL ULTA VZ M GWW
2011-12-30 KLAC CF PM PFE XOM M GWW CVX AEE HUM OKE TJX BIIB AAPL CTRA
2012-01-31 KLAC CF M AAPL GWW WCG MNST WMB CAT GRMN PFE COG TJX ADS GR
2012-02-29 BKNG CF AAPL LYB GRMN REGN CAT TJX TRGP MOH WCG KLAC URI TEX AIG
2012-03-30 BKNG AAPL CF AIG MOH JBL ULTA BAC LYB LVS M EQIX AAP ADS WBD
2012-04-30 AAPL BKNG WBD TJX CF KLAC ULTA PSKY SHW TT KMI M PM WFC EQIX
2012-05-31 STX BKNG AAPL AIG EC WMB SPG SBAC WBD BIIB M SHW PM YUM USB
2012-06-29 STX BKNG AAPL MNST CF SHW DLTR VRTX SBAC DAL AIG SPG WBD TJX SRE
2012-07-31 AAPL STX MRK VRTX BKNG CF KMB EW BIIB LEN SHW CHD AAL MNST SBAC
2012-08-31 STX WDC AAPL ALL MRK CF KBH SBAC NOC AIG TWX CMCSA BKNG BIIB BLDR
2012-09-28 STX AAPL WDC ALL VLO PHM CF LPX LEN STZ DHI EBAY DDS EOG TEX
2012-10-31 ALL ANDV URI CF LEN AIG STX TWX DHI SHW VLO STZ EBAY MRK JPM
2012-11-30 ALL META KBH TRV GNRC LEN AMGN BKNG NWL DHI AAL PHM DVA GS MTB
2012-12-31 STX ALL WDC LEN GNRC TRV FSLR AMGN NWL META BBBY STZ AAL KBH GS
2013-01-31 STX WDC META BAC LEN LPX PPG APTV DAL PHM EQIX EMN BKNG STT ALL
2013-02-28 STX GS WDC DAL ALL PHM MS TRV LYB DHI BAC STT KBH TSN HCA
2013-03-28 STX GS KKR ALL DHI TRV WDC APO STT TEX NWL AMGN BX MPC HON
2013-04-30 FNMA FMCC ALL COR AMGN HRB TWX WDC NWL TRV BAC KR KKR GS STX
2013-05-31 FNMA FMCC REGN TSLA KBH VLO KR WDC BKNG KKR PHM MPC BX STX MTG
2013-06-28 FSLR FNMA FMCC REGN WDC BIIB JPM GS MCO MBI BKNG STX APO BX CAR
2013-07-31 FNMA WDC FMCC BKNG STX MU FSLR TYL MBI CME REGN ELV DXCM JPM APTV
2013-08-30 BKNG DAL TSN MTG GNW TRIP BBBY MU SVU PRU CBOE REGN CIEN LYV BSX
2013-09-30 BKNG TRIP MTG GME META DAL RTX EA FL GT FANG HII LNC CI CPRI
2013-10-31 META FNMA BKNG FMCC TSLA MGM GT MU BX REGN ADS APO LVS INCY FLT
2013-11-29 FNMA FMCC FSLR META REGN BKNG PBI FANG INCY ALGN DAL BA LVS AXON URI
2013-12-31 FNMA BKNG FMCC MCK MU DAL IBKR PBI META FSLR URI DECK STZ BR CAH
2014-01-31 FNMA FMCC BKNG MGM DAL URI GT DECK BX MA V PHM STZ MU AMP
2014-02-28 BKNG INCY REGN ILMN MU META SMCI URI TKO BX PHM ADSK VLO TPL MGM
2014-03-31 ILMN FNMA META FMCC TSLA BKNG VTRS BX DXCM MGM INCY WYNN DAL AAL FRX
2014-04-30 FNMA EOG FMCC TSLA RCL URI VTRS FSLR GLW DAL HP AAL BKNG META ILMN
2014-05-30 META DAL URI EOG LYB BKR RCL GLW HP BKNG FNMA COP ILMN FSLR SLB
2014-06-30 META DAL URI LYB TRGP AAL EOG FRX SWKS LUV TSLA COP GD FANG EA
2014-07-31 MU META URI ILMN EOG DAL NFX TRGP AAL COP FANG FNMA EA RCL TAP
2014-08-29 MU TWX GILD TRGP FANG HAL DAL EOG LUV RCL DLR CAR COP FSLR URI
2014-09-30 GILD NXPI LUV TPL URI WDC UHS RCL STLD ENPH LYB DLR MS TWX WMB
2014-10-31 GILD MU RCL LUV NXPI ENPH GD DAL SIAL HCA MS STLD TRV URI ETR
2014-11-28 CSX RCL NXPI UNP DAL GILD MU GD ANDV SWKS LUV SMCI KR TWX RHI
2014-12-31 WELL GD INCY EW RCL EIX IRM ANDV ES ETR MNST WEC PNW AEP ZTS
2015-01-30 RCL DAL AAL KR WELL ALL RMD SHW EW KDP AMAT UAL MAC AVB TRV
2015-02-27 KR RCL MAC SHW RMD AXON UAL WELL PCG VLO ALK ARE TDG COR GILD
2015-03-31 SBUX BIIB DLTR CI GILD SWKS COR ELV KR DRI AET AAPL INCY CME ULTA
2015-04-30 CI CNC SBUX INCY SWKS MAY DRI DLTR NCLH COR HUM DDS ULTA PAYC MOH
2015-05-29 GILD COR SBUX AXON DRI BLDR CI HSP VTRS PRGO PAYC BX EXPE ABMD NCLH
2015-06-30 GILD GS BX SBUX HUM JPM VTRS DRI PANW CNXT AET MPC SWKS CI ZTS
2015-07-31 GILD SBUX CI BTUUQ VLO MPC DRI PANW EA JPM CNC AET GS HUM COTY
2015-08-31 VLO SBUX DRI GILD MDLZ CI UAL EA PANW ANDV HAS ULTA AYI JPM BKNG
2015-09-30 SBUX VLO HUM DRI BKNG UAL MDLZ INCY EQIX DXCM TKO STZ BLDR AMZN HSP
2015-10-30 SBUX VLO BKNG UAL STZ EQIX INCY CCI ACN AZO MDLZ KDP PLD AMZN GILD
2015-11-30 VLO AMZN PSX LUV GM PLD GOOG MAS ACN EQIX STZ GILD ANDV PANW GPN
2015-12-31 AMZN VLO VRSN GOOG GILD MAS LUV PLD DD UAL GM GPN ARG GE CCI
2016-01-29 GOOG VLO TAP ABMD AMZN KMB EQIX STZ GE KDP ATVI LHX CLX VRSN AVGO
2016-02-29 VZ T DAL KLAC UAL KMB AWK AAL ATO CMS XEL DLR PM WEC PPL
2016-03-31 T VZ PM KLAC TSN AWK EIX ATO ETN XEL KMB DAL CMS MKC NI
2016-04-29 KLAC VZ T TSN X CNX ABBV AMZN RRC LUV MAT PM ETN DD GPN
2016-05-31 NXPI DLR ABBV T EQIX CLF CNX RRC MUR KLAC MTW AMZN VMC MLM VZ
2016-06-30 T ALB DLR EQIX ABBV WCG CCI ABMD AWK EVRG SIVB MTW DXC STJ XEC
2016-07-29 DLR OKE DXC AWK T EQIX ALB CCI VZ CNP NI GEN WM ABBV HII
2016-08-31 CLF ULTA T VTR GRMN SPGI ALGN KMI WMB DLR IRM ABBV DXC OKE EW
2016-09-30 SPGI AMD CLF GEN AMZN KMI ABBV WMB MKTX DHR META BKNG TSN PODD GRMN
2016-10-31 SPGI WB LITE C AMZN GEN WMB TPL BKNG NXPI ETSY AAL META UAL DHR
2016-11-30 SPGI CLF KLAC WOR RCL DAL META DXC BKNG WB T LITE FCX GRMN TMUS
2016-12-30 CLF FMCC FNMA STLD BBY MS NUE CSX GM FCX FDX PRU AMD PFG JPM
2017-01-31 CLF AMD NBR GS STLD MS FMCC CHTR CSX UIS BBY FITB JPM GM KMG
2017-02-28 CLF CHTR MTB AMD COHR LITE NRG GEN MS RF SLM MTG TMUS JPM HWM
2017-03-31 INCY CSX GS SPGI META COHR BKNG WB AMAT AVGO HII HWM AMD TTD KLAC
2017-04-28 AMAT AMD KLAC CHTR SPGI META BBY INCY AVGO MHK DXC SWKS BKNG TTD GS
2017-05-31 WB KLAC META BBY MSFT WDC VEEV LRCX BKNG RCL AMAT TTWO DXC GOOG ADSK
2017-06-30 AMAT WB ADSK TTWO LRCX EA VEEV XYZ RCL NVDA WDC SPGI VRTX MSFT LITE
2017-07-31 AMAT MU VRTX LITE SPGI META MTD LRCX WB BX XYZ PKG PYPL ALGN RCL
2017-08-31 BA ALL RCL MU VRTX META AMAT XYZ NRG SPGI PGR BX COO LRCX C
2017-09-29 WB BA VRTX RCL MU AMAT MCHP SBAC APTV META KMG ABMD KLAC GS SPGI
2017-10-31 BA WB AMAT TROW RCL ABBV MCHP GM FMC MU CNC CBOE CI FMCC ENPH
2017-11-30 XYZ MU BBBY AMAT LRCX IPGP ON BA TTWO INTC WB TWTR NRG MAR MRVL
2017-12-29 XYZ BBBY ALGN MU IPGP BA MRVL CBOE ENPH ON WB AMAT TTWO IBKR FSLR
2018-01-31 BBBY TROW FSLR WB XYZ DE KBH MPC ALGN ELV MU ENPH BA TXN ODFL
2018-02-28 BBBY EC KKR MPC BA ON TROW MAY FSLR ANET WB WYNN TXN RL BKNG
2018-03-29 MU XYZ BA ON WYNN WB NKTR BKNG MPC URI AMAT ALGN ANET BLK NOW
2018-04-30 MU NKTR MPC XYZ WYNN PSX BKNG ON BA NTAP BR PANW CME ENPH CVNA
2018-05-31 MU PSX SEDG NTAP BKNG COP OXY MPC MCO NKTR M CVX VLO NRG ABMD
2018-06-29 MU PSX VLO XYZ M MCO ALGN BA ANDV OXY CPRT MSCI DECK GDDY V
2018-07-31 MU XYZ ETSY TTD ALGN PSX GDDY CNC V VRSN MCO SEDG ENPH EVHC BA
2018-08-31 PFE MU KDP WAB MPC M CNC PSX TJX ABMD LLY REGN AZO GWW MCO
2018-09-28 CVNA MPC PFE FICO ABMD TJX AMD MTCH VRSN ANDV NSC PGR LLY ETSY SHW
2018-10-31 XYZ ABMD MOH PFE AMD LLY ETSY TJX HCA VZ MRK ESRX MTCH VEEV PEG
2018-11-30 MRK MKC PFE VZ ESRX KDP AMD ABMD ULTA LW CME PEG HCA MOS AES
2018-12-31 MKC PFE MRK ESRX VZ CME KDP PEG LW AVGO BALL CMCSA AET NRG SO
2019-01-31 AMD AVGO AZO DLTR PFE NRG SO WELL BALL CHD MRK RHT PEG DOC TKO
2019-02-28 AVGO AMD XYZ ERIE BALL PGR AES SO MTCH PEG FNMA FMCC HET REGN WELL
2019-03-29 AMD MTCH CVNA BALL AVGO KMI AES KLAC SSP ERIE PGR MU HET NYT XLNX
2019-04-30 KEYS AMD MTCH HON AZO ZBRA NSC LIN MSCI TDG KLAC FICO PEP HET ALGN
2019-05-31 PEP CVNA MTCH SO BALL HON QCOM LLY APD LIN MDLZ TT MSFT MSCI SNPS
2019-06-28 MTCH MKTX HSY LIN FDS QCOM LHX SBAC VEEV SO PEP MSFT HON AXP CINF
2019-07-31 MKTX ERIE MTCH LIN SYK MSI HSY VEEV BALL AXP AZO FIS GS SNPS APD
2019-08-30 QCOM ENPH HSY SBAC LIN LMT SYK APD MSFT ZTS BALL WEC SO HET FIS
2019-09-30 ENPH HSY BMY WEC LMT SNPS SBAC SO FISV QCOM ETR ZTS PEP BALL KLAC
2019-10-31 PODD BMY LMT QCOM KLAC NWL EQIX SHW MKTX KBH MLM SO VRTX PHM WEC
2019-11-29 BMY QCOM KLAC TER WU PSX HET KBH XRX VRTX MSFT SO CPRT LIN BF.B
2019-12-31 ENPH QCOM VRTX XRX CVNA DXCM MSFT HET WU AMGN BMY TER URI HWM JPM
2020-01-31 BMY SWKS ANSS HET QRVO MSFT THC LLY CDAY LMT ENPH KSU TER QCOM TIF
2020-02-28 TSLA LLY BMY HET SWKS MSFT ENPH TDG SO VRTX QCOM ANSS AON LMT LDOS
2020-03-31 ENPH NEM TSLA GEN ABBV QCOM LLY PODD CSGP KR NOW PGR DVA GOOG ALL
2020-04-30 NEM LLY ENPH CRWD ABBV KR CLX GEN CI QCOM BIIB PGR LDOS CDNS ANET
2020-05-29 NEM LLY DXCM ENPH MRNA CLX BBBY WST KR QCOM CDNS ABBV GEN CI CRWD
2020-06-30 ENPH NEM EBAY PENN LOW ABBV MRNA CDNS QCOM MSFT SPGI DHI DG LEN DXCM
2020-07-31 EBAY TSLA ENPH LOW MRNA NEM ABBV QCOM PENN CDNS MRVL MSFT ADSK XYZ CLX
2020-08-31 BBBY LOW EBAY ENPH CDNS DHI PENN PG REGN LEN META WHR TER NEM BBY
2020-09-30 BBBY LOW ENPH TUP PG CDNS TSLA META CZR EBAY DHI VIAC PGR MRNA BBY
2020-10-30 ENPH PENN LOW GME XYZ CVNA VIAC TSLA FDX CRWD BBBY WHR DG CZR PBI
2020-11-30 VIAC ENPH PENN GE PCG FDX BBBY DDOG PSKY XEC GNRC CARR LOW NOW WPX
2020-12-31 MRNA XYZ GE CRWD PLTR PENN WPX FSLR GME KLAC FCX AMAT DVN CVNA QEP
2021-01-29 BBBY FCX CLF PBI WPX KLAC ALB TSLA MS TER AMAT CVNA TUP APTV GE
2021-02-26 GME TSLA PBI CLF TUP FCX PENN DDS AXON TDC CRWD GNRC COHR XYZ ALB
2021-03-31 GME DVN FCX PENN FANG NBR TRIP ETSY TPR OXY GS GNRC VIAC MRNA TDC
2021-04-30 VIAC DISCA DISCK TRIP TPL BBWI FCX WSM LPX DVN GNRC AMAT DELL CZR CLF
2021-05-28 GME TPL MAC LPX CLF FCX WSM NUE DDS BBWI ALL TDC LEN PHM TEX
2021-06-30 NUE FCX BBBY BX MAC GS COF XEC CLF LPX F STLD CAR DVN TRGP
2021-07-30 BX TGT GS DVN MAC GNRC TRGP F NUE GOOG FCX MUR RRC CRWD MS
2021-08-31 MRNA KKR BX SIVB GS CLF TGT SBNY NUE AMD DDS GNRC BBWI WFC KSU
2021-09-30 MRNA BX SIVB SBNY NUE PKI KSU XEC MMC PXD KKR AMD EPAM FRC A
2021-10-29 MRNA BX SIVB SBNY EOG RRC KKR OXY GS M APA NUE DVN AMD CB
2021-11-30 CAR DDS KKR MRNA M RRC BX APA COP DXCM APP KLAC WFC AZO JWN
2021-12-31 CAR DDS AMD KKR BX KLAC PFE APA DDOG APP ZTS M REGN ODFL JWN
2022-01-31 CAR DDS BLDR PFE WFC ON KLAC AMD BX CVX HPQ AZO F KKR MRVL
2022-02-28 WFC REGN CVX XOM CB MCK EXC COP PFE BX CAR AXP AMD WY HPQ
2022-03-31 CAR FCX COP CVX REGN ABBV CF OXY CB MOS DDS MCK ADM BRK-B WFC
2022-04-29 REGN FCX ABBV CVX MOS CAR COP CF MCK EXC OXY ADM CLF BKR CB
2022-05-31 CF MOS REGN EOG APA PFE ABBV CVX MRK MPC MCK XOM ADM BMY GILD
2022-06-30 EOG APA MPC VLO CF ABBV PFE XOM EQT GILD MOS OXY REGN CTRA MRK
2022-07-29 EOG APA CF MPC MOS ABBV ON XOM PFE OXY VLO DVN KLAC MRNA MCK
2022-08-31 CF MOS ON VRTX COP CVX MPC APA DVN MCK EOG AZO UPS VICI F
2022-09-30 CF DVN MOS COP CVX MPC APA EOG ON VRTX OXY MCK XOM MAR CAH
2022-10-31 CF COP CVX APA EOG DVN MPC MOS MCK CAH AZO VRTX CAR GPC XOM
2022-11-30 MPC CVX APA COP EOG MRNA XOM CF MRK BKNG AIG AMGN T VRTX GPC
2022-12-30 MPC CVX APA BKNG COP AIG EOG MRK XOM MRNA KLAC T JPM ABMD STLD
2023-01-31 BKNG MPC CLF MRNA ABMD KLAC BK BNY AIG AON CAT COP HES MAR MRK
2023-02-28 BKNG MPC UCL MOS CLF LEN MAR ON DHI ABNB ALGN ULTA AON MCHP DOW
2023-03-31 BKNG MPC UCL VLO ABNB URI DHI LEN XOM ON GE STLD MCHP LVS ULTA
2023-04-28 BKNG GE ADI MPC DHI AVGO FSLR XOM BSX LEN MTW ABNB CVX DECK LW
2023-05-31 BKNG PHM LEN GE VRTX DHI MDLZ NEE ADI KLAC HCA FSLR HSY AON LW
2023-06-30 BKNG PHM LEN CVNA PLTR DHI GE KLAC AVGO SMCI MRVL DAL CPRT URI TDG
2023-07-31 BKNG DAL PHM GE CVNA PANW JBL KLAC DHI AVGO HUBB VLO MPC CRWD EOG
2023-08-31 SMCI COIN BKNG DAL GP PHM MPC CCL PLTR CVNA RCL BBBY VLO EOG DASH
2023-09-29 CVNA SMCI BKNG PSX PLTR MPC PHM COIN JPM CAT EMR EOG VLO CPRI NOW
2023-10-31 PSX MPC BKNG VLO EMR CVNA SMCI PHM KLAC TMUS APP CPRI CME NOW TJX
2023-11-30 BKNG IBM SMCI TMUS PGR NOW PLTR FNMA JPM CBOE VST CVNA FMCC CPRT PHM
2023-12-29 BKNG CVNA COIN PHM NOW UBER IBM LEN PANW CRWD XYZ DHI KKR VRT DECK
2024-01-31 COIN CVNA BKNG IBM ANF CRM PHM NOW FICO DHI UBER CRWD FMCC JPM X
2024-02-29 SMCI GE PGR IBM CVNA TDG ANF UBER CRWD CRM BKNG PCAR META CAT NOW
2024-03-28 SMCI ANF GE DELL META PLTR CRM FNMA FMCC UBER IBM COIN PGR ADCT CVNA
2024-04-30 SMCI COIN ANF HOOD NVDA PGR PLTR META CAT FNMA FMCC GE ADCT APP WSM
2024-05-31 DELL ANF CVNA COIN PGR NVDA SMCI VRT META VST FNMA CEG WSM CAT NRG
2024-06-28 DELL VST FSLR ANF VRT NVDA PANW CEG META PGR SMCI AMZN NRG TMUS KLAC
2024-07-31 NVDA ANF HOOD VST CVNA META COIN KLAC COHR FSLR IBM PANW APP GDDY AMZN
2024-08-30 NVDA LUMN FICO PGR CVNA ANF PLTR PANW META IRM TMUS IBM WELL PM AMT
2024-09-30 PGR IBM NVDA PM NEM PLTR WELL TRGP CEG VTR KKR AMT UHS VRT META
2024-10-31 CEG NVDA VST META PLTR IBM PGR LUMN COHR HOOD TMUS BKNG MSI FISV TT
2024-11-29 LUMN VRT NVDA TPL VST CEG BKNG WMB COIN TRGP FMCC FNMA FISV COHR CRM
2024-12-31 TPL APP CVNA VST TRGP HOOD VRT AXON NVDA COIN RCL TMUS OKE BKNG WMB
2025-01-31 TPL VST COIN FNMA APP MRVL CEG FMCC GEV META TRGP LITE KMI GS LULU
2025-02-28 HOOD APP META GS JPM PGR BSX GEV IBKR LULU FOX FNMA CIEN FMCC DASH
2025-03-31 HOOD PGR APP TPL TPR FOX ABT WELL TMUS BKNG JPM META GS UBER BSX
2025-04-30 BKNG PGR GME HOOD UBER APP ABT PM WELL TMUS TPR CME TRV BRK-B MCK
2025-05-30 APP GILD UBER BKNG GME PM VRSN VST HOOD NEM COR ABT CME RCL CAH
2025-06-30 APP GILD BKNG HOOD UBER PM VRT GS SMCI RCL FNMA MPWR CCL ABT JPM
2025-07-31 HOOD APP RCL UBER BKNG GS CAR C GILD FNMA DIS JPM CCL KLAC HWM
2025-08-29 STX HOOD CAR COIN UBER GEV GS C KLAC MPWR GILD TPR SSP DASH UCL
2025-09-30 AVGO C TE STX GS UBER FNMA GOOG NEM COIN GEV MS ECHO FMCC KLAC
2025-10-31 NEM MU TE STX MPWR KLAC APP FMCC UBER GILD GS HOOD FNMA AVGO ECHO
2025-11-28 MU MPWR HOOD KLAC STX LUMN APP GILD NEM TE VRT ECHO GS WDC GLW
2025-12-31 WDC MU LUMN STX AVGO KLAC C MPWR GILD VRT SSP NEM M GS ATGE
2026-01-30 WDC KLAC NEM MU ECHO ALB SSP C STX GS GILD MPWR LLY TE EXPE
2026-02-27 WDC MU KLAC TE GILD MPWR ECHO STX GLW ALB NEM GOOG LITE GOOGL COHR
2026-03-31 MU WDC KLAC NEM COHR GILD GLW LITE STX JNJ IPGP PSX CIEN FDX ATI
2026-04-30 MU KLAC CAR PSX WDC APA NEM COHR GEV CF GILD JNJ GLW FTI LYB
2026-05-29 LITE MU CAR KLAC VRT APA WDC COHR GLW GEV CASY FIX PSX INTC GILD
2026-06-26 WDC MU HPE TE CIEN KLAC DELL LITE VRT NUE COHR MRVL SANM STLD FLEX
Scoring script (python)
FORMULA_NAME = "Contrarian 52W Regime Momentum Recovery Quality Hybrid (State-Arbitrated Relay, v1165)"
LOGIC_VARIANT_COUNT = 4
NOTES = """mode=explore; family=contrarian-52w-regime-momentum-recovery-quality-hybrid
New hybrid family built as a state-arbitrated relay instead of a static blend. It preserves the strong parent edge in recovery leaders off 52-week highs, but only pays for deeper drawdowns when repair, liquidity continuity, and operating durability confirm them. In healthy tapes, repaired leaders outrank deeper contrarian names; in choppier tapes, controlled pullbacks with improving trend get priority; in transitions, quality-backed turnarounds can beat pure momentum; in risk-off, the model triages for durable, liquid, lower-vol franchises that are merely bruised rather than broken.
Explicit arbitration rule: when momentum leadership and contrarian depth conflict, stock-state gates decide the sleeve. Deep drawdown names must pass a repair-and-durability gate to avoid falling knives; shallow drawdown leaders need trend persistence to outrank cheaper-looking laggards; transition tapes favor improving quality recoveries over both raw momentum and raw depth.
Deliberate metric coverage this run: active momentum uses 3m, 6m, and 12_1; trend/recovery uses both 200d distance and 52-week-high distance; volatility is active through realized vol; liquidity uses volume, dollar-volume, and trading-days continuity; income uses dividend yield in defensive branches only; valuation rotates to forward_pe and peg in transition/risk-off while pe is deliberately zeroed; growth uses forward_eps plus operating-income and free-cash-flow growth; quality uses operating and free-cash-flow margins; size uses market_cap only as a small negative tilt in strong tapes. Deliberate weight-0 metrics: return_1m_pct, return_12m_pct, dividend_ttm, pe, eps_growth_pct, revenue_growth_pct, shares_outstanding, close, adj_close, high_52w, ma_200d, eps_ttm, revenue_ttm, operating_income_ttm, free_cash_flow_ttm.
"""

# Deliberate weight-0 metrics this run:
# - Momentum/return: return_1m_pct, return_12m_pct
# - Income: dividend_ttm
# - Valuation: pe
# - Growth: eps_growth_pct, revenue_growth_pct
# - Size/raw levels: shares_outstanding, close, adj_close, high_52w, ma_200d,
#   eps_ttm, revenue_ttm, operating_income_ttm, free_cash_flow_ttm

STRONG_BULL = {
    "momentum_12_1_pct": (0.23, +1),
    "return_6m_pct": (0.19, +1),
    "return_3m_pct": (0.08, +1),
    "from_200d_ma_pct": (0.13, +1),
    "from_52w_high_pct": (0.17, -1),
    "realized_vol_3m": (0.06, -1),
    "avg_daily_dollar_volume_3m": (0.04, +1),
    "trading_days_3m": (0.03, +1),
    "forward_eps": (0.03, +1),
    "free_cash_flow_margin_pct": (0.02, +1),
    "market_cap": (0.02, -1),
}

SOFT_BULL = {
    "from_52w_high_pct": (0.21, -1),
    "from_200d_ma_pct": (0.18, +1),
    "return_6m_pct": (0.12, +1),
    "momentum_12_1_pct": (0.09, +1),
    "return_3m_pct": (0.07, +1),
    "realized_vol_3m": (0.08, -1),
    "avg_daily_volume_3m": (0.05, +1),
    "avg_daily_dollar_volume_3m": (0.04, +1),
    "operating_income_growth_pct": (0.07, +1),
    "free_cash_flow_growth_pct": (0.05, +1),
    "operating_margin_pct": (0.04, +1),
}

TRANSITION = {
    "from_200d_ma_pct": (0.16, +1),
    "from_52w_high_pct": (0.14, -1),
    "momentum_12_1_pct": (0.08, +1),
    "return_3m_pct": (0.08, +1),
    "realized_vol_3m": (0.07, -1),
    "avg_daily_dollar_volume_3m": (0.05, +1),
    "trading_days_3m": (0.04, +1),
    "forward_pe": (0.08, -1),
    "peg": (0.05, -1),
    "forward_eps": (0.08, +1),
    "operating_income_growth_pct": (0.07, +1),
    "free_cash_flow_growth_pct": (0.06, +1),
    "operating_margin_pct": (0.02, +1),
    "free_cash_flow_margin_pct": (0.02, +1),
}

RISK_OFF = {
    "from_52w_high_pct": (0.09, -1),
    "from_200d_ma_pct": (0.13, +1),
    "realized_vol_3m": (0.13, -1),
    "avg_daily_dollar_volume_3m": (0.07, +1),
    "trading_days_3m": (0.05, +1),
    "dividend_yield_ttm_pct": (0.08, +1),
    "forward_pe": (0.08, -1),
    "peg": (0.05, -1),
    "forward_eps": (0.07, +1),
    "operating_margin_pct": (0.10, +1),
    "free_cash_flow_margin_pct": (0.10, +1),
    "free_cash_flow_growth_pct": (0.05, +1),
}

def score_universe(stocks, regime, ctx):
    def safe_float(v):
        if v is None:
            return None
        if isinstance(v, bool):
            return 1.0 if v else 0.0
        try:
            x = float(v)
        except Exception:
            return None
        if x != x:
            return None
        return x

    def get_metric(stock, key):
        return safe_float(stock.get(key))

    def get_symbol(stock):
        sym = stock.get("symbol")
        if sym is None:
            return None
        try:
            return str(sym)
        except Exception:
            return None

    def rank_map(metric, direction):
        values = []
        for idx, stock in enumerate(stocks):
            v = get_metric(stock, metric)
            if v is not None:
                values.append((idx, v))
        ranked = {}
        n = len(values)
        if n == 0:
            return ranked
        values.sort(key=lambda x: x[1], reverse=(direction > 0))
        if n == 1:
            ranked[values[0][0]] = 1.0
            return ranked
        i = 0
        while i < n:
            j = i + 1
            while j < n and values[j][1] == values[i][1]:
                j += 1
            avg_rank = (i + j - 1) * 0.5
            score = 1.0 - (avg_rank / (n - 1))
            k = i
            while k < j:
                ranked[values[k][0]] = score
                k += 1
            i = j
        return ranked

    def weighted_base(branch):
        total = [0.0] * len(stocks)
        coverage = [0.0] * len(stocks)
        for metric, spec in branch.items():
            weight, direction = spec
            ranks = rank_map(metric, direction)
            for idx, val in ranks.items():
                total[idx] += weight * val
                coverage[idx] += weight
        out = [0.0] * len(stocks)
        for idx in range(len(stocks)):
            if coverage[idx] > 0.0:
                out[idx] = total[idx] / coverage[idx]
        return out

    def regime_token():
        parts = []
        if isinstance(regime, str):
            parts.append(regime.lower())
        elif isinstance(regime, dict):
            for key in (
                "label",
                "name",
                "regime",
                "state",
                "market_regime",
                "primary_regime",
                "trend",
                "description",
            ):
                v = regime.get(key)
                if v is not None:
                    try:
                        parts.append(str(v).lower())
                    except Exception:
                        pass
        if ctx and isinstance(ctx, dict):
            for key in ("regime", "market_regime", "regime_label", "market_state"):
                v = ctx.get(key)
                if v is not None:
                    try:
                        parts.append(str(v).lower())
                    except Exception:
                        pass
        text = " ".join(parts)
        if "risk" in text or "bear" in text or "defensive" in text or "crash" in text:
            return "risk_off"
        if "transition" in text or "mixed" in text or "neutral" in text or "sideways" in text:
            return "transition"
        if "soft" in text or "weak bull" in text or "fragile" in text or "repair" in text:
            return "soft_bull"
        if "bull" in text or "up" in text or "strong" in text or "momentum" in text:
            return "strong_bull"
        return "transition"

    branch_name = regime_token()
    if branch_name == "strong_bull":
        branch = STRONG_BULL
    elif branch_name == "soft_bull":
        branch = SOFT_BULL
    elif branch_name == "risk_off":
        branch = RISK_OFF
    else:
        branch = TRANSITION

    base_scores = weighted_base(branch)
    result = {}

    for idx, stock in enumerate(stocks):
        symbol = get_symbol(stock)
        if not symbol:
            continue

        m12 = get_metric(stock, "momentum_12_1_pct")
        r6 = get_metric(stock, "return_6m_pct")
        r3 = get_metric(stock, "return_3m_pct")
        d52 = get_metric(stock, "from_52w_high_pct")
        d200 = get_metric(stock, "from_200d_ma_pct")
        vol = get_metric(stock, "realized_vol_3m")
        adv = get_metric(stock, "avg_daily_volume_3m")
        addv = get_metric(stock, "avg_daily_dollar_volume_3m")
        tdays = get_metric(stock, "trading_days_3m")
        fpe = get_metric(stock, "forward_pe")
        peg = get_metric(stock, "peg")
        feps = get_metric(stock, "forward_eps")
        oig = get_metric(stock, "operating_income_growth_pct")
        fcfg = get_metric(stock, "free_cash_flow_growth_pct")
        om = get_metric(stock, "operating_margin_pct")
        fcfm = get_metric(stock, "free_cash_flow_margin_pct")
        dy = get_metric(stock, "dividend_yield_ttm_pct")

        score = base_scores[idx]
        bonus = 0.0

        momentum_ok = (
            (m12 is not None and m12 > 0.0) or
            (r6 is not None and r6 > 0.0) or
            (r3 is not None and r3 > -2.0)
        )
        strong_momentum = (
            (m12 is not None and m12 > 8.0) and
            (r6 is not None and r6 > 10.0)
        )
        repaired_trend = (
            (d200 is not None and d200 > 0.0) and
            (r3 is not None and r3 > -5.0)
        )
        deep_drawdown = d52 is not None and d52 >= 0.22
        shallow_pullback = d52 is not None and 0.07 <= d52 <= 0.22
        controlled_vol = vol is None or vol < 42.0
        liquid_ok = (
            (tdays is None or tdays >= 45.0) and
            ((addv is not None and addv > 0.0) or (adv is not None and adv > 0.0))
        )
        durability_ok = (
            ((om is not None and om > 0.0) or (fcfm is not None and fcfm > 0.0)) and
            ((fcfg is None or fcfg > -10.0) and (oig is None or oig > -10.0))
        )
        growth_ok = (
            (feps is None or feps > 0.0) and
            ((oig is not None and oig > 0.0) or (fcfg is not None and fcfg > 0.0))
        )
        value_ok = (
            (fpe is None or (fpe > 0.0 and fpe < 28.0)) and
            (peg is None or (peg > 0.0 and peg < 2.2))
        )

        if branch_name == "strong_bull":
            if strong_momentum and repaired_trend and shallow_pullback:
                bonus += 0.18
            elif deep_drawdown and repaired_trend and durability_ok and liquid_ok:
                bonus += 0.08
            elif deep_drawdown and not repaired_trend:
                bonus -= 0.18
            elif not momentum_ok:
                bonus -= 0.08

            if controlled_vol:
                bonus += 0.03
            else:
                bonus -= 0.04

        elif branch_name == "soft_bull":
            if deep_drawdown and repaired_trend and durability_ok and controlled_vol:
                bonus += 0.16
            elif shallow_pullback and strong_momentum and controlled_vol:
                bonus += 0.07
            elif deep_drawdown and not durability_ok:
                bonus -= 0.16
            elif not liquid_ok:
                bonus -= 0.05

            if growth_ok:
                bonus += 0.04

        elif branch_name == "transition":
            turnaround_ok = repaired_trend and durability_ok and growth_ok and value_ok
            if turnaround_ok and deep_drawdown:
                bonus += 0.18
            elif turnaround_ok and shallow_pullback:
                bonus += 0.10
            elif strong_momentum and not value_ok:
                bonus -= 0.07
            elif deep_drawdown and (not repaired_trend or not durability_ok):
                bonus -= 0.18

            if liquid_ok:
                bonus += 0.03

        else:
            defensive_ok = durability_ok and value_ok and controlled_vol and liquid_ok
            if defensive_ok and shallow_pullback:
                bonus += 0.15
            elif defensive_ok and deep_drawdown and repaired_trend:
                bonus += 0.08
            elif deep_drawdown and not defensive_ok:
                bonus -= 0.20
            elif strong_momentum and vol is not None and vol > 45.0:
                bonus -= 0.06

            if dy is not None and dy > 0.0:
                bonus += 0.03
            if d200 is not None and d200 < -8.0:
                bonus -= 0.05

        coverage_penalty = 0.0
        missing_core = 0
        for v in (d52, d200, vol):
            if v is None:
                missing_core += 1
        if missing_core >= 2:
            coverage_penalty -= 0.06
        if not liquid_ok:
            coverage_penalty -= 0.03

        result[symbol] = score + bonus + coverage_penalty

    return result