exp_1143

Contrarian 52-Week Recovery with Quality-Regime Momentum Arbitration (v1143)

← All V2 experiments
Relative return
1.041x
Excess vs bench
4.13%
Benchmark
CAPW_UNIV
Rolling windows
179 · monthly
Mean strategy gain
18.83%
Mean benchmark gain
14.08%
Mean excess gain
4.75%
Dispersion (ref)
6.42%
Win-rate vs bench (ref)
99.44%
Worst / best ratio (ref)
0.984x / 1.081x
Logic variants
3
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 4.42% 2.22% 1.022x
2011-07-01 … 2016-06-30 21.49% 13.74% 1.068x
2016-07-01 … 2021-06-30 24.23% 20.63% 1.030x
2021-07-01 … 2026-06-26 23.89% 15.48% 1.073x
All rolling windows — the objective set (equal-weighted mean ratio)
Strategy Benchmark (CAPW_UNIV) Excess
2006200720082009201020112012201320142015201620172018201920202021 -5%0%5%10%15%20%25%30%
rolling 5y windows, monthly step — 179 windows · mean ratio 1.041x · beat benchmark in 178/179
#WindowStrategyBenchmarkRatio
1 2006-07-31 … 2011-07-29 2.88% 1.79% 1.011x
2 2006-08-31 … 2011-08-31 1.92% 0.21% 1.017x
3 2006-09-29 … 2011-08-31 1.97% -0.14% 1.021x
4 2006-10-31 … 2011-10-31 1.89% 0.23% 1.017x
5 2006-11-30 … 2011-11-30 1.83% -0.05% 1.019x
6 2006-12-29 … 2011-11-30 1.75% -0.32% 1.021x
7 2007-01-31 … 2012-01-31 2.00% 0.93% 1.011x
8 2007-02-28 … 2012-01-31 1.77% 1.43% 1.003x
9 2007-03-30 … 2012-03-30 4.94% 3.09% 1.018x
10 2007-04-30 … 2012-04-30 4.05% 2.42% 1.016x
11 2007-05-31 … 2012-05-31 3.39% 0.60% 1.028x
12 2007-06-29 … 2012-06-29 4.81% 1.92% 1.028x
13 2007-07-31 … 2012-07-31 5.68% 2.69% 1.029x
14 2007-08-31 … 2012-08-31 5.98% 2.95% 1.029x
15 2007-09-28 … 2012-09-28 5.73% 3.20% 1.025x
16 2007-10-31 … 2012-10-31 4.49% 2.60% 1.018x
17 2007-11-30 … 2012-11-30 5.61% 3.45% 1.021x
18 2007-12-31 … 2012-12-31 5.71% 3.69% 1.019x
19 2008-01-31 … 2013-01-31 7.91% 5.85% 1.019x
20 2008-02-29 … 2013-02-28 9.04% 6.82% 1.021x
21 2008-03-31 … 2013-03-28 10.98% 7.73% 1.030x
22 2008-04-30 … 2013-04-30 10.21% 7.51% 1.025x
23 2008-05-30 … 2013-04-30 8.33% 7.81% 1.005x
24 2008-06-30 … 2013-06-28 7.55% 9.33% 0.984x
25 2008-07-31 … 2013-07-31 11.23% 10.48% 1.007x
26 2008-08-29 … 2013-07-31 12.08% 10.52% 1.014x
27 2008-09-30 … 2013-09-30 14.97% 11.48% 1.031x
28 2008-10-31 … 2013-10-31 19.49% 15.76% 1.032x
29 2008-11-28 … 2013-10-31 21.13% 17.46% 1.031x
30 2008-12-31 … 2013-12-31 23.61% 18.44% 1.044x
31 2009-01-30 … 2013-12-31 25.41% 20.64% 1.040x
32 2009-02-27 … 2014-01-31 27.56% 21.63% 1.049x
33 2009-03-31 … 2014-03-31 26.24% 20.60% 1.047x
34 2009-04-30 … 2014-04-30 24.97% 19.00% 1.050x
35 2009-05-29 … 2014-04-30 26.68% 18.32% 1.071x
36 2009-06-30 … 2014-06-30 28.45% 19.01% 1.079x
37 2009-07-31 … 2014-07-31 25.92% 17.39% 1.073x
38 2009-08-31 … 2014-08-29 26.78% 17.70% 1.077x
39 2009-09-30 … 2014-09-30 24.49% 16.64% 1.067x
40 2009-10-30 … 2014-09-30 26.52% 17.08% 1.081x
41 2009-11-30 … 2014-11-28 24.03% 16.82% 1.062x
42 2009-12-31 … 2014-12-31 22.84% 16.28% 1.056x
43 2010-01-29 … 2014-12-31 24.93% 17.23% 1.066x
44 2010-02-26 … 2015-01-30 23.75% 15.80% 1.069x
45 2010-03-31 … 2015-03-31 23.38% 15.40% 1.069x
46 2010-04-30 … 2015-04-30 20.79% 15.38% 1.047x
47 2010-05-28 … 2015-04-30 23.04% 17.09% 1.051x
48 2010-06-30 … 2015-06-30 24.52% 17.45% 1.060x
49 2010-07-30 … 2015-06-30 24.30% 16.43% 1.068x
50 2010-08-31 … 2015-08-31 23.54% 15.76% 1.067x
51 2010-09-30 … 2015-09-30 21.52% 13.61% 1.070x
52 2010-10-29 … 2015-09-30 21.12% 13.06% 1.071x
53 2010-11-30 … 2015-11-30 21.61% 15.09% 1.057x
54 2010-12-31 … 2015-12-31 20.05% 13.55% 1.057x
55 2011-01-31 … 2016-01-29 19.32% 11.90% 1.066x
56 2011-02-28 … 2016-01-29 19.39% 11.53% 1.070x
57 2011-03-31 … 2016-03-31 19.17% 12.90% 1.055x
58 2011-04-29 … 2016-04-29 18.42% 12.39% 1.054x
59 2011-05-31 … 2016-05-31 19.36% 12.94% 1.057x
60 2011-06-30 … 2016-06-30 20.14% 13.30% 1.060x
61 2011-07-29 … 2016-07-29 20.94% 14.52% 1.056x
62 2011-08-31 … 2016-08-31 20.38% 15.19% 1.045x
63 2011-09-30 … 2016-09-30 21.80% 16.32% 1.047x
64 2011-10-31 … 2016-10-31 18.80% 14.02% 1.042x
65 2011-11-30 … 2016-11-30 19.06% 14.66% 1.038x
66 2011-12-30 … 2016-12-30 18.22% 14.92% 1.029x
67 2012-01-31 … 2017-01-31 19.01% 14.63% 1.038x
68 2012-02-29 … 2017-02-28 18.17% 14.78% 1.030x
69 2012-03-30 … 2017-02-28 17.54% 14.43% 1.027x
70 2012-04-30 … 2017-04-28 17.27% 14.61% 1.023x
71 2012-05-31 … 2017-05-31 19.34% 15.98% 1.029x
72 2012-06-29 … 2017-05-31 18.81% 15.44% 1.029x
73 2012-07-31 … 2017-07-31 18.71% 15.43% 1.028x
74 2012-08-31 … 2017-08-31 19.57% 15.12% 1.039x
75 2012-09-28 … 2017-08-31 19.45% 14.77% 1.041x
76 2012-10-31 … 2017-10-31 21.79% 16.12% 1.049x
77 2012-11-30 … 2017-11-30 22.04% 16.79% 1.045x
78 2012-12-31 … 2017-12-29 21.28% 16.93% 1.037x
79 2013-01-31 … 2018-01-31 22.58% 17.57% 1.043x
80 2013-02-28 … 2018-02-28 21.36% 16.21% 1.044x
81 2013-03-28 … 2018-02-28 20.07% 15.81% 1.037x
82 2013-04-30 … 2018-04-30 19.31% 14.25% 1.044x
83 2013-05-31 … 2018-05-31 20.98% 14.57% 1.056x
84 2013-06-28 … 2018-05-31 21.86% 14.97% 1.060x
85 2013-07-31 … 2018-07-31 19.94% 14.83% 1.045x
86 2013-08-30 … 2018-07-31 20.45% 15.59% 1.042x
87 2013-09-30 … 2018-09-28 21.07% 15.84% 1.045x
88 2013-10-31 … 2018-10-31 17.82% 12.89% 1.044x
89 2013-11-29 … 2018-10-31 17.01% 12.60% 1.039x
90 2013-12-31 … 2018-12-31 14.67% 9.93% 1.043x
91 2014-01-31 … 2019-01-31 14.71% 12.37% 1.021x
92 2014-02-28 … 2019-02-28 13.95% 12.38% 1.014x
93 2014-03-31 … 2019-03-29 16.16% 12.76% 1.030x
94 2014-04-30 … 2019-04-30 17.02% 13.73% 1.029x
95 2014-05-30 … 2019-04-30 16.45% 13.54% 1.026x
96 2014-06-30 … 2019-06-28 16.09% 12.81% 1.029x
97 2014-07-31 … 2019-07-31 16.83% 13.30% 1.031x
98 2014-08-29 … 2019-07-31 15.74% 12.80% 1.026x
99 2014-09-30 … 2019-09-30 16.71% 12.70% 1.036x
100 2014-10-31 … 2019-10-31 16.24% 12.91% 1.029x
101 2014-11-28 … 2019-10-31 16.18% 12.60% 1.032x
102 2014-12-31 … 2019-12-31 17.76% 14.16% 1.032x
103 2015-01-30 … 2019-12-31 17.31% 14.85% 1.021x
104 2015-02-27 … 2020-01-31 17.61% 14.04% 1.031x
105 2015-03-31 … 2020-03-31 11.99% 8.56% 1.032x
106 2015-04-30 … 2020-04-30 16.84% 11.65% 1.046x
107 2015-05-29 … 2020-05-29 17.76% 12.61% 1.046x
108 2015-06-30 … 2020-06-30 18.64% 13.64% 1.044x
109 2015-07-31 … 2020-07-31 20.03% 14.60% 1.047x
110 2015-08-31 … 2020-08-31 21.40% 18.07% 1.028x
111 2015-09-30 … 2020-09-30 19.98% 17.05% 1.025x
112 2015-10-30 … 2020-10-30 17.98% 14.60% 1.030x
113 2015-11-30 … 2020-11-30 21.77% 17.43% 1.037x
114 2015-12-31 … 2020-12-31 22.79% 18.65% 1.035x
115 2016-01-29 … 2021-01-29 25.92% 19.26% 1.056x
116 2016-02-29 … 2021-02-26 28.31% 19.79% 1.071x
117 2016-03-31 … 2021-03-31 26.31% 19.42% 1.058x
118 2016-04-29 … 2021-03-31 27.08% 19.66% 1.062x
119 2016-05-31 … 2021-05-28 25.76% 20.42% 1.044x
120 2016-06-30 … 2021-06-30 23.80% 21.06% 1.023x
121 2016-07-29 … 2021-06-30 24.23% 20.63% 1.030x
122 2016-08-31 … 2021-08-31 28.23% 21.75% 1.053x
123 2016-09-30 … 2021-09-30 26.12% 20.22% 1.049x
124 2016-10-31 … 2021-10-29 28.38% 22.50% 1.048x
125 2016-11-30 … 2021-11-30 27.59% 21.87% 1.047x
126 2016-12-30 … 2021-11-30 28.46% 21.75% 1.055x
127 2017-01-31 … 2022-01-31 21.90% 20.17% 1.014x
128 2017-02-28 … 2022-02-28 20.90% 18.51% 1.020x
129 2017-03-31 … 2022-03-31 23.60% 19.46% 1.035x
130 2017-04-28 … 2022-03-31 23.60% 19.46% 1.035x
131 2017-05-31 … 2022-05-31 22.13% 15.59% 1.057x
132 2017-06-30 … 2022-06-30 20.89% 13.08% 1.069x
133 2017-07-31 … 2022-07-29 20.50% 15.16% 1.046x
134 2017-08-31 … 2022-08-31 19.88% 13.72% 1.054x
135 2017-09-29 … 2022-08-31 19.63% 13.56% 1.053x
136 2017-10-31 … 2022-10-31 19.80% 11.86% 1.071x
137 2017-11-30 … 2022-11-30 19.64% 12.52% 1.063x
138 2017-12-29 … 2022-11-30 20.28% 12.46% 1.070x
139 2018-01-31 … 2023-01-31 18.04% 11.01% 1.063x
140 2018-02-28 … 2023-02-28 18.10% 11.03% 1.064x
141 2018-03-29 … 2023-02-28 18.55% 11.72% 1.061x
142 2018-04-30 … 2023-04-28 19.10% 13.01% 1.054x
143 2018-05-31 … 2023-05-31 17.66% 12.95% 1.042x
144 2018-06-29 … 2023-05-31 17.86% 13.01% 1.043x
145 2018-07-31 … 2023-07-31 19.81% 14.67% 1.045x
146 2018-08-31 … 2023-08-31 18.42% 13.51% 1.043x
147 2018-09-28 … 2023-08-31 18.59% 13.56% 1.044x
148 2018-10-31 … 2023-10-31 17.05% 12.60% 1.040x
149 2018-11-30 … 2023-11-30 17.94% 14.58% 1.029x
150 2018-12-31 … 2023-12-29 19.99% 17.26% 1.023x
151 2019-01-31 … 2024-01-31 21.05% 16.27% 1.041x
152 2019-02-28 … 2024-01-31 20.94% 15.94% 1.043x
153 2019-03-29 … 2024-03-28 24.23% 17.50% 1.057x
154 2019-04-30 … 2024-04-30 23.65% 15.50% 1.071x
155 2019-05-31 … 2024-05-31 24.84% 18.12% 1.057x
156 2019-06-28 … 2024-06-28 22.80% 17.99% 1.041x
157 2019-07-31 … 2024-07-31 22.26% 17.70% 1.039x
158 2019-08-30 … 2024-08-30 22.13% 18.41% 1.031x
159 2019-09-30 … 2024-09-30 23.05% 18.65% 1.037x
160 2019-10-31 … 2024-10-31 23.89% 17.87% 1.051x
161 2019-11-29 … 2024-11-29 26.67% 18.64% 1.068x
162 2019-12-31 … 2024-12-31 22.43% 17.62% 1.041x
163 2020-01-31 … 2025-01-31 23.21% 18.07% 1.044x
164 2020-02-28 … 2025-02-28 24.51% 19.00% 1.046x
165 2020-03-31 … 2025-03-31 24.69% 19.24% 1.046x
166 2020-04-30 … 2025-04-30 22.26% 16.49% 1.050x
167 2020-05-29 … 2025-04-30 21.22% 15.80% 1.047x
168 2020-06-30 … 2025-06-30 21.61% 18.19% 1.029x
169 2020-07-31 … 2025-07-31 19.19% 17.87% 1.011x
170 2020-08-31 … 2025-08-29 18.66% 16.69% 1.017x
171 2020-09-30 … 2025-09-30 21.78% 18.57% 1.027x
172 2020-10-30 … 2025-09-30 22.58% 19.43% 1.026x
173 2020-11-30 … 2025-11-28 21.15% 17.77% 1.029x
174 2020-12-31 … 2025-12-31 20.16% 16.92% 1.028x
175 2021-01-29 … 2025-12-31 18.45% 17.20% 1.011x
176 2021-02-26 … 2026-01-30 19.97% 17.04% 1.025x
177 2021-03-31 … 2026-03-31 20.32% 14.07% 1.055x
178 2021-04-30 … 2026-04-30 24.82% 16.03% 1.076x
179 2021-05-28 … 2026-04-30 25.34% 16.22% 1.078x
Notes
mode=explore; family=contrarian-52w-recovery-quality-regime-momentum-hybrid This hybrid combines three orthogonal sleeves from the strongest parents, but only after explicit arbitration. In bullish tapes it prefers repaired momentum leaders that are still not fully extended versus the 52-week high. In mixed tapes it hunts deep 52-week drawdown names only when price repair, quality durability, and tradability all confirm together. In defensive tapes it suppresses low-quality rebounds and rotates toward lower-volatility, valuation-supported, quality names that still retain basic trend integrity. Deliberate metric coverage: actively use momentum/return via return_3m_pct, return_6m_pct, momentum_12_1_pct; trend/recovery via from_52w_high_pct and from_200d_ma_pct; volatility via realized_vol_3m; liquidity via avg_daily_dollar_volume_3m and trading_days_3m; income via dividend_yield_ttm_pct; valuation via peg and forward_pe; growth via revenue_growth_pct and operating_income_growth_pct; quality via free_cash_flow_margin_pct and operating_margin_pct; size via market_cap. Deliberately weight return_1m_pct, return_12m_pct, avg_daily_volume_3m, dividend_ttm, pe, eps_growth_pct, forward_eps, free_cash_flow_growth_pct, shares_outstanding, close, adj_close, high_52w, ma_200d, eps_ttm, revenue_ttm, operating_income_ttm, and free_cash_flow_ttm at zero this run to avoid collapsing back into any parent recipe while still covering the full metric menu consciously. Sparse fundamentals are normalized by present weights before sleeve arbitration so missing data does not automatically zero a stock unless multiple confirmation blocks are absent.
Lesson notes
#850 · degrade · relative_return Δ -0.3282 · parent exp_1104 · Jul 21, 2026 · auto/explore; benchmark CAPW_UNIV
explore/contrarian-52w-recovery-quality-regime-momentum-hybrid: relative_return 1.0413x (delta -0.3282 vs exp_1104); win-rate 99.4413%, worst-window 0.983682, dispersion 6.4189%.
Monthly picks — top stocks selected each month (whole timeline)
timeline — 240 months · top 15 each
Month 123456789101112131415
2006-07-31 SLG MRK CPB CMI BXP DDS DGX CME CSX AVB CPT T ATI PFG INTU
2006-08-31 MRK ADM SLG BXP LH T DDS VNO DGX CPB ESS LMT AVB ECL L
2006-09-29 T MRK KSS BXP HOG VNO LMT HUM LH ORCL AIV DGX VTR CTSH ESS
2006-10-31 MRK KSS AIV T HOG CTSH VNO GS MAT INTU MS OKE IT EQR AKAM
2006-11-30 MRK MAT HOG VNO SLG GS AT KSS ES BXP HAS ETR CMCSA DLR OKE
2006-12-29 ES HOG VNO CMCSA MTCH OKE MAT ETR GS BKNG DLR NEE CNP PCAR EOP
2007-01-31 BKNG TWX AT HAS MTCH DECK CMCSA DOC HPQ MAT PCAR NEE ALB CNP BMET
2007-02-28 MAT DOC HAS NEE AT ETR BXP SLG KMX TWX SYK CNP BMET CBRE SRE
2007-03-30 MAT NRG MTCH NEE ETR AEP ES SYK HAS CNP SRE KR ZBH PEG SVU
2007-04-30 ETR PEG ES BAX SYK SRE MAT AEP NEE FE GT NRG MTCH PPL RL
2007-05-31 ETR NRG PEG CI BAX CE EIX MAT HON DLTR SVU SYK TAP AT NEE
2007-06-29 NRG CI GT MLM CE HON DLX L BAX AAPL OKE MDR ON WBD ICE
2007-07-31 DJ MDR HON AL CE X JEC AT ALXN BWA CF HCR MTW APOL GME
2007-08-31 HON BIIB DJ VRSN IBM COP AL DE MDR CVX LIN CE FSLR TDG X
2007-09-28 BIIB PENN FLR EXPE DE COP BG VRSN ESRX HON NOV FTI GME IBM CVX
2007-10-31 EXPE FLR BG GOOG FTI AMZN TRMB GRMN MGM BIIB FMC AL GOOGL DE PENN
2007-11-30 FMC GOOG FTI AL FLR WAT MRK MGM GOOGL IDXX MDR MCD OI KO APD
2007-12-31 MRK MCD CME GOOG BRK-B WAT CL FMC CRL IRM HUM KO APD GOOGL ESRX
2008-01-31 ESRX HUM CRL BRK-B PEG FE PRGO IRM JEC MCD KO CMG ADM AFL J
2008-02-29 AFL CRL EQT CL ESRX BAX JEC BDX X BRK-B WMB MA APOL FSLR J
2008-03-31 AFL CL BDX MO ESRX JEC BRK-B MEE BAX CF X APOL WDC MHS ATGE
2008-04-30 AFL HAL EQT UNP CF MEE BTUUQ RRC X ESV APOL MUR CSX WMT DVN
2008-05-30 TTWO CSX HAL UNP MA NBR EQT FMC X MEE OI APA BTUUQ APOL RRC
2008-06-30 FMC TTWO NBR MA X CSX HAL APOL EQT MEE HP BTUUQ BCR ESV ATGE
2008-07-31 MEE WWY BTUUQ ESV X APOL BCR EW ATGE CEPH SRCL HP MHS CF HRS
2008-08-29 ESV BTUUQ WWY APOL BCR CEPH ATGE SRCL MHS HRS ACS RTN SWN CELG STJ
2008-09-30 ESV BCR APOL WWY CEPH ATGE SRCL HRS ACS SWN BTUUQ CELG FDO BNI MHS
2008-10-31 WWY MRSH CHD CLX ABT BAX NSC STE MCD BCR LEG CPB MDLZ GIS ROH
2008-11-28 DLTR KR CLX MCD CHD MRSH SJM ABT SHW ED KMB PRGO AON BAX HSY
2008-12-31 DLTR SHW MCD KR AON SJM CLX ABT CHD AMGN GILD DGX CHRW BMY CL
2009-01-30 DLTR MCD SJM GILD ABT BMY PCG MDLZ LDOS WM DGX EW CL HSY WEC
2009-02-27 PCG EW LDOS HSY GILD MCD ABT VTRS WEC XEL DGX ED BAX CL AZO
2009-03-31 PCG VTRS DLTR AZO EW BALL BKNG MNST BIIB BMY AAP XEL CMS ED ADM
2009-04-30 BR AZO MNST VTRS NFLX AAP GEN ORLY FDS KSS ROST BKNG EW DRI CMS
2009-05-29 BKNG TJX NFLX ROST GPS WDC ILMN AAP AZO ORLY VTRS DRI FFIV FDS CTSH
2009-06-30 AAPL TJX BKNG GOOG ISRG FISV QCOM ELV MSI FFIV WBD CF ROST MS PALM
2009-07-31 AAPL WBD TJX CF BKNG FISV FIS CTSH TXN PALM TPR ADBE FFIV ROST AN
2009-08-31 AAPL F BKNG COF PALM WDC PVH NVR EBAY MU SNDK WBD KLAC KDP EXPE
2009-09-30 AAPL PALM WBD F BKNG MU EXPE GNW WLL CTSH ON SNDK IP STX SPG
2009-10-30 AAPL WBD TT BKNG EXPE WLL STX MCK HIG EBAY SNDK FCX CTSH PXD GMCR
2009-11-30 TT AAPL CTSH FLEX WLL MCK GOOG BKNG FCX BEN SNDK WSM MSFT ITW GGP
2009-12-31 BKNG GOOG TT WLL IP CTSH MAC SLG DD EXPE NFLX FLEX ISRG V F
2010-01-29 WLL SLG CRM MEE GGP DD PXD TIN WFM SW BKNG F CTSH VTSS SNDK
2010-02-26 WLL BKNG DD F PXD OKE GGP CCI HUM MEE TIN SNDK WFM SLG AMP
2010-03-31 F WLL FFIV ISRG BKNG PXD EQR CTSH SWK UAL ETFC CLF GGP SNDK DPZ
2010-04-30 WLL F BKNG BBWI LYV NFLX TSN VSTNQ PXD EL ASH ISRG CMI GGP SNDK
2010-05-28 WLL F BBWI UAL ASH AIV CMI PXD AAPL FITB COR TSN VSTNQ ISRG GGP
2010-06-30 COR KDP WLL AAPL UHS DLTR HAS WBD SHW CMI BBWI TMUS MCK EQR TJX
2010-07-30 KDP AAPL AIG AKAM DLTR TSN HSY PRGO HAS AZO EW WLL NEM RMD WBD
2010-08-31 AAPL AZO KDP EW CTSH PRGO CASY MO DLTR DLR CCU NEM AVB AMT MCD
2010-09-30 CCU AAPL MO AZO AAP DLTR CPQ CASY CTSH EQR ERIE AMT NEM CMS CCI
2010-10-29 AAPL ERIE CTSH DLTR EMN AZO MO LYB AAP CCU COO CMI ILMN BWA VRSN
2010-11-30 BKNG WLL DLTR AAPL ILMN AZO NTAP AAP BWA MCHP MO INTU TXN EXPD ERIE
2010-12-31 BKNG EXPD TXN WLL ILMN TPR BWA ETN SWKS NFLX CMI AZO LUMN EW COO
2011-01-31 CXO PXD XEC ALXN WLL JOY CTXS BKNG ILMN SNDK FDO ACAS TWC TXN SBNY
2011-02-28 LULU NOV HOG FLR TXN ILMN ROK KLAC CXO PXD VLO ACAS FDO BWA QCOM
2011-03-31 KLAC NOV PSKY DECK BKNG CBRE BKR CSX COP LYB TER ILMN WYNN VIAV WMB
2011-04-29 BKNG PSKY TSCO BKR ECHO BIIB NBR ANDV LYB ETFC DDS MSI HUM MCO LULU
2011-05-31 BKNG LULU CXO PXD BBWI WMB GR FDO SBNY ELV BIIB KSU ALXN PETM TWC
2011-06-30 BKNG HUM MCO MNST BBWI ELV TDC GR MSI CHTR WYNN PXD ADS KSU PSKY
2011-07-29 BIIB COO MNST ADS WCG CEPH GR BKNG TDC KSU COG HUM EP CMG DLTR
2011-08-31 BIIB AAPL BKNG CF BBWI CMG DLTR ISRG PM VFC OKE IRM WYNN COO EQT
2011-09-30 AAPL BIIB DLTR VFC AZO CNP FE NI CL CTRA TJX ISRG BBWI CHD MNST
2011-10-31 KLAC AAPL DLTR BIIB DG VFC TJX MNST NI INTC AZO ISRG FE CL CNP
2011-11-30 KLAC DLTR ISRG VFC BIIB MA AAPL OKE GWW TJX INTC MNST DECK HUM V
2011-12-30 KLAC PM DLTR TJX MA ISRG V AAPL GWW OKE VFC HUM INTC MCD GRMN
2012-01-31 GWW DLTR TJX AAPL GRMN MNST ISRG FAST KLAC V ORLY OKE MA WCG HUM
2012-02-29 AAPL TJX V ISRG GRMN EQIX WCG FAST TRGP COG INTC LYB ADS MNST SHW
2012-03-30 AAPL BKNG EQIX FAST ULTA ISRG AAP WCG TJX ADS PVH MOH LVS SHW PSKY
2012-04-30 TJX AAPL SHW ISRG BKNG PM CCI MNST PSKY SBAC ULTA V DLTR AAP VRSK
2012-05-31 BKNG CCI SBAC EC AAPL ISRG SHW SPG CMCSA STX WMB TFC DLTR TJX V
2012-06-29 SHW CCI SBAC BKNG AAPL DLTR MNST SRE SPG TJX WBD DG BIIB CMCSA STX
2012-07-31 AAPL KMB SHW CCI CHD SBAC MRK BIIB SRE TJX V WEC DG MO CMCSA
2012-08-31 AAPL SBAC SHW CMCSA TJX MRK BIIB SPG CCI MO AMGN KMB VTR USB STX
2012-09-28 AAPL VLO CF STZ SHW CCI CMCSA SBAC BIIB DHI TJX ALL EBAY BUD AMGN
2012-10-31 SBAC MRK AMGN ALL CCI TWX SHW STZ BUD CMCSA GE WBD CF EQIX AOS
2012-11-30 AMGN SBAC CMCSA DVA ALL MRK BAX MTB MCO CPAY V IRM CCI WBD TWX
2012-12-31 STX STZ SBAC AMGN MCO BAX CMCSA CPAY APTV DDS GILD AFL VTRS RMD EBAY
2013-01-31 STX APTV PPG CPAY EMN STT IP MCO V PHM EME HFC EQIX PKG HRB
2013-02-28 GILD PHM STT HCA WBD TRGP LYB GS THC TSN CAG TWX FLT LPX CPRT
2013-03-28 GILD STT WBD AVY CAG LEG LII AMGN TWX DXC GEN ALL KR TYL KKR
2013-04-30 COR TWX KR GEN GILD HRB WBD TSN NRG STT CPB HSY PSKY DXC BIIB
2013-05-31 REGN KR STZ BX ADBE PHM COR PSKY MCO TWX GILD BEN JEF STT PKG
2013-06-28 MCO REGN STZ CPAY SLM WDC GILD STT GOOG BSX CBOE FNMA FSLR AIZ TWX
2013-07-31 STX TYL STZ ELV BKNG APTV CME CBOE PKG GNW SLM FNMA HII OMX STT
2013-08-30 BKNG ELV GHC TSN PRU REGN AIZ PKG MCO CBOE OMX SLM MET HII CI
2013-09-30 BKNG OMX FLT HII ADS ELV GT CELG GME FLEX KATE NOC HBI LNC TRIP
2013-10-31 META BKNG FLT ADS BSX CELG MA SIVB HBI KATE OMX PXD REGN WFM XEC
2013-11-29 META BKNG OMX PBI HII STZ GNW MCK CAH AMP REGN MA BR AAL GHC
2013-12-31 BKNG MCK IBKR BR META MA PBI STZ CAH HII VTRS AMP LNC PFG LVS
2014-01-31 BKNG MA MGM HII GT STZ ADS MCK FLT KATE BX URI DAL GOOG CELG
2014-02-28 BKNG ILMN BX MA SPGI GOOG MGM FLT V MCK INCY KATE ADSK CELG STZ
2014-03-31 WYNN BKNG META BX MCK MTCH CAH DD HP HII ILMN PANW LYB FNMA SWKS
2014-04-30 HP GLW STZ TSN EOG LYB DD META TRGP BKR WYNN HII TDG FNMA TPL
2014-05-30 LYB BKR GLW OKE TRGP META HP DD WLL URI PEG FRX EOG TSN AAP
2014-06-30 FRX META LYB URI WLL SWKS GMCR GLW OKE ODP TPL EOG BF.B BF-B BALL
2014-07-31 MU NFX URI AAPL NBR TAP CAR NOV EOG MSFT CBRE META COP LYB DD
2014-08-29 KLAC LYB CAR GILD AAPL AMT HAL URI GMCR CDW BNY BK DLR LRCX MU
2014-09-30 WMB LRCX KLAC GILD UNP URI DLR TRGP LYB MSFT TDG UHS NXPI AMT BALL
2014-10-31 GILD HCA DLR MO AAPL KDP MCO MSFT LUMN WMB META TDG KR GMCR GD
2014-11-28 AAPL KR KDP MO RHI DLR CSX GILD MCO GMCR TWX IRM HCA EA UNP
2014-12-31 AAPL WELL AMGN KR KDP EW IRM SIAL MNST EIX COR MO EA ZTS PNW
2015-01-30 KR EW WELL KDP SHW MO PCG CNC MAC AVB ORLY BBWI IRM ULTA EQR
2015-02-27 KR MAC COR SHW ARE RMD KDP CNC WELL MO STZ FDS DLTR TDG ELV
2015-03-31 COR DLTR KR SHW CNC ELV SWKS ULTA AET ZTS SBUX CME MO CI TXN
2015-04-30 COR SWKS DLTR ULTA KR BX CI SBUX SHW STZ DDS ELV HSP LII MSCI
2015-05-29 COR HSP BX ABMD FDS SHW ULTA VMC KR EFX AZO AET MCO EA FICO
2015-06-30 COR BX HSP GILD ABMD AET KRFT ELV MCO MSCI AYI STZ EA BSX FDS
2015-07-31 SBUX MTG ULTA ORLY EA KRFT AYI AET HAS INCY EQIX CNC DIS ROL MCO
2015-08-31 MDLZ ULTA AYI ORLY EA STZ EQIX MTG ACGL IQV ACN SBUX NVR HSP HAS
2015-09-30 HUM MDLZ CASY ORLY STZ EQIX NVR HSP MO PSA ACGL ULTA AZO SBUX EA
2015-10-30 MO EQIX STZ MDLZ CASY ACN PSA ORLY ACGL NVR MAS KDP PGR SBUX AIZ
2015-11-30 STZ SBUX ORLY MAS GOOGL MO PSA GOOG ACN EQIX FISV CASY V KDP AZO
2015-12-31 PSA MAS GOOG VRSN MO CLX STZ GOOGL EQIX KDP MCD CVC NVR GE SBUX
2016-01-29 GOOG TAP KLAC MCD GE GOOGL PSA EQIX KDP KMB STZ CLX ABMD VRSN LHX
2016-02-29 KMB KLAC AWK MCD ATO T TAP KDP DLR CMS PM XEL NI PSA PPL
2016-03-31 PM KLAC T KMB VZ AWK TSN ATO NI PSA MCD DLR ISRG CPB ABMD
2016-04-29 DLR NI T PM TSN LNT ATO CPB AWK CMS EVRG ABMD MCD ED EIX
2016-05-31 DLR TSN EQIX T SYY PM BAX AWK KLAC ABMD NI VMC IDXX XYL HAS
2016-06-30 DLR EQIX EVRG AWK T WM ALB IRM EIX CCI NI WCG WEC CNP LNT
2016-07-29 DLR IRM OKE AWK CNP BSX ALB HII VMC WM ISRG TSN CINF SYY EVRG
2016-08-31 VTR ALGN IRM ALB BSX ULTA OKE ARE WCG HII PLD SIVB STJ MKTX XEC
2016-09-30 GEN SPGI MKTX ISRG META ITW TDG CPRT STJ AMAT WCG XYL ALGN EW SIVB
2016-10-31 DHR GEN SPGI MKTX HPE GLW META TXN TDG GRMN JOY LRCX CPRT MRVL WCG
2016-11-30 DHR BKNG TXN GRMN LRCX AMAT JOY QCOM KLAC HPE SPGI WOR GEN DXC GLW
2016-12-30 DHR CSX PFG FDX HPE STLD PRU MS ODFL PWR AMAT TFC IP STT DXC
2017-01-31 IP KEY FITB TFC MS CFG DD GS X ZION MTB KMG NSC PWR PFG
2017-02-28 MTB NVDA LNC RF WDC PNC PRU CFG GEN X UNM MS SLM USB KEY
2017-03-31 BKNG AMAT PRU UNM HII KLAC RF PNC X LRCX JPM KEY GEN ADI BAC
2017-04-28 AMAT CHTR KLAC BKNG ADBE CSX AAPL GEN X NVDA SWKS PRU LRCX CFG WCG
2017-05-31 BKNG ADBE LRCX AAPL META ANET WDC ELV KLAC ISRG TTWO IDXX CSX AMAT VEEV
2017-06-30 LRCX AMAT ADBE SPGI TTWO ANET ELV CCL WDC ABMD EA WCG NVDA CSX PAYC
2017-07-31 LRCX BCR AMAT AET SPGI MTD ANET ELV PKG BKNG BAX ABMD ALGN DXC KBH
2017-08-31 LRCX PGR AET CBOE MTD COO SPGI MA ELV META ALGN EA CCL AMT BAX
2017-09-29 CBOE ABMD SBAC MTD CTSH MA AET RHT LRCX WB APTV ATVI ADSK BCR EA
2017-10-31 TROW CBOE BA VRTX ABBV AMAT NRG LRCX MTD FMC TXN LHX NYT AMP CRL
2017-11-30 LRCX MU ON AMAT IPGP TWTR ISRG TTWO NVDA NRG RHT ABMD CBOE TER ATVI
2017-12-29 NVDA CBOE LRCX MU TXN TTWO DHI TSN PHM IBKR TROW AMAT ISRG NRG HLT
2018-01-31 ABBV TROW TXN CBOE ODFL HLT VFC MU VLO KORS ELV AET IBKR BLK TWTR
2018-02-28 TROW KORS CPRI VLO ANET MA ZTS CPRT EL BBBY WYNN ODFL TWTR TEL CME
2018-03-29 ANET MA TKO BR MU XYZ CME CSGP NKTR EL ABMD KORS ELV CPRT CPRI
2018-04-30 MU KDP BR EL PANW ABMD CPRT ZTS CME PTC LW GWW CSGP XYZ PSX
2018-05-31 PSX BKNG MA KDP PTC CPRT MSCI NRG V PANW BR GWW MCO GDDY OKE
2018-06-29 MSCI ADBE CPRT GDDY INTU MA FFIV MCO V OKE DECK PSX ALGN BR VRSN
2018-07-31 ADBE TJX INTU MA GDDY MSCI ISRG VRSN MU CNC V ALGN CPRT MSFT MSI
2018-08-31 WAB CNC ABMD TJX CPRT ORLY VRSN PFE NSC REGN CSX CTAS GWW HET V
2018-09-28 TJX ABMD FICO VRSN PFE ORLY CNC HET ANDV FFIV V ELV INTU EHC MA
2018-10-31 ABMD TJX HCA PFE MOH MRK ESRX MKC ROST ORLY ELV ANDV CME ROL BSX
2018-11-30 MRK MKC ESRX PFE ABMD HCA KDP CME VZ LW DELL AES ELV AET ULTA
2018-12-31 MRK MKC ESRX PFE CME KDP BALL AET NRG HCA LW EXC VZ ELV FE
2019-01-31 ESRX MRK BALL EXC WELL DOC NRG PFE XEL CHD CME KDP RHT SBUX VTR
2019-02-28 BALL AES RHT MRK WELL ERIE SBUX HET XEL DOC XLNX O EXC AMT ORLY
2019-03-29 BALL AES RHT WELL KMI MRK XEL HET AWK XLNX ERIE CDNS AZO WEC TSS
2019-04-30 KEYS TDG MSCI HET FICO CSCO VRSN BALL LII XLNX MA AZO APD CDNS MSFT
2019-05-31 BALL CDNS APD HSY MDLZ MA MSCI MSFT PAYX TDG AZO TT AWK WM VRSN
2019-06-28 FDS MKTX BALL APD SBAC HSY MDLZ GPN MSFT LHX MSI WM MSCI CINF MA
2019-07-31 HSY MSI BALL APD GPN MSFT MA MKTX CINF V VRSN AZO WRB SNPS ZTS
2019-08-30 HSY SBAC APD BALL WEC CCI GPN HET WRB SBUX MSI TSN ZTS MSFT FIS
2019-09-30 HSY WEC ETR CPRT SBAC AWK ZTS WELL CINF BALL LHX EQIX SO LDOS NEE
2019-10-31 PHM MLM EQIX SHW ETR HSY KBH WEC KLAC INVH LHX WU NEE WELL HET
2019-11-29 KLAC HET QCOM SHW WU BF.B TER BF-B BMY AAPL MSFT TDY TYL KBH AVP
2019-12-31 HET MSFT WU ANSS CDW AVP TER PODD TYL TDG AMGN MTCH KLAC AAPL MCO
2020-01-31 HET ANSS MSFT BMY CDAY SWKS TDG TYL KSU CTLT TIF FBHS CPRT NEE SPGI
2020-02-28 HET ANSS BMY NEE TYL GPN TDG SWKS CDAY RMD VRTX MCO TER ADBE ALLE
2020-03-31 ENPH GEN NEM DVA BMY ABBV KR TYL VRTX CSGP DXCM PODD WST BIIB SEDG
2020-04-30 NEM KR GEN REGN VRTX CLX ABBV BMY LLY WST MSFT EA LM DVA PODD
2020-05-29 NEM DXCM CLX GEN WST KR REGN VRTX BIO LLY TYL MSFT CDNS EA ABBV
2020-06-30 ENPH CLX ABBV REGN MSFT NEM VRTX EBAY CDNS AAPL SPGI ADBE KR EA WST
2020-07-31 EBAY CLX ABBV CDNS ADBE MSFT WST ODFL SPGI NEM VRTX REGN EA CTLT ADSK
2020-08-31 CDNS EBAY TSCO CLX REGN ETSY WST MSFT LULU SWKS ODFL EA DHR TER FAST
2020-09-30 LOW TSCO VEEV WST SPGI CDNS ETSY META DHR CTLT FDX AAPL ABMD BBBY EPAM
2020-10-30 FDX ABMD LOW VAR ENPH CTLT XYZ DHR SIVB CDAY CVNA VEEV WST CPRT ROL
2020-11-30 FDX GNRC ABMD PWR TT XYZ CTLT CARR TER LRCX PENN ENPH DHR VRTS SIVB
2020-12-31 MRNA XYZ PENN LRCX TTD FSLR ABMD TT ETSY PWR GNRC ALB TER AMAT ENPH
2021-01-29 ENPH LRCX TER TUP ALB APTV KLAC XYZ ALGN TTD AMAT ABMD GNRC DD COHR
2021-02-26 ENPH TUP MRNA PYPL QEP ALGN PENN VIAC KLAC TER PSKY GNRC FFIV LRCX TTD
2021-03-31 VIAC ETSY MRNA WBD FCX NWSA DISCA ENPH MGM ZBRA DISCK GS MS COF RF
2021-04-30 AMAT LPX VIAC LRCX CZR DISCA DISCK DELL XEC NWSA MGM CPRI ATI ETSY ALK
2021-05-28 XEC COF NUE AMG DVN KKR SLM CLF TEX FITB MHK CPRI STLD RJF PHM
2021-06-30 XEC COF FCX BX BIG SIVB NUE TRGP GS ENPH SBNY EXR TWTR EPAM DVN
2021-07-30 XEC BX GOOG GNRC SIVB SBNY BIG COF F RRD GOOGL EXR TWTR GS INTU
2021-08-31 MRNA SIVB SBNY XEC RRD MDP PKI BX KSU TWTR KKR GOOGL CRL GOOG A
2021-09-30 MRNA SIVB SBNY BX XEC PKI KSU GOOGL MDP MMC PXD DRE RRD EXR GOOG
2021-10-29 MRNA SBNY SIVB BX XLNX JEF MDP ORCL RRD PXD DRE PKI GOOGL RHI INTU
2021-11-30 MRNA SBNY KKR DXCM MSFT SIVB MDP CPT RRD BX JEF AZO ARES IT RHI
2021-12-31 SBNY FDS BX ZTS ODFL KLAC EXR XLNX KKR PFE MSFT MAA CPT SIVB PLD
2022-01-31 EXR PFE PLD FDS ABBV XLNX EXC CVX RRD AZO MCK DVN NVDA ELV BRO
2022-02-28 MCK EXC ABBV XOM WMB ELV CVX COR RRD ADM EOG NI TRGP HSY DLTR
2022-03-31 ABBV CVX MCK EXC ADM COP PFE REGN WMB EOG DVN TRGP RRD BG CF
2022-04-29 ABBV MCK CVX EXC REGN ADM WMB COR SRE DLTR PFE VRTX COP HSY BMY
2022-05-31 ABBV MCK MRK EXC CVX SRE BMY CF ADM WMB COR VRTX ELV FHN CTVA
2022-06-30 ABBV MCK MRK BMY CVX EXC FHN PFE DVN SRE WRB CF ELV WMB EOG
2022-07-29 MCK ABBV MRK BMY CF FHN DVN SRE MRO EXC CTRA HUM HSY LW WMB
2022-08-31 MCK VRTX CF VICI GPC LW HSY SRE CAH MRK AZO HUM WM ED RSG
2022-09-30 MCK VRTX GPC CAH LW HSY MRK VICI CF WM CTVA RSG HUM GIS FHN
2022-10-31 MCK CAH GPC LW ORLY HUM CVX AZO MRK TKO COP ERIE AMGN HII MOH
2022-11-30 MRK CAH GPC XOM MRNA ORLY UNM VRTX MCK HUM LW PFG AMGN TJX TKO
2022-12-30 MRK XOM CAH BIIB CVX GPC ORLY TJX FSLR COP AFL DE PCG PSX LW
2023-01-31 ACGL MRK GILD BIIB BKNG PCG HES ULTA CAH XOM ODP RE TJX ABMD FLEX
2023-02-28 HES ACGL RE MRK ULTA BKNG TJX PCG ABC FICO DECK URI LVS BIIB ODP
2023-03-31 BKNG ULTA LVS URI LEN DECK RE BWA FICO JBL PHM TJX ORCL GILD OMC
2023-04-28 BKNG AVGO ULTA LW ADI DECK FICO CPRT LEN ANET LVS HCA BSX COTY ORCL
2023-05-31 BKNG PHM LEN LW MDLZ HSY BSX CPRT NVR GE HCA COTY WST MNST ORLY
2023-06-30 BKNG PHM LEN CPRT GE TDG AVGO LW HCA KBH FICO CAH DHI AAPL ORCL
2023-07-31 BKNG HUBB JBL CPRT GE ISRG PHM CAH AVGO CRWD MSFT MLM PWR VNT FICO
2023-08-31 BKNG PLTR DASH PHM RCL TDG GE CRH TJX AVGO PWR FDX CARR BLDR PNR
2023-09-29 BKNG VRSK FDX BKR AVGO TJX FICO DASH PHM PSX APO PH ADBE MAR RCL
2023-10-31 VRSK CME TJX CSCO CBOE AFL BKNG KLAC VST BKR AVGO PSX MSFT APO MCK
2023-11-30 BKNG CBOE VST IBM CME CAH AKAM AFL MCK ADBE PGR LII MSFT TDG PCAR
2023-12-29 BKNG IBM DELL NRG AKAM VST CBOE VRT AVGO NOW CVNA WSM FICO ANET KKR
2024-01-31 BKNG IBM NOW FICO META DECK NVDA ANET NRG AVGO WSM VST DELL INTU MSFT
2024-02-29 TDG PCAR GE GDDY ANET FLT HLT PGR COR NRG TT FICO MSFT ALL APO
2024-03-28 GE ANF PCAR PLTR NRG ANET CRH CMG VST TDG KKR GDDY IR DASH ETN
2024-04-30 PLTR CRH META URI DASH MLM PGR NVDA KKR BLDR PH TDG AYI IR GDDY
2024-05-31 COIN TT EME WFC FANG LDOS ETN CMG NRG TDG PGR APH META TRGP URI
2024-06-28 EME GDDY TT TRGP LDOS BSX NRG TDG MCK PGR NVDA DECK IBKR META COST
2024-07-31 ANF TRGP GDDY NVDA NTAP COIN ANET THC IRM WELL LDOS FICO MCK KLAC NRG
2024-08-30 FICO IRM WELL MSI TRGP PM GDDY NVDA PGR VTR REGN THC MCO AFL ANET
2024-09-30 WELL PM VTR TRGP MO PGR MSI IBM FICO NVDA EXR GDDY THC UHS IRM
2024-10-31 IRM BKNG MSI FICO BNY BK HWM FISV MMM KKR JEF BLK IBM WELL ANET
2024-11-29 BKNG FISV WMB TRGP TPL KMI VNO FICO DASH OKE BNY BK GDDY GEV LYV
2024-12-31 BKNG TRGP FISV WMB FICO DASH RCL GDDY BK KMI BNY OKE VST COIN APO
2025-01-31 BKNG TRGP BSX FISV KMI GDDY NFLX VST TPR DASH META LYV FOX RCL APO
2025-02-28 PLTR BSX BKNG LYV FOXA FOX DASH IBKR ETR NFLX V META COF UNM WSM
2025-03-31 PLTR MO V WELL FOX FOXA TPR BSX ETR CME VRSN PGR PM TPL BRO
2025-04-30 MO PM CME WELL BKNG VRSN MCK CAH TPR EXC KR CNP ETR RSG V
2025-05-30 PM GILD VRSN CME CAH COR MO BKNG MCK KR CNP RSG TTWO WELL V
2025-06-30 PM NFLX CAH BKNG GILD CME MO VRSN EBAY COR HWM TTWO WELL JCI BUD
2025-07-31 BKNG NFLX CAH HWM JCI GE APH BK BNY JBL TPR RCL PM CME PWR
2025-08-29 APH COIN GEV NVDA PWR MSFT NFLX STX GE BKNG BK BNY VST DASH HOOD
2025-09-30 AVGO APH GEV GE GOOG BNY BK C GS LITE MS RCL NEM NFLX GOOGL
2025-10-31 NEM TEL GLW GE KLAC LRCX GOOG AVGO IDXX C APP GEV NVDA MU GS
2025-11-28 MRVL KLAC TEL LRCX MPWR GOOG GLW WELL NEM HCA HOOD COR JNJ APP GE
2025-12-31 JNJ GOOG ATGE NKTR WELL KLAC LRCX C GLW HCA WDC NEM AVGO GOOGL CMA
2026-01-30 NEM JNJ KLAC GOOG WDC MNST ATI NKTR ECHO MPWR CMI C EA GLW ALB
2026-02-27 GOOG GOOGL KLAC FDX JNJ LRCX FTI MNST MPWR NKTR ADI ATI BG MRK FLS
2026-03-31 MU FDX GOOG JNJ GOOGL NEM MRK FTI ATI GILD COHR WDC NEE HWM ECHO
2026-04-30 KLAC APA FTI DVN GEV JNJ FDX CF CASY ECHO TRGP LRCX NEM MRK ADI
2026-05-29 CASY APA GEV FTI FIX LITE TRGP KLAC KEYS PWR VRT EQIX ECHO BNY BK
2026-06-26 NUE WDC SPG STLD KEYS FIX EQIX HPE PWR BK ON DELL STT HST BNY
Scoring script (python)
FORMULA_NAME = "Contrarian 52-Week Recovery with Quality-Regime Momentum Arbitration (v1143)"
LOGIC_VARIANT_COUNT = 3
NOTES = """mode=explore; family=contrarian-52w-recovery-quality-regime-momentum-hybrid
This hybrid combines three orthogonal sleeves from the strongest parents, but only after explicit arbitration. In bullish tapes it prefers repaired momentum leaders that are still not fully extended versus the 52-week high. In mixed tapes it hunts deep 52-week drawdown names only when price repair, quality durability, and tradability all confirm together. In defensive tapes it suppresses low-quality rebounds and rotates toward lower-volatility, valuation-supported, quality names that still retain basic trend integrity.
Deliberate metric coverage: actively use momentum/return via return_3m_pct, return_6m_pct, momentum_12_1_pct; trend/recovery via from_52w_high_pct and from_200d_ma_pct; volatility via realized_vol_3m; liquidity via avg_daily_dollar_volume_3m and trading_days_3m; income via dividend_yield_ttm_pct; valuation via peg and forward_pe; growth via revenue_growth_pct and operating_income_growth_pct; quality via free_cash_flow_margin_pct and operating_margin_pct; size via market_cap. Deliberately weight return_1m_pct, return_12m_pct, avg_daily_volume_3m, dividend_ttm, pe, eps_growth_pct, forward_eps, free_cash_flow_growth_pct, shares_outstanding, close, adj_close, high_52w, ma_200d, eps_ttm, revenue_ttm, operating_income_ttm, and free_cash_flow_ttm at zero this run to avoid collapsing back into any parent recipe while still covering the full metric menu consciously. Sparse fundamentals are normalized by present weights before sleeve arbitration so missing data does not automatically zero a stock unless multiple confirmation blocks are absent."""

TREND_BULL = {
    "momentum_12_1_pct": (0.20, +1),
    "return_6m_pct": (0.18, +1),
    "from_200d_ma_pct": (0.16, +1),
    "from_52w_high_pct": (0.10, -1),
    "realized_vol_3m": (0.08, -1),
    "avg_daily_dollar_volume_3m": (0.07, +1),
    "operating_margin_pct": (0.07, +1),
    "revenue_growth_pct": (0.06, +1),
    "forward_pe": (0.04, -1),
    "market_cap": (0.04, -1),
}

WASHOUT_REPAIR = {
    "from_52w_high_pct": (0.24, -1),
    "from_200d_ma_pct": (0.18, +1),
    "return_3m_pct": (0.14, +1),
    "momentum_12_1_pct": (0.08, +1),
    "free_cash_flow_margin_pct": (0.10, +1),
    "operating_income_growth_pct": (0.07, +1),
    "avg_daily_dollar_volume_3m": (0.07, +1),
    "trading_days_3m": (0.05, +1),
    "realized_vol_3m": (0.04, -1),
    "market_cap": (0.03, -1),
}

DEFENSIVE_QUALITY = {
    "realized_vol_3m": (0.20, -1),
    "from_200d_ma_pct": (0.16, +1),
    "from_52w_high_pct": (0.08, -1),
    "operating_margin_pct": (0.12, +1),
    "free_cash_flow_margin_pct": (0.10, +1),
    "peg": (0.10, -1),
    "forward_pe": (0.06, -1),
    "dividend_yield_ttm_pct": (0.06, +1),
    "trading_days_3m": (0.07, +1),
    "return_3m_pct": (0.05, +1),
}

def score_universe(stocks, regime, ctx):
    def get_metric(stock, name):
        v = stock.get(name)
        if v is None:
            return None
        if isinstance(v, bool):
            return 1.0 if v else 0.0
        try:
            return float(v)
        except Exception:
            return None

    def rank_map(metric):
        present = []
        for stock in stocks:
            v = get_metric(stock, metric)
            if v is not None:
                present.append((stock.get("symbol"), v))
        present.sort(key=lambda x: x[1])
        n = len(present)
        out = {}
        if n == 0:
            return out
        if n == 1:
            out[present[0][0]] = 0.5
            return out
        i = 0
        while i < n:
            j = i
            total_rank = 0.0
            count = 0.0
            value = present[i][1]
            while j < n and present[j][1] == value:
                total_rank += j
                count += 1.0
                j += 1
            avg_rank = total_rank / count
            pct = avg_rank / float(n - 1)
            k = i
            while k < j:
                out[present[k][0]] = pct
                k += 1
            i = j
        return out

    metric_names = {}
    for group in (TREND_BULL, WASHOUT_REPAIR, DEFENSIVE_QUALITY):
        for name in group:
            metric_names[name] = 1

    ranks = {}
    for name in metric_names:
        ranks[name] = rank_map(name)

    def weighted_score(symbol, weights):
        total = 0.0
        used = 0.0
        for metric, spec in weights.items():
            weight = spec[0]
            direction = spec[1]
            rv = ranks.get(metric, {}).get(symbol)
            if rv is None:
                continue
            if direction < 0:
                rv = 1.0 - rv
            total += weight * rv
            used += weight
        if used <= 0.0:
            return None
        return total / used

    regime_name = ""
    if regime is None:
        regime_name = ""
    else:
        try:
            regime_name = str(regime).lower()
        except Exception:
            regime_name = ""

    is_bull = ("bull" in regime_name) or ("risk_on" in regime_name) or ("uptrend" in regime_name)
    is_bear = ("bear" in regime_name) or ("risk_off" in regime_name) or ("defensive" in regime_name) or ("stress" in regime_name)

    scores = {}
    for stock in stocks:
        symbol = stock.get("symbol")
        if not symbol:
            continue

        trend_score = weighted_score(symbol, TREND_BULL)
        repair_score = weighted_score(symbol, WASHOUT_REPAIR)
        defensive_score = weighted_score(symbol, DEFENSIVE_QUALITY)

        if trend_score is None:
            trend_score = 0.0
        if repair_score is None:
            repair_score = 0.0
        if defensive_score is None:
            defensive_score = 0.0

        drawdown_rank = ranks["from_52w_high_pct"].get(symbol)
        above_200_rank = ranks["from_200d_ma_pct"].get(symbol)
        mom_3m_rank = ranks["return_3m_pct"].get(symbol)
        mom_6m_rank = ranks["return_6m_pct"].get(symbol)
        mom_12_1_rank = ranks["momentum_12_1_pct"].get(symbol)
        vol_rank = ranks["realized_vol_3m"].get(symbol)
        liq_rank = ranks["avg_daily_dollar_volume_3m"].get(symbol)
        td_rank = ranks["trading_days_3m"].get(symbol)
        qual_rank = ranks["free_cash_flow_margin_pct"].get(symbol)
        opm_rank = ranks["operating_margin_pct"].get(symbol)

        deep_drawdown = drawdown_rank is not None and drawdown_rank <= 0.30
        repaired_trend = above_200_rank is not None and above_200_rank >= 0.52
        positive_momentum = (
            (mom_3m_rank is not None and mom_3m_rank >= 0.55) or
            (mom_6m_rank is not None and mom_6m_rank >= 0.55) or
            (mom_12_1_rank is not None and mom_12_1_rank >= 0.55)
        )
        quality_confirm = (
            (qual_rank is not None and qual_rank >= 0.45) or
            (opm_rank is not None and opm_rank >= 0.45)
        )
        tradable = (
            (liq_rank is not None and liq_rank >= 0.35) or
            (td_rank is not None and td_rank >= 0.45)
        )
        calm_profile = vol_rank is not None and vol_rank <= 0.45
        hot_momentum = (
            (mom_6m_rank is not None and mom_6m_rank >= 0.68) and
            (mom_12_1_rank is not None and mom_12_1_rank >= 0.62)
        )

        if is_bull:
            if deep_drawdown and repaired_trend and positive_momentum and quality_confirm and tradable:
                score = 0.58 * repair_score + 0.32 * trend_score + 0.10 * defensive_score
            elif hot_momentum and not deep_drawdown:
                score = 0.70 * trend_score + 0.20 * defensive_score + 0.10 * repair_score
            else:
                score = 0.52 * trend_score + 0.33 * repair_score + 0.15 * defensive_score
        elif is_bear:
            if deep_drawdown and not quality_confirm:
                score = 0.20 * repair_score + 0.80 * defensive_score
            elif calm_profile and quality_confirm:
                score = 0.18 * trend_score + 0.18 * repair_score + 0.64 * defensive_score
            else:
                score = 0.24 * trend_score + 0.26 * repair_score + 0.50 * defensive_score
        else:
            if deep_drawdown and repaired_trend and positive_momentum and quality_confirm:
                score = 0.62 * repair_score + 0.23 * defensive_score + 0.15 * trend_score
            elif hot_momentum and quality_confirm:
                score = 0.50 * trend_score + 0.20 * repair_score + 0.30 * defensive_score
            else:
                score = 0.40 * trend_score + 0.40 * repair_score + 0.20 * defensive_score

        penalty = 0.0
        if deep_drawdown and not repaired_trend:
            penalty += 0.08
        if deep_drawdown and not quality_confirm:
            penalty += 0.07
        if not tradable:
            penalty += 0.05
        if vol_rank is not None and vol_rank >= 0.90:
            penalty += 0.04

        bonus = 0.0
        if deep_drawdown and repaired_trend and positive_momentum and quality_confirm:
            bonus += 0.05
        if calm_profile and quality_confirm and tradable:
            bonus += 0.03

        scores[symbol] = score + bonus - penalty

    return scores