exp_1180

Contrarian 52-Week Hybrid with Repair-Leadership Arbitration (v1180)

← All V2 experiments
Relative return
1.026x
Excess vs bench
2.61%
Benchmark
CAPW_UNIV
Rolling windows
179 · monthly
Mean strategy gain
17.01%
Mean benchmark gain
14.08%
Mean excess gain
2.93%
Dispersion (ref)
5.21%
Win-rate vs bench (ref)
83.24%
Worst / best ratio (ref)
0.978x / 1.083x
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 8.48% 2.22% 1.061x
2011-07-01 … 2016-06-30 14.10% 13.74% 1.003x
2016-07-01 … 2021-06-30 23.73% 20.63% 1.026x
2021-07-01 … 2026-06-26 27.67% 15.48% 1.106x
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.026x · beat benchmark in 149/179
#WindowStrategyBenchmarkRatio
1 2006-07-31 … 2011-07-29 7.93% 1.79% 1.060x
2 2006-08-31 … 2011-08-31 7.49% 0.21% 1.073x
3 2006-09-29 … 2011-08-31 7.47% -0.14% 1.076x
4 2006-10-31 … 2011-10-31 7.12% 0.23% 1.069x
5 2006-11-30 … 2011-11-30 5.98% -0.05% 1.060x
6 2006-12-29 … 2011-11-30 6.09% -0.32% 1.064x
7 2007-01-31 … 2012-01-31 7.54% 0.93% 1.065x
8 2007-02-28 … 2012-01-31 8.26% 1.43% 1.067x
9 2007-03-30 … 2012-03-30 9.81% 3.09% 1.065x
10 2007-04-30 … 2012-04-30 9.50% 2.42% 1.069x
11 2007-05-31 … 2012-05-31 6.74% 0.60% 1.061x
12 2007-06-29 … 2012-06-29 8.30% 1.92% 1.063x
13 2007-07-31 … 2012-07-31 8.44% 2.69% 1.056x
14 2007-08-31 … 2012-08-31 8.68% 2.95% 1.056x
15 2007-09-28 … 2012-09-28 9.05% 3.20% 1.057x
16 2007-10-31 … 2012-10-31 7.47% 2.60% 1.048x
17 2007-11-30 … 2012-11-30 8.28% 3.45% 1.047x
18 2007-12-31 … 2012-12-31 7.85% 3.69% 1.040x
19 2008-01-31 … 2013-01-31 10.06% 5.85% 1.040x
20 2008-02-29 … 2013-02-28 10.11% 6.82% 1.031x
21 2008-03-31 … 2013-03-28 12.48% 7.73% 1.044x
22 2008-04-30 … 2013-04-30 12.14% 7.51% 1.043x
23 2008-05-30 … 2013-04-30 11.49% 7.81% 1.034x
24 2008-06-30 … 2013-06-28 10.61% 9.33% 1.012x
25 2008-07-31 … 2013-07-31 12.95% 10.48% 1.022x
26 2008-08-29 … 2013-07-31 13.05% 10.52% 1.023x
27 2008-09-30 … 2013-09-30 15.21% 11.48% 1.033x
28 2008-10-31 … 2013-10-31 17.55% 15.76% 1.015x
29 2008-11-28 … 2013-10-31 18.80% 17.46% 1.011x
30 2008-12-31 … 2013-12-31 19.93% 18.44% 1.013x
31 2009-01-30 … 2013-12-31 21.07% 20.64% 1.004x
32 2009-02-27 … 2014-01-31 23.05% 21.63% 1.012x
33 2009-03-31 … 2014-03-31 21.47% 20.60% 1.007x
34 2009-04-30 … 2014-04-30 20.21% 19.00% 1.010x
35 2009-05-29 … 2014-04-30 19.44% 18.32% 1.009x
36 2009-06-30 … 2014-06-30 22.61% 19.01% 1.030x
37 2009-07-31 … 2014-07-31 19.88% 17.39% 1.021x
38 2009-08-31 … 2014-08-29 20.68% 17.70% 1.025x
39 2009-09-30 … 2014-09-30 19.21% 16.64% 1.022x
40 2009-10-30 … 2014-09-30 20.24% 17.08% 1.027x
41 2009-11-30 … 2014-11-28 19.48% 16.82% 1.023x
42 2009-12-31 … 2014-12-31 17.98% 16.28% 1.015x
43 2010-01-29 … 2014-12-31 19.26% 17.23% 1.017x
44 2010-02-26 … 2015-01-30 19.20% 15.80% 1.029x
45 2010-03-31 … 2015-03-31 17.68% 15.40% 1.020x
46 2010-04-30 … 2015-04-30 16.55% 15.38% 1.010x
47 2010-05-28 … 2015-04-30 18.45% 17.09% 1.012x
48 2010-06-30 … 2015-06-30 19.71% 17.45% 1.019x
49 2010-07-30 … 2015-06-30 19.35% 16.43% 1.025x
50 2010-08-31 … 2015-08-31 17.29% 15.76% 1.013x
51 2010-09-30 … 2015-09-30 15.46% 13.61% 1.016x
52 2010-10-29 … 2015-09-30 14.90% 13.06% 1.016x
53 2010-11-30 … 2015-11-30 16.02% 15.09% 1.008x
54 2010-12-31 … 2015-12-31 15.45% 13.55% 1.017x
55 2011-01-31 … 2016-01-29 13.68% 11.90% 1.016x
56 2011-02-28 … 2016-01-29 12.95% 11.53% 1.013x
57 2011-03-31 … 2016-03-31 14.21% 12.90% 1.012x
58 2011-04-29 … 2016-04-29 12.40% 12.39% 1.000x
59 2011-05-31 … 2016-05-31 13.08% 12.94% 1.001x
60 2011-06-30 … 2016-06-30 13.66% 13.30% 1.003x
61 2011-07-29 … 2016-07-29 13.73% 14.52% 0.993x
62 2011-08-31 … 2016-08-31 13.31% 15.19% 0.984x
63 2011-09-30 … 2016-09-30 15.19% 16.32% 0.990x
64 2011-10-31 … 2016-10-31 12.42% 14.02% 0.986x
65 2011-11-30 … 2016-11-30 13.13% 14.66% 0.987x
66 2011-12-30 … 2016-12-30 12.49% 14.92% 0.979x
67 2012-01-31 … 2017-01-31 12.18% 14.63% 0.979x
68 2012-02-29 … 2017-02-28 12.59% 14.78% 0.981x
69 2012-03-30 … 2017-02-28 11.86% 14.43% 0.978x
70 2012-04-30 … 2017-04-28 12.62% 14.61% 0.983x
71 2012-05-31 … 2017-05-31 15.37% 15.98% 0.995x
72 2012-06-29 … 2017-05-31 14.46% 15.44% 0.992x
73 2012-07-31 … 2017-07-31 13.51% 15.43% 0.983x
74 2012-08-31 … 2017-08-31 13.88% 15.12% 0.989x
75 2012-09-28 … 2017-08-31 13.32% 14.77% 0.987x
76 2012-10-31 … 2017-10-31 15.52% 16.12% 0.995x
77 2012-11-30 … 2017-11-30 14.91% 16.79% 0.984x
78 2012-12-31 … 2017-12-29 14.91% 16.93% 0.983x
79 2013-01-31 … 2018-01-31 16.74% 17.57% 0.993x
80 2013-02-28 … 2018-02-28 16.70% 16.21% 1.004x
81 2013-03-28 … 2018-02-28 15.60% 15.81% 0.998x
82 2013-04-30 … 2018-04-30 14.75% 14.25% 1.004x
83 2013-05-31 … 2018-05-31 16.07% 14.57% 1.013x
84 2013-06-28 … 2018-05-31 16.83% 14.97% 1.016x
85 2013-07-31 … 2018-07-31 15.97% 14.83% 1.010x
86 2013-08-30 … 2018-07-31 16.77% 15.59% 1.010x
87 2013-09-30 … 2018-09-28 16.95% 15.84% 1.010x
88 2013-10-31 … 2018-10-31 14.27% 12.89% 1.012x
89 2013-11-29 … 2018-10-31 13.81% 12.60% 1.011x
90 2013-12-31 … 2018-12-31 11.97% 9.93% 1.018x
91 2014-01-31 … 2019-01-31 12.46% 12.37% 1.001x
92 2014-02-28 … 2019-02-28 12.19% 12.38% 0.998x
93 2014-03-31 … 2019-03-29 14.15% 12.76% 1.012x
94 2014-04-30 … 2019-04-30 15.22% 13.73% 1.013x
95 2014-05-30 … 2019-04-30 14.53% 13.54% 1.009x
96 2014-06-30 … 2019-06-28 11.86% 12.81% 0.992x
97 2014-07-31 … 2019-07-31 12.72% 13.30% 0.995x
98 2014-08-29 … 2019-07-31 11.96% 12.80% 0.993x
99 2014-09-30 … 2019-09-30 11.63% 12.70% 0.990x
100 2014-10-31 … 2019-10-31 11.58% 12.91% 0.988x
101 2014-11-28 … 2019-10-31 11.29% 12.60% 0.988x
102 2014-12-31 … 2019-12-31 13.39% 14.16% 0.993x
103 2015-01-30 … 2019-12-31 13.46% 14.85% 0.988x
104 2015-02-27 … 2020-01-31 13.16% 14.04% 0.992x
105 2015-03-31 … 2020-03-31 9.93% 8.56% 1.013x
106 2015-04-30 … 2020-04-30 13.68% 11.65% 1.018x
107 2015-05-29 … 2020-05-29 14.14% 12.61% 1.014x
108 2015-06-30 … 2020-06-30 14.41% 13.64% 1.007x
109 2015-07-31 … 2020-07-31 15.72% 14.60% 1.010x
110 2015-08-31 … 2020-08-31 19.18% 18.07% 1.009x
111 2015-09-30 … 2020-09-30 17.94% 17.05% 1.008x
112 2015-10-30 … 2020-10-30 16.09% 14.60% 1.013x
113 2015-11-30 … 2020-11-30 18.84% 17.43% 1.012x
114 2015-12-31 … 2020-12-31 20.44% 18.65% 1.015x
115 2016-01-29 … 2021-01-29 21.75% 19.26% 1.021x
116 2016-02-29 … 2021-02-26 23.56% 19.79% 1.032x
117 2016-03-31 … 2021-03-31 22.47% 19.42% 1.025x
118 2016-04-29 … 2021-03-31 23.37% 19.66% 1.031x
119 2016-05-31 … 2021-05-28 23.60% 20.42% 1.026x
120 2016-06-30 … 2021-06-30 23.33% 21.06% 1.019x
121 2016-07-29 … 2021-06-30 23.73% 20.63% 1.026x
122 2016-08-31 … 2021-08-31 27.72% 21.75% 1.049x
123 2016-09-30 … 2021-09-30 24.97% 20.22% 1.040x
124 2016-10-31 … 2021-10-29 27.61% 22.50% 1.042x
125 2016-11-30 … 2021-11-30 27.49% 21.87% 1.046x
126 2016-12-30 … 2021-11-30 27.97% 21.75% 1.051x
127 2017-01-31 … 2022-01-31 26.34% 20.17% 1.051x
128 2017-02-28 … 2022-02-28 24.95% 18.51% 1.054x
129 2017-03-31 … 2022-03-31 26.33% 19.46% 1.057x
130 2017-04-28 … 2022-03-31 26.07% 19.46% 1.055x
131 2017-05-31 … 2022-05-31 24.44% 15.59% 1.077x
132 2017-06-30 … 2022-06-30 22.15% 13.08% 1.080x
133 2017-07-31 … 2022-07-29 21.58% 15.16% 1.056x
134 2017-08-31 … 2022-08-31 20.65% 13.72% 1.061x
135 2017-09-29 … 2022-08-31 20.70% 13.56% 1.063x
136 2017-10-31 … 2022-10-31 21.06% 11.86% 1.082x
137 2017-11-30 … 2022-11-30 21.56% 12.52% 1.080x
138 2017-12-29 … 2022-11-30 21.84% 12.46% 1.083x
139 2018-01-31 … 2023-01-31 18.80% 11.01% 1.070x
140 2018-02-28 … 2023-02-28 17.98% 11.03% 1.063x
141 2018-03-29 … 2023-02-28 18.49% 11.72% 1.061x
142 2018-04-30 … 2023-04-28 17.62% 13.01% 1.041x
143 2018-05-31 … 2023-05-31 17.38% 12.95% 1.039x
144 2018-06-29 … 2023-05-31 17.80% 13.01% 1.042x
145 2018-07-31 … 2023-07-31 20.10% 14.67% 1.047x
146 2018-08-31 … 2023-08-31 18.27% 13.51% 1.042x
147 2018-09-28 … 2023-08-31 18.06% 13.56% 1.040x
148 2018-10-31 … 2023-10-31 15.81% 12.60% 1.029x
149 2018-11-30 … 2023-11-30 16.87% 14.58% 1.020x
150 2018-12-31 … 2023-12-29 19.37% 17.26% 1.018x
151 2019-01-31 … 2024-01-31 20.21% 16.27% 1.034x
152 2019-02-28 … 2024-01-31 19.86% 15.94% 1.034x
153 2019-03-29 … 2024-03-28 21.79% 17.50% 1.036x
154 2019-04-30 … 2024-04-30 19.93% 15.50% 1.038x
155 2019-05-31 … 2024-05-31 23.54% 18.12% 1.046x
156 2019-06-28 … 2024-06-28 24.21% 17.99% 1.053x
157 2019-07-31 … 2024-07-31 22.74% 17.70% 1.043x
158 2019-08-30 … 2024-08-30 23.01% 18.41% 1.039x
159 2019-09-30 … 2024-09-30 24.14% 18.65% 1.046x
160 2019-10-31 … 2024-10-31 23.26% 17.87% 1.046x
161 2019-11-29 … 2024-11-29 24.81% 18.64% 1.052x
162 2019-12-31 … 2024-12-31 22.06% 17.62% 1.038x
163 2020-01-31 … 2025-01-31 22.84% 18.07% 1.040x
164 2020-02-28 … 2025-02-28 23.67% 19.00% 1.039x
165 2020-03-31 … 2025-03-31 23.01% 19.24% 1.032x
166 2020-04-30 … 2025-04-30 20.36% 16.49% 1.033x
167 2020-05-29 … 2025-04-30 19.84% 15.80% 1.035x
168 2020-06-30 … 2025-06-30 21.70% 18.19% 1.030x
169 2020-07-31 … 2025-07-31 20.76% 17.87% 1.025x
170 2020-08-31 … 2025-08-29 19.43% 16.69% 1.024x
171 2020-09-30 … 2025-09-30 21.98% 18.57% 1.029x
172 2020-10-30 … 2025-09-30 22.42% 19.43% 1.025x
173 2020-11-30 … 2025-11-28 22.04% 17.77% 1.036x
174 2020-12-31 … 2025-12-31 20.34% 16.92% 1.029x
175 2021-01-29 … 2025-12-31 20.16% 17.20% 1.025x
176 2021-02-26 … 2026-01-30 22.28% 17.04% 1.045x
177 2021-03-31 … 2026-03-31 21.31% 14.07% 1.064x
178 2021-04-30 … 2026-04-30 24.94% 16.03% 1.077x
179 2021-05-28 … 2026-04-30 24.40% 16.22% 1.070x
Notes
mode=explore; family=contrarian-52w-hybrid New hybrid family that combines the strongest orthogonal elements of the winning parent families without mechanically averaging them: deep 52-week contrarian repair, quality-filtered recovery durability, and regime-aware momentum leadership. The arbitration is explicit. In damaged tapes, washed-out names only qualify when recovery evidence, balance-sheet durability proxies, and tradability confirm the repair. In strong tapes, momentum leaders can dominate, but only when they are not excessively extended, too volatile, or obviously low-quality. In mixed tapes, the strategy prefers names where short-horizon repair and medium-horizon leadership are converging rather than fighting each other. Deliberate metric coverage this run: actively use momentum (return_1m_pct, return_3m_pct, return_6m_pct, return_12m_pct, momentum_12_1_pct), trend/recovery (from_200d_ma_pct, from_52w_high_pct), volatility (realized_vol_3m), liquidity (avg_daily_volume_3m, avg_daily_dollar_volume_3m, trading_days_3m), income (dividend_yield_ttm_pct), valuation (pe, forward_pe, peg), growth (eps_growth_pct, operating_income_growth_pct, free_cash_flow_growth_pct, forward_eps), quality (operating_margin_pct, free_cash_flow_margin_pct), and size (market_cap). Deliberately weight dividend_ttm, revenue_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 correlated price-level duplication and to keep the family structurally distinct from prior hybrids. Sparse fundamentals are normalized within each sleeve so missing fields do not automatically dominate or disqualify a stock. Regime branches: panic-repair, transition, clean-trend, and defensive-carry. The branch count is exactly four.
Lesson notes
#880 · degrade · relative_return Δ -0.3603 · parent exp_1137 · Jul 21, 2026 · auto/explore; benchmark CAPW_UNIV
explore/contrarian-52w-hybrid: relative_return 1.0261x (delta -0.3603 vs exp_1137); win-rate 83.2402%, worst-window 0.977525, dispersion 5.2058%.
Monthly picks — top stocks selected each month (whole timeline)
timeline — 240 months · top 15 each
Month 123456789101112131415
2006-07-31 MRK T BAC MO ABT AES CVX LMT CMCSA JPM CPB BXP ADM WFC DIS
2006-08-31 T DGX BXP MRK AIV MO LH BAC HPQ EQR AMT AES LMT KSS ABT
2006-09-29 BAC CMCSA MS AIV T LMT GILD ORCL ALL MRK GS JPM PFE BEN BAX
2006-10-31 CMCSA GS AT T BEN NVDA HAS BMET MRK NEE ALXN MAT ADS EQR INCLF
2006-11-30 CSCO NEE CTSH ETR ES CMCSA AAPL ATI GS HOG VNO DOC MTCH BXP CVX
2006-12-29 CMCSA MCD CSCO BKNG T AT NEE HPQ ETR MS IBM TWX BMET DOC ALXN
2007-01-31 HPQ DOC NEE BXP T CMCSA CTSH BMY ATI AIV MAT GS AMP EOP SPG
2007-02-28 NEE ABT MAT ETR CNP AEP BAX CI NRG SRE DD SYK ANDV CHD T
2007-03-30 AEP T ETR NRG NEE KR ES BAX MAT PEG SYK TAP ANDV ALXN FE
2007-04-30 CI BAX ETR NEE AEP NRG MCD CVX KO HON ALXN CE EXC CNP ANDV
2007-05-31 NRG CI FCX CE AAPL ALXN AT HON T VZ GT AMZN HPQ COP BALL
2007-06-29 CE CVX FCX BKNG ALXN MDR AAPL JEC DECK APOL ACN MA ATGE AT CMI
2007-07-31 AL FCX ALXN MDR APOL JEC CMI ATGE AT LIN HPQ BA NOV HON MMM
2007-08-31 BIIB IBM DE HPQ CSCO CVX MMM INTC ESRX COP APD AAPL SLB NOV VRSN
2007-09-28 CVX COP DE FLR APA BG HAL CSCO GOOG BIIB EBAY APD RTX GOOGL IBM
2007-10-31 APA GOOG DVN DE MCD GOOGL OXY BG KO FCX FMC AFL NKE MRK ESRX
2007-11-30 BKNG CL OXY HPQ MO MRK GOOG SCHW BRK-B WDC ESRX CVX D FCX DHR
2007-12-31 HPQ BKNG CME COP BRK-B VLO DVN CVX HAL OXY WDC GOOG D FCX FSLR
2008-01-31 MOS MO BKNG ESRX BAX HUM BRK-B PFE CL CAT FE BDX COP RTX WMT
2008-02-29 HAL CF BKNG ABT CVX OXY DVN WDC MOS COP BA AFL FCX XOM HPQ
2008-03-31 ABT BKNG HAL CAG DVN AFL GE MO CF IBM D CSX WHR JCI APA
2008-04-30 CF HAL MOS CVX OXY DVN BKNG WDC JCI BA COP APA D SLB IBM
2008-05-30 MA HAL CSX IBM UNP FMC OXY COP CVX APOL BKNG APA BTUUQ NBR ATGE
2008-06-30 HAL CF MOS D OXY APA ABT COP CVX WDC MA DVN FMC PEG NBR
2008-07-31 ABT CF BCR D APOL IBM ATGE CEPH BNI HAL MOS ACS CPB HPQ BKNG
2008-08-29 MCD CF ABT AON BCR SCHW APOL D ED CEPH ATGE BBWI HPQ BNI ACS
2008-09-30 ABT MCD ED CPB D SCHW AON HPQ BAX BCR MDLZ IBM LLY GIS CLX
2008-10-31 ABT AON MCD ED CPB D MO CAG BAX MRSH CLX HPQ KR AZO DLTR
2008-11-28 AON ABT D MCD ED DLTR KR AEP CLX BMY CPB CL CHD HPQ SHW
2008-12-31 ABT BMY AON MCD AMGN CAG AEP ED JNJ AZO XOM CVX BKNG DRI RTX
2009-01-30 ABT BMY MCD CAG XOM ED CVX ADI IBM AMGN JNJ BAX APA AEP DLTR
2009-02-27 AON ABT MCD BKNG BMY IBM CAG ADI ED DRI CF MOS XOM AMGN CVX
2009-03-31 CVX BMY AAPL CF MS CAG DRI ED BKNG IBM ADI AZO AON UPS OXY
2009-04-30 BKNG EBAY CVX AAPL CF ADBE IBM AON MS WDC UPS DRI CTSH PH RCL
2009-05-29 EBAY CF BKNG CVX MS MOS AAPL OXY EOG ADBE WDC IBM GPS RTX BMY
2009-06-30 AAPL WBD BKNG AMGN MSFT ORCL ELV F GILD FFIV FISV TJX IBM CAG ESRX
2009-07-31 AAPL AMGN WBD BKNG ORCL EBAY TJX MMM IBM MCHP FIS BEN INTC ADBE F
2009-08-31 AAPL WBD BKNG CTSH MSFT EBAY MU MMM WDC BEN ORCL GMCR PFE NVR MCK
2009-09-30 AAPL WBD ISRG BKNG EOG GS BEN EBAY CTSH CSCO OXY MU ASH WLL GNW
2009-10-30 AAPL MSFT MA GOOG GOOGL WBD PFE BEN ISRG BKNG EOG MCK CTSH V ITW
2009-11-30 ISRG WBD MSFT AAPL BKNG GOOG GOOGL AMT BMY MA ABT CCI CTSH PFE SYK
2009-12-31 ISRG AAPL GOOG MSFT GOOGL MA CCI AMT BKNG F WLL ORCL V FTR MEE
2010-01-29 ISRG AMT PFE GE MA GIS COR ABT CCI PG F MMM MSFT AMGN SYK
2010-02-26 ISRG BKNG GNW F CXO GGP PXD A BTUUQ GMCR CF JOY WLL SNDK ASH
2010-03-31 BKNG AAPL HON BMY GE WLL GNW CXO DAL AFL FITB SYK PXD AMP EBAY
2010-04-30 AAPL WBD WLL HON BBWI BKNG CXO PXD A DIS RF JOY HST GGP LVS
2010-05-28 AAPL WBD COR HAS NTAP KDP INTU MCD HON DG AKAM AZO SHW NFLX MCK
2010-06-30 BMY NEM AAPL PEG NTAP CB HAS CCI MMM GIS BBWI MO AMGN HON COR
2010-07-30 BMY BKNG GS BBWI NTAP PEG HON QCOM CMCSA MO AAPL COP CB INTU AZO
2010-08-31 BMY BKNG NEM CB D CCI MCD ABT EBAY AAPL ED AMT MO MRO COP
2010-09-30 AAPL BKNG AMT CCI MO BMY TXN MCHP NTAP INTU VZ ADI AZO MCD CTSH
2010-10-29 BKNG AAPL TXN ADI NTAP MO ORCL INTU AMT BWA AAP MCD AZO BMY LYB
2010-11-30 AAPL TXN MCHP ADI HON BKNG BBWI AZO QCOM BWA EXPD ETN ILMN AME OXY
2010-12-31 ADI OXY AAPL HON COP TXN LYB LULU ETN AZO QCOM NOV BKNG WLL FCX
2011-01-31 AAPL ADI TXN GE QCOM HON BKNG COP MCHP DE KLAC XOM NOV ETN OXY
2011-02-28 QCOM GE COP KLAC AAPL TXN HON ADI TER AMAT CMCSA BKNG NOV CSX OXY
2011-03-31 BKNG COP LULU CAT MCHP DE WYNN CVX CSX BKR OXY CMG ADI ROK HP
2011-04-29 BKNG MCO OXY MCHP WYNN BBWI LULU LYB SPG ORCL KKR ELV INTC CAT COO
2011-05-31 MCO SPG PFE CF MA D BKNG HUM PM WYNN MNST MO MSI ADI AXP
2011-06-30 D SPG MNST CMG ADS BKNG MA AXP ARG ISRG BEN GR CTRA BIIB LULU
2011-07-29 D AAPL SPG BKNG CF INTC MSFT WYNN COP AXP KLAC CVX BBWI MA GE
2011-08-31 CF AAPL BKNG MSFT KLAC DUK VZ WBD WYNN BBWI AEP KO MA SPG MCD
2011-09-30 AAPL KLAC DUK INTC MSFT VZ BKNG CF V AEP MA T SPG KO GE
2011-10-31 KLAC CF AAPL INTC ADI AMAT BKNG ADBE DUK SPG WBD MSFT LRCX V MCHP
2011-11-30 KLAC PFE INTC MA AEE AAPL OXY AEP V XOM VZ DUK ISRG CAT BKNG
2011-12-30 KLAC PFE CF AAPL GE MA V ISRG XOM AEP INTC SPG VZ ADBE CVX
2012-01-31 AAPL PFE KLAC SPG AMGN CF MSFT INTC GILD V ISRG MCD FAST CMCSA AMT
2012-02-29 AAPL V MSFT ISRG BKNG CMCSA CF MA FAST EQIX INTC QCOM TJX AMGN HD
2012-03-30 AAPL BKNG QCOM SPG ISRG WBD KLAC INTC MSFT EQIX V GE IVZ PFE CMCSA
2012-04-30 BKNG SPG ISRG V WBD AAPL MA PFE MSFT CCI CF INTC CMCSA MO EBAY
2012-05-31 AAPL SPG NEE MO AMGN GE AMT V CCI DIS CMCSA PFE SHW BMY ISRG
2012-06-29 SPG GE AMT CMCSA V AAPL CF NEE MO WBD CCI BMY DIS AMGN DG
2012-07-31 AAPL SPG V NEE AMGN MO AMT PFE GE CMCSA AEP GILD CCI BMY EBAY
2012-08-31 AAPL AMGN GILD SPG GE CMCSA ALL EBAY CF STX PFE AEP WBD CCI HD
2012-09-28 GE CF AAPL GILD CMCSA ALL AMGN PFE WBD DIS GOOGL HD GOOG NEE MA
2012-10-31 CMCSA AMGN AMT GILD ALL PFE CCI AEP GE WBD AOS MCO EOG MA NEE
2012-11-30 AMGN GILD EBAY CMCSA MA AMT ALL BEN V CCI CF MCO PFE WBD GE
2012-12-31 AMT CCI APTV ORCL AMGN ADBE CMCSA WBD BAC MCO GS GILD MA PPG LYB
2013-01-31 WBD EBAY ALL GS GILD MCO ORCL STX BLK PFE BEN CF ANDV LYB CPAY
2013-02-28 GILD WBD ALL AMGN GE KKR BMY CAG JPM BRK-B APTV ALK PFE ANDV GEN
2013-03-28 AMGN GILD BMY ALL PFE BEN MA ADBE LEG HON GIS BIIB STX KR CAG
2013-04-30 GILD DIS MA AMGN ADBE KKR MCO SPG ALL AMT GIS NEE JNJ ABBV AEP
2013-05-31 MCO GILD JPM GS CSCO BMY STX WDC BKNG MA MSFT AXP SLM FSLR STT
2013-06-28 BKNG STX MA CSCO CI HON CME WFC JPM AET COR CBOE WDC BA KEY
2013-07-31 MA BKNG GILD CSCO MCO JPM RTX NOC CBOE BSX GE JNJ MMM EA HON
2013-08-30 BKNG META GILD CI MA ADS ELV FLT AMGN CELG LMT KATE NOC HBI MGM
2013-09-30 BKNG MA META GILD MCO WYNN REGN ADS MGM FLT CELG TXN HBI KATE SPGI
2013-10-31 BKNG MA GILD BMY SBUX META GE TXN PFE DAL BA NXPI MMM INTU NOC
2013-11-29 BKNG MA GILD BX MSFT PFE MMM AMP MCK COR SPGI CAH OMX MCO URI
2013-12-31 MA BX WYNN URI BKNG V ABBV AMP GILD LVS GE MMM META MCO VLO
2014-01-31 META BKNG GILD BX MU WYNN URI MSFT CMCSA GOOG GOOGL BAC MCK ESRX BIIB
2014-02-28 BKNG BX META URI WYNN V GILD REGN DD PFE TMO MGM ORCL DIS MU
2014-03-31 MSFT EOG URI ORCL MCHP GLW TXN WFC HP CF QCOM BX HPQ DD TSN
2014-04-30 MU EOG AAPL ORCL DD MSFT MO LYB URI BKR AEP SLB GLW CAT PSA
2014-05-30 EOG MU COP AAPL URI SLB MO GD SPG LYB ORCL WMB DAL ABBV AEP
2014-06-30 EOG MU META COP AEP SLB AAPL HAL GILD URI INTC WLL BKR OXY ETR
2014-07-31 META AAPL MSFT GILD URI AMT COP SPG INTC VZ MU EOG DIS T INTU
2014-08-29 GILD AAPL MSFT KLAC META URI MCO AMT AMGN MU IVZ LYB INTC NXPI MO
2014-09-30 GILD META MSFT MO MU KLAC AAPL MCO AMGN INTU INTC GD ABBV LRCX UNP
2014-10-31 GILD AAPL AMGN MO ABBV MCO AEP GD MSFT SPG V DLR KR CSX ED
2014-11-28 AAPL ABBV AMGN MO AMT MU V INTC KLAC KR GD CSCO DAL INTU META
2014-12-31 KR BBWI ALL AEP ED V AMAT LOW ORLY AAPL MO DAL HD RCL DLTR
2015-01-30 MO SPG KR AAPL ED AEP PSA BX TXN ALL BBWI PCG WELL KDP SHW
2015-02-27 MO TXN CI V AAPL BBWI DLTR COR KR CNC DIS BX MMM CME LOW
2015-03-31 CI COR KR BBWI SBUX AAPL BX CNC META COST DLTR AET HAS SPG TXN
2015-04-30 BX AAPL SBUX COR MCO HAS DIS ABMD MA INTU BKNG HSP BK CI BNY
2015-05-29 GILD BX AAPL SBUX CI MCO DIS AET JPM HAS GS ELV INTU NXPI COR
2015-06-30 GILD JPM AAPL SBUX GS BKNG BX HAS MA EBAY DIS CMCSA MCO ABT CI
2015-07-31 SBUX GILD AMGN MA DIS EBAY NKE V HAS META KR JPM ORLY ACN MCO
2015-08-31 BKNG CCI GILD MO SBUX HAS JPM EBAY PSA ED PGR CI HD MA SPG
2015-09-30 BKNG MO SBUX CCI PEG INTC PSA ED CSCO GE SPG GILD VLO CMCSA BBWI
2015-10-30 BKNG MO CCI INTC SBUX GILD GE CSCO TXN CMCSA AAPL PSA SPG AAL KLAC
2015-11-30 PSA GOOGL MCD GE V MO HD ADBE META SBUX COST VLO INTC PSX DHR
2015-12-31 GE MO CCI PSA BKNG AMGN GILD MCD KLAC GOOGL INTC SPG SO PLD AVGO
2016-01-29 KLAC CCI MO MCD GE PSA NEE SO AEP GOOGL ADBE AMGN ISRG GOOG TXN
2016-02-29 KLAC VZ T BKNG AEP DAL CCI ED ISRG GE SPG MO ABBV GILD UAL
2016-03-31 KLAC VZ PSA T AEP ED GE MCD ISRG SPG MO DLR SO PM EXC
2016-04-29 T ISRG KLAC MCD META BAX HAS MO AWK ED HON VZ ABBV EVRG AFL
2016-05-31 SPGI KLAC ADBE META T ABMD ISRG CSCO DLR ABBV CCI MO TXN HAS EQIX
2016-06-30 CCI MO T ISRG VZ DLR AEP AWK SPG AMT EQIX ED JNJ CNP IRM
2016-07-29 TXN T ISRG SPGI SPG META CSCO ABBV AMGN DHR ABMD VZ HPE QCOM KLAC
2016-08-31 META CSCO SPGI TXN DHR ISRG AMAT AMGN MSFT EBAY INTC QCOM ADBE PG AMZN
2016-09-30 SPGI META ISRG BKNG HPQ CSCO NVDA AMZN ADBE EBAY QCOM AMAT GEN INTC TXN
2016-10-31 META MSFT BKNG DHR TXN SPGI MA ADBE CSCO QCOM NVDA GOOGL GEN ANET LRCX
2016-11-30 AMAT TXN KLAC QCOM ADI MSFT JPM BKNG CSX LRCX IBM DHR HPE SPGI ANET
2016-12-30 JPM MSFT ADI NVDA T AAPL AMAT TXN IBM MS GS C PNC DHR KEY
2017-01-31 AMAT IBM BKNG ADBE AAPL DHR ADI MSFT CMCSA DELL KLAC TXN NVDA IP MS
2017-02-28 AAPL BKNG CSCO ADBE ADI META AMGN JPM AMAT MO KLAC IBM SPGI ISRG BAC
2017-03-31 ADBE META BKNG AMAT KLAC AAPL ADI MSFT LRCX TXN AMT SPGI ISRG GEN CCL
2017-04-28 ADBE META AMAT BKNG ISRG MSFT GOOGL CCL AAPL AMT KLAC ABBV LRCX CHTR MCD
2017-05-31 AMAT ADBE ISRG META AAPL GOOGL KLAC ADI MCD MSFT AMT LRCX MA BKNG CCL
2017-06-30 ABBV ADBE SPGI ISRG META MCD CCL AMT BX BKNG NVDA ORCL AMGN MA CSX
2017-07-31 META BKNG SPGI ADBE NVDA MA AMAT AMT MSFT MCD LRCX ISRG ALL CCL CHTR
2017-08-31 ABBV ADBE AMT META MA V RCL MSFT MCD ISRG NVDA AAPL CCL SPGI GILD
2017-09-29 AMAT MA LRCX META ABBV V TXN ISRG NVDA BA BMY SPGI MSFT KLAC AMGN
2017-10-31 MU AMAT TXN NVDA MA ISRG LRCX ADBE ABBV META V MSFT MCD CDNS AAPL
2017-11-30 ABBV BA ISRG ANET ADBE MSFT AEP TXN MU V URI MA CBOE ALL INTC
2017-12-29 TXN ABBV BA V ANET MSFT ALL INTC CSCO URI MCD PGR MA MAR HD
2018-01-31 MSFT MA ADBE ANET V ABBV GOOGL CSCO NVDA BA JPM BAC MAR PYPL GOOG
2018-02-28 MU MA ADBE ABBV BKNG MSFT V CSCO INTC NVDA AMAT BA EL TXN ANET
2018-03-29 MU ADBE MA BKNG EL INTU INTC V EXR BR ABMD NEE PGR CPRT CSGP
2018-04-30 MU BKNG PSX AEP ANET ADBE WYNN PFE EXR ALL MPC PANW CSCO NEE MCO
2018-05-31 MU PSX BKNG V PFE MCO FCX EXR ADBE MA COP META AAPL INTU M
2018-06-29 MU V PFE META PSX MCO BKNG EXR ADBE INTU DIS M MA VZ ANET
2018-07-31 PFE V ADBE PSX DIS SPG MSFT AAPL MA AMGN CSX MU ISRG INTU ORLY
2018-08-31 PFE V SPG MA ADBE AAPL MSFT ISRG ABMD NVDA CSCO INTU TJX CNC COST
2018-09-28 PFE V DIS MA ADBE ABMD AAPL INTU CSCO PGR ISRG MSFT NVDA ORLY TJX
2018-10-31 PFE VZ CMCSA DIS AVGO AEP MO AAPL SPG PEG MRK NEE ESRX BKNG PGR
2018-11-30 PFE VZ SBUX CMCSA AVGO DIS MRK EXR DELL BKNG MCD NEE PEG BALL ESRX
2018-12-31 PFE AVGO VZ SBUX CMCSA DIS YUM NEE EXR ABBV MRK AET CME MCD PEG
2019-01-31 AVGO PFE ADI SBUX MU EXR REGN KLAC BALL META LRCX CMCSA BKNG DOC AIV
2019-02-28 AVGO ADI PGR SBUX AMT AZO INTU MRK DHR BALL MA REGN BA AES PEG
2019-03-29 AVGO CCI CDNS V MA INTU CSCO AZO PG SBUX BALL MSFT AES KLAC MCD
2019-04-30 MSFT MA ADI V KLAC ADBE CDNS CSCO AVGO HON MCO LRCX PYPL TXN ORCL
2019-05-31 MSFT PEP CCI SO KO HON LIN MTCH MA LLY AXP DIS JNJ ORCL BMY
2019-06-28 MSFT V MA BALL ORCL SBUX APD LIN CDNS MCD HON AXP ADBE CCI ADI
2019-07-31 V MSFT CCI MA SPGI MCD DIS HSY PG SBUX INTU EXR MCO CDNS TXN
2019-08-30 CCI KO MSFT EXR MCD SPGI AMGN MA V INTU BALL PLD SO SBUX KLAC
2019-09-30 SO NEE MSFT KO KLAC TXN T NXPI CCI PLD LRCX ETR MCD ES MDT
2019-10-31 BMY AMGN MSFT SO NEE T KLAC BKNG AAPL KO NXPI PLD ETR VRTX CCI
2019-11-29 AMGN AAPL MSFT BMY PLD VRTX JPM ANSS HET INTC QCOM XRX URI BAC CDAY
2019-12-31 BMY AMGN MSFT AAPL JPM MCO QCOM ANSS KLAC BAC ADBE SPGI HET LRCX C
2020-01-31 MSFT BMY SPGI ADBE NEE MCO SO MA KO AAPL JNJ V GOOGL AON CCI
2020-02-28 BMY MSFT LLY VRTX JNJ KO ADBE NEM GOOGL CCI AMGN AON HET MCO QCOM
2020-03-31 ABBV NEM ANET MSFT LLY VZ PFE PGR AMT CDNS GILD CCI ORCL AMGN QCOM
2020-04-30 ABBV NEM LLY PFE AMGN MSFT ANET QCOM GIS CDNS VZ AMT ENPH ADBE REGN
2020-05-29 ABBV NEM ANET CDNS LLY MSFT REGN GIS CSCO PFE QCOM EBAY BKNG AMT CCI
2020-06-30 EBAY ABBV NEM MSFT QCOM AAPL CDNS ADBE KLAC SPGI META LOW AMGN INTC ENPH
2020-07-31 AAPL CDNS EBAY QCOM ABBV ADBE META DHR NEM NVDA NEE MSFT SPGI PLD FAST
2020-08-31 ADBE MSFT META AAPL CDNS SPGI PG EBAY ABBV MA TXN ENPH NVDA DHR AMD
2020-09-30 DHR ENPH PG CHTR LOW AMGN SPGI ADBE NVDA TXN DE FDX AVGO ABMD AAPL
2020-10-30 DHR ENPH EXR TXN PG ABMD NEE CDNS TMO DE CARR META BALL CTLT CPRT
2020-11-30 ETSY ENPH ABMD TER TXN LRCX DE KLAC AMAT ABBV FDX QCOM CTLT CDAY AVGO
2020-12-31 CDNS ENPH ETSY AMAT TER AVGO AAPL ABBV MS KLAC LRCX ABMD QCOM ANET DE
2021-01-29 ETSY AMAT AVGO ENPH KLAC TXN MSFT QCOM WBD ABBV AAPL DE ANET DD PENN
2021-02-26 ETSY AMAT ABBV CDNS KLAC MS LRCX DVN WBD AVGO GS ENPH ORCL DE PSKY
2021-03-31 AMAT KLAC URI CSCO LRCX MO TXN DE BAC GS JPM CLF GM SPG EBAY
2021-04-30 BBWI EXR COF GS SPG GOOGL FTNT AMAT KKR MS FCX META FITB TPR AON
2021-05-28 BBWI GS MS AMAT COF EXR SPG ORCL C FTNT JPM ALL FCX BAC BIG
2021-06-30 BBWI EXR BX GOOGL INTU AMAT MRNA GS ADBE NVDA IDXX META SIVB TGT MSFT
2021-07-30 BBWI INTU GOOGL EXR ADBE BX ORCL MRNA MS MSFT CARR TGT CLF IDXX MCO
2021-08-31 GOOGL BX EXR INTU ADBE BBWI DHR SIVB META MSFT MRNA GOOG ISRG GS A
2021-09-30 GOOGL ORCL MRNA DHR AVGO MSFT BBWI MCD INTU BX JPM TMO AON COST EXR
2021-10-29 MSFT GOOGL AVGO ORCL EXR AON EOG SPG INTU NVDA ADBE BX OXY BAC BBWI
2021-11-30 AVGO MSFT AAPL COP KLAC EXR PLD PFE BBWI ADBE BX GOOGL MRNA NVDA SPG
2021-12-31 EXR PFE PLD ABBV AVGO AAPL MSFT KLAC COP CCI ABT TMO MCD GILD SPG
2022-01-31 PFE COP GILD WFC CVX MO WY AVGO ABBV KLAC AAPL BX CB EOG MCD
2022-02-28 COP ABBV FCX CVX WY REGN MO BMY CB WFC OXY AVGO AXP PFE EOG
2022-03-31 COP ABBV REGN PFE FCX CVX CF BMY EOG CB OXY PLD DVN MOS AVGO
2022-04-29 COP ABBV REGN BMY PFE WY GILD CVX CF EOG FCX DVN CB PLD OXY
2022-05-31 PFE ABBV EOG CF OXY GILD CVX REGN APA XOM BMY KLAC T DVN MPC
2022-06-30 ABBV PFE GILD BMY OXY EOG CF T KO MCD REGN XOM JNJ CVX MRK
2022-07-29 OXY MRNA KLAC CF PFE ABBV ON DVN CVX XOM EOG MRO GILD TXN MPC
2022-08-31 CF DVN OXY EOG VRTX COP ON ABBV EXR XOM CVX MOS AMGN APA MRO
2022-09-30 CF DVN EOG COP VRTX OXY ABBV CVX PFE BMY XOM ON AMGN REGN MPC
2022-10-31 DVN EOG OXY CVX COP CF ABBV MRNA AMGN APA XOM PFE BMY AIG BKNG
2022-11-30 AMGN ABBV EOG XOM CVX BMY MRK VRTX GILD AIG ORLY GIS AZO ANET EMR
2022-12-30 CVX ABBV XOM MRNA BKNG AIG AVGO EOG APA MO KLAC COP EMR PFE SPG
2023-01-31 BKNG VRTX AVGO XOM URI V AON ORCL T AIG EOG MCHP ACGL CAT REGN
2023-02-28 BKNG AVGO URI ABBV ADI MCHP ACGL ORCL V CDNS REGN JPM BWA XOM ANET
2023-03-31 BKNG AVGO ADI ORCL CDNS MCHP V TXN ANET CSCO VRTX ON GE ABBV MA
2023-04-28 BKNG AVGO V VRTX ORCL ANET MA MSFT MCD CDNS ADI AON XOM AAPL MO
2023-05-31 BKNG AVGO KLAC GE NEE PHM ADI ANET CSCO AAPL VRTX LEN MO AON ORCL
2023-06-30 AVGO AAPL BKNG KLAC AON ADBE GE PHM ORCL VRTX LEN AMAT ADI MSFT MA
2023-07-31 BKNG AVGO ADBE AAPL KLAC MCHP ON LRCX AMAT ABNB ADI GE JPM EOG NXPI
2023-08-31 AVGO BKNG ADBE CSCO MA V EMR ANET AMAT KLAC ETN ORCL GE GOOGL EOG
2023-09-29 BKNG EOG PSX AMGN EMR CF JPM MO MPC ABNB CSCO AVGO HAL GE CAT
2023-10-31 EOG KLAC CSCO AVGO BKNG ANET GILD PSX EMR MPC AMGN V MSFT ADBE AON
2023-11-30 IBM ADBE BKNG MSFT ANET V META AVGO KLAC NOW GE INTU SPG JPM CAH
2023-12-29 BKNG AVGO IBM ANET META SPG JPM KLAC INTU AMGN COST MSFT QCOM ADBE GE
2024-01-31 BKNG IBM AMGN META AVGO NVDA ANET MSFT CRM MA GE V JPM NOW ADBE
2024-02-29 AVGO META NVDA GE ANET KLAC CRM CAT JPM MSFT MA COST IBM URI ETN
2024-03-28 NVDA GE CAT JPM PGR META ANET AVGO ALL SPG URI IBM ETN PCAR MSFT
2024-04-30 NVDA GE PGR APH WFC KLAC AMAT AXP AVGO JPM ETN GOOGL CMG MO BSX
2024-05-31 NVDA MO AMAT KLAC ANET APH VRTX BKNG GOOGL META PGR NEE JPM AXP ETN
2024-06-28 ANET NVDA META MSFT BKNG MO GOOGL AMAT KLAC T COST VRTX REGN NFLX BSX
2024-07-31 MO NVDA AMT VRTX IBM ANET MCO GS AXP AEP URI IRM T PM JPM
2024-08-30 MO MCO IBM PGR SPGI BLK NVDA META ANET AFL CTAS AMT NFLX JPM TMUS
2024-09-30 IBM BLK META AMT ANET NEE T MO TMUS URI SPGI EBAY AXP AAPL NVDA
2024-10-31 BKNG MO NVDA BLK META T ANET TMUS NFLX FISV BK BNY SPG DASH KKR
2024-11-29 BKNG TMUS MO NFLX DASH SPG BLK NVDA GS FISV BK META BNY MA CCL
2024-12-31 BLK ANET BKNG AAPL V META MA NFLX NVDA FTNT MO CRM AXP PLTR PYPL
2025-01-31 META V BLK NFLX FTNT MA BSX GOOGL GS ANET PLTR JPM DASH AXP AMZN
2025-02-28 V MA META MO FTNT TMUS T BKNG PGR SPG NFLX CSCO SPGI BSX FOX
2025-03-31 MO PGR VZ NEM AEP ABT BKNG AMT V TMUS DUK FOX BRK-B BMY JPM
2025-04-30 BKNG MO AMT NEM ABT VZ AEP PGR FTNT COIN KLAC UBER MCD V NFLX
2025-05-30 BKNG GILD MO NEM KLAC CF META NVDA HOOD UBER APP ABT VZ C GOOGL
2025-06-30 BKNG NFLX META AVGO NVDA NEM GILD GS MSFT JPM C MO CAH CSCO APH
2025-07-31 NVDA MSFT AVGO META MO C APH BKNG GILD GS BLK ANET HOOD JPM NEM
2025-08-29 NVDA MO GOOGL ANET C RCL NEM AVGO APH GS URI MS LRCX BKNG MSFT
2025-09-30 NVDA NEM AVGO GOOGL C APH ANET MO KLAC GS LRCX MS PLTR MSFT GE
2025-10-31 AVGO NVDA GOOGL KLAC LRCX ANET APH GILD C NEM MS GOOG AAPL PLTR AEP
2025-11-28 AVGO GOOGL GILD NEM AMGN JNJ KLAC C AAPL AEP AMAT PLD LRCX NEE MU
2025-12-31 NEM JNJ C KLAC GOOGL LRCX GILD WDC GS MS PLD AAPL AMGN LLY ADI
2026-01-30 GILD JNJ GOOGL NEM ADI LRCX KLAC WDC MU AMGN AMAT GOOG GS NEE C
2026-02-27 JNJ NEM ADI BMY GILD AMGN KLAC WDC AEP MO MU LRCX AMAT VZ KO
2026-03-31 KLAC GILD JNJ WDC CF NEM MU APA PSX AVGO BMY DVN LRCX SPG GOOGL
2026-04-30 ADI KLAC MU AVGO MO LRCX WDC GOOGL SPG AMAT NEE NVDA BMY FDX JNJ
2026-05-29 AVGO AAPL KLAC MU ADI NVDA AMAT WDC LRCX GOOGL MS SPG GS CSCO BK
2026-06-26 SPG MU KLAC LRCX WDC MO AMAT C FTNT APH ADI KO JNJ ABBV STX
Scoring script (python)
FORMULA_NAME = "Contrarian 52-Week Hybrid with Repair-Leadership Arbitration (v1180)"
LOGIC_VARIANT_COUNT = 4
NOTES = """mode=explore; family=contrarian-52w-hybrid
New hybrid family that combines the strongest orthogonal elements of the winning parent families without mechanically averaging them: deep 52-week contrarian repair, quality-filtered recovery durability, and regime-aware momentum leadership. The arbitration is explicit. In damaged tapes, washed-out names only qualify when recovery evidence, balance-sheet durability proxies, and tradability confirm the repair. In strong tapes, momentum leaders can dominate, but only when they are not excessively extended, too volatile, or obviously low-quality. In mixed tapes, the strategy prefers names where short-horizon repair and medium-horizon leadership are converging rather than fighting each other.
Deliberate metric coverage this run: actively use momentum (return_1m_pct, return_3m_pct, return_6m_pct, return_12m_pct, momentum_12_1_pct), trend/recovery (from_200d_ma_pct, from_52w_high_pct), volatility (realized_vol_3m), liquidity (avg_daily_volume_3m, avg_daily_dollar_volume_3m, trading_days_3m), income (dividend_yield_ttm_pct), valuation (pe, forward_pe, peg), growth (eps_growth_pct, operating_income_growth_pct, free_cash_flow_growth_pct, forward_eps), quality (operating_margin_pct, free_cash_flow_margin_pct), and size (market_cap). Deliberately weight dividend_ttm, revenue_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 correlated price-level duplication and to keep the family structurally distinct from prior hybrids. Sparse fundamentals are normalized within each sleeve so missing fields do not automatically dominate or disqualify a stock.
Regime branches: panic-repair, transition, clean-trend, and defensive-carry. The branch count is exactly four."""

ACTIVE_METRICS = (
    "return_1m_pct",
    "return_3m_pct",
    "return_6m_pct",
    "return_12m_pct",
    "momentum_12_1_pct",
    "from_200d_ma_pct",
    "from_52w_high_pct",
    "realized_vol_3m",
    "avg_daily_volume_3m",
    "avg_daily_dollar_volume_3m",
    "trading_days_3m",
    "dividend_yield_ttm_pct",
    "pe",
    "forward_pe",
    "peg",
    "eps_growth_pct",
    "operating_income_growth_pct",
    "free_cash_flow_growth_pct",
    "forward_eps",
    "operating_margin_pct",
    "free_cash_flow_margin_pct",
    "market_cap",
)

ZERO_WEIGHT_METRICS = (
    "dividend_ttm",
    "revenue_growth_pct",
    "shares_outstanding",
    "close",
    "adj_close",
    "high_52w",
    "ma_200d",
    "eps_ttm",
    "revenue_ttm",
    "operating_income_ttm",
    "free_cash_flow_ttm",
)


def score_universe(stocks, regime, ctx):
    def get_field(obj, key, default=None):
        if isinstance(obj, dict):
            return obj.get(key, default)
        return getattr(obj, key, default)

    def as_number(value):
        if value is None or value == "":
            return None
        if isinstance(value, bool):
            return 1.0 if value else 0.0
        try:
            number = float(value)
        except Exception:
            return None
        if number != number:
            return None
        if number == float("inf") or number == float("-inf"):
            return None
        return number

    def symbol_of(stock, idx):
        sym = get_field(stock, "symbol")
        if sym is None:
            sym = get_field(stock, "ticker")
        if sym is None:
            sym = get_field(stock, "name")
        if sym is None:
            sym = "stock_%s" % idx
        return str(sym)

    universe = list(stocks or [])
    if not universe:
        return {}

    symbols = [symbol_of(stock, i) for i, stock in enumerate(universe)]

    def rank_map(metric, high_is_good=True):
        values = []
        for i, stock in enumerate(universe):
            val = as_number(get_field(stock, metric))
            if val is not None:
                values.append((i, val))
        result = {}
        if not values:
            return result
        values.sort(key=lambda item: item[1], reverse=high_is_good)
        n = len(values)
        if n == 1:
            result[values[0][0]] = 1.0
            return result
        for rank, (idx, _) in enumerate(values):
            result[idx] = 1.0 - (rank / float(n - 1))
        return result

    ranks = {
        "return_1m_pct": rank_map("return_1m_pct", True),
        "return_3m_pct": rank_map("return_3m_pct", True),
        "return_6m_pct": rank_map("return_6m_pct", True),
        "return_12m_pct": rank_map("return_12m_pct", True),
        "momentum_12_1_pct": rank_map("momentum_12_1_pct", True),
        "from_200d_ma_pct": rank_map("from_200d_ma_pct", True),
        "from_52w_high_pct": rank_map("from_52w_high_pct", True),
        "deep_drawdown": rank_map("from_52w_high_pct", False),
        "realized_vol_3m_low": rank_map("realized_vol_3m", False),
        "avg_daily_volume_3m": rank_map("avg_daily_volume_3m", True),
        "avg_daily_dollar_volume_3m": rank_map("avg_daily_dollar_volume_3m", True),
        "trading_days_3m": rank_map("trading_days_3m", True),
        "dividend_yield_ttm_pct": rank_map("dividend_yield_ttm_pct", True),
        "pe_low": rank_map("pe", False),
        "forward_pe_low": rank_map("forward_pe", False),
        "peg_low": rank_map("peg", False),
        "eps_growth_pct": rank_map("eps_growth_pct", True),
        "operating_income_growth_pct": rank_map("operating_income_growth_pct", True),
        "free_cash_flow_growth_pct": rank_map("free_cash_flow_growth_pct", True),
        "forward_eps": rank_map("forward_eps", True),
        "operating_margin_pct": rank_map("operating_margin_pct", True),
        "free_cash_flow_margin_pct": rank_map("free_cash_flow_margin_pct", True),
        "market_cap": rank_map("market_cap", True),
        "smaller_cap": rank_map("market_cap", False),
    }

    def present(idx, key):
        return 1.0 if idx in ranks[key] else 0.0

    def mix(idx, weighted_keys):
        total = 0.0
        weight = 0.0
        for key, w in weighted_keys:
            if idx in ranks[key]:
                total += ranks[key][idx] * w
                weight += w
        if weight <= 0.0:
            return 0.5
        return total / weight

    avg_6m = 0.0
    avg_200d = 0.0
    avg_vol = 0.0
    n_6m = 0
    n_200d = 0
    n_vol = 0
    for stock in universe:
        v = as_number(get_field(stock, "return_6m_pct"))
        if v is not None:
            avg_6m += v
            n_6m += 1
        v = as_number(get_field(stock, "from_200d_ma_pct"))
        if v is not None:
            avg_200d += v
            n_200d += 1
        v = as_number(get_field(stock, "realized_vol_3m"))
        if v is not None:
            avg_vol += v
            n_vol += 1
    avg_6m = avg_6m / n_6m if n_6m else 0.0
    avg_200d = avg_200d / n_200d if n_200d else 0.0
    avg_vol = avg_vol / n_vol if n_vol else 0.0

    def pull_regime_number(source, keys):
        for key in keys:
            val = None
            if isinstance(source, dict):
                val = source.get(key)
            else:
                val = getattr(source, key, None)
            num = as_number(val)
            if num is not None:
                return num
        return None

    regime_risk_on = pull_regime_number(regime, ("risk_on", "risk_on_score", "bull", "bullish"))
    regime_trend = pull_regime_number(regime, ("trend", "trend_score", "market_trend"))
    regime_breadth = pull_regime_number(regime, ("breadth", "breadth_score"))
    regime_vol = pull_regime_number(regime, ("volatility", "vol", "vol_score", "stress"))
    regime_drawdown = pull_regime_number(regime, ("drawdown", "damage", "damage_score"))

    if regime_risk_on is None:
        regime_risk_on = 1.0 if avg_6m > 8.0 else (0.0 if avg_6m < -4.0 else 0.5)
    if regime_trend is None:
        regime_trend = 1.0 if avg_200d > 5.0 else (0.0 if avg_200d < -3.0 else 0.5)
    if regime_breadth is None:
        regime_breadth = 1.0 if avg_6m > 4.0 and avg_200d > 0.0 else (0.0 if avg_6m < 0.0 and avg_200d < 0.0 else 0.5)
    if regime_vol is None:
        regime_vol = 1.0 if avg_vol > 45.0 else (0.0 if avg_vol < 25.0 else 0.5)
    if regime_drawdown is None:
        regime_drawdown = 1.0 if avg_200d < -5.0 else (0.0 if avg_200d > 3.0 else 0.5)

    regime_strength = (regime_risk_on + regime_trend + regime_breadth) / 3.0
    regime_stress = (regime_vol + regime_drawdown) / 2.0

    if regime_strength < 0.38 and regime_stress > 0.58:
        branch = 0  # panic-repair
    elif regime_strength > 0.68 and regime_stress < 0.48:
        branch = 2  # clean-trend
    elif regime_stress > 0.62:
        branch = 3  # defensive-carry
    else:
        branch = 1  # transition

    scores = {}
    for idx, stock in enumerate(universe):
        liquidity = mix(
            idx,
            (
                ("avg_daily_volume_3m", 0.25),
                ("avg_daily_dollar_volume_3m", 0.50),
                ("trading_days_3m", 0.25),
            ),
        )

        value = mix(
            idx,
            (
                ("pe_low", 0.30),
                ("forward_pe_low", 0.35),
                ("peg_low", 0.35),
            ),
        )

        quality = mix(
            idx,
            (
                ("operating_margin_pct", 0.55),
                ("free_cash_flow_margin_pct", 0.45),
            ),
        )

        growth = mix(
            idx,
            (
                ("eps_growth_pct", 0.30),
                ("operating_income_growth_pct", 0.25),
                ("free_cash_flow_growth_pct", 0.25),
                ("forward_eps", 0.20),
            ),
        )

        momentum = mix(
            idx,
            (
                ("return_1m_pct", 0.18),
                ("return_3m_pct", 0.24),
                ("return_6m_pct", 0.22),
                ("return_12m_pct", 0.10),
                ("momentum_12_1_pct", 0.26),
            ),
        )

        trend = mix(
            idx,
            (
                ("from_200d_ma_pct", 0.60),
                ("from_52w_high_pct", 0.40),
            ),
        )

        drawdown = mix(idx, (("deep_drawdown", 1.0),))
        low_vol = mix(idx, (("realized_vol_3m_low", 1.0),))
        income = mix(idx, (("dividend_yield_ttm_pct", 1.0),))
        size = mix(idx, (("market_cap", 1.0),))
        smaller = mix(idx, (("smaller_cap", 1.0),))

        repair_evidence = mix(
            idx,
            (
                ("return_1m_pct", 0.25),
                ("return_3m_pct", 0.30),
                ("from_200d_ma_pct", 0.25),
                ("realized_vol_3m_low", 0.20),
            ),
        )

        repair_score = (
            0.30 * drawdown
            + 0.26 * repair_evidence
            + 0.16 * quality
            + 0.12 * value
            + 0.08 * growth
            + 0.08 * liquidity
        )

        leadership_score = (
            0.33 * momentum
            + 0.24 * trend
            + 0.14 * quality
            + 0.11 * growth
            + 0.10 * liquidity
            + 0.08 * low_vol
        )

        defensive_score = (
            0.24 * quality
            + 0.20 * low_vol
            + 0.16 * value
            + 0.15 * income
            + 0.15 * liquidity
            + 0.10 * size
        )

        bridge_score = (
            0.28 * repair_evidence
            + 0.20 * momentum
            + 0.16 * quality
            + 0.12 * growth
            + 0.12 * value
            + 0.12 * drawdown
        )

        repair_gap = repair_score - leadership_score
        convergence = 1.0 - repair_gap if repair_gap >= 0.0 else 1.0 + repair_gap
        if convergence < 0.0:
            convergence = 0.0

        extension_penalty = 0.0
        broken_penalty = 0.0
        junk_penalty = 0.0

        raw_from_high = as_number(get_field(stock, "from_52w_high_pct"))
        raw_from_200d = as_number(get_field(stock, "from_200d_ma_pct"))
        raw_vol = as_number(get_field(stock, "realized_vol_3m"))
        raw_pe = as_number(get_field(stock, "pe"))
        raw_fpe = as_number(get_field(stock, "forward_pe"))
        raw_mom_1m = as_number(get_field(stock, "return_1m_pct"))
        raw_mom_3m = as_number(get_field(stock, "return_3m_pct"))

        if raw_from_high is not None and raw_from_high > -5.0 and raw_mom_1m is not None and raw_mom_1m > 18.0:
            extension_penalty += 0.08
        if raw_from_200d is not None and raw_from_200d < -12.0 and raw_mom_3m is not None and raw_mom_3m < 0.0:
            broken_penalty += 0.12
        if raw_vol is not None and raw_vol > 70.0:
            junk_penalty += 0.08
        if raw_pe is not None and raw_pe < 0.0:
            junk_penalty += 0.06
        if raw_fpe is not None and raw_fpe > 60.0:
            extension_penalty += 0.04
        if quality < 0.30 and growth < 0.30:
            junk_penalty += 0.07
        if liquidity < 0.22:
            junk_penalty += 0.08

        if branch == 0:
            score = (
                1.18 * repair_score
                + 0.32 * defensive_score
                + 0.18 * bridge_score
                + 0.10 * smaller
                - 0.85 * broken_penalty
                - 0.65 * junk_penalty
                - 0.35 * extension_penalty
            )
            if repair_evidence < 0.42:
                score -= 0.10
            if drawdown < 0.45:
                score -= 0.04
        elif branch == 1:
            score = (
                0.72 * (repair_score if repair_score > leadership_score else leadership_score)
                + 0.44 * (repair_score if repair_score < leadership_score else leadership_score)
                + 0.30 * bridge_score
                + 0.16 * defensive_score
                + 0.06 * value
                - 0.35 * junk_penalty
                - 0.18 * extension_penalty
                - 0.18 * broken_penalty
            )
            score += 0.10 * convergence
            if momentum < 0.35 and repair_evidence < 0.40:
                score -= 0.08
        elif branch == 2:
            score = (
                1.14 * leadership_score
                + 0.22 * defensive_score
                + 0.16 * bridge_score
                + 0.08 * quality
                - 0.70 * extension_penalty
                - 0.25 * junk_penalty
                - 0.40 * broken_penalty
            )
            if trend < 0.40:
                score -= 0.10
            if drawdown > 0.80 and repair_evidence < 0.50:
                score -= 0.06
        else:
            score = (
                1.10 * defensive_score
                + 0.34 * repair_score
                + 0.12 * leadership_score
                + 0.10 * income
                + 0.06 * value
                - 0.45 * junk_penalty
                - 0.20 * extension_penalty
                - 0.24 * broken_penalty
            )
            if low_vol < 0.35:
                score -= 0.08
            if size < 0.20 and liquidity < 0.35:
                score -= 0.05

        score += 0.03 * liquidity
        scores[symbols[idx]] = score

    return scores