exp_1152

Recovery Quality Contrarian 52-Week Hybrid (Relay Arbitration, v1152)

← All V2 experiments
Relative return
1.038x
Excess vs bench
3.80%
Benchmark
CAPW_UNIV
Rolling windows
179 · monthly
Mean strategy gain
18.39%
Mean benchmark gain
14.08%
Mean excess gain
4.30%
Dispersion (ref)
5.34%
Win-rate vs bench (ref)
96.65%
Worst / best ratio (ref)
0.991x / 1.104x
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 8.48% 2.22% 1.061x
2011-07-01 … 2016-06-30 18.32% 13.74% 1.040x
2016-07-01 … 2021-06-30 22.24% 20.63% 1.013x
2021-07-01 … 2026-06-26 29.02% 15.48% 1.117x
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.038x · beat benchmark in 173/179
#WindowStrategyBenchmarkRatio
1 2006-07-31 … 2011-07-29 8.60% 1.79% 1.067x
2 2006-08-31 … 2011-08-31 7.49% 0.21% 1.073x
3 2006-09-29 … 2011-08-31 7.29% -0.14% 1.074x
4 2006-10-31 … 2011-10-31 6.45% 0.23% 1.062x
5 2006-11-30 … 2011-11-30 5.77% -0.05% 1.058x
6 2006-12-29 … 2011-11-30 5.39% -0.32% 1.057x
7 2007-01-31 … 2012-01-31 7.16% 0.93% 1.062x
8 2007-02-28 … 2012-01-31 7.06% 1.43% 1.056x
9 2007-03-30 … 2012-03-30 9.46% 3.09% 1.062x
10 2007-04-30 … 2012-04-30 8.95% 2.42% 1.064x
11 2007-05-31 … 2012-05-31 6.28% 0.60% 1.056x
12 2007-06-29 … 2012-06-29 7.99% 1.92% 1.060x
13 2007-07-31 … 2012-07-31 9.29% 2.69% 1.064x
14 2007-08-31 … 2012-08-31 9.66% 2.95% 1.065x
15 2007-09-28 … 2012-09-28 8.99% 3.20% 1.056x
16 2007-10-31 … 2012-10-31 7.70% 2.60% 1.050x
17 2007-11-30 … 2012-11-30 8.98% 3.45% 1.053x
18 2007-12-31 … 2012-12-31 8.52% 3.69% 1.047x
19 2008-01-31 … 2013-01-31 11.37% 5.85% 1.052x
20 2008-02-29 … 2013-02-28 12.26% 6.82% 1.051x
21 2008-03-31 … 2013-03-28 13.69% 7.73% 1.055x
22 2008-04-30 … 2013-04-30 13.33% 7.51% 1.054x
23 2008-05-30 … 2013-04-30 12.87% 7.81% 1.047x
24 2008-06-30 … 2013-06-28 14.25% 9.33% 1.045x
25 2008-07-31 … 2013-07-31 16.30% 10.48% 1.053x
26 2008-08-29 … 2013-07-31 16.43% 10.52% 1.053x
27 2008-09-30 … 2013-09-30 17.96% 11.48% 1.058x
28 2008-10-31 … 2013-10-31 21.91% 15.76% 1.053x
29 2008-11-28 … 2013-10-31 23.23% 17.46% 1.049x
30 2008-12-31 … 2013-12-31 24.05% 18.44% 1.047x
31 2009-01-30 … 2013-12-31 24.96% 20.64% 1.036x
32 2009-02-27 … 2014-01-31 26.91% 21.63% 1.043x
33 2009-03-31 … 2014-03-31 26.06% 20.60% 1.045x
34 2009-04-30 … 2014-04-30 24.73% 19.00% 1.048x
35 2009-05-29 … 2014-04-30 24.39% 18.32% 1.051x
36 2009-06-30 … 2014-06-30 26.42% 19.01% 1.062x
37 2009-07-31 … 2014-07-31 24.91% 17.39% 1.064x
38 2009-08-31 … 2014-08-29 25.48% 17.70% 1.066x
39 2009-09-30 … 2014-09-30 23.78% 16.64% 1.061x
40 2009-10-30 … 2014-09-30 24.29% 17.08% 1.062x
41 2009-11-30 … 2014-11-28 22.63% 16.82% 1.050x
42 2009-12-31 … 2014-12-31 22.08% 16.28% 1.050x
43 2010-01-29 … 2014-12-31 22.93% 17.23% 1.049x
44 2010-02-26 … 2015-01-30 22.44% 15.80% 1.057x
45 2010-03-31 … 2015-03-31 22.77% 15.40% 1.064x
46 2010-04-30 … 2015-04-30 22.34% 15.38% 1.060x
47 2010-05-28 … 2015-04-30 24.32% 17.09% 1.062x
48 2010-06-30 … 2015-06-30 25.54% 17.45% 1.069x
49 2010-07-30 … 2015-06-30 24.32% 16.43% 1.068x
50 2010-08-31 … 2015-08-31 21.83% 15.76% 1.052x
51 2010-09-30 … 2015-09-30 19.35% 13.61% 1.051x
52 2010-10-29 … 2015-09-30 18.99% 13.06% 1.052x
53 2010-11-30 … 2015-11-30 19.31% 15.09% 1.037x
54 2010-12-31 … 2015-12-31 18.14% 13.55% 1.040x
55 2011-01-31 … 2016-01-29 16.20% 11.90% 1.038x
56 2011-02-28 … 2016-01-29 16.12% 11.53% 1.041x
57 2011-03-31 … 2016-03-31 17.30% 12.90% 1.039x
58 2011-04-29 … 2016-04-29 16.03% 12.39% 1.032x
59 2011-05-31 … 2016-05-31 16.95% 12.94% 1.035x
60 2011-06-30 … 2016-06-30 18.27% 13.30% 1.044x
61 2011-07-29 … 2016-07-29 18.96% 14.52% 1.039x
62 2011-08-31 … 2016-08-31 17.89% 15.19% 1.023x
63 2011-09-30 … 2016-09-30 20.48% 16.32% 1.036x
64 2011-10-31 … 2016-10-31 16.76% 14.02% 1.024x
65 2011-11-30 … 2016-11-30 17.43% 14.66% 1.024x
66 2011-12-30 … 2016-12-30 16.69% 14.92% 1.015x
67 2012-01-31 … 2017-01-31 16.57% 14.63% 1.017x
68 2012-02-29 … 2017-02-28 16.87% 14.78% 1.018x
69 2012-03-30 … 2017-02-28 16.08% 14.43% 1.014x
70 2012-04-30 … 2017-04-28 15.85% 14.61% 1.011x
71 2012-05-31 … 2017-05-31 18.57% 15.98% 1.022x
72 2012-06-29 … 2017-05-31 18.01% 15.44% 1.022x
73 2012-07-31 … 2017-07-31 17.82% 15.43% 1.021x
74 2012-08-31 … 2017-08-31 17.99% 15.12% 1.025x
75 2012-09-28 … 2017-08-31 17.91% 14.77% 1.027x
76 2012-10-31 … 2017-10-31 20.82% 16.12% 1.040x
77 2012-11-30 … 2017-11-30 20.83% 16.79% 1.035x
78 2012-12-31 … 2017-12-29 21.00% 16.93% 1.035x
79 2013-01-31 … 2018-01-31 21.09% 17.57% 1.030x
80 2013-02-28 … 2018-02-28 20.25% 16.21% 1.035x
81 2013-03-28 … 2018-02-28 19.65% 15.81% 1.033x
82 2013-04-30 … 2018-04-30 18.01% 14.25% 1.033x
83 2013-05-31 … 2018-05-31 18.42% 14.57% 1.034x
84 2013-06-28 … 2018-05-31 18.69% 14.97% 1.032x
85 2013-07-31 … 2018-07-31 17.40% 14.83% 1.022x
86 2013-08-30 … 2018-07-31 18.09% 15.59% 1.022x
87 2013-09-30 … 2018-09-28 17.41% 15.84% 1.014x
88 2013-10-31 … 2018-10-31 14.59% 12.89% 1.015x
89 2013-11-29 … 2018-10-31 13.85% 12.60% 1.011x
90 2013-12-31 … 2018-12-31 12.15% 9.93% 1.020x
91 2014-01-31 … 2019-01-31 12.79% 12.37% 1.004x
92 2014-02-28 … 2019-02-28 12.78% 12.38% 1.004x
93 2014-03-31 … 2019-03-29 13.81% 12.76% 1.009x
94 2014-04-30 … 2019-04-30 14.66% 13.73% 1.008x
95 2014-05-30 … 2019-04-30 13.72% 13.54% 1.002x
96 2014-06-30 … 2019-06-28 13.66% 12.81% 1.008x
97 2014-07-31 … 2019-07-31 13.81% 13.30% 1.004x
98 2014-08-29 … 2019-07-31 13.37% 12.80% 1.005x
99 2014-09-30 … 2019-09-30 13.92% 12.70% 1.011x
100 2014-10-31 … 2019-10-31 14.46% 12.91% 1.014x
101 2014-11-28 … 2019-10-31 14.32% 12.60% 1.015x
102 2014-12-31 … 2019-12-31 14.48% 14.16% 1.003x
103 2015-01-30 … 2019-12-31 14.61% 14.85% 0.998x
104 2015-02-27 … 2020-01-31 13.07% 14.04% 0.991x
105 2015-03-31 … 2020-03-31 8.04% 8.56% 0.995x
106 2015-04-30 … 2020-04-30 11.94% 11.65% 1.003x
107 2015-05-29 … 2020-05-29 12.80% 12.61% 1.002x
108 2015-06-30 … 2020-06-30 13.26% 13.64% 0.997x
109 2015-07-31 … 2020-07-31 14.67% 14.60% 1.001x
110 2015-08-31 … 2020-08-31 17.57% 18.07% 0.996x
111 2015-09-30 … 2020-09-30 16.35% 17.05% 0.994x
112 2015-10-30 … 2020-10-30 14.69% 14.60% 1.001x
113 2015-11-30 … 2020-11-30 18.36% 17.43% 1.008x
114 2015-12-31 … 2020-12-31 20.28% 18.65% 1.014x
115 2016-01-29 … 2021-01-29 21.58% 19.26% 1.019x
116 2016-02-29 … 2021-02-26 23.35% 19.79% 1.030x
117 2016-03-31 … 2021-03-31 22.55% 19.42% 1.026x
118 2016-04-29 … 2021-03-31 23.04% 19.66% 1.028x
119 2016-05-31 … 2021-05-28 24.07% 20.42% 1.030x
120 2016-06-30 … 2021-06-30 22.60% 21.06% 1.013x
121 2016-07-29 … 2021-06-30 22.24% 20.63% 1.013x
122 2016-08-31 … 2021-08-31 24.35% 21.75% 1.021x
123 2016-09-30 … 2021-09-30 22.91% 20.22% 1.022x
124 2016-10-31 … 2021-10-29 25.20% 22.50% 1.022x
125 2016-11-30 … 2021-11-30 23.96% 21.87% 1.017x
126 2016-12-30 … 2021-11-30 24.41% 21.75% 1.022x
127 2017-01-31 … 2022-01-31 21.48% 20.17% 1.011x
128 2017-02-28 … 2022-02-28 19.94% 18.51% 1.012x
129 2017-03-31 … 2022-03-31 20.36% 19.46% 1.008x
130 2017-04-28 … 2022-03-31 20.61% 19.46% 1.010x
131 2017-05-31 … 2022-05-31 19.18% 15.59% 1.031x
132 2017-06-30 … 2022-06-30 16.72% 13.08% 1.032x
133 2017-07-31 … 2022-07-29 17.62% 15.16% 1.021x
134 2017-08-31 … 2022-08-31 17.24% 13.72% 1.031x
135 2017-09-29 … 2022-08-31 16.73% 13.56% 1.028x
136 2017-10-31 … 2022-10-31 18.46% 11.86% 1.059x
137 2017-11-30 … 2022-11-30 19.24% 12.52% 1.060x
138 2017-12-29 … 2022-11-30 19.44% 12.46% 1.062x
139 2018-01-31 … 2023-01-31 17.57% 11.01% 1.059x
140 2018-02-28 … 2023-02-28 15.93% 11.03% 1.044x
141 2018-03-29 … 2023-02-28 16.53% 11.72% 1.043x
142 2018-04-30 … 2023-04-28 16.99% 13.01% 1.035x
143 2018-05-31 … 2023-05-31 16.37% 12.95% 1.030x
144 2018-06-29 … 2023-05-31 16.64% 13.01% 1.032x
145 2018-07-31 … 2023-07-31 18.06% 14.67% 1.030x
146 2018-08-31 … 2023-08-31 16.98% 13.51% 1.031x
147 2018-09-28 … 2023-08-31 17.36% 13.56% 1.033x
148 2018-10-31 … 2023-10-31 17.19% 12.60% 1.041x
149 2018-11-30 … 2023-11-30 18.94% 14.58% 1.038x
150 2018-12-31 … 2023-12-29 21.94% 17.26% 1.040x
151 2019-01-31 … 2024-01-31 22.58% 16.27% 1.054x
152 2019-02-28 … 2024-01-31 22.12% 15.94% 1.053x
153 2019-03-29 … 2024-03-28 23.45% 17.50% 1.051x
154 2019-04-30 … 2024-04-30 20.58% 15.50% 1.044x
155 2019-05-31 … 2024-05-31 22.50% 18.12% 1.037x
156 2019-06-28 … 2024-06-28 21.59% 17.99% 1.031x
157 2019-07-31 … 2024-07-31 22.18% 17.70% 1.038x
158 2019-08-30 … 2024-08-30 23.44% 18.41% 1.042x
159 2019-09-30 … 2024-09-30 23.44% 18.65% 1.040x
160 2019-10-31 … 2024-10-31 23.02% 17.87% 1.044x
161 2019-11-29 … 2024-11-29 25.49% 18.64% 1.058x
162 2019-12-31 … 2024-12-31 23.77% 17.62% 1.052x
163 2020-01-31 … 2025-01-31 25.27% 18.07% 1.061x
164 2020-02-28 … 2025-02-28 27.78% 19.00% 1.074x
165 2020-03-31 … 2025-03-31 27.02% 19.24% 1.065x
166 2020-04-30 … 2025-04-30 24.33% 16.49% 1.067x
167 2020-05-29 … 2025-04-30 23.54% 15.80% 1.067x
168 2020-06-30 … 2025-06-30 24.83% 18.19% 1.056x
169 2020-07-31 … 2025-07-31 23.00% 17.87% 1.043x
170 2020-08-31 … 2025-08-29 22.23% 16.69% 1.048x
171 2020-09-30 … 2025-09-30 25.57% 18.57% 1.059x
172 2020-10-30 … 2025-09-30 26.17% 19.43% 1.056x
173 2020-11-30 … 2025-11-28 23.33% 17.77% 1.047x
174 2020-12-31 … 2025-12-31 22.90% 16.92% 1.051x
175 2021-01-29 … 2025-12-31 23.01% 17.20% 1.050x
176 2021-02-26 … 2026-01-30 24.80% 17.04% 1.066x
177 2021-03-31 … 2026-03-31 23.48% 14.07% 1.083x
178 2021-04-30 … 2026-04-30 28.08% 16.03% 1.104x
179 2021-05-28 … 2026-04-30 27.73% 16.22% 1.099x
Notes
mode=explore; family=recovery-quality-contrarian-52w-hybrid This variant keeps the parent family core but changes the arbitration structure. Instead of letting one sleeve dominate by regime, it uses a relay: contrarian depth nominates candidates, repair strength confirms whether the selloff is healing, and quality plus tradability decide whether a conflict is an early turnaround or a falling knife. In bull tapes the relay prefers shallower repaired leaders off their highs; in mixed tapes it requires balanced agreement between drawdown and repair; in risk-off it only advances rebounds that also show durability, lower volatility, and reliable liquidity. Deliberate metric coverage: active momentum metrics are return_1m_pct, return_6m_pct, momentum_12_1_pct; active trend/recovery metrics are from_52w_high_pct and from_200d_ma_pct; active volatility metric is realized_vol_3m; active liquidity metrics are avg_daily_volume_3m, avg_daily_dollar_volume_3m, trading_days_3m; active income metrics are dividend_yield_ttm_pct and dividend_ttm; active valuation metrics are forward_pe and peg; active growth metrics are operating_income_growth_pct, free_cash_flow_growth_pct, and forward_eps; active quality metrics are operating_margin_pct and free_cash_flow_margin_pct; active size metric is market_cap. Deliberate weight-0 metrics this run: return_3m_pct, return_12m_pct, 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. Correlated momentum fields are thinned, raw level fields stay off, and sparse fundamentals are normalized by present weight so missing data does not automatically zero a stock.
Lesson notes
#859 · degrade · relative_return Δ -0.3906 · parent exp_1123 · Jul 21, 2026 · auto/explore; benchmark CAPW_UNIV
explore/recovery-quality-contrarian-52w-hybrid: relative_return 1.0380x (delta -0.3906 vs exp_1123); win-rate 96.648%, worst-window 0.991476, dispersion 5.3407%.
Monthly picks — top stocks selected each month (whole timeline)
timeline — 240 months · top 15 each
Month 123456789101112131415
2006-07-31 CPB CSX KSS NOC CL WM TWX OMC PAYX DGX NEE CAG DIS GIS GOOG
2006-08-31 CPB BAC T OMC ADM MRK WFC NEE ABT CL NOC INTU LMT USB GOOGL
2006-09-29 LH CPB DGX ABT PSKY EXC L PPL KSS D T NEE FE KR PEP
2006-10-31 BDX ALL MDLZ PFE VZ BAC JCI T KSS AIV HPQ LNC MS EXC ABT
2006-11-30 MRK CAG KSS MAT FNMA FMCC BEN TWX VZ MS JPM NEE T TJX CMCSA
2006-12-29 MRK VNO HOG OKE TWX AES MTCH NEE ES CMCSA ETR CTSH CNP CAG DDR
2007-01-31 TWX BKNG CAG HAS TRV MCD HOG NEE ETR HPQ USB NKE IBM CMCSA ES
2007-02-28 TWX DOC MCD IBM HAS BMY YUM JCI CAG TRV NEE HD LMT MBI MSFT
2007-03-30 MTCH NEE PRU HAS BK BNY NKE CI YUM IBM MCD TWX HON CAG CNP
2007-04-30 MTCH SYK PEG ES SRE BK BNY USB T FE AEP ETR NKE MCK BAX
2007-05-31 ETR BAX MCD NEE ZBH PEG SYK MAT CHD AEP CNP PRU CI FE D
2007-06-29 CI PRU MET MCK ABT EQT ZBH CVS VZ BAX MCD HPQ PH GILD HON
2007-07-31 VFC MCD ESRX HON GILD GWW AON MET CVS GOOG DD AZO BWA PSKY WTW
2007-08-31 CAT HON CDNS APA BA GOOG GEN TXN GILD GOOGL HAL COP URI AMAT GLW
2007-09-28 PENN AMAT URI IDXX HPQ IBM CDNS BIIB PAYX HON GEN CAT ADI MCHP TXN
2007-10-31 EXPE COP BKR RTX MMM HAL CAT IBM CVX BA DGX MSI ITW MDLZ HPQ
2007-11-30 MGM YUM WMB EOG PENN KO NOC GE ADBE RTX VZ ITW MCD NKE GPN
2007-12-31 HPQ MCD MRK CL KO NEE PEP LMT NKE CVS AON ABT MO BMY MGM
2008-01-31 HPQ MCD ESRX DHR PEP KO AON PG UNH AET ELV MSFT EMR NRG WMB
2008-02-29 ABT PEG D HAL LMT CVX RTX DHR BA GE UNH NOC XOM AON ED
2008-03-31 MO ABT D LMT CVX NOC RTX AON XOM HON ED MMM DHR IBM MRSH
2008-04-30 ABT MO ALL D CAG ZBH IBM RTX MMM CVX LMT CL NOC PG DHR
2008-05-30 HAL CVX IBM ABT D RTX AEP TTWO ALL XOM COP HPQ BAX BA CAG
2008-06-30 ABT IBM ALL D AEP HPQ CVX MO LMT TTWO RTX LLY MMM HAL PEG
2008-07-31 D ABT HPQ TTWO AEP PEG EW LLY HAL ALL EXC IBM MO FE MMM
2008-08-29 D IBM LLY WWY ED BAX BTUUQ ESV MCD NAV ABT DNR APC MDLZ AON
2008-09-30 MCD ESV ABT BTUUQ D ED LLY GD CPB AEP DHR IBM AZO CAG AON
2008-10-31 ABT MCD AON CAG ED D HPQ CPB IBM HAS LLY AZO MO MTCH GD
2008-11-28 ABT CAG AON MCD ED CPB D MO IBM AZO HPQ MRK LUV GD MTCH
2008-12-31 ABT AON MCD ED CAG CPB BMY MMM IBM JNJ AMGN HPQ KR AEP MDLZ
2009-01-30 ABT MCD AON BMY XOM CAG ED AEP CPB RTX AMGN JNJ HPQ T MTCH
2009-02-27 ABT MCD XOM CAG CVX ED BMY AON CPB RTX AEP HPQ AMGN JNJ GD
2009-03-31 MCD BKNG CVX AON ABT XOM BMY AMT CAG ADI ED AMGN IBM JNJ PG
2009-04-30 BKNG CVX IBM MCD AZO AON BMY UPS OXY EBAY XOM CAG ED ADM AMT
2009-05-29 BKNG EBAY CF IBM AZO CAG CVX MCD BMY AMT GOOG UPS MA AON AAPL
2009-06-30 IBM CAG GOOG BKNG BMY AZO AAPL AMT EBAY ROST JNJ PG CF XOM AMGN
2009-07-31 BMY IBM CAG EBAY GOOG AMT AZO FISV AAPL WAT BKNG EOG JNJ CF PEP
2009-08-31 KLAC IBM AAPL EBAY EOG JCI JNJ CAG PEP BMY AZO TGT XOM SPGI YUM
2009-09-30 CAG XOM IBM AAPL EBAY EOG MA JNJ YUM GE PEP GILD MDT BKNG BMY
2009-10-30 EBAY EOG AMGN AAPL BKNG IBM WBD FIS GILD TT BMY MCK ABT GIS PM
2009-11-30 MCK HPQ AMGN IBM TWX TJX GILD ABT TRV ITW GOOG GIS AAPL MSFT JCI
2009-12-31 JCI MCK WBD ABT IBM CAH MRK ACN GOOG PEP CL MSFT GIS TT ADP
2010-01-29 GOOG IBM WBD MSFT GIS ABT GOOGL DHR TT TRV ADP SPG AMGN HPQ RTX
2010-02-26 ABT WBD ACN SYK GIS GE SW DHR CCI ADP RTX LMT JCI AMGN CB
2010-03-31 COR ACN TRV EW AZO LMT AMGN DTE F BMY GIS EBAY WHR MSFT XRX
2010-04-30 BBWI BMY GIS F BKNG HAS MDLZ AMGN XRX GE BRK-B DRI JCI TSN HON
2010-05-28 BBWI HON TSN VTRS BMY AMGN EL TFC F AZO GE GIS LMT ABT DRI
2010-06-30 BBWI HON BMY ETN LEG NTAP TSN TRV GE SHW TJX SBUX LMT AZO GILD
2010-07-30 BBWI BMY HSY AZO BKNG HAS KDP CB NEM TRV NTAP HON PEG COR TSN
2010-08-31 BBWI BKNG INTC AZO HON FIS NTAP BMY TXN AXP AAPL MMM CB ED KDP
2010-09-30 BKNG BMY AZO BBWI CB ED HSY NEM FIS MRK NTAP NI INTC TRV MDLZ
2010-10-29 BMY BKNG VZ AZO CB MRK CHRW INTC BBWI GILD CMS CCI PM ED TXN
2010-11-30 BKNG PM BMY D NTAP CB INTC TXN AZO CNP MDLZ VZ MCHP INTU CMS
2010-12-31 TXN BKNG ADI AZO BBWI MCHP NTAP EXPD D HON LUMN PM WYNN AAP OMC
2011-01-31 BKNG ADI TXN INTC FCX CHRW AZO VZ MCHP TPR AAPL NTAP UNP HON CTSH
2011-02-28 TXN BKNG ADI BBWI INTC DE MCHP HON AAPL TPR ILMN AZO OXY XOM ON
2011-03-31 COP XOM ADI BKNG WYNN TXN BBWI AAPL D GE CVX TER FCX QCOM NOV
2011-04-29 COP BKNG TXN ADI AAPL CSX CVX GE AZO MU WYNN COR PSKY XOM PPG
2011-05-31 BKNG GE BBWI COP XOM CVX CAT WMB WYNN MCHP KKR ADI ELV OXY INTC
2011-06-30 BKNG COP PM BBWI WYNN GE XOM CVX CAT LLY D SPG AAPL MCHP WMB
2011-07-29 COP BKNG D BBWI WYNN CAT CVX GE XOM IRM BAX LLY AZO AAPL AXP
2011-08-31 BKNG AAPL CF FCX COP WYNN BIIB AZO BBWI GE VZ PM CAT CVX ADI
2011-09-30 BKNG WYNN COP AAPL KLAC CF AZO VZ PM DUK GE XOM ADBE WBD AVB
2011-10-31 BKNG AAPL KLAC AZO CF DUK COP KMB VZ CL DG WYNN TJX LLY BAX
2011-11-30 KLAC BKNG AAPL AZO CVX WYNN VZ COP GE PFE CNP XOM WBD LLY GOOG
2011-12-30 KLAC BKNG AAPL AZO VFC CF COP VZ PFE AEE XOM DG DLTR CVX GE
2012-01-31 KLAC VZ BKNG PFE GE LLY CF AAPL PM AZO DG DLTR OKE COP XOM
2012-02-29 BKNG AAPL KLAC CF GE MRK AZO UNP BIIB ECL TJX CAT DG OKE URI
2012-03-30 BKNG AAPL CF CAT AZO COP KLAC EOG EBAY IP BBWI ETN GE WBD LUMN
2012-04-30 BKNG AAPL KLAC GE CF COP WBD JPM QCOM IVZ WYNN AZO KMI BLK PM
2012-05-31 BKNG AAPL STX SPG ISRG WBD CF QCOM PM WMB EBAY ORLY COP MSFT TFC
2012-06-29 BKNG AAPL STX CF VRTX SPG QCOM EBAY KLAC WBD PM AZO COP ISRG ITW
2012-07-31 BKNG AAPL STX COP WBD DG CF MCK KLAC ISRG EBAY KMB SPG LLY GE
2012-08-31 STX KMB MO SRE WEC MRK ALL SPG GE CMS CF PM KMI EXPE VTR
2012-09-28 STX ALL SPG TJX EBAY AAPL LUMN DOC VTR VLO MO CF UNP SRE KMI
2012-10-31 GE ALL CF MRK TWX AAPL EBAY GOOG LLY LUMN KMB COP QCOM MO XOM
2012-11-30 ALL MRK GE TRV BKNG AMGN LLY DVA CB CF GS IRM CDNS XOM NRG
2012-12-31 STX AMGN ALL EBAY TRV GE CB LLY AFL QCOM BAX VTRS WYNN CL DVA
2013-01-31 STX SBAC ALL AMGN APTV EBAY PPG COP IP GE CMCSA FISV CSCO KKR AFL
2013-02-28 EBAY ALL GS TRV BKNG NWL CB STX WYNN PPG KKR BAX TSN CPRT DAL
2013-03-28 STX JPM KKR GS ALL MCK GE TRV DOV DVA BKNG HON VTRS AMGN CB
2013-04-30 STX ALL GEN AMGN GS BKNG STT TRV LLY COR BSX PFE KKR HON BDX
2013-05-31 BKNG TWX KR ALL COR TRV KKR MAT VLO STX COST WYNN GOOG ECL JPM
2013-06-28 BKNG GEN JPM KKR AMGN ALL GS GILD STX TRV BLK TWX BX MCO FIS
2013-07-31 BKNG GOOG STZ ALL KKR JPM VFC MO WFC ELV PFE TRV BRK-B CB STX
2013-08-30 BKNG JNJ VFC GOOG SPGI PFE FITB WFC REGN JPM BDX COST AFL MCO AZO
2013-09-30 BKNG JNJ WFC PFE ELV COP GOOG MSFT HON ICE COST COO UNP CAH RTX
2013-10-31 BKNG META REGN BX SPGI RTX A COP MU EHC MA WFC URI V LYB
2013-11-29 BKNG META COP KR REGN JNJ PFE MO WYNN URI TJX BX OXY ADM SLB
2013-12-31 BKNG JNJ COP META MSFT COR MCK IBKR URI MU STZ BX PFG PFE TJX
2014-01-31 BKNG MA V URI COR JNJ MO TT GE COP BX ITW VFC ABBV REGN
2014-02-28 BKNG BX MU MA REGN COP URI V MO ESRX COR MSFT META CB GE
2014-03-31 BX WYNN META MU V BKNG VZ ESRX GD URI T SPGI LLY GOOG CAH
2014-04-30 META URI WYNN STZ VZ RCL EOG USB MCK AAL GLW LLY BKNG MSFT BX
2014-05-30 META BKNG T D URI WYNN AEP COP EIX PEG DTE BX GLW BKR JNJ
2014-06-30 META URI LYB T COP UNP GD VZ BX HST VNO JNJ OXY BAX TRV
2014-07-31 COP MU URI META BKNG OXY JNJ BX EOG TRV T SLB NOV CBRE UNP
2014-08-29 COP T VZ MU GILD DLR META BX EQIX BNY BK DAL VNO WFC BAX
2014-09-30 GILD COP URI WMB VZ T OXY DLR PSX BK BNY AEP AIV ESS BALL
2014-10-31 GILD MU META VZ T URI RCL BK BNY RSG LUMN BKNG KLAC SBAC COP
2014-11-28 GILD META T VZ ED AEP BX MU GS PAYX HIG D SRE SO EQR
2014-12-31 GD MU GILD WELL T DLR AMGN AEP KLAC KDP EIX META FDX BX EQR
2015-01-30 GILD T RCL GD TRV HIG ALL AZO GE CB VFC VZ AEP BX AMAT
2015-02-27 KR BX MAC VNO SHW BXP GILD ARE T ALL ESS EQR DRI COR KDP
2015-03-31 BMS SBUX GILD TXN GE SHW AAPL BX MO PPG BDX DLTR CME PCG VTR
2015-04-30 BX GILD DLTR DGX BKNG SHW DRI SBUX AZO LH LII COST CHD TEL TXN
2015-05-29 KMI GILD COR AZO LH BX DRI BBWI COST BKNG PSX GE SBUX JPM ALL
2015-06-30 BX COR BKNG GILD AZO KMI JPM GS COST SBUX AAPL SHW TXN MCK DRI
2015-07-31 BKNG BX JPM GS GILD GE MTG VLO SBUX AZO HAS DRI COR TGT ANET
2015-08-31 GILD MDLZ BKNG PANW VLO JPM SBUX BF.B BF-B DRI HAS KR ACN AMGN ELV
2015-09-30 BKNG GILD HUM CCI JPM HAS VLO SBUX MTG DRI MDLZ AZO AMGN SYF ESRX
2015-10-30 BKNG WEC CCI CMG PEG GILD PCG AZO SBUX ACGL VLO CASY XEL HAS ES
2015-11-30 MO AZO PLD ACGL GILD CCI PSX MDLZ ACN SPG WEC PM BBWI BKNG ORLY
2015-12-31 BKNG GILD MAS FISV AZO PSX PLD VLO CCI MO COST PAYX LUV ORLY AMGN
2016-01-29 VRSN IBM TAP CCI KLAC COR GM GE PLD COST ADBE GOOG CB AMGN VLO
2016-02-29 VZ TAP T KLAC ABBV GOOG BKNG AMGN KDP PPL PM CCI BUD KMB RMD
2016-03-31 T VZ KLAC ABBV KMB PM CCI AMGN KDP ISRG DAL GOOG ETN WM GILD
2016-04-29 VZ T KLAC PM XEL CMS ABBV MKC LNT KMB AEP NI NDAQ WEC BKNG
2016-05-31 T VZ ABBV TSN PM BAX KLAC SYY OMC EXC META ISRG MCD WM CL
2016-06-30 ABBV T VZ KLAC IBM AMGN META CCI EVRG MCD ISRG ACN ZBH PM PPL
2016-07-29 CNP NI WM T AWK VZ ABBV DLR CCI EQIX XEL EVRG MRSH PCG EIX
2016-08-31 T ABBV VTR WM VZ DXC BKNG IRM ULTA CNP BSX HII META AMGN KIM
2016-09-30 ABBV BKNG T META DHR AMGN SPGI COO FIS AFL VZ ICE CME TSN WM
2016-10-31 BKNG SPGI T META GLW DHR ABBV VZ ISRG MKTX HPQ YUM EBAY IBM CME
2016-11-30 META BKNG SPGI T DHR KLAC PEP ISRG PG ADBE YUM QCOM ABBV GOOG CSCO
2016-12-30 FDX META HPE BKNG QCOM GM DHR ITW ABBV ADBE CSX YUM GLW PFG NXPI
2017-01-31 FDX ABBV TFC DD GS PFG BKNG JPM SPGI T GM TWX BRO IBM NXPI
2017-02-28 ABBV TT GM T MSFT META XRX ADBE MTB TWX USB FDX BKNG IBM BRO
2017-03-31 MO GS PRU USB BKNG META JPM UNM IBM EBAY TWX BRK-B AXP KLAC AMGN
2017-04-28 EBAY META MHK XRX ADI BKNG AMAT KLAC MO PRU ADBE AMGN GS MRK USB
2017-05-31 META BKNG EBAY MSFT ADBE KLAC BX XRX KHC LRCX MO TFX GOOG AMGN WDC
2017-06-30 META MSFT BX ADBE BKNG XRX AMAT SPGI PM WDC GOOGL RCL MO EBAY ADI
2017-07-31 PM BX AMAT ABBV META BCR HUM BAX ELV LRCX BSX BKNG ADBE TT AET
2017-08-31 BX META NXPI AMAT BA ALL CB HIG LRCX SPGI PM MU AET BDX STT
2017-09-29 BX RCL META ADBE SBAC STZ XEL BAX VRTX NEE BA AET AMT BCR SPGI
2017-10-31 BA BX TROW AMGN ABBV RCL SPGI NYT META AMAT TXN TWX FDX ZTS VRTX
2017-11-30 MU META NXPI INTC TXN CTSH ANET AMGN AEP XOM ADBE BA RCL AMAT PLD
2017-12-29 MU META AEP TSN ANET AMGN ADBE NXPI CBOE ON AMAT EXC BA XEL ISRG
2018-01-31 MU TXN AET NXPI SWK INTC HLT MCD STZ SHW ITW TROW OXY ANET ZTS
2018-02-28 ANET BKNG AET NXPI BX LW XOM TXN TSN META AEP MCD MU ITW LRCX
2018-03-29 NXPI MU BKNG AET BA ANET PSX URI CAT BX FCX AEP ELV ON WYNN
2018-04-30 BKNG MU ANET PSX AEP WYNN NXPI EW HCA MPC BA KDP KSS BLK BX
2018-05-31 BKNG MU PSX PFE ANET CVX VZ AEP AET KDP FCX ALL CTSH OXY NTAP
2018-06-29 BKNG MU PSX NOW BA ANET VLO ADBE BLK PFE AEP META OXY MSCI M
2018-07-31 MU BKNG ADBE TJX PSX NOW AEP PEG OXY MSCI PANW META MCO ETSY V
2018-08-31 PSX MU EVHC OXY PFE WAB AEP OKE MRK BKNG PEG CVX MPC TDG VLO
2018-09-28 PSX BKNG AEP SHW PFE MPC SPG USB OXY AET REGN TJX VLO VZ BRO
2018-10-31 BKNG PFE AVGO ABMD ETSY EHC WMB CF UNP DELL PSX FTV AEP TJX M
2018-11-30 TJX BKNG PM PFE MKC MRK VZ CME ESRX ADM AMD JKHY PEG VICI MO
2018-12-31 BKNG ESRX PFE MKC USB AVGO MRK VZ CMCSA MDLZ PEG ABMD SO CMI TJX
2019-01-31 ESRX MRK PFE AVGO CME AZO XEL EXC VZ FE PEG ETR LW CLX WEC
2019-02-28 AVGO WELL CNP PFE MDLZ SO EXC VTR CME XEL WCG VZ AIV PGR ES
2019-03-29 PGR AVGO JNJ XEL VRTX PEP EXC LIN REGN KLAC MTCH PPL AWK ADI INTC
2019-04-30 AES PEP BAX WMB IBM MRK LIN KLAC JNJ KMI MTCH XEL KEYS CAT CCI
2019-05-31 ADI LLY PEP HON SO MDLZ JNJ AVGO QCOM LIN MSFT CDNS GRMN IBM MTCH
2019-06-28 PEP MDLZ SO HSY PAYX PGR INVH KMI MTCH XEL BR SRE HON WM FDS
2019-07-31 PEP LIN QCOM MDLZ AFL PGR HON BKNG MSFT JNJ SO XRAY ROP TRV SRE
2019-08-30 QCOM AZO PEP CPRT XRAY LIN BKNG GS PSX APD SO IBM PGR MSFT HON
2019-09-30 QCOM PEP BKNG BMY HSY WEC PSX AWK GPN SO WM MSI NCC XEL CCI
2019-10-31 HSY PEP MLM BKNG VMC WEC ES BMY XEL LMT LHX MDLZ SO EVRG IBM
2019-11-29 QCOM BMY PSX ETR SO PEP INVH FE J SHW EQR ES XEL BF.B BF-B
2019-12-31 VRTX QCOM AMGN PSX AVP USB PEP GOOG MSFT KIM INVH BMY SO JPM FTNT
2020-01-31 BMY QCOM AMGN JPM LLY ANSS VRTX FLT PEP MSFT JNJ TIF SO KSU SYY
2020-02-28 LLY BMY QCOM SO GS JNJ JPM FTNT ETR VRTX MSFT CPRT AMGN RTN PEP
2020-03-31 ABBV QCOM ENPH ANET GOOG NEM PGR SO JPM GEN NOW IBM LLY GOOGL MNST
2020-04-30 ABBV KR LLY PGR QCOM CLX ANET ENPH MRK VZ MDLZ SO GEN GOOG IBM
2020-05-29 LLY ANET NEM QCOM ABBV KR PGR GOOG VZ IBM ENPH BDX CLX GEN SO
2020-06-30 ABBV ENPH NEM VZ GEN INTC QCOM CPB CDNS BAX JNJ KR IBM ICE ANET
2020-07-31 ABBV EBAY ADBE VRTX ENPH MSFT AZO QCOM CDNS VZ GIS URI CPB KLAC SPGI
2020-08-31 ABBV REGN EBAY CDNS CLX AZO VRTX PG ORLY ENPH EA ETSY META ROP NEM
2020-09-30 ABBV META EBAY CDNS REGN MO AZO MS ENPH LOW VIAC ADBE PG ODFL ORLY
2020-10-30 ENPH LOW ABBV VIAC PGR ADBE PG MO AZO META ETSY REGN CRWD MRK SPGI
2020-11-30 PG CPRT VIAC CDNS NOW META ENPH ADBE LOW ABBV AZO AWK TMO CNXT CTSH
2020-12-31 ETSY NOW ABBV PG ENPH KLAC LRCX CARR META FDX AMAT ALL TT AMD TGT
2021-01-29 ENPH ABBV KLAC ADBE MS GS PG WPX PGR FCX ETSY AMAT DVN CDNS LRCX
2021-02-26 ENPH ABBV ADBE TUP KLAC ABMD PGR PG BLK ETSY COST CTLT ALL CRWD FFIV
2021-03-31 GS MS JPM ETSY FCX KLAC SPG DVN TSLA ENPH TUP PSX ADBE EBAY ALXN
2021-04-30 AMAT GS JPM C TSLA DVN BBWI ETSY URI FCX MS LRCX JCI LEN PG
2021-05-28 PGR GS FE DE ALL PG OMC FCX AMAT RJF PM LRCX WY JPM LOW
2021-06-30 BX JPM GS DE XEC ETSY FCX C BRK-B ALL F AFL COF MS PGR
2021-07-30 GS BX FCX JPM BIG XOM ORLY META GOOG XEC DE REGN LRCX MS AZO
2021-08-31 MRNA BX GS TGT BBWI KKR AZO QCOM GOOGL AMD UDR JPM PAYX WFC C
2021-09-30 BX MRNA GS SIVB GOOGL KSU A PKI XEC FRC MMC GOOG META REGN AMD
2021-10-29 MRNA BX SIVB GS EOG C KSU PKI CB META RMD JPM PXD QCOM MMC
2021-11-30 MRNA GS CB COP REGN BX JEF AZO JPM GILD GOOGL KKR M ISRG KLAC
2021-12-31 REGN AMD BX GILD COP KLAC GOOGL JPM PFE GS CVX DDOG QCOM SPG CB
2022-01-31 PFE GILD BX REGN FDS AVGO GOOGL CB KLAC FCX WY CVX MRSH ON SPG
2022-02-28 PFE GILD WY REGN BX MRK CB AMD WFC EXC HPQ SPG CVX QCOM PM
2022-03-31 GILD WY COP ABBV PFE REGN BX CVX FCX CB SPG ON EOG DVN MDLZ
2022-04-29 ABBV REGN GILD FCX PFE CVX COP CF BRK-B NI EXC WY BKNG CB MOS
2022-05-31 ABBV REGN CF EOG MOS GILD WY PFE MRK BRK-B FHN BMY SRE PLD FE
2022-06-30 EOG CF DVN CVX REGN VLO ABBV MPC MRO XOM GILD PSX WY BRK-B PFE
2022-07-29 EOG ABBV VLO REGN MRK GILD CF PFE BMY FHN DVN EXC CB KR CVX
2022-08-31 DVN CVX EOG CF AZO VRTX PFE ABBV MRK MOS COP ON BMY PSA VICI
2022-09-30 DVN EOG CVX COP CF ON MRO GS VRTX PFE XOM VICI AZO ABBV PSA
2022-10-31 DVN EOG ON CF PFE COP CVX ABBV MRNA VRTX AZO GS VICI PSA TXN
2022-11-30 COP EOG DVN CVX CF VRTX XOM AZO MRNA BKNG MCK MPC AMGN MRK UNM
2022-12-30 EOG DVN COP BKNG CVX MRNA GS MRO MPC AMGN BIIB MCHP VRTX ON AIG
2023-01-31 BKNG EOG COP MRK CVX AIG ABBV AMGN MRNA DVN PCG AZO JPM MO BK
2023-02-28 BKNG TJX CVX AMGN T VRTX AIG MRK EOG PSA MPC ON COP VLO XOM
2023-03-31 BKNG PSX MO XOM ABNB EOG DOW CVX PSA VLO URI JPM TJX SPG MCHP
2023-04-28 BKNG ADI AVGO MCHP ABNB MPC ANET PSX ON KLAC EOG PSA NXPI CVX MO
2023-05-31 BKNG PSA VRTX XOM MO MDLZ ABNB NEE ADI LEN CVX EOG PSX AMGN HSY
2023-06-30 BKNG MDLZ PSA HSY AVGO EOG MO MNST ANET XOM ADI LW PLTR CVX NEE
2023-07-31 BKNG EOG VRTX CAH MDLZ COR CHD CPRT HCA PANW BSX FISV MRK MO AVGO
2023-08-31 BKNG EOG JPM ABNB PSX COR MO MDLZ MCHP ADI KLAC PLTR NOW TAP VLO
2023-09-29 BKNG PSX EOG JPM AVGO KLAC NOW MO PLTR FISV TJX EMR MCHP BRK-B ECL
2023-10-31 BKNG PSX JPM VLO PLTR ADI EMR EOG CAT ABNB MO MCHP KLAC TJX VRSK
2023-11-30 BKNG IBM TJX ABNB JPM PEG CME GILD AFL EOG MET MRK BKR CMCSA MO
2023-12-29 BKNG IBM PSX NOW ABNB AKAM WMB CBOE JPM AFL PANW ADBE EOG AM CME
2024-01-31 BKNG IBM NOW JPM CRM MO SPG ABNB GILD KLAC ACN ANET PSX ROP DHI
2024-02-29 IBM NOW CB PSX JPM BSX COR BKNG PCAR MRK PGR JNJ FISV TDG CSX
2024-03-28 IBM CSX META UNP CRM JPM UBER ANET CRWD KLAC PLTR GE NOW CB HLT
2024-04-30 PLTR META CAT NVDA IBM JPM CRH URI CRWD CRM UBER PSX HLT PANW SPG
2024-05-31 CAT IBM META WFC URI FANG COR MRK AMZN AZO NVDA PGR JPM RSG PH
2024-06-28 IBM CAT CEG PANW CB URI NVDA KR MO GS META PGR COIN WFC XYL
2024-07-31 NVDA BSX META MO GOOG NFLX CAT IBM TJX JPM WMB LDOS AMZN CL ANET
2024-08-30 NVDA AMT GS MO IBM WELL PANW PM ANET JPM SO AEP DUK META PLTR
2024-09-30 PM MO CL NVDA AMT IBM GS ICE JNJ DUK JPM VTR NFLX WELL NEM
2024-10-31 IBM AMT META AFL MSI NVDA JNJ SHW PLTR BKNG BSX DUK ICE MMM EXR
2024-11-29 NVDA META FIS VTR BLK PANW BKNG FISV SO DUK WMB ANET MO BSX NFLX
2024-12-31 CRH MO TMUS BKNG DUK OKE GS WELL FISV META TT TRV LULU WMB BK
2025-01-31 PGR MO BKNG KVUE TRV LULU NVDA FIS SPG NFLX CB WDAY META PYPL DUK
2025-02-28 GS META JPM NFLX BSX BKNG PLTR CRM MS PGR BLK APO RJF CCL PNC
2025-03-31 BKNG GS JPM META FTNT PGR C MS MO NFLX PFE RCL QCOM PANW HBAN
2025-04-30 MO BKNG GS META PGR KMI JPM VZ BMY C AZO PFE QCOM AMT TMUS
2025-05-30 GILD EXC CNP KR NEM BKNG UBER EW KDP VZ COR TJX MO MDLZ AZO
2025-06-30 GILD CME PM EXC MO BKNG VZ CNP PGR MNST RSG MDLZ BUD TJX ALL
2025-07-31 BKNG GILD UBER NFLX CAH GS MNST VZ JPM PM KLAC PGR WRB C CTVA
2025-08-29 GILD BKNG GS STX PWR NFLX KLAC COIN UBER C LRCX NVDA CME AEP CTVA
2025-09-30 GILD BKNG RCL COIN AVGO C GS NFLX MS UBER LVS BNY BK NDAQ META
2025-10-31 NEM COIN GILD GS C BKNG MPWR NSC AZO STX UBER META KLAC RCL AVGO
2025-11-28 GILD KLAC MPWR QCOM GS ANET LRCX MU STX C UBER TEL NVDA NEM MS
2025-12-31 AVGO WELL GILD JNJ WDC AMGN COR XEL STX AEP KLAC MPWR C VZ ATGE
2026-01-30 AVGO WDC KLAC C WELL GILD NEM TJX MS GS JNJ AMGN MPWR EA TRV
2026-02-27 GOOG GILD KLAC AVGO MPWR WDC GS GOOGL MU C MNST MS JNJ USB STX
2026-03-31 GILD GOOG MU WDC NEM MNST KLAC AVGO LRCX JNJ AMGN SPG PSX PGR KVUE
2026-04-30 GILD JNJ PSX MRK CF NEM KLAC AMGN KMI PGR CTVA SPG APA MU KVUE
2026-05-29 GILD PSX JNJ NEM USB WMB KLAC AMGN CF KMI CASY COP SPG FTI ALL
2026-06-26 WDC PSX MCHP ADI MU GILD KLAC VLO SPG GS AES AVGO MS BK ADM
Scoring script (python)
FORMULA_NAME = "Recovery Quality Contrarian 52-Week Hybrid (Relay Arbitration, v1152)"
LOGIC_VARIANT_COUNT = 3
NOTES = """mode=explore; family=recovery-quality-contrarian-52w-hybrid
This variant keeps the parent family core but changes the arbitration structure. Instead of letting one sleeve dominate by regime, it uses a relay: contrarian depth nominates candidates, repair strength confirms whether the selloff is healing, and quality plus tradability decide whether a conflict is an early turnaround or a falling knife. In bull tapes the relay prefers shallower repaired leaders off their highs; in mixed tapes it requires balanced agreement between drawdown and repair; in risk-off it only advances rebounds that also show durability, lower volatility, and reliable liquidity.
Deliberate metric coverage: active momentum metrics are return_1m_pct, return_6m_pct, momentum_12_1_pct; active trend/recovery metrics are from_52w_high_pct and from_200d_ma_pct; active volatility metric is realized_vol_3m; active liquidity metrics are avg_daily_volume_3m, avg_daily_dollar_volume_3m, trading_days_3m; active income metrics are dividend_yield_ttm_pct and dividend_ttm; active valuation metrics are forward_pe and peg; active growth metrics are operating_income_growth_pct, free_cash_flow_growth_pct, and forward_eps; active quality metrics are operating_margin_pct and free_cash_flow_margin_pct; active size metric is market_cap.
Deliberate weight-0 metrics this run: return_3m_pct, return_12m_pct, 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. Correlated momentum fields are thinned, raw level fields stay off, and sparse fundamentals are normalized by present weight so missing data does not automatically zero a stock.
"""

_DIRECTION = {
    "return_1m_pct": -1,
    "return_6m_pct": 1,
    "momentum_12_1_pct": 1,
    "from_52w_high_pct": -1,
    "from_200d_ma_pct": 1,
    "realized_vol_3m": -1,
    "avg_daily_volume_3m": 1,
    "avg_daily_dollar_volume_3m": 1,
    "trading_days_3m": 1,
    "dividend_yield_ttm_pct": 1,
    "dividend_ttm": 1,
    "forward_pe": -1,
    "peg": -1,
    "operating_income_growth_pct": 1,
    "free_cash_flow_growth_pct": 1,
    "forward_eps": 1,
    "operating_margin_pct": 1,
    "free_cash_flow_margin_pct": 1,
    "market_cap": -1,
}


def _to_number(value):
    if value is None or value is False or value is True:
        return None
    try:
        number = float(value)
    except Exception:
        return None
    if number != number:
        return None
    return number


def _get_symbol(stock):
    for key in ("symbol", "ticker", "name"):
        value = stock.get(key)
        if value:
            return str(value)
    return None


def _clip(value, low, high):
    if value < low:
        return low
    if value > high:
        return high
    return value


def _percentile_ranks(stocks, metric, direction):
    pairs = []
    for stock in stocks:
        symbol = _get_symbol(stock)
        if not symbol:
            continue
        value = _to_number(stock.get(metric))
        if value is None:
            continue
        pairs.append((symbol, value * direction))

    ranks = {}
    count = len(pairs)
    if count == 0:
        return ranks

    pairs.sort(key=lambda item: item[1])
    if count == 1:
        ranks[pairs[0][0]] = 1.0
        return ranks

    index = 0
    while index < count:
        end = index
        current = pairs[index][1]
        while end + 1 < count and pairs[end + 1][1] == current:
            end += 1
        rank = ((index + end) * 0.5) / (count - 1.0)
        while index <= end:
            ranks[pairs[index][0]] = rank
            index += 1
    return ranks


def _weighted_score(symbol, rank_map, weights, neutral=0.5):
    total = 0.0
    used = 0.0
    for metric, weight in weights.items():
        metric_ranks = rank_map.get(metric, {})
        if symbol not in metric_ranks:
            continue
        total += metric_ranks[symbol] * weight
        used += weight
    if used <= 0.0:
        return neutral
    return total / used


def _regime_branch(regime, ctx):
    text = ""
    if regime is not None:
        text += str(regime).lower() + " "
    if ctx is not None:
        regime_hint = ctx.get("regime") if isinstance(ctx, dict) else None
        if regime_hint is not None:
            text += str(regime_hint).lower() + " "

    if (
        "risk_off" in text
        or "risk-off" in text
        or "bear" in text
        or "defensive" in text
        or "drawdown" in text
        or "panic" in text
    ):
        return "risk_off"
    if (
        "bull" in text
        or "risk_on" in text
        or "risk-on" in text
        or "uptrend" in text
        or "strong" in text
    ):
        return "bull"
    return "transition"


def score_universe(stocks, regime, ctx):
    rank_map = {}
    for metric, direction in _DIRECTION.items():
        rank_map[metric] = _percentile_ranks(stocks, metric, direction)

    contrarian_weights = {
        "from_52w_high_pct": 0.44,
        "return_1m_pct": 0.16,
        "forward_pe": 0.12,
        "peg": 0.12,
        "market_cap": 0.16,
    }
    repair_weights = {
        "from_200d_ma_pct": 0.30,
        "return_6m_pct": 0.24,
        "momentum_12_1_pct": 0.18,
        "operating_income_growth_pct": 0.16,
        "forward_eps": 0.12,
    }
    durability_weights = {
        "realized_vol_3m": 0.22,
        "operating_margin_pct": 0.24,
        "free_cash_flow_margin_pct": 0.20,
        "dividend_yield_ttm_pct": 0.18,
        "dividend_ttm": 0.16,
    }
    liquidity_weights = {
        "avg_daily_dollar_volume_3m": 0.46,
        "avg_daily_volume_3m": 0.28,
        "trading_days_3m": 0.26,
    }
    growth_value_weights = {
        "operating_income_growth_pct": 0.28,
        "free_cash_flow_growth_pct": 0.24,
        "forward_eps": 0.16,
        "forward_pe": 0.18,
        "peg": 0.14,
    }

    branch = _regime_branch(regime, ctx)
    scores = {}

    for stock in stocks:
        symbol = _get_symbol(stock)
        if not symbol:
            continue

        contrarian = _weighted_score(symbol, rank_map, contrarian_weights)
        repair = _weighted_score(symbol, rank_map, repair_weights)
        durability = _weighted_score(symbol, rank_map, durability_weights)
        liquidity = _weighted_score(symbol, rank_map, liquidity_weights)
        growth_value = _weighted_score(symbol, rank_map, growth_value_weights)

        disagreement = abs(contrarian - repair)
        knife_risk = contrarian * (1.0 - repair) * (1.0 - durability)
        balanced_relay = contrarian if contrarian < repair else repair
        conflict_penalty = disagreement * (1.0 - durability)

        shallow_repair_sweet_spot = 1.0 - abs(contrarian - 0.64) / 0.64
        shallow_repair_sweet_spot = _clip(shallow_repair_sweet_spot, 0.0, 1.0)

        if branch == "bull":
            base = (
                0.34 * repair
                + 0.24 * shallow_repair_sweet_spot
                + 0.16 * growth_value
                + 0.14 * durability
                + 0.12 * liquidity
            )
            multiplier = 0.82 + 0.26 * durability + 0.12 * liquidity
            score = base * multiplier - 0.16 * knife_risk - 0.06 * conflict_penalty
        elif branch == "risk_off":
            defensive_turn = contrarian * (0.58 * durability + 0.42 * repair)
            base = (
                0.34 * durability
                + 0.20 * repair
                + 0.18 * defensive_turn
                + 0.16 * liquidity
                + 0.12 * growth_value
            )
            multiplier = 0.76 + 0.28 * liquidity + 0.18 * durability
            score = base * multiplier - 0.22 * knife_risk - 0.08 * disagreement
        else:
            base = (
                0.32 * balanced_relay
                + 0.24 * durability
                + 0.16 * growth_value
                + 0.14 * liquidity
                + 0.14 * contrarian
            )
            multiplier = 0.78 + 0.30 * durability + 0.10 * repair
            score = base * multiplier - 0.10 * conflict_penalty - 0.12 * knife_risk

        scores[symbol] = score

    return scores