exp_1188

Contrarian 52W Recovery Quality Hybrid (Conflict-Arbitrated Relay, v1188)

← All V2 experiments
Relative return
0.993x
Excess vs bench
-0.70%
Benchmark
CAPW_UNIV
Rolling windows
179 · monthly
Mean strategy gain
13.22%
Mean benchmark gain
14.08%
Mean excess gain
-0.87%
Dispersion (ref)
5.82%
Win-rate vs bench (ref)
43.58%
Worst / best ratio (ref)
0.907x / 1.076x
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 9.72% 2.22% 1.073x
2011-07-01 … 2016-06-30 13.88% 13.74% 1.001x
2016-07-01 … 2021-06-30 15.48% 20.63% 0.957x
2021-07-01 … 2026-06-26 13.25% 15.48% 0.981x
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 0.993x · beat benchmark in 78/179
#WindowStrategyBenchmarkRatio
1 2006-07-31 … 2011-07-29 7.50% 1.79% 1.056x
2 2006-08-31 … 2011-08-31 4.91% 0.21% 1.047x
3 2006-09-29 … 2011-08-31 4.71% -0.14% 1.049x
4 2006-10-31 … 2011-10-31 5.72% 0.23% 1.055x
5 2006-11-30 … 2011-11-30 3.95% -0.05% 1.040x
6 2006-12-29 … 2011-11-30 4.09% -0.32% 1.044x
7 2007-01-31 … 2012-01-31 6.00% 0.93% 1.050x
8 2007-02-28 … 2012-01-31 6.42% 1.43% 1.049x
9 2007-03-30 … 2012-03-30 6.57% 3.09% 1.034x
10 2007-04-30 … 2012-04-30 5.85% 2.42% 1.034x
11 2007-05-31 … 2012-05-31 3.51% 0.60% 1.029x
12 2007-06-29 … 2012-06-29 3.14% 1.92% 1.012x
13 2007-07-31 … 2012-07-31 3.90% 2.69% 1.012x
14 2007-08-31 … 2012-08-31 4.17% 2.95% 1.012x
15 2007-09-28 … 2012-09-28 5.41% 3.20% 1.021x
16 2007-10-31 … 2012-10-31 5.18% 2.60% 1.025x
17 2007-11-30 … 2012-11-30 7.50% 3.45% 1.039x
18 2007-12-31 … 2012-12-31 8.41% 3.69% 1.045x
19 2008-01-31 … 2013-01-31 11.90% 5.85% 1.057x
20 2008-02-29 … 2013-02-28 11.53% 6.82% 1.044x
21 2008-03-31 … 2013-03-28 11.79% 7.73% 1.038x
22 2008-04-30 … 2013-04-30 11.76% 7.51% 1.040x
23 2008-05-30 … 2013-04-30 11.83% 7.81% 1.037x
24 2008-06-30 … 2013-06-28 15.38% 9.33% 1.055x
25 2008-07-31 … 2013-07-31 16.01% 10.48% 1.050x
26 2008-08-29 … 2013-07-31 16.59% 10.52% 1.055x
27 2008-09-30 … 2013-09-30 19.44% 11.48% 1.071x
28 2008-10-31 … 2013-10-31 22.62% 15.76% 1.059x
29 2008-11-28 … 2013-10-31 24.03% 17.46% 1.056x
30 2008-12-31 … 2013-12-31 24.64% 18.44% 1.052x
31 2009-01-30 … 2013-12-31 26.43% 20.64% 1.048x
32 2009-02-27 … 2014-01-31 26.79% 21.63% 1.042x
33 2009-03-31 … 2014-03-31 28.13% 20.60% 1.062x
34 2009-04-30 … 2014-04-30 25.73% 19.00% 1.057x
35 2009-05-29 … 2014-04-30 26.17% 18.32% 1.066x
36 2009-06-30 … 2014-06-30 28.01% 19.01% 1.076x
37 2009-07-31 … 2014-07-31 23.45% 17.39% 1.052x
38 2009-08-31 … 2014-08-29 24.20% 17.70% 1.055x
39 2009-09-30 … 2014-09-30 22.02% 16.64% 1.046x
40 2009-10-30 … 2014-09-30 24.13% 17.08% 1.060x
41 2009-11-30 … 2014-11-28 23.04% 16.82% 1.053x
42 2009-12-31 … 2014-12-31 20.81% 16.28% 1.039x
43 2010-01-29 … 2014-12-31 23.10% 17.23% 1.050x
44 2010-02-26 … 2015-01-30 19.94% 15.80% 1.036x
45 2010-03-31 … 2015-03-31 18.22% 15.40% 1.024x
46 2010-04-30 … 2015-04-30 17.86% 15.38% 1.021x
47 2010-05-28 … 2015-04-30 18.48% 17.09% 1.012x
48 2010-06-30 … 2015-06-30 21.39% 17.45% 1.034x
49 2010-07-30 … 2015-06-30 19.83% 16.43% 1.029x
50 2010-08-31 … 2015-08-31 19.37% 15.76% 1.031x
51 2010-09-30 … 2015-09-30 15.35% 13.61% 1.015x
52 2010-10-29 … 2015-09-30 14.51% 13.06% 1.013x
53 2010-11-30 … 2015-11-30 14.91% 15.09% 0.999x
54 2010-12-31 … 2015-12-31 13.28% 13.55% 0.998x
55 2011-01-31 … 2016-01-29 9.97% 11.90% 0.983x
56 2011-02-28 … 2016-01-29 9.10% 11.53% 0.978x
57 2011-03-31 … 2016-03-31 12.98% 12.90% 1.001x
58 2011-04-29 … 2016-04-29 12.48% 12.39% 1.001x
59 2011-05-31 … 2016-05-31 12.19% 12.94% 0.993x
60 2011-06-30 … 2016-06-30 12.35% 13.30% 0.992x
61 2011-07-29 … 2016-07-29 14.15% 14.52% 0.997x
62 2011-08-31 … 2016-08-31 15.75% 15.19% 1.005x
63 2011-09-30 … 2016-09-30 17.01% 16.32% 1.006x
64 2011-10-31 … 2016-10-31 12.84% 14.02% 0.990x
65 2011-11-30 … 2016-11-30 15.45% 14.66% 1.007x
66 2011-12-30 … 2016-12-30 14.91% 14.92% 1.000x
67 2012-01-31 … 2017-01-31 15.28% 14.63% 1.006x
68 2012-02-29 … 2017-02-28 15.84% 14.78% 1.009x
69 2012-03-30 … 2017-02-28 15.70% 14.43% 1.011x
70 2012-04-30 … 2017-04-28 14.97% 14.61% 1.003x
71 2012-05-31 … 2017-05-31 17.49% 15.98% 1.013x
72 2012-06-29 … 2017-05-31 17.86% 15.44% 1.021x
73 2012-07-31 … 2017-07-31 18.94% 15.43% 1.030x
74 2012-08-31 … 2017-08-31 18.05% 15.12% 1.025x
75 2012-09-28 … 2017-08-31 16.83% 14.77% 1.018x
76 2012-10-31 … 2017-10-31 16.75% 16.12% 1.005x
77 2012-11-30 … 2017-11-30 18.45% 16.79% 1.014x
78 2012-12-31 … 2017-12-29 17.19% 16.93% 1.002x
79 2013-01-31 … 2018-01-31 16.57% 17.57% 0.992x
80 2013-02-28 … 2018-02-28 15.40% 16.21% 0.993x
81 2013-03-28 … 2018-02-28 14.92% 15.81% 0.992x
82 2013-04-30 … 2018-04-30 14.13% 14.25% 0.999x
83 2013-05-31 … 2018-05-31 13.95% 14.57% 0.995x
84 2013-06-28 … 2018-05-31 13.85% 14.97% 0.990x
85 2013-07-31 … 2018-07-31 11.81% 14.83% 0.974x
86 2013-08-30 … 2018-07-31 12.48% 15.59% 0.973x
87 2013-09-30 … 2018-09-28 12.15% 15.84% 0.968x
88 2013-10-31 … 2018-10-31 9.34% 12.89% 0.969x
89 2013-11-29 … 2018-10-31 9.45% 12.60% 0.972x
90 2013-12-31 … 2018-12-31 5.89% 9.93% 0.963x
91 2014-01-31 … 2019-01-31 8.99% 12.37% 0.970x
92 2014-02-28 … 2019-02-28 8.19% 12.38% 0.963x
93 2014-03-31 … 2019-03-29 8.72% 12.76% 0.964x
94 2014-04-30 … 2019-04-30 10.45% 13.73% 0.971x
95 2014-05-30 … 2019-04-30 9.77% 13.54% 0.967x
96 2014-06-30 … 2019-06-28 9.49% 12.81% 0.971x
97 2014-07-31 … 2019-07-31 11.27% 13.30% 0.982x
98 2014-08-29 … 2019-07-31 10.48% 12.80% 0.979x
99 2014-09-30 … 2019-09-30 10.16% 12.70% 0.977x
100 2014-10-31 … 2019-10-31 10.90% 12.91% 0.982x
101 2014-11-28 … 2019-10-31 10.61% 12.60% 0.982x
102 2014-12-31 … 2019-12-31 12.99% 14.16% 0.990x
103 2015-01-30 … 2019-12-31 14.14% 14.85% 0.994x
104 2015-02-27 … 2020-01-31 11.39% 14.04% 0.977x
105 2015-03-31 … 2020-03-31 -1.32% 8.56% 0.909x
106 2015-04-30 … 2020-04-30 1.50% 11.65% 0.909x
107 2015-05-29 … 2020-05-29 3.38% 12.61% 0.918x
108 2015-06-30 … 2020-06-30 3.02% 13.64% 0.907x
109 2015-07-31 … 2020-07-31 6.52% 14.60% 0.929x
110 2015-08-31 … 2020-08-31 7.32% 18.07% 0.909x
111 2015-09-30 … 2020-09-30 7.42% 17.05% 0.918x
112 2015-10-30 … 2020-10-30 6.07% 14.60% 0.926x
113 2015-11-30 … 2020-11-30 11.29% 17.43% 0.948x
114 2015-12-31 … 2020-12-31 11.75% 18.65% 0.942x
115 2016-01-29 … 2021-01-29 14.12% 19.26% 0.957x
116 2016-02-29 … 2021-02-26 14.98% 19.79% 0.960x
117 2016-03-31 … 2021-03-31 12.67% 19.42% 0.943x
118 2016-04-29 … 2021-03-31 12.77% 19.66% 0.942x
119 2016-05-31 … 2021-05-28 15.18% 20.42% 0.957x
120 2016-06-30 … 2021-06-30 15.63% 21.06% 0.955x
121 2016-07-29 … 2021-06-30 15.48% 20.63% 0.957x
122 2016-08-31 … 2021-08-31 15.99% 21.75% 0.953x
123 2016-09-30 … 2021-09-30 15.26% 20.22% 0.959x
124 2016-10-31 … 2021-10-29 18.03% 22.50% 0.963x
125 2016-11-30 … 2021-11-30 15.86% 21.87% 0.951x
126 2016-12-30 … 2021-11-30 15.77% 21.75% 0.951x
127 2017-01-31 … 2022-01-31 11.55% 20.17% 0.928x
128 2017-02-28 … 2022-02-28 11.26% 18.51% 0.939x
129 2017-03-31 … 2022-03-31 11.34% 19.46% 0.932x
130 2017-04-28 … 2022-03-31 11.45% 19.46% 0.933x
131 2017-05-31 … 2022-05-31 8.90% 15.59% 0.942x
132 2017-06-30 … 2022-06-30 4.17% 13.08% 0.921x
133 2017-07-31 … 2022-07-29 5.12% 15.16% 0.913x
134 2017-08-31 … 2022-08-31 5.76% 13.72% 0.930x
135 2017-09-29 … 2022-08-31 6.03% 13.56% 0.934x
136 2017-10-31 … 2022-10-31 6.58% 11.86% 0.953x
137 2017-11-30 … 2022-11-30 7.21% 12.52% 0.953x
138 2017-12-29 … 2022-11-30 7.54% 12.46% 0.956x
139 2018-01-31 … 2023-01-31 7.41% 11.01% 0.968x
140 2018-02-28 … 2023-02-28 6.82% 11.03% 0.962x
141 2018-03-29 … 2023-02-28 6.61% 11.72% 0.954x
142 2018-04-30 … 2023-04-28 6.67% 13.01% 0.944x
143 2018-05-31 … 2023-05-31 5.68% 12.95% 0.936x
144 2018-06-29 … 2023-05-31 6.43% 13.01% 0.942x
145 2018-07-31 … 2023-07-31 9.37% 14.67% 0.954x
146 2018-08-31 … 2023-08-31 8.31% 13.51% 0.954x
147 2018-09-28 … 2023-08-31 8.39% 13.56% 0.954x
148 2018-10-31 … 2023-10-31 6.62% 12.60% 0.947x
149 2018-11-30 … 2023-11-30 10.49% 14.58% 0.964x
150 2018-12-31 … 2023-12-29 15.78% 17.26% 0.987x
151 2019-01-31 … 2024-01-31 14.29% 16.27% 0.983x
152 2019-02-28 … 2024-01-31 13.73% 15.94% 0.981x
153 2019-03-29 … 2024-03-28 14.84% 17.50% 0.977x
154 2019-04-30 … 2024-04-30 13.23% 15.50% 0.980x
155 2019-05-31 … 2024-05-31 15.25% 18.12% 0.976x
156 2019-06-28 … 2024-06-28 14.41% 17.99% 0.970x
157 2019-07-31 … 2024-07-31 14.40% 17.70% 0.972x
158 2019-08-30 … 2024-08-30 13.40% 18.41% 0.958x
159 2019-09-30 … 2024-09-30 15.90% 18.65% 0.977x
160 2019-10-31 … 2024-10-31 14.41% 17.87% 0.971x
161 2019-11-29 … 2024-11-29 16.61% 18.64% 0.983x
162 2019-12-31 … 2024-12-31 14.34% 17.62% 0.972x
163 2020-01-31 … 2025-01-31 16.21% 18.07% 0.984x
164 2020-02-28 … 2025-02-28 15.70% 19.00% 0.972x
165 2020-03-31 … 2025-03-31 20.09% 19.24% 1.007x
166 2020-04-30 … 2025-04-30 18.86% 16.49% 1.020x
167 2020-05-29 … 2025-04-30 17.28% 15.80% 1.013x
168 2020-06-30 … 2025-06-30 22.23% 18.19% 1.034x
169 2020-07-31 … 2025-07-31 18.80% 17.87% 1.008x
170 2020-08-31 … 2025-08-29 17.81% 16.69% 1.010x
171 2020-09-30 … 2025-09-30 19.12% 18.57% 1.005x
172 2020-10-30 … 2025-09-30 19.85% 19.43% 1.004x
173 2020-11-30 … 2025-11-28 15.04% 17.77% 0.977x
174 2020-12-31 … 2025-12-31 14.76% 16.92% 0.981x
175 2021-01-29 … 2025-12-31 14.05% 17.20% 0.973x
176 2021-02-26 … 2026-01-30 13.25% 17.04% 0.968x
177 2021-03-31 … 2026-03-31 12.06% 14.07% 0.982x
178 2021-04-30 … 2026-04-30 16.46% 16.03% 1.004x
179 2021-05-28 … 2026-04-30 15.42% 16.22% 0.993x
Notes
mode=explore; family=contrarian-52w-recovery-quality-hybrid New hybrid family built by combining the bull recovery-leader contrarian sweet-spot from contrarian-52w with the stock-level conflict arbitration and quality/liquidity discipline from recovery-quality-regime-momentum-hybrid. The structure is intentionally not a mechanical average: in bull tapes, repaired rebounders can graduate into momentum only after quality confirms; in mixed tapes, recovery only gets paid when liquidity and balance-sheet proxies are good enough; in risk-off, the model falls back to lower-volatility durable franchises entered from modest 52-week drawdowns rather than deep damage. Deliberate metric coverage: actively use one momentum cluster (3m, 6m, 12_1), one recovery cluster (distance from 52-week high plus 200d trend), one volatility check, all three liquidity checks in mixed/risk-off, one income metric, two valuation metrics, three growth/earnings proxies, two quality metrics, and a size tilt that flips by regime. Deliberate weight-0 metrics this run: 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
#888 · degrade · relative_return Δ -0.4327 · parent exp_758 · Jul 21, 2026 · auto/explore; benchmark CAPW_UNIV
explore/contrarian-52w-recovery-quality-hybrid: relative_return 0.9930x (delta -0.4327 vs exp_758); win-rate 43.5754%, worst-window 0.906524, dispersion 5.8185%.
Monthly picks — top stocks selected each month (whole timeline)
timeline — 240 months · top 15 each
Month 123456789101112131415
2006-07-31 BAC CMCSA T GEN ATI ICE PNC NVDA MTW ANDV XRAY EXPD ZBH AOS VTR
2006-08-31 KIM EA MAT FTI ILMN MAA ODFL KSS BLK NUE LUMN O MTW NOV NFB
2006-09-29 IT ALL SNA ILMN AKAM BAX AMGN UNM ADM CAG UHS PENN MTW TSN HST
2006-10-31 VFC GEN EQR SJM AMAT MKTX GT IDXX ED NI SPG CRL SLG CNP MHS
2006-11-30 ETR SHW AAPL WTW ARE LMT AVB ILMN DDR ALB AMZN WDC OI INCY FLS
2006-12-29 DOC REGN MHK INTU EXPE AAP ADI SNDK CRM PKI DLX SAPE MMC OI EHC
2007-01-31 EXPE REGN UAL PGL NVR WAB PVH DHI VZ SWKS OMX AMZN PHM EW NAV
2007-02-28 COG TIE TUP WDC REGN CTB OI CNC WCG INCY FLR COL CIEN TTWO NVR
2007-03-30 ON WYNN VFC NDSN ETR DNR TTWO ADSK ANDW EBAY RHI RX RE VAR EKDKQ
2007-04-30 HP MAY NEE CF PSA RX EKDKQ TTWO UIS GLW XTO QCOM WYE PETM AFL
2007-05-31 OKE X CERN SVU WFT COL NBL DE L HES IPGP ADSK NOV PPL LM
2007-06-29 POOL ACN MNST EFX ES DGX HES CLF BBBY VTSS LUV TTWO PNR STLD EXR
2007-07-31 CAR CVG CF OI NKTR DLX PCAR NRG SLM CNX MLM DLTR MGM CBRE MCHP
2007-08-31 JEC WHR AXON STZ ALGN FIS VFC DECK MOH MA NDAQ NFX FSLR NRG COO
2007-09-28 AT FMC CTRA IBKR DXCM VRTX MUR STZ SLM JBHT DOC KSE REG TYL DLX
2007-10-31 MPWR MNST STX FCX MSI ADBE CF VTSS ESS AEE CMI GRMN MHK KO CTAS
2007-11-30 FTI STZ WLL ARG DHR MYL CMI MCD PG FCX MOLX SVU DOC SLB NOV
2007-12-31 IPGP AFL WYNN LVS GRMN HON TTWO TWX FDX ROST AXON NI ANDV VIAV GEN
2008-01-31 BIIB DECK ISRG J PODD NOV NVR FTI SPG FLR FCX DOC PSA MAT WYNN
2008-02-29 FSLR ESRX MSFT GT UDR WHR BSX TXT PH STX EQR PNW MRK EXR SPG
2008-03-31 THC WHR CMG BIIB CF NYT MRSH SCHW J NVR AAPL MSFT ADI DHI CNP
2008-04-30 CMVT TSN NVR NI MHK TER HD GT BIIB AKAM CRH NYT ADI LNC AIV
2008-05-30 ALL NDSN EHC ROH STI THC ADM AMCC DLTR LSI EFX CMVT IBM FRT DXC
2008-06-30 DLTR FE EME JCI MMM IPG ALL DXC ADI ZBH NCR PBI MSFT CAH VFC
2008-07-31 DFS PALM MA JNY ON NBR JCP PAYX HP GS WDC MOS CPT SNV APA
2008-08-29 PRGO PALM JNY AVY PPG ALB WTW STZ NSC SWK FRT CLF BBY MAA CTAS
2008-09-30 BMY CNC ESV HOG COF EME MSFT TGT KSS MMM SWKS CSGP OXY JNY CAH
2008-10-31 BMY SCHW HPQ APOL CEPH ATGE MMM LEG D CELG FI HCBK HRS VRTX PFE
2008-11-28 BMY ECL BAX CNP PAYX KO ES PNW SRE ROH ESRX VZ EW USB PFE
2008-12-31 HPQ MNST T RTX MRSH WFC CVX NFLX RMD LLY AEP COR CPB ORCL BALL
2009-01-30 CMS MO CAG ACGL VTRS MNST LH AEP KR RSG TSCO MCK AEE HPQ D
2009-02-27 XOM AMGN COR IBM BALL SHW VZ SJM HRB DUK BMY BAX FIS CMS MTCH
2009-03-31 BIIB XOM KO JNJ IBM FHN CAG LUMN MTCH TLAB DXC AMGN WRB CL MO
2009-04-30 UPS AZO V BKNG ELV HPQ PENN F EFX LKQ CVS GEN NEM TGT JNJ
2009-05-29 OXY AAPL MSFT SNPS CME TSN EQIX MS GOOG LMT MPWR NTAP UPS TPR GOOGL
2009-06-30 NFLX SNDK CTSH ILMN VTSS DUK MPWR FISV DXCM KMB AAPL GPS LUMN PENN DRI
2009-07-31 BEN MCHP IDXX BRO KLAC LKQ ASH RL MRVL NFX APD MU PVH PPG DISCK
2009-08-31 LULU IDXX CAR XEC HSP MTD JNY BRCM QLGC PKG CBRE TGT DDS CTB IP
2009-09-30 INCY MDR LEN AT PODD SSP TEL EXC DECK MDP PDCO PRU AVB CI APC
2009-10-30 SLG THC FLEX RCL HIG SLM MAC PRU TEX EXPE NFX EHC HST URI GNW
2009-11-30 URI HIG GNW DXC CBRE MTW GILD CMCSA BX MU MAC LYV DPZ LPX AIV
2009-12-31 CBE IGT RDC WFT OMX SWN ETFC PBG NOVL JNS RRD NBL BIG COV CBS
2010-01-29 DDS GPS MAC BKNG ALK HIG JBL AVY WLP NTAP NBR MGM KMX WDC HOLX
2010-02-26 BBWI DDR DDS BC POOL AMD MTW ULTA ADSK WFT ACGL MU JBL IP MEE
2010-03-31 EKDKQ KEY O REGN PENN BMY FTNT GL CEPH STX AOS WMB TSN ISRG ATGE
2010-04-30 LULU CLF MTG REGN DAL AAMRQ TPL EBAY EXPD MU KMG GNW AAL PBCT CLX
2010-05-28 PHM URI DHI EL VLO PTC VIAV ISRG DPZ UAL PKG PWR LEN GNW PVH
2010-06-30 ZION BBWI VRTS GE HBAN TFC INCY MAY VIAV C SMCI BBBY VTRS DRI MSFT
2010-07-30 AZO ZION BC CLF AIG TMUS DDS QCOM FSLR AMD MSI TPL CAR GME EBAY
2010-08-31 INTC HBAN C ACGL AIG TLAB MA GE QCOM MSFT DDS GS TEL JPM XRX
2010-09-30 HP LIN PPL AAL FE GOOG MCO AMCC UTX LLTC MYL CTB GE PFG AT
2010-10-29 GILD TPL PPL SWY X CELG VTSS MRO GPC NBL DXC COL WEN BAX FIX
2010-11-30 VTRS GM TPR ALGN BAX LUMN WEC HBI ADS HSP ELV MAY NBR XLNX PFE
2010-12-31 CMG PPG ADBE NFLX SLB NVDA MRVL BC ODFL EC TPL MTW WLL WEN LVS
2011-01-31 SPGI CMG DECK PVH LDOS AAMRQ ATI CTRA CIEN EQIX EC UAA TPL BKNG ISRG
2011-02-28 NFLX MAY AMGN LDOS SANM HON OKE LPX GILD MRVL MGM SMCI VIAV QCOM SSP
2011-03-31 JEF CMG ON CRH SMCI CAT LPX WDC APOL BKNG LII BC EC V TER
2011-04-29 WYNN MA TER AET EXPE MNST PODD DF URI MCO BKNG DHI TJX NVDA WFC
2011-05-31 NXPI DDS AMAT TER LULU MCO THC URI MTW ANDV TDC KLAC NVDA WHR RHI
2011-06-30 PXD HIG SMCI WSM REGN ADSK TER ANDV VLO PHM EME AMP DE AMT HII
2011-07-29 MCO EC ELV WFM WSM KSU GMCR GR CBS HFC MXIM ADS LO APOL PETM
2011-08-31 DUK MCO CNP KLAC GR APOL GMCR MXIM PETM HAL ARG GE OXY SBNY WLP
2011-09-30 KLAC MCO ADI GE TXN KMB COG DHR MCHP LUMN NOC LVS MMM LULU CEPH
2011-10-31 LRCX AMAT CSCO TKO FFIV TER GT MAR CCL JPM IVZ CF WFC PCAR KLAC
2011-11-30 CF YUM DLTR LNT GE SHW MBI AFL ADBE WYNN FITB IVZ WFC RHI BEN
2011-12-30 DUK CF XEL NI HST EIX FFIV IVZ HBAN FTNT ADBE FLS DD NEE SVU
2012-01-31 AAL DG AZO SNPS GL O NDAQ SBAC SLG TER FLS MAS AME AFL FTNT
2012-02-29 SHW MNST MRO ADSK FHN ROK HCA MBI TER GILD AFL KBH MUR MAS CE
2012-03-30 ORLY LNC KKR WU TT HMA NXPI BKNG PKI ROK SWN HRS MRO QEP RDC
2012-04-30 TT ORCL HCA FRT ECL PKI FHN FAST AMD NXPI MRO SNI AFL ZION AZO
2012-05-31 BKNG WLP WCG HAS RDS.A DPZ KLAC PKI GMCR FLS QCOM ROK CAR CF BDX
2012-06-29 DXCM AMGN BDX BKNG EC PXD CCI SRCL PNR ADSK LSI PKI MCO UN BIO
2012-07-31 FTNT NI BKNG NRG AAL MNST DXCM EQT EC RRC SLB OMX ISRG CCU CPRI
2012-08-31 VRTX BBBY BLDR MOS CBRE HD PRU DHI EXPE AXON ISRG ECHO MBI JPM ZION
2012-09-28 MTB LPX VRTX MUR STX DLTR CF LHX ISRG TEX FISV GE GRMN MRO EQT
2012-10-31 WST BAX AAPL RCL MS AAL ANDV MCHP HAL R H AMT IBKR EXC PARA
2012-11-30 DDS APTV GNRC CIEN MCHP KLAC ISRG KBH GT J AN CTSH TLAB CINF MS
2012-12-31 VRTS JNY WFM PEAK MMC CTXS NLSN NBL CTB TIE DNR GPS WBD BWA FBHS
2013-01-31 KATE TIE BBBY LULU IBKR GME ON META EA PSA MCO ADM MRSH FTNT JPM
2013-02-28 SYK HNZ MMM GNRC TYL FIS HSP MWV LO COL GILD ON HOLX MAT MGM
2013-03-28 HON GEN BBY NVDA DECK MRO RTX COL FL CVC SVU CF MWV AXON GILD
2013-04-30 FL UNP ENPH VLO CMG WBA CSX DD STZ CTB HPQ MXIM FNMA NRG MTCH
2013-05-31 GME ENPH OMX ALK REGN CMG CF MCO HSIC COG APO TRMB O TTWO TXT
2013-06-28 ENPH MBI CAR ILMN FSLR MCO REGN DECK MNST NOV WFT MAC PLD INCY NEE
2013-07-31 TMO NOV FL TFC AMD MBI STX DRI BLDR FSLR PRU LULU O TEX CPRT
2013-08-30 BBBY META MOH VRTX SSP REGN SWKS LULU BKNG CAR CF STX DRI CIEN EXC
2013-09-30 WAB BBBY ENPH BKNG HRB AMD VRTX JEF BLDR CTAS CASY MCO VMC ALB META
2013-10-31 CMG CIEN UHS WOR TSLA BKNG MXIM KMB SVU CTXS LNC ESV AMP MA INTU
2013-11-29 CSGP META TSN MPWR VFC GME BKNG PARA IBKR TYL APH WAB COR AMP SPGI
2013-12-31 ITT PH MTCH GILD BRCM JOY FICO HBI MA MET FMCC TPL COHR PRU SMCI
2014-01-31 FMCC JOY PHM UIS EQIX ROST AXON IBKR PSA FNMA APA PEAK BEN FLEX AOS
2014-02-28 CTSH PNR AAL TDG MCK JWN BKNG M DDR KBH CI MTW PENN PHM ISRG
2014-03-31 META ILMN DXCM JEC BKNG HP WFT PANW TRIP ISRG VTRS NSC ROK MPWR WELL
2014-04-30 META WYNN MTCH BKNG MMM O CMG IQV MOS VTR EQIX PANW UAA WELL AYI
2014-05-30 R ETR FMCC HAL JCI FLEX MTW AIV RJF META WCG KMB MTCH UHS WYNN
2014-06-30 GPN BLDR GLW WLL MTW IFF MAY CHRW BKR INCY UAL DVN MRO CCU NCC
2014-07-31 NRG ISRG G TRGP WLL ENPH JBL MU FE WB ATI EXC TSN NTAP HOG
2014-08-29 NSC MKTX AIG LRCX NRG G LH PFG ISRG VTRS ALGN ALL MCO AMT KLAC
2014-09-30 INTU TPL MO NFX ISRG NOW DUK ENPH CCU TRIP BKNG FANG SANM MCO MRO
2014-10-31 FSL ODP DUK DPZ ENPH ROST COO DDS MCO XEL WDAY AMGN PGR GILD IQV
2014-11-28 MPWR EA BBBY ANET CBRE VEEV FDS PHM XRX LPX TWTR AMZN EFX FL AMGN
2014-12-31 ENPH BBBY UIS GILD BKNG SW CSGP BIO DRI ISRG NUE KR ORLY KLAC V
2015-01-30 BBBY ANDV KLAC CSGP MCO MS HOG SSP EBAY MO PRGO VRSN GPC WDC KR
2015-02-27 CRL AXON CIEN BBBY TWTR TWC CVC BBT FE MAR MO HSP VEEV DOC TSS
2015-03-31 COR AOS HSP JKHY BTUUQ STE ATVI ED MWW CBOE BKNG FICO ENDP CHTR GNRC
2015-04-30 MCO CNC PNW CASY CFG PHM FSLR MOS RMD NAVI AVGO KLAC O CRL JEF
2015-05-29 BKNG SNPS NFX BIIB LULU TKO EPAM APO RMD FANG DVN KLAC O SMCI ED
2015-06-30 SNPS BKR CRL BKNG ED BBBY KMG STLD FANG ANET NFX PAYC ETN NEM BIIB
2015-07-31 SBUX BTUUQ ADI AZO COTY PAYC CI RRD LYB HII AVGO HUM AET VRSN MDT
2015-08-31 NFX MDR CNC LYB SLB OXY QCOM WMB ANET RTX INTC CAT THC ETR IBM
2015-09-30 TKO GILD CNP TPL OXY BLDR ETR MTCH ZTS AIZ ILMN CI WY RTX IBM
2015-10-30 MGM FISV ANET ADBE AVY UAL CAR TRMB BKNG GILD PANW HST CNP QCOM SBUX
2015-11-30 BKNG DDR BBT NVR RMD TSS EXR WOR DXCM HRL BLDR ANET HOLX ZTS VRTS
2015-12-31 GMCR AMAT GLW AXP LM RMD AAL JCI WIN ILMN SNI PSKY GE EXC DDR
2016-01-29 GMCR LUV AAPL BKNG SMCI IBM EMR RTX RMD KMG FLR PSKY WB ANDV DD
2016-02-29 AMAT GLW AAPL GILD LXK GMCR ETN PSKY RMD TWX AAL ZTS ABBV MDP UTX
2016-03-31 RRD ITW MCD HSIC GE PHM GMCR H UTX HCA FLT HST ULTA PNR LXK
2016-04-29 JNS AON CPRI ADI DISCA TEX ELV CLF PAYC VTR TECH WPX MUR CMI COO
2016-05-31 NAV XYL JCI SYMC MYL WRK LRCX FIS QCOM ADM FMC LUMN ODFL KSU AYI
2016-06-30 CTRA PCAR PM MUR MRK KATE DLTR AAP HET WYNN ACV TWX CAG HCA EHC
2016-07-29 XYL DNR ATI SWN LULU LEN REG NDAQ AXP BSX PFG ANET PVH CSRA PRU
2016-08-31 NEM ETSY BLDR GNW COR RRC NBR MKTX XYL IPGP CPRI FTNT BG AFL KKR
2016-09-30 CBS TRGP SNI FTNT JEC ZBRA TER NEM DFS CSRA DHI HSY SPGI LNC BKNG
2016-10-31 DAL ETSY WB EME JBL DLR BWA TRGP WMB CNX MTG GHC BBBY CNC VRTS
2016-11-30 PRU CHRW MPC UNP XYZ IBKR APD HUBB GNW QRVO VRTS EBAY JBL ETSY ORCL
2016-12-30 SPGI KSS ATI FMCC CLF TWX AXON ANDV CF CNX FNMA MCO MKTX RSG SMCI
2017-01-31 NCC MO CLF KR LULU HRL MHK ETSY VRTS WB UIS LITE FTNT SPG AXON
2017-02-28 EG PSA NVDA UIS NBR EVHC TWTR AXP LVS MTW SPG DXCM EXR LITE BKNG
2017-03-31 SNPS NRG TTD NFLX LRCX UIS EFX TPL KMX ARES BKNG GPS AMAT INCY G
2017-04-28 URI TTD SNPS INCY LYV COF COHR DLTR STX DIS PEAK XEL MMM ABBV O
2017-05-31 SEDG X BCR LYV ALL MDR DFS MDP IEX SEE BIG CXO HOLX FRC ROP
2017-06-30 GILD LRCX WB BEN AMAT KMG QRVO FSLR PEAK KLAC C INCY MCK TER TTD
2017-07-31 PGR BKNG SNPS YUM KMG O TSN CVNA MCK EXC SPGI SSP REG ISRG LRCX
2017-08-31 PYPL ARES SPGI LITE EQT MNST VIAV META NCC CPRI HRB KMG DPZ LRCX ISRG
2017-09-29 KMX FIS AOS DELL MTG NOW PBI AMP PSX TXT CMI KBH REGN CME KSS
2017-10-31 ISRG TXN MA NCC WM ANF DPZ DHI FI KSU WB ENPH TMK AEP VRTX
2017-11-30 MU HRB RVTY XYZ AMP LRCX SPGI NOC LKQ KSS LNT NI NCC LW AZO
2017-12-29 MU ALL LRCX BF-B BF.B BBBY DVN ALGN HP SWK WB WRB BLDR IPGP AMAT
2018-01-31 PYPL WYNN KBH BBBY CCI MAY MOS TDG MU THC URI MA ANET LRCX M
2018-02-28 CTAS ANET FTI WYNN FSLR MO DHI CIEN AZO WBD MOS BLDR PFG TRGP BWA
2018-03-29 ANET KKR MU DVA MMI SYF MO XYZ MOS IR DHI DPZ PHM OXY ATVI
2018-04-30 MU IBKR LUMN NKTR AAP NBR UA MO CMCSA UAA FCX EXR ABBV VTRS DOC
2018-05-31 SEDG URI ANET FICO AZO CFG EBAY ANF FCX NCC UAL DVA TTD AMAT PHM
2018-06-29 MU ANET PAYC PEG PODD MBI DOC HRL DDR ARES QEP LITE HAS SLB CZR
2018-07-31 ANET MU UAA UA TTD DDS LRCX EIX SEDG BEN EVHC ANF ABT WYNN FCX
2018-08-31 IDXX LLY REGN SVU SHW RVTY BR AAP CCI BIO CI ALGN CPRT COP BLL
2018-09-28 GME CVNA MAT RMD ORLY REGN MRK RRC TRGP MAC ENDP TRIP JWN MSFT PGR
2018-10-31 XYZ TKO ALB GIS PAYC TTD WMB BEN SWKS ENDP CPRT LITE LUV ETSY NVDA
2018-11-30 MDLZ CLF AON HOG MO MTG DLTR TKO XYZ ERIE GIS PM AMD UA SBNY
2018-12-31 TTD MO CHTR FTNT MMM LULU PHM ABMD DLTR RTN BEN CMI ALXN UPS SIVB
2019-01-31 AMD SBUX NLOK DNR KMI LRCX MO XYZ PM RSG PARA LEN WHR STX CAH
2019-02-28 MOS SJM HFC VMC CRH EBAY NEM DNR TSN NCR ODP TER CELG MRVL SYMC
2019-03-29 MA MKTX ANET CPT SRE NAV AOS WHR SRCL FBHS CNXT SEE LRCX FII LM
2019-04-30 TER FNMA SMCI FMCC FSLR BKNG ORCL PKG CBRE ALGN MCD GEN AMAT NCC IP
2019-05-31 NXPI ALGN MCD CPRT AMAT WM QCOM CVNA BMY BKNG INTC STX SMCI PODD LPX
2019-06-28 V G CVNA PKG TEL FMC FMCC FNMA FHN CPRT CMI BUD IBKR ETSY AN
2019-07-31 ERIE MU FTNT CVNA HET ANET QCOM GEN WFC CLF LPX LITE AMGN HPQ SW
2019-08-30 CINF WEC ETR WEN MSI HII MAA LNT ERIE MA ENPH CRWD WELL SJM KEY
2019-09-30 ETR ABBV HII TFC ADM SNA AME PG PAYC IR ED QCOM BMY BG CAG
2019-10-31 TSLA NWL CHTR EQR SPG CDNS HUM PAYC CF EIX UDR FTNT AAPL KR INTU
2019-11-29 AAPL WYNN FOX PODD LUMN REGN ROST WBA CDAY NWL GNW CPAY JKHY XYZ SPG
2019-12-31 TYL REGN NAV SNV UIS FLIR SEE VAR LW TJX RE ARES PKI SPG ATVI
2020-01-31 ETR BIG URI THC TER MMI BXP BC COP AT ATGE MO CBOE PTC MAT
2020-02-28 TER CZR TSLA CVNA PENN MO UBER APA URI SWKS JBL TE MS PDCO BIG
2020-03-31 PFE KO META ABBV MCO V QCOM ADSK GOOGL BRO ALL LDOS GOOG MO ETN
2020-04-30 ANET CSCO PTC AMAT SCHW ENPH BRO KKR DECK FTV AON GS KO EQT IR
2020-05-29 VRTX RRC EQT WMB JBHT MS EQIX UBER ANET MRNA BBBY VTRS BKNG CTRA KO
2020-06-30 ANET ENPH COR NVDA DD ERIE KO RRC LPX YUM EQT PFE GLW AMZN BKNG
2020-07-31 LOW MU WRK PNW RRC BX CTRA DISCA DISCK CHIR COG NWL EBAY PH EQT
2020-08-31 PYPL VIAV CTAS EQIX RRC INTU DELL JKHY SPGI GWW RE ETSY CNX NCR ANET
2020-09-30 BKNG LULU APO FSLR YUM DRI AAPL CZR META EBAY MOS DD KO KHC GS
2020-10-30 ENPH TUP SEDG LEN ETSY AAPL CRM ADBE PHM XYZ MRVL JEF CRWD EBAY ED
2020-11-30 VIAC TGT MGM FNMA FLR SYF AEP DE MTG MAR PSKY GLW TRIP HBAN AYI
2020-12-31 TTD CVNA GE ATI NLOK PBI AEP UAA GHC SPGI ANET HES VTR RL KSS
2021-01-29 LRCX ENPH UAA CLF TER DXC ATI DDS WDC FLR GE CAR JWN UA MTG
2021-02-26 ENPH BBT MRNA COTY HP TTD OXY AXON XYZ COHR JWN FLR ALB CXO KO
2021-03-31 ETSY IAC NUE OXY TER GILD DISH DVN FOX MUR HP TUP NAVI AMP FANG
2021-04-30 XEC NUE LKQ GILD OXY ETSY FRT MUR EBAY APA IP VICI BX ROST HFC
2021-05-28 XEC TPL OXY OI DISCK DISCA IDXX DD EMR TMO TT EC KSS NTRS TGT
2021-06-30 RRD FCX CAR MAC LPX MSFT GT BIIB PM SSP MHK MRSH UAA ETSY STX
2021-07-30 DVN ANET TECH TWTR MRO CSCO FCX MUR MTW TPL NEM ANF TRGP FAST LYV
2021-08-31 RRD CRL MRNA OTIS BRO PSA MBI MSI AVB THC BG MUR HCA ACN DXC
2021-09-30 MRNA DDS NAVI WAT BEN EXR LUMN NKE LLY SLG SLM TWTR XEC BX ADBE
2021-10-29 AON MAC PWR ERIE FCX HOLX NAVI META CSX TWTR CCI HD COTY DHI CHTR
2021-11-30 EBAY FDS HFC DFS APA FCX CMG URI GT GNRC IDXX STLD OXY AMT EPAM
2021-12-31 TTD CERN RE IQV ACN ALB MCD APP MPWR CRL MCK DXCM CLX AM TTWO
2022-01-31 NVDA DDOG RRC NI TSLA AMD EBAY F BLDR SBNY INTC M GOOGL MRVL JWN
2022-02-28 AMD NVDA PFE TTD F CVG MRVL DTE SBUX LW TSLA KLAC KKR BMY C
2022-03-31 DTE COR CAR ETR ACGL BMY PAYX ENPH FTI LRCX AON INTC FDX BLDR ALB
2022-04-29 ON MRK CAR QCOM ABX WFC FCX PFE AAL MOS KLAC ABNB CLF MCHP ANET
2022-05-31 FCX MPC NUE MU MOS CLF FDX PLD IBM WU MDT FICO CMCSA ZBH FTI
2022-06-30 EOG PSX VLO COP CF DVN MRO MPC FANG CTRA SLB TRGP AVGO DOW IP
2022-07-29 APA CNX VLO EOG TSLA DECK KR CSGP HSY MOS WFC ZTS NUE MMM BEN
2022-08-31 APA MCHP SPGI SLB CNX PFE DECK MOS AVGO URI TT CPRT ABBV ROST NUE
2022-09-30 PFE MS SBUX SMCI VLO CTRA FTV MO PSX V SLB LOW AMT EOG TT
2022-10-31 DXCM STT CSCO BAC LEN CPRT SBUX JPM WFC BIIB UPS ROK WRK SNPS MDT
2022-11-30 TWTR JCI ADM GLW DHI ITT FAST DXCM MO AMP WRK EQIX TE LULU IVZ
2022-12-30 DHI TMO SANM MO REG KEYS SNPS JCI KLAC BWA TKO SPG CPRI DXCM TT
2023-01-31 LRCX JWN TER BEN BNY BK DVN MO VRSK VTRS MRNA CFG FTI ODFL BKR
2023-02-28 AMAT NYT PBI OTIS FCX PVH TER DXCM ETN NFLX CFG FE IDXX AAPL NVDA
2023-03-31 URI FCX SPGI WST XRX ADBE APH STLD DISH NYT UHS ISRG NAVI XRAY DOW
2023-04-28 MCHP LVS AMG GIS ADBE FSLR NWSA IVZ DVA NWS ON EOG K POOL ROL
2023-05-31 RRC STX VZ QCOM BKR MTW DOW CRWD INTC ESS EOG PD SLM OXY LYB
2023-06-30 MCO DXC CTRA XRX FFIV SWK IVZ PSA DDOG EQT RJF JEF KMX DLTR ESS
2023-07-31 CVNA OXY GP AMAT MOH COHR EQT CRWD EXE SLG CHTR APP ESS CLX BKR
2023-08-31 OXY CRWD NYT DDOG EME HOOD ADM V BHF AIV MET TSLA SMCI ABNB SLM
2023-09-29 CVNA DAL FMCC SMCI MTCH PKG GT CF BAC FNMA CPRI BMY PLTR NCLH CCL
2023-10-31 PLTR CF VNO CPRI SMCI COIN ADM GT LHX SLG RCL NDAQ TDC ORCL HP
2023-11-30 ABNB FNMA FMCC PFG AKAM PCAR TDC POOL JBL AMP MMM CCI UIS APP PNC
2023-12-29 PCAR CINF CR AMGN ZION UNP JWN SCHW AIG AMCR WAB DIS HWM HAL GS
2024-01-31 NTRS LNC EW AMGN FIS CPB FMCC ZION COHR TRIP GPS ZBH AMG KSS STT
2024-02-29 KLAC KEY IDXX CCI PANW TECH AZO SMCI ZBH GWW ITT HRL MRO HBI EXR
2024-03-28 TDG MIR AYI FNMA CCI ADCT FMCC SMCI BSX VLO PRGO RMD LVS WAB AKAM
2024-04-30 EXR HOOD ADCT META JWN PLTR FMCC COHR ANET ZBH TPR DVA PSX M MPWR
2024-05-31 MO HES SW CVNA ECHO LII COIN MBI CTLT FNMA O ANSS BSX COHR AZO
2024-06-28 NTAP GEHC VRT VST AVGO VTRS FMCC CTLT JNPR RVTY QCOM COIN DIS GPS HAS
2024-07-31 HOOD NVDA MTG AMAT IFF ECHO TER AVGO LRCX DAL COIN TRMB DDS CEG HRL
2024-08-30 TER PSX VST HOOD MKC NVDA FCX LUMN DXC BMY MRO VLO CPAY MO NCLH
2024-09-30 FOX MSI FSLR FICO IFF AMCR GEV TER WB GEN ECL EQT PKG NRG STLD
2024-10-31 HOOD STT GL GILD EQT CZR DVA EFX ERIE SWK BKNG IAC ON FAST UIS
2024-11-29 MCO RCL GEN TKO WDAY CSGP CINF CVNA BR UNM ETR NAVI GLW BKNG VRSK
2024-12-31 VST PAYC FICO LB CARR APP NWL EXR FIX FAST SOLV CR TTD TE ECHO
2025-01-31 KLAC DVA PH TGNA FMCC FLR LITE OKE CTSH GEV COIN BKNG STLD URI FL
2025-02-28 UAL FNMA TPL VNT FMCC VRSN LB MBI MIR CVNA AVGO CIEN APO AMT EXR
2025-03-31 TRV VICI META CVNA RCL KO AXON CRM PLTR AM GOOGL NVDA EW COP GEV
2025-04-30 META HOOD PNW IBKR CRM NVDA TPL AVGO EXPE GOOGL LDOS ELV FMCC CAR C
2025-05-30 HWM DLTR LRCX UAL APP TDG CAH DG TSLA ROL NFLX LDOS COIN ADCT MPWR
2025-06-30 EXR ABNB BALL CBOE STLD LRCX FNMA AM CCU CMG EW VRT PLD MTCH DDOG
2025-07-31 APH CAR DDOG SMCI NXPI TXT AMAT NFLX ATI MTD PLD ABNB WBA GNRC FCX
2025-08-29 FOX INTU UCL PLTR AZO APA ADCT CF DVN PAYC NRG VRT HUM FLS TER
2025-09-30 FMCC EA FLS DASH MTD COIN AVGO JPM AMT GNRC EXR AOS FNMA JEF ATI
2025-10-31 NEM COIN URI ETSY INTU GNRC FLR LVS CRL SLB MBI WST MAC EXR IRM
2025-11-28 MPWR CDNS CFG APP WSM ANET HOOD MHK DDS MS EW TECH NVDA CLF PLTR
2025-12-31 AVGO MPWR NTAP WSM HP URI CLF SSP KSS CDNS BIO SANM ASH ANET EA
2026-01-30 KLAC NDSN NEM JNJ TGNA M STZ COO ODFL OTIS BDX BXP EOG G AVGO
2026-02-27 PWER TDC IDXX SSP NVDA M IPGP AVGO UDR VFC HOLX SANM ANET ATGE CLX
2026-03-31 MU APH AVGO KVUE IPGP DYN STZ SSP UA AMD FTNT COHR CCI AMT NEM
2026-04-30 TER MCK PPG CCI FOX NEM ROST TPL HOLX VRTX FCX DHI RSG GILD CNC
2026-05-29 CF CCI APA AMT LHX HAS HSY NBR VRT NEM LITE AAPL GEV ALB FOXA
2026-06-26 STX NTAP NXPI WDC NVDA SANM FITB D ADI NYT FTI RHI MRVL EIX VRT
Scoring script (python)
FORMULA_NAME = "Contrarian 52W Recovery Quality Hybrid (Conflict-Arbitrated Relay, v1188)"
LOGIC_VARIANT_COUNT = 3
NOTES = """mode=explore; family=contrarian-52w-recovery-quality-hybrid
New hybrid family built by combining the bull recovery-leader contrarian sweet-spot from contrarian-52w with the stock-level conflict arbitration and quality/liquidity discipline from recovery-quality-regime-momentum-hybrid. The structure is intentionally not a mechanical average: in bull tapes, repaired rebounders can graduate into momentum only after quality confirms; in mixed tapes, recovery only gets paid when liquidity and balance-sheet proxies are good enough; in risk-off, the model falls back to lower-volatility durable franchises entered from modest 52-week drawdowns rather than deep damage.
Deliberate metric coverage: actively use one momentum cluster (3m, 6m, 12_1), one recovery cluster (distance from 52-week high plus 200d trend), one volatility check, all three liquidity checks in mixed/risk-off, one income metric, two valuation metrics, three growth/earnings proxies, two quality metrics, and a size tilt that flips by regime. Deliberate weight-0 metrics this run: 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/raw fundamentals: 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

USED_METRICS = (
    "from_52w_high_pct",
    "from_200d_ma_pct",
    "return_3m_pct",
    "return_6m_pct",
    "momentum_12_1_pct",
    "realized_vol_3m",
    "avg_daily_volume_3m",
    "avg_daily_dollar_volume_3m",
    "trading_days_3m",
    "dividend_yield_ttm_pct",
    "forward_pe",
    "peg",
    "forward_eps",
    "operating_income_growth_pct",
    "free_cash_flow_growth_pct",
    "free_cash_flow_margin_pct",
    "operating_margin_pct",
    "market_cap",
)


def _clamp(x, lo, hi):
    if x < lo:
        return lo
    if x > hi:
        return hi
    return x


def _to_float(x):
    if x is None:
        return None
    if isinstance(x, bool):
        return 1.0 if x else 0.0
    if isinstance(x, (int, float)):
        return float(x)
    try:
        return float(x)
    except Exception:
        return None


def _normalize_metric(metric, value):
    x = _to_float(value)
    if x is None:
        return None

    if metric == "from_52w_high_pct":
        if x < 0.0:
            x = -x
        if x > 1.5:
            x /= 100.0
        return x

    if metric in (
        "from_200d_ma_pct",
        "return_3m_pct",
        "return_6m_pct",
        "momentum_12_1_pct",
        "dividend_yield_ttm_pct",
        "operating_income_growth_pct",
        "free_cash_flow_growth_pct",
        "free_cash_flow_margin_pct",
        "operating_margin_pct",
    ):
        if x > 1.5 or x < -1.5:
            x /= 100.0
        return x

    if metric == "realized_vol_3m":
        if x > 3.0:
            x /= 100.0
        return x

    return x


def _metric_value(stock, metric):
    return _normalize_metric(metric, stock.get(metric))


def _rank_map(value_map, higher_is_better):
    items = sorted(value_map.items(), key=lambda kv: kv[1])
    n = len(items)
    if n == 0:
        return {}
    if n == 1:
        return {items[0][0]: 0.5}

    out = {}
    i = 0
    while i < n:
        j = i
        v = items[i][1]
        while j + 1 < n and items[j + 1][1] == v:
            j += 1
        pct = ((i + j) * 0.5) / float(n - 1)
        score = pct if higher_is_better else (1.0 - pct)
        k = i
        while k <= j:
            out[items[k][0]] = score
            k += 1
        i = j + 1
    return out


def _get_score(score_map, symbol, default=0.5):
    v = score_map.get(symbol)
    if v is None:
        return default
    return v


def _avg(values):
    total = 0.0
    count = 0
    for v in values:
        if v is not None:
            total += v
            count += 1
    if count == 0:
        return 0.5
    return total / float(count)


def _sweet_spot(value, low, high, center):
    if value is None:
        return 0.5
    if value <= low or value >= high:
        return 0.0
    if value == center:
        return 1.0
    if value < center:
        denom = center - low
        if denom <= 0:
            return 0.0
        return _clamp((value - low) / denom, 0.0, 1.0)
    denom = high - center
    if denom <= 0:
        return 0.0
    return _clamp((high - value) / denom, 0.0, 1.0)


def _detect_branch(regime):
    text = ""
    if isinstance(regime, str):
        text = regime.lower()
    elif isinstance(regime, dict):
        parts = []
        for key in (
            "regime",
            "name",
            "market_regime",
            "state",
            "trend",
            "risk_regime",
            "volatility_regime",
        ):
            if key in regime and regime.get(key) is not None:
                parts.append(str(regime.get(key)).lower())
        text = " ".join(parts)

        for key in ("risk_off", "defensive", "bearish", "crisis"):
            val = regime.get(key)
            if val is True:
                return "risk_off"
        for key in ("bull", "bullish", "risk_on"):
            val = regime.get(key)
            if val is True:
                return "bull"

    if (
        "risk_off" in text
        or "bear" in text
        or "defensive" in text
        or "crash" in text
        or "stress" in text
        or "high_vol" in text
        or "panic" in text
    ):
        return "risk_off"

    if (
        "bull" in text
        or "risk_on" in text
        or "uptrend" in text
        or "strong" in text
        or "momentum" in text
        or "breakout" in text
    ):
        return "bull"

    return "mixed"


def score_universe(stocks, regime, ctx):
    symbols = []
    metric_maps = {}
    for metric in USED_METRICS:
        metric_maps[metric] = {}

    for stock in stocks:
        symbol = stock.get("symbol")
        if not symbol:
            continue
        symbols.append(symbol)
        for metric in USED_METRICS:
            val = _metric_value(stock, metric)
            if val is not None:
                metric_maps[metric][symbol] = val

    ranks = {
        "from_200d_ma_pct": _rank_map(metric_maps["from_200d_ma_pct"], True),
        "return_3m_pct": _rank_map(metric_maps["return_3m_pct"], True),
        "return_6m_pct": _rank_map(metric_maps["return_6m_pct"], True),
        "momentum_12_1_pct": _rank_map(metric_maps["momentum_12_1_pct"], True),
        "realized_vol_3m": _rank_map(metric_maps["realized_vol_3m"], False),
        "avg_daily_volume_3m": _rank_map(metric_maps["avg_daily_volume_3m"], True),
        "avg_daily_dollar_volume_3m": _rank_map(metric_maps["avg_daily_dollar_volume_3m"], True),
        "trading_days_3m": _rank_map(metric_maps["trading_days_3m"], True),
        "dividend_yield_ttm_pct": _rank_map(metric_maps["dividend_yield_ttm_pct"], True),
        "forward_pe": _rank_map(metric_maps["forward_pe"], False),
        "peg": _rank_map(metric_maps["peg"], False),
        "forward_eps": _rank_map(metric_maps["forward_eps"], True),
        "operating_income_growth_pct": _rank_map(metric_maps["operating_income_growth_pct"], True),
        "free_cash_flow_growth_pct": _rank_map(metric_maps["free_cash_flow_growth_pct"], True),
        "free_cash_flow_margin_pct": _rank_map(metric_maps["free_cash_flow_margin_pct"], True),
        "operating_margin_pct": _rank_map(metric_maps["operating_margin_pct"], True),
        "market_cap_small": _rank_map(metric_maps["market_cap"], False),
        "market_cap_large": _rank_map(metric_maps["market_cap"], True),
    }

    branch = _detect_branch(regime)
    out = {}

    for symbol in symbols:
        dd_raw = metric_maps["from_52w_high_pct"].get(symbol)
        dd_bull = _sweet_spot(dd_raw, 0.08, 0.30, 0.17)
        dd_mixed = _sweet_spot(dd_raw, 0.14, 0.42, 0.26)
        dd_def = _sweet_spot(dd_raw, 0.06, 0.24, 0.14)

        trend = _get_score(ranks["from_200d_ma_pct"], symbol)
        r3 = _get_score(ranks["return_3m_pct"], symbol)
        r6 = _get_score(ranks["return_6m_pct"], symbol)
        m12 = _get_score(ranks["momentum_12_1_pct"], symbol)
        low_vol = _get_score(ranks["realized_vol_3m"], symbol)

        liq_volume = _get_score(ranks["avg_daily_volume_3m"], symbol)
        liq_dollar = _get_score(ranks["avg_daily_dollar_volume_3m"], symbol)
        liq_days = _get_score(ranks["trading_days_3m"], symbol)
        liquidity = _avg((liq_volume, liq_dollar, liq_days))

        div_yield = _get_score(ranks["dividend_yield_ttm_pct"], symbol)
        cheap_pe = _get_score(ranks["forward_pe"], symbol)
        cheap_peg = _get_score(ranks["peg"], symbol)
        valuation = _avg((cheap_pe, cheap_peg))

        fwd_eps = _get_score(ranks["forward_eps"], symbol)
        op_growth = _get_score(ranks["operating_income_growth_pct"], symbol)
        fcf_growth = _get_score(ranks["free_cash_flow_growth_pct"], symbol)
        growth = _avg((fwd_eps, op_growth, fcf_growth))

        fcf_margin = _get_score(ranks["free_cash_flow_margin_pct"], symbol)
        op_margin = _get_score(ranks["operating_margin_pct"], symbol)
        quality = _avg((fcf_margin, op_margin))

        small_cap = _get_score(ranks["market_cap_small"], symbol)
        large_cap = _get_score(ranks["market_cap_large"], symbol)

        if branch == "bull":
            recovery_core = (
                0.28 * dd_bull
                + 0.18 * trend
                + 0.12 * r6
                + 0.08 * low_vol
                + 0.06 * div_yield
                + 0.08 * small_cap
                + 0.10 * fcf_margin
                + 0.10 * op_margin
            )
            graduate_momentum = (
                0.24 * m12
                + 0.16 * r3
                + 0.16 * r6
                + 0.10 * trend
                + 0.10 * dd_bull
                + 0.12 * fwd_eps
                + 0.12 * fcf_margin
            )
            quality_gate = 0.45 * quality + 0.30 * low_vol + 0.25 * liquidity
            relay = _clamp((m12 + r6 + trend + dd_bull - 1.90) / 1.40, 0.0, 1.0)
            relay *= _clamp((quality_gate - 0.45) / 0.40, 0.0, 1.0)
            score = (1.0 - 0.55 * relay) * recovery_core + (0.55 * relay) * graduate_momentum

        elif branch == "risk_off":
            durable_franchise = (
                0.18 * dd_def
                + 0.14 * trend
                + 0.18 * low_vol
                + 0.12 * liquidity
                + 0.12 * quality
                + 0.10 * valuation
                + 0.08 * div_yield
                + 0.06 * growth
                + 0.10 * large_cap
            )
            damage_penalty = _clamp((0.35 - dd_def) / 0.35, 0.0, 1.0) * _clamp((0.45 - trend) / 0.45, 0.0, 1.0)
            score = durable_franchise - 0.10 * damage_penalty

        else:
            repaired_rebound = (
                0.26 * dd_mixed
                + 0.18 * trend
                + 0.10 * r6
                + 0.12 * quality
                + 0.12 * liquidity
                + 0.08 * valuation
                + 0.08 * growth
                + 0.06 * low_vol
            )
            chase_sleeve = (
                0.22 * m12
                + 0.14 * r3
                + 0.12 * trend
                + 0.08 * quality
                + 0.08 * liquidity
                + 0.06 * valuation
            )
            gate = 0.40 * quality + 0.30 * liquidity + 0.20 * low_vol + 0.10 * valuation
            chase_weight = _clamp((m12 + trend - dd_mixed - 0.35) / 0.80, 0.0, 1.0)
            chase_weight *= _clamp((gate - 0.45) / 0.45, 0.0, 1.0)
            base = (1.0 - 0.35 * chase_weight) * repaired_rebound + (0.35 * chase_weight) * chase_sleeve
            conflict_penalty = _clamp((0.52 - gate) / 0.52, 0.0, 1.0) * _clamp((m12 - dd_mixed + 0.10) / 0.55, 0.0, 1.0)
            repair_bonus = _clamp((dd_mixed + trend + gate - 1.55) / 0.65, 0.0, 1.0)
            score = base - 0.12 * conflict_penalty + 0.06 * repair_bonus

        out[symbol] = score

    return out