exp_1130

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

← All V2 experiments
Relative return
0.987x
Excess vs bench
-1.28%
Benchmark
CAPW_UNIV
Rolling windows
179 · monthly
Mean strategy gain
12.51%
Mean benchmark gain
14.08%
Mean excess gain
-1.57%
Dispersion (ref)
3.45%
Win-rate vs bench (ref)
32.40%
Worst / best ratio (ref)
0.928x / 1.045x
Logic variants
3
Updated
Jul 21, 2026
Anchored windows (reference — strategy vs benchmark)
Kept from V1 for continuity; the objective ranks on the full rolling set, not these four.
WindowStrategyBenchmarkRatio
2006-07-03 … 2011-06-30 4.45% 2.22% 1.022x
2011-07-01 … 2016-06-30 14.55% 13.74% 1.007x
2016-07-01 … 2021-06-30 13.92% 20.63% 0.944x
2021-07-01 … 2026-06-26 9.75% 15.48% 0.950x
All rolling windows — the objective set (equal-weighted mean ratio)
Strategy Benchmark (CAPW_UNIV) Excess
2006200720082009201020112012201320142015201620172018201920202021 -5%0%5%10%15%20%25%
rolling 5y windows, monthly step — 179 windows · mean ratio 0.987x · beat benchmark in 58/179
#WindowStrategyBenchmarkRatio
1 2006-07-31 … 2011-07-29 4.53% 1.79% 1.027x
2 2006-08-31 … 2011-08-31 3.67% 0.21% 1.035x
3 2006-09-29 … 2011-08-31 3.37% -0.14% 1.035x
4 2006-10-31 … 2011-10-31 4.20% 0.23% 1.040x
5 2006-11-30 … 2011-11-30 3.76% -0.05% 1.038x
6 2006-12-29 … 2011-11-30 3.13% -0.32% 1.035x
7 2007-01-31 … 2012-01-31 4.24% 0.93% 1.033x
8 2007-02-28 … 2012-01-31 4.63% 1.43% 1.032x
9 2007-03-30 … 2012-03-30 6.64% 3.09% 1.034x
10 2007-04-30 … 2012-04-30 5.86% 2.42% 1.034x
11 2007-05-31 … 2012-05-31 4.79% 0.60% 1.042x
12 2007-06-29 … 2012-06-29 6.36% 1.92% 1.044x
13 2007-07-31 … 2012-07-31 7.32% 2.69% 1.045x
14 2007-08-31 … 2012-08-31 7.19% 2.95% 1.041x
15 2007-09-28 … 2012-09-28 7.67% 3.20% 1.043x
16 2007-10-31 … 2012-10-31 6.85% 2.60% 1.041x
17 2007-11-30 … 2012-11-30 7.26% 3.45% 1.037x
18 2007-12-31 … 2012-12-31 7.17% 3.69% 1.034x
19 2008-01-31 … 2013-01-31 8.84% 5.85% 1.028x
20 2008-02-29 … 2013-02-28 9.66% 6.82% 1.027x
21 2008-03-31 … 2013-03-28 10.53% 7.73% 1.026x
22 2008-04-30 … 2013-04-30 10.73% 7.51% 1.030x
23 2008-05-30 … 2013-04-30 10.49% 7.81% 1.025x
24 2008-06-30 … 2013-06-28 10.66% 9.33% 1.012x
25 2008-07-31 … 2013-07-31 12.74% 10.48% 1.020x
26 2008-08-29 … 2013-07-31 12.82% 10.52% 1.021x
27 2008-09-30 … 2013-09-30 12.95% 11.48% 1.013x
28 2008-10-31 … 2013-10-31 16.81% 15.76% 1.009x
29 2008-11-28 … 2013-10-31 17.86% 17.46% 1.003x
30 2008-12-31 … 2013-12-31 17.91% 18.44% 0.995x
31 2009-01-30 … 2013-12-31 18.43% 20.64% 0.982x
32 2009-02-27 … 2014-01-31 18.72% 21.63% 0.976x
33 2009-03-31 … 2014-03-31 19.47% 20.60% 0.991x
34 2009-04-30 … 2014-04-30 20.88% 19.00% 1.016x
35 2009-05-29 … 2014-04-30 20.18% 18.32% 1.016x
36 2009-06-30 … 2014-06-30 19.58% 19.01% 1.005x
37 2009-07-31 … 2014-07-31 18.32% 17.39% 1.008x
38 2009-08-31 … 2014-08-29 18.73% 17.70% 1.009x
39 2009-09-30 … 2014-09-30 17.41% 16.64% 1.007x
40 2009-10-30 … 2014-09-30 17.68% 17.08% 1.005x
41 2009-11-30 … 2014-11-28 17.38% 16.82% 1.005x
42 2009-12-31 … 2014-12-31 17.05% 16.28% 1.007x
43 2010-01-29 … 2014-12-31 17.40% 17.23% 1.001x
44 2010-02-26 … 2015-01-30 16.24% 15.80% 1.004x
45 2010-03-31 … 2015-03-31 16.35% 15.40% 1.008x
46 2010-04-30 … 2015-04-30 16.65% 15.38% 1.011x
47 2010-05-28 … 2015-04-30 18.21% 17.09% 1.010x
48 2010-06-30 … 2015-06-30 17.24% 17.45% 0.998x
49 2010-07-30 … 2015-06-30 16.90% 16.43% 1.004x
50 2010-08-31 … 2015-08-31 15.48% 15.76% 0.998x
51 2010-09-30 … 2015-09-30 14.12% 13.61% 1.004x
52 2010-10-29 … 2015-09-30 14.08% 13.06% 1.009x
53 2010-11-30 … 2015-11-30 15.88% 15.09% 1.007x
54 2010-12-31 … 2015-12-31 14.53% 13.55% 1.009x
55 2011-01-31 … 2016-01-29 13.42% 11.90% 1.014x
56 2011-02-28 … 2016-01-29 12.78% 11.53% 1.011x
57 2011-03-31 … 2016-03-31 14.34% 12.90% 1.013x
58 2011-04-29 … 2016-04-29 13.71% 12.39% 1.012x
59 2011-05-31 … 2016-05-31 13.55% 12.94% 1.005x
60 2011-06-30 … 2016-06-30 14.48% 13.30% 1.010x
61 2011-07-29 … 2016-07-29 14.97% 14.52% 1.004x
62 2011-08-31 … 2016-08-31 14.95% 15.19% 0.998x
63 2011-09-30 … 2016-09-30 15.20% 16.32% 0.990x
64 2011-10-31 … 2016-10-31 12.23% 14.02% 0.984x
65 2011-11-30 … 2016-11-30 13.92% 14.66% 0.994x
66 2011-12-30 … 2016-12-30 13.64% 14.92% 0.989x
67 2012-01-31 … 2017-01-31 13.38% 14.63% 0.989x
68 2012-02-29 … 2017-02-28 13.40% 14.78% 0.988x
69 2012-03-30 … 2017-02-28 12.96% 14.43% 0.987x
70 2012-04-30 … 2017-04-28 12.95% 14.61% 0.985x
71 2012-05-31 … 2017-05-31 13.94% 15.98% 0.982x
72 2012-06-29 … 2017-05-31 13.13% 15.44% 0.980x
73 2012-07-31 … 2017-07-31 13.98% 15.43% 0.987x
74 2012-08-31 … 2017-08-31 14.17% 15.12% 0.992x
75 2012-09-28 … 2017-08-31 13.87% 14.77% 0.992x
76 2012-10-31 … 2017-10-31 15.33% 16.12% 0.993x
77 2012-11-30 … 2017-11-30 15.82% 16.79% 0.992x
78 2012-12-31 … 2017-12-29 15.50% 16.93% 0.988x
79 2013-01-31 … 2018-01-31 15.58% 17.57% 0.983x
80 2013-02-28 … 2018-02-28 14.45% 16.21% 0.985x
81 2013-03-28 … 2018-02-28 14.17% 15.81% 0.986x
82 2013-04-30 … 2018-04-30 13.39% 14.25% 0.993x
83 2013-05-31 … 2018-05-31 12.79% 14.57% 0.984x
84 2013-06-28 … 2018-05-31 13.16% 14.97% 0.984x
85 2013-07-31 … 2018-07-31 13.26% 14.83% 0.986x
86 2013-08-30 … 2018-07-31 14.04% 15.59% 0.987x
87 2013-09-30 … 2018-09-28 14.40% 15.84% 0.988x
88 2013-10-31 … 2018-10-31 11.33% 12.89% 0.986x
89 2013-11-29 … 2018-10-31 11.10% 12.60% 0.987x
90 2013-12-31 … 2018-12-31 10.56% 9.93% 1.006x
91 2014-01-31 … 2019-01-31 12.83% 12.37% 1.004x
92 2014-02-28 … 2019-02-28 12.36% 12.38% 1.000x
93 2014-03-31 … 2019-03-29 12.08% 12.76% 0.994x
94 2014-04-30 … 2019-04-30 12.09% 13.73% 0.986x
95 2014-05-30 … 2019-04-30 11.92% 13.54% 0.986x
96 2014-06-30 … 2019-06-28 12.66% 12.81% 0.999x
97 2014-07-31 … 2019-07-31 12.78% 13.30% 0.995x
98 2014-08-29 … 2019-07-31 12.58% 12.80% 0.998x
99 2014-09-30 … 2019-09-30 12.86% 12.70% 1.001x
100 2014-10-31 … 2019-10-31 12.36% 12.91% 0.995x
101 2014-11-28 … 2019-10-31 11.94% 12.60% 0.994x
102 2014-12-31 … 2019-12-31 12.21% 14.16% 0.983x
103 2015-01-30 … 2019-12-31 12.87% 14.85% 0.983x
104 2015-02-27 … 2020-01-31 12.10% 14.04% 0.983x
105 2015-03-31 … 2020-03-31 6.87% 8.56% 0.984x
106 2015-04-30 … 2020-04-30 8.94% 11.65% 0.976x
107 2015-05-29 … 2020-05-29 10.62% 12.61% 0.982x
108 2015-06-30 … 2020-06-30 11.17% 13.64% 0.978x
109 2015-07-31 … 2020-07-31 12.49% 14.60% 0.982x
110 2015-08-31 … 2020-08-31 13.97% 18.07% 0.965x
111 2015-09-30 … 2020-09-30 13.16% 17.05% 0.967x
112 2015-10-30 … 2020-10-30 11.21% 14.60% 0.970x
113 2015-11-30 … 2020-11-30 13.69% 17.43% 0.968x
114 2015-12-31 … 2020-12-31 14.84% 18.65% 0.968x
115 2016-01-29 … 2021-01-29 14.79% 19.26% 0.962x
116 2016-02-29 … 2021-02-26 14.24% 19.79% 0.954x
117 2016-03-31 … 2021-03-31 14.02% 19.42% 0.955x
118 2016-04-29 … 2021-03-31 14.12% 19.66% 0.954x
119 2016-05-31 … 2021-05-28 15.26% 20.42% 0.957x
120 2016-06-30 … 2021-06-30 14.20% 21.06% 0.943x
121 2016-07-29 … 2021-06-30 13.92% 20.63% 0.944x
122 2016-08-31 … 2021-08-31 15.50% 21.75% 0.949x
123 2016-09-30 … 2021-09-30 12.86% 20.22% 0.939x
124 2016-10-31 … 2021-10-29 14.82% 22.50% 0.937x
125 2016-11-30 … 2021-11-30 13.13% 21.87% 0.928x
126 2016-12-30 … 2021-11-30 13.01% 21.75% 0.928x
127 2017-01-31 … 2022-01-31 14.37% 20.17% 0.952x
128 2017-02-28 … 2022-02-28 13.00% 18.51% 0.954x
129 2017-03-31 … 2022-03-31 13.88% 19.46% 0.953x
130 2017-04-28 … 2022-03-31 13.92% 19.46% 0.954x
131 2017-05-31 … 2022-05-31 12.22% 15.59% 0.971x
132 2017-06-30 … 2022-06-30 10.02% 13.08% 0.973x
133 2017-07-31 … 2022-07-29 10.59% 15.16% 0.960x
134 2017-08-31 … 2022-08-31 9.88% 13.72% 0.966x
135 2017-09-29 … 2022-08-31 9.61% 13.56% 0.965x
136 2017-10-31 … 2022-10-31 9.49% 11.86% 0.979x
137 2017-11-30 … 2022-11-30 10.67% 12.52% 0.984x
138 2017-12-29 … 2022-11-30 10.83% 12.46% 0.986x
139 2018-01-31 … 2023-01-31 9.32% 11.01% 0.985x
140 2018-02-28 … 2023-02-28 9.08% 11.03% 0.982x
141 2018-03-29 … 2023-02-28 9.41% 11.72% 0.979x
142 2018-04-30 … 2023-04-28 9.91% 13.01% 0.973x
143 2018-05-31 … 2023-05-31 9.36% 12.95% 0.968x
144 2018-06-29 … 2023-05-31 9.11% 13.01% 0.965x
145 2018-07-31 … 2023-07-31 10.43% 14.67% 0.963x
146 2018-08-31 … 2023-08-31 9.74% 13.51% 0.967x
147 2018-09-28 … 2023-08-31 9.71% 13.56% 0.966x
148 2018-10-31 … 2023-10-31 9.45% 12.60% 0.972x
149 2018-11-30 … 2023-11-30 10.14% 14.58% 0.961x
150 2018-12-31 … 2023-12-29 11.56% 17.26% 0.951x
151 2019-01-31 … 2024-01-31 11.84% 16.27% 0.962x
152 2019-02-28 … 2024-01-31 11.85% 15.94% 0.965x
153 2019-03-29 … 2024-03-28 12.57% 17.50% 0.958x
154 2019-04-30 … 2024-04-30 11.22% 15.50% 0.963x
155 2019-05-31 … 2024-05-31 11.96% 18.12% 0.948x
156 2019-06-28 … 2024-06-28 10.80% 17.99% 0.939x
157 2019-07-31 … 2024-07-31 11.68% 17.70% 0.949x
158 2019-08-30 … 2024-08-30 13.66% 18.41% 0.960x
159 2019-09-30 … 2024-09-30 13.61% 18.65% 0.958x
160 2019-10-31 … 2024-10-31 13.02% 17.87% 0.959x
161 2019-11-29 … 2024-11-29 13.98% 18.64% 0.961x
162 2019-12-31 … 2024-12-31 12.42% 17.62% 0.956x
163 2020-01-31 … 2025-01-31 13.73% 18.07% 0.963x
164 2020-02-28 … 2025-02-28 15.72% 19.00% 0.972x
165 2020-03-31 … 2025-03-31 17.38% 19.24% 0.984x
166 2020-04-30 … 2025-04-30 15.54% 16.49% 0.992x
167 2020-05-29 … 2025-04-30 14.43% 15.80% 0.988x
168 2020-06-30 … 2025-06-30 13.30% 18.19% 0.959x
169 2020-07-31 … 2025-07-31 11.41% 17.87% 0.945x
170 2020-08-31 … 2025-08-29 11.76% 16.69% 0.958x
171 2020-09-30 … 2025-09-30 12.12% 18.57% 0.946x
172 2020-10-30 … 2025-09-30 12.77% 19.43% 0.944x
173 2020-11-30 … 2025-11-28 11.89% 17.77% 0.950x
174 2020-12-31 … 2025-12-31 10.68% 16.92% 0.947x
175 2021-01-29 … 2025-12-31 11.18% 17.20% 0.949x
176 2021-02-26 … 2026-01-30 11.21% 17.04% 0.950x
177 2021-03-31 … 2026-03-31 10.20% 14.07% 0.966x
178 2021-04-30 … 2026-04-30 9.90% 16.03% 0.947x
179 2021-05-28 … 2026-04-30 9.68% 16.22% 0.944x
Notes
mode=explore; family=recovery-quality-contrarian-52w-hybrid This hybrid is a stock-level relay between three sleeves rather than a flat blend: leadership repair, off-high rebound, and defensive shelter. The regime picks the default sleeve, but each stock can be promoted or demoted when discount, repair, durability, and crowding conflict. In strong tapes, repaired laggards can graduate into leaders only after trend repair and quality confirmation; in mixed tapes, deep-off-high names must prove both business durability and tradability before the contrarian sleeve takes over; in stressed tapes, the model defaults to shelter but still admits selective fallen-angel recoveries when stability and quality are unusually strong. Deliberate metric coverage: momentum active via 3m, 6m, 12m, and 12_1 metrics; trend/recovery active via both 200d and 52w-high distance with opposite signs by sleeve; volatility active via realized 3m vol; liquidity active via share volume, dollar volume, and trading-days continuity; income active via dividend yield and dividend_ttm in the shelter sleeve; valuation active via PE and PEG; growth active via forward EPS plus operating-income and free-cash-flow growth; quality active via operating and free-cash-flow margins; size active via market_cap as a stability tilt in defense and a modest contrarian tilt in rebound. Deliberate weight-0 metrics this run: return_1m_pct, forward_pe, revenue_growth_pct, eps_growth_pct, shares_outstanding, close, adj_close, high_52w, ma_200d, eps_ttm, revenue_ttm, operating_income_ttm, free_cash_flow_ttm.
Lesson notes
#839 · degrade · relative_return Δ -0.4038 · parent exp_1118 · Jul 21, 2026 · auto/explore; benchmark CAPW_UNIV
explore/recovery-quality-contrarian-52w-hybrid: relative_return 0.9872x (delta -0.4038 vs exp_1118); win-rate 32.4022%, worst-window 0.928227, dispersion 3.4467%.
Monthly picks — top stocks selected each month (whole timeline)
timeline — 240 months · top 15 each
Month 123456789101112131415
2006-07-31 AIG BAC C ABT BRK-B CL GE AMGN AFL AXP ALL JNJ CAH ACN AEP
2006-08-31 AIG BAC C AFL ABT BRK-B GE CL AXP JNJ AIZ CAH ALL ETR EXC
2006-09-29 AIG BAC C ABT BRK-B AXP AFL GE AIZ CL AMGN JNJ ALL BAX CAH
2006-10-31 AIG BAC C ABT BK AXP BNY BDX GE BRK-B AIZ CL AFL AMGN JNJ
2006-11-30 AIG BAC C BK BNY AFL AXP ABT GE BRK-B AMGN CL ALL JNJ BDX
2006-12-29 AIG BAC AFL C BMY ABT CL GE CLX AXP APD ALL BRK-B BDX EXC
2007-01-31 AIG BAC AFL C CL ABT CLX AXP BRK-B GE JNJ AN AVY BDX DD
2007-02-28 AIG BAC ABT CL AFL BDX C ACGL BRK-B BAX CLX JNJ AVY GE AN
2007-03-30 AIG BAC GE CL BDX BRK-B C BAX AFL AVY ACGL ALL BK CLX CAH
2007-04-30 AIG BAC BAX GE CL BRK-B BDX AVY CVX ALL CLX AFL BK BNY ACGL
2007-05-31 AIG BAC BAX GE CL AFL ALL BDX CVX BRK-B C AVY BNY COP APD
2007-06-29 AIG BAC C AFL CL GE ALL BDX BAX CVX AVY BRK-B CAH APD CLX
2007-07-31 AIG BAC C CAH BDX CL GE BRK-B CLX ELV ACGL APD PFE ASH DIS
2007-08-31 AIG BAC ADM CAH BIIB CL BDX BRK-B C ACN GE ELV CVX AET COP
2007-09-28 AIG BAC ADM BDX CL BRK-B CAH CVX C AET GE COP APA ELV BAX
2007-10-31 AIG BAC ADM CL CVX BRK-B CAH BDX COP GE AET CLX ELV BAX AVY
2007-11-30 AET CL BRK-B GE BDX CLX CVX ELV ALL COP ADM BAX CAH BA ATO
2007-12-31 AET CL BRK-B GE CLX CAH ELV CVX BDX BAX COP AES ALL BA ACGL
2008-01-31 AET CL BAX BRK-B GE CVX CLX CAH BDX COP ELV AFL ATO APD BA
2008-02-29 ABT CVX GE AFL CL AET BAX BDX BRK-B CAH BA D CLX ELV ACGL
2008-03-31 ABT AFL CVX CL BAX BDX GE BRK-B CLX D ACGL MO A ATO EIX
2008-04-30 ABT AFL CVX BAX BRK-B COP ALL CL BDX BA D ACGL CLX CAH ATO
2008-05-30 ABT AFL CVX COP BAX CL BRK-B BA D ACGL BDX AEP ALL ATO IBM
2008-06-30 ABT BAX AFL CVX COP BRK-B ALL D ACGL CL AEP BDX DD AIZ APD
2008-07-31 ABT BAX BRK-B BDX D APD ALL AEP CL ACGL CLX CAH A CVX DD
2008-08-29 BAX D BDX BRK-B A ABT APC ALXN ADS IBM COP CVX AYE ED BDK
2008-09-30 ABT BAX BDX D CL BRK-B CAH CLX AEP A DGX IBM CRL ED COR
2008-10-31 ABT BAX BRK-B BDX CL D CLX BIIB ACN AON CAH ACGL CHD IBM BF-B
2008-11-28 ABT BAX BDX BRK-B D CL CLX ACN BIIB AON BA CAH CHD ACGL BF-B
2008-12-31 ABT BAX BDX ACN BRK-B CL CLX BIIB AON BMY BA ACGL CHD IBM CAH
2009-01-30 ABT BAX ACN BDX CL CLX BA AON BRK-B CAH BMY ACGL BIIB AEP CHD
2009-02-27 ABT BAX ACN CVX BDX CL CLX CAH BRK-B ETR BMY AEP BIIB COR CHD
2009-03-31 ABT CVX BAX BMY BDX CL ACN CLX BIIB AEP BALL ADM JNJ CHD AMGN
2009-04-30 ABT CVX BAX BMY BDX CL ACN AEP BIIB CLX BALL JNJ IBM AMGN ADM
2009-05-29 ABT CVX BAX BMY BDX CL AEP ACN CLX BIIB IBM JNJ BALL AMGN CMS
2009-06-30 BMY CVX ABT BDX ACN CL BAX IBM AMGN CLX JNJ BRK-B BIIB ATO CHD
2009-07-31 BMY ABT CVX BAX ACN CL BRK-B CLX IBM JNJ BDX AWK AAP BIIB AMGN
2009-08-31 BMY ABT CVX BAX CL IBM JNJ ACN CLX BRK-B AWK ADP AAPL CHD ATO
2009-09-30 BMY ABT BAX CVX CL ACN IBM JNJ CLX BIIB APD AAPL ATO CAH AWK
2009-10-30 BMY ABT CVX CL BAX AMGN ACN IBM JNJ BDX ACGL CLX BRK-B ADP ATO
2009-11-30 ABT BRK-B ACN CL BDX BMY CVX IBM ACGL JNJ BAX CLX ADP CAH AEP
2009-12-31 ABT ACN BRK-B CVX BDX ACGL BMY CL CLX IBM JNJ BAX CAH ADP ADM
2010-01-29 ABT ACN AMGN CVX ACGL IBM BDX CLX CL BMY BAX JNJ ADP BIIB ADM
2010-02-26 ACN CVX ABT JNJ BMY CL ACGL BAX BDX CLX ADP LMT AEP D MCD
2010-03-31 BMY ACN CVX BAX JNJ CL BDX ACGL AEP CLX ED LLY IBM BIIB CB
2010-04-30 ACN CL BRK-B BDX JNJ CVX PG BMY ACGL CLX GIS AEP LLY IBM K
2010-05-28 JNJ ABT CVX ACN BDX BMY CL LLY AEP BRK-B IBM CLX ACGL LMT ED
2010-06-30 BMY BDX JNJ CL ABT LLY ADM CLX BRK-B ACGL BIIB ACN LMT IBM ED
2010-07-30 BMY ABT BDX JNJ ADM COP CL LLY CLX BRK-B ACGL ACN AET LMT T
2010-08-31 BMY CVX BAX BRK-B COP JNJ BDX D LLY CL ABT CLX IBM APD ACGL
2010-09-30 BMY ACN CVX BRK-B COP APD D JNJ LLY BDX CLX CL ED ABT GE
2010-10-29 BMY COP BRK-B ACN CVX CL D BDX APD ABT CLX BAX JNJ ACGL ED
2010-11-30 BMY D CVX BRK-B ACN COP BDX CL JNJ LLY CLX ACGL BAX IBM INTC
2010-12-31 BMY D BRK-B CVX JNJ COP ACGL LLY CL BDX CLX CHRW IBM AAP AAPL
2011-01-31 D CVX BRK-B JNJ LLY CL COP APD BDX ACGL CLX EXC AAPL CNP CHRW
2011-02-28 BMY CVX BRK-B D JNJ CL COP LLY ACGL APD CMS AAPL CNP EXC LMT
2011-03-31 D CVX COP LLY CL BRK-B BMY ACGL BDX AAPL APD CMS ACN BIIB ATO
2011-04-29 D CVX BRK-B LLY CL COP JNJ ACGL BDX BMY AAPL BXP GE AVB IBM
2011-05-31 D BRK-B CVX BDX CL LLY AAPL BMY CLX JNJ LMT AVB BALL ACGL APD
2011-06-30 D BRK-B CVX COP BDX AAPL LLY CL CB BAX IBM EXC CNP BMY DGX
2011-07-29 D COP CVX BRK-B GE CL BAX LLY BDX JNJ CAH EXC AAPL BMY CNP
2011-08-31 COP CVX CL DUK GE AAPL BDX BAX LLY AAP APD AVB CAH EXC BRK-B
2011-09-30 COP CVX AAPL GE CL DUK BDX BAX AAP BIIB AVB LLY APD EXC CAH
2011-10-31 COP CVX AAPL DUK GE CL BAX BDX AAP LLY EXC BMY APD CAH CMS
2011-11-30 COP AAPL CVX GE CL LLY AAP BAX BDX EXC AWK DUK ACN BRK-B ACGL
2011-12-30 COP AAPL CVX CL GE BRK-B LLY CLX AAP BDX BAX DLTR ACGL AET EXC
2012-01-31 COP CL AAPL CVX GE BRK-B CLX AAP BDX LLY BIIB DLTR DUK AWK EXC
2012-02-29 COP AAPL CL BRK-B CVX GE CLX BDX BAX BMY BIIB ACGL LLY ADM ECL
2012-03-30 COP CVX BRK-B GE CL BAX ACN CLX LLY AAPL BDX APD CMS ECL EXC
2012-04-30 COP CVX BRK-B GE CL EXC ACN BMY CLX LLY BDX CMS ACGL AEP AVB
2012-05-31 COP CVX BRK-B CL BDX BMY CLX LLY EXC GE ACGL AEP FE BAX CAH
2012-06-29 COP BRK-B CVX CL BDX CLX LLY BLK GE ACGL AEP CMS BAX AVB FE
2012-07-31 COP BRK-B CVX AAPL CL BDX BAX GE BMY CLX BLK LLY CMS AVB AEP
2012-08-31 COP BRK-B CVX GE CL BDX CLX AVB BAX CMS CNP BXP APD BLK ATO
2012-09-28 COP BRK-B CVX BDX GE BXP BAX AVB CLX CL APD ARE ACGL BIIB BLK
2012-10-31 COP BRK-B CVX BDX GE BAX BXP ACGL CL CLX AVB ARE ADM BG AFL
2012-11-30 BRK-B COP CVX GE CL AVB BXP CLX BDX CB BAX CAH ADM BG ARE
2012-12-31 COP BRK-B CL BXP GE CVX CB CLX AVB AWK CAH BG AFL BDX ARE
2013-01-31 BRK-B COP APD CVX BXP CAH CL GE BG CLX BDX DOC ARE CHD ACN
2013-02-28 CVX COP BAX BRK-B BDX BXP CLX GE ARE CAH CL ACN DOC APD CMS
2013-03-28 CVX COP BRK-B BAX GE BDX BXP CLX COST ARE ACN DOC CMS CL CB
2013-04-30 CVX COP BAX BRK-B COST GE BDX BXP CMS ARE EXC CB CLX DOC APD
2013-05-31 COP CVX BRK-B GE COST BXP ACGL BDX CB APD MO ACN AWK BAX CL
2013-06-28 COP CVX BRK-B APD GE COST BDX BAX CAH ACGL DUK AWK AFL MO COR
2013-07-31 COP CVX BRK-B AFL COST GE AAP BG BDX AME BALL BAX MO CLX DUK
2013-08-30 COP BRK-B BDX BAX COST ALB CL BG CLX GE AFL CB ESRX JNJ ACGL
2013-09-30 COP BRK-B CL BDX ALB COST CLX BG ACGL CAH CB GE AFL PFE AAP
2013-10-31 COP BRK-B BDX COST ACGL CLX CL BG AFL JNJ ALB CB GE CMS A
2013-11-29 COP BRK-B ACN AFL BDX JNJ ACGL BG MO COST CL CLX DUK BUD COR
2013-12-31 BRK-B AFL BAX MO BG ACGL CL BDX BUD ACN COR CSX GE AWK DLTR
2014-01-31 BRK-B BAX AFL CL BDX JNJ MO BG DUK AWK COR CLX LLY ESRX AME
2014-02-28 BRK-B BAX AFL CL AVB CB JNJ CLX MO DUK BDX BG COR ESRX AWK
2014-03-31 COP BRK-B AFL CL AVB GE BAX CB T BDX CLX DUK D BXP ARE
2014-04-30 COP BRK-B GE CL AVB ADM CB BAX CLX AFL T VZ DUK ACGL BXP
2014-05-30 COP GE BRK-B AVB CL VZ CB T BDX ACGL BAX CLX BXP ADM AFL
2014-06-30 COP GE BRK-B BAX ACN AVB T VZ CB CL ACGL BDX BXP AWK AIV
2014-07-31 COP ACN BRK-B GE BAX T VZ CB BDX AVB AIV ACGL ASH ARE AFL
2014-08-29 ACN BAX GE BRK-B COP T VZ AFL BDX CB ACGL APTV IBM AVB COR
2014-09-30 ACN GE T BRK-B BAX AFL ACGL BDX VZ CB IBM BK CSX BNY COR
2014-10-31 ACN GE AFL BRK-B CL T BAX VZ ACGL AVB CB ARE CHD BK BNY
2014-11-28 ACN BRK-B GE AFL CL T ACGL VZ BK BNY CB AVB BAX BXP COF
2014-12-31 GE BRK-B AFL CB AVB CL BXP ACN ACGL BAX BK BNY CLX ARE ASH
2015-01-30 GE BRK-B AFL T AVB ACGL VZ CLX BXP BAX CB BX AIZ ASH JNJ
2015-02-27 GE BRK-B BAX AFL COR T BX CLX ACGL ASH VZ CB AVB CAH JNJ
2015-03-31 GE BRK-B BAX AFL COR ACGL CLX BX BDX JNJ BMS CB CHD BF-B BF.B
2015-04-30 BRK-B AFL BAX CL BK BNY COR BX ACGL CLX JNJ AMG CB APD CHD
2015-05-29 BRK-B BAX AFL ADM BK BNY CL COR ACGL JNJ COST BX CLX CB BDX
2015-06-30 ACN BRK-B CL BDX CB COF AFL BK BNY COR COST ADM ACGL CVX CMI
2015-07-31 GE ACN BRK-B BDX CL BLK COST BK BNY ADM ACGL CMI CB JNJ CLX
2015-08-31 BRK-B BDX GE ACN AVB ADM CL BLK CB ACGL COST BF-B BF.B AWK ATO
2015-09-30 BRK-B ACN AVB ACGL ADM CL BDX AWK CB BLK BF-B BF.B GE IBM CLX
2015-10-30 BRK-B ACN AVB ACGL BDX CLX DUK IBM AFL AWK BF-B BF.B COR CL ATO
2015-11-30 BRK-B ACN AFL AVB ACGL COR CLX CL CB AWK JNJ D CHD APD AIZ
2015-12-31 BRK-B COR BUD BDX ACGL GE AFL CL CLX APD ACN CHD AVB CB BXP
2016-01-29 BRK-B AFL BAX GE COR ACGL CLX BUD ASH AME BDX ACN EIX AWK CB
2016-02-29 BRK-B IBM AFL ACGL BUD COR CL AME VZ GE DUK T BDX CMS AVB
2016-03-31 BRK-B AFL VZ IBM CL ACGL CMS AMGN T BDX DUK AVB GE CLX AME
2016-04-29 BRK-B CL AFL VZ GE APD BDX ATO T CHD BAX AMGN DUK ABBV CMS
2016-05-31 BRK-B AFL CL BDX APD ABBV ACN VZ T CLX ACGL BAX JNJ GE CHD
2016-06-30 BRK-B CL AFL ACN BDX AMGN ABBV CLX T VZ BXP ARE AWK APD AVB
2016-07-29 BRK-B CL AFL BDX IBM ABBV VZ CLX AMGN AWK T AVB BSX ACN CMS
2016-08-31 BRK-B ABBV CL AMGN IBM BDX AFL CLX T AVB ACN BXP VZ CME AWK
2016-09-30 ABBV BRK-B AFL APD IBM CL AMGN CME ACN BLK BDX DD CLX AET GOOG
2016-10-31 BRK-B APD AFL IBM AET CL ACN DD CME BLK GOOG CLX JPM CHRW CSCO
2016-11-30 BRK-B APD IBM AFL DD ACN CL CHRW ACGL T ABBV BK BNY AME CSCO
2016-12-30 BRK-B APD IBM AFL CL DD ACN ACGL T CHRW BLK FDX ABBV CLX DHR
2017-01-31 BRK-B AFL IBM APD ACGL ABBV ACN T DD AVB CHRW BLK JNJ BK BNY
2017-02-28 BRK-B ABBV IBM APD AFL BDX ACGL BAX ACN T AVB BLK CME DHR GOOG
2017-03-31 BRK-B ABBV IBM BDX AFL BAX ACN ACGL BLK MO DHR JNJ APD AME CHRW
2017-04-28 ABBV BRK-B AFL APD ACGL ACN BK BAX BNY MO BLK BDX CHD CL ECL
2017-05-31 BRK-B AFL ABBV AET AVB BK BNY APD AVY CB ACN BAX MO EIX ECL
2017-06-30 BRK-B AET AFL ABBV ACN BK BNY APD AMGN AVB ARE CB CMS AVY MO
2017-07-31 BRK-B AET ACN BDX APD ABBV AFL BK BNY BSX AME ARE CB CTSH CMS
2017-08-31 BRK-B AET ACN BDX CL ABBV AFL BSX CB ARE AVB BX CMS APD AMGN
2017-09-29 BRK-B ACN AFL CL AET BDX BAX AVB BSX APD AWK ARE BX CMS EIX
2017-10-31 BRK-B ACN AFL AVB APD BAX BUD AME AWK ARE BDX CL CMI AIV BX
2017-11-30 ACN BRK-B AFL APD AVB ADS ARE BUD AME AEP AWK ALXN AMGN CTSH ABMD
2017-12-29 ACN BRK-B AFL APD AME AEP BUD BK AVB BNY BAX CTSH ADS BLK ECL
2018-01-31 ACN BRK-B AET APD BUD AME IBM CME CTSH ECL AMGN BAX DD ATO GOOG
2018-02-28 AET ACN IBM CTSH BUD CL AME APD BX AMGN CMS ACGL CMI ECL ATO
2018-03-29 AET CL AEP BUD ADM CTSH CMS AVB ATO COST ECL AWK BX EXC ACGL
2018-04-30 AET AFL ADM CL AEP AWK CMS AVB D BUD COST ATO CTSH EXC AIV
2018-05-31 AET AFL ADM AVB BDX CL CMS BRK-B APD AWK AEP AIV CVX BALL ATO
2018-06-29 ADM AET AFL BRK-B AVB APD BDX EXC BLK CL AEP ATO ACN AWK CVX
2018-07-31 ADM AET AFL BDX APD BRK-B AVB CL BLK ACN IBM EXC AIV BAX ECL
2018-08-31 AET ADM BDX AFL BRK-B AVB ACN BAX CL CME APD ELV EVHC EXC AIV
2018-09-28 ACN AET ADM BDX AFL BRK-B APD BAX AVB ACGL CL ELV AIV ATO ECL
2018-10-31 AET ADM AFL BRK-B ACN BDX APD CVX CME CNP AVB BK BNY AWK AEP
2018-11-30 AET ADM AFL ACN APD BRK-B CVX BK BNY CME CNP BDX AVB AIV EXC
2018-12-31 AET ADM CME BRK-B APD CNP BK CVX BNY BDX ESRX AVB EXC CMS AFL
2019-01-31 ADM CME BRK-B CVX CL AFL CNP BK BNY ACN AVB APD ESRX CMS EXC
2019-02-28 CL CVX CME ADM BRK-B AFL BAX BK AVB CNP BNY ACN APD AWK EXC
2019-03-29 AFL CVX CL AVB BAX BRK-B ACN AWK APD ATO CME ADM AIV PEP CMS
2019-04-30 AFL APD ACN BRK-B ATO CVX IBM AWK CL CME AVB CMS ECL AME AES
2019-05-31 AFL BRK-B ACN APD ATO AWK AVB CVX CME IBM BAX CL AMGN ECL EXC
2019-06-28 ACN BRK-B AFL APD AWK CVX BAX CME IBM CL AMGN AVB PEP BR AME
2019-07-31 ACN BRK-B AFL CVX BAX BDX ADM AVB AWK BSX APD JPM PEP ATO IBM
2019-08-30 BRK-B ACN CVX APD AVB AWK BAX AFL ATO CMS AIV ARE IBM CNP CL
2019-09-30 BRK-B CVX ACN AVB AWK ATO AFL ARE BAX APD BXP AIV CMS ACGL ALLE
2019-10-31 BRK-B CVX AVB ARE AFL AWK ACN ATO AIV CL BMY CMS CLX DTE BXP
2019-11-29 BRK-B AFL ACN AVB ARE CVX ATO AIZ AIV AWK CL BMY IBM JPM AMGN
2019-12-31 BRK-B ACN AFL AVB ARE ATO CL AMGN AME AIV PEP CLX JPM BK AWK
2020-01-31 ACN BRK-B AFL ATO AME ARE AVB CLX CTSH PEP BAX JPM DTE FE BLK
2020-02-28 BRK-B ACN AWK ATO AME CHD BAX AVB A CLX ARE HET CSX CMS ANSS
2020-03-31 ABBV BRK-B BDX CLX AKAM CL CHRW CHD EA A ACN BIO ANSS IBM ABMD
2020-04-30 ABBV BRK-B BDX CLX AKAM CL CHRW EA CHD A ANSS ABMD IBM BIO MO
2020-05-29 ABBV BRK-B BDX CLX AKAM CL CHRW CHD EA A BIO IBM ANSS ADS ABMD
2020-06-30 ABBV BRK-B AKAM CLX BAX BDX CL EA ANSS CHD A ABMD CHRW BR AMGN
2020-07-31 ABBV CL CLX ANSS ABMD AWK BRK-B ADS A ATO CHD BR ABC BAX APD
2020-08-31 ABBV CL ANSS ABMD ALXN A ATO BRK-B ABC BLK BR CMS ACN AZO IBM
2020-09-30 ABBV BRK-B IBM CL CME ARE ANSS ABMD ALXN A ATO BMY ABC BLK ACN
2020-10-30 BRK-B ABBV AAP CL ARE ABMD ANSS ATO AWK ALXN BALL BMY ABC CMS AZO
2020-11-30 BRK-B ABBV AAP BDX CL BAX AWK ARE ABMD ANSS D JNJ ALXN AZO A
2020-12-31 BRK-B ABBV BDX CL BAX AAP AWK ABMD ARE ANSS ALL A ACN BLK ABC
2021-01-29 BRK-B ABBV BDX CL COST A ABMD AMGN ANSS ACN AWK CHD ALL ABC BLK
2021-02-26 BRK-B ABBV CL BDX A ANSS ABMD ACN ALL ABC PGR BLK JNJ BMY BF-B
2021-03-31 BRK-B ACN BMY BAX CL AMGN ARE AFL JPM PGR ALL CHD ABMD AVB ANSS
2021-04-30 ACN BRK-B BAX CL AFL ARE COST ADM BMY IBM ABMD JPM AVB PGR ANSS
2021-05-28 BRK-B ACN CL BAX AFL ADM ARE COST BMY APD CME AME IBM JPM PG
2021-06-30 ACN BRK-B ABMD CL BAX ANSS APD AKAM COST AVB A AME ALXN JPM PG
2021-07-30 ACN BRK-B ABMD ANSS APD AKAM A AMGN COST ABC ALXN BDX BMY ADS CL
2021-08-31 ACN ABMD ANSS A BRK-B ABC ADS ATVI ABBV BLL CDAY COST DGX GILD JNJ
2021-09-30 ACN BRK-B ABMD BMY APD ARE BDX CL AME ANSS GILD A COST CME IBM
2021-10-29 BRK-B ACN CL AME ARE AVB C AFL BDX ABMD APD A GILD ALL AIZ
2021-11-30 BRK-B ACN APD BDX CL GILD CVX ARE JPM AMCR CME AME AVB AIZ AFL
2021-12-31 BRK-B APD CVX GILD CL JPM ARE ABBV BDX AMCR CME ADM BAX AME BLK
2022-01-31 BRK-B GILD APD CL BDX BAX CVX ABBV JPM AFL CME AMCR BLK AVB ATO
2022-02-28 BRK-B GILD BAX CL ADM CVX BDX AFL CME APD AMCR ATO JPM AWK BMY
2022-03-31 BRK-B ABBV GILD BDX BAX CL AFL ATO CVX AME AVB AWK GS EXC ACGL
2022-04-29 BRK-B ABBV GILD CL ATO GS AME AFL ARE BDX AWK CVX COR AIZ CMS
2022-05-31 BRK-B ABBV BDX AFL CL GS AME APD ATO AIZ CVX AWK ACGL CNP GILD
2022-06-30 BRK-B ABBV CL BDX AFL ATO AIZ APD AME ACGL GS CVX AVB JPM GILD
2022-07-29 BRK-B ABBV BDX CL AFL ATO ACGL AIZ AME APD CAH CME GILD CSX GS
2022-08-31 BRK-B CL ABBV AMGN BDX AFL CME ATO JPM ACN ACGL BF-B BF.B BSX AZO
2022-09-30 BRK-B AFL CL BDX ACN AMGN ABBV CME BF-B BF.B AME JPM GS CVX APD
2022-10-31 BRK-B CL AFL ACN BSX ABBV CME BDX AMGN CVX CHD ELV GS AME BF-B
2022-11-30 BRK-B CL CVX CME AFL ABBV AMGN BSX GS AME ADM BDX COR CAH EOG
2022-12-30 BRK-B CL CVX CME BSX AMGN AFL ABBV GS COR BDX AME BIIB CHD ADM
2023-01-31 BRK-B ABBV ACGL AMGN AFL CVX BSX CL COR JPM EOG BDX GS BK BNY
2023-02-28 BRK-B AMGN BSX ABBV BDX CVX CL BK JPM CME ACGL AFL BNY BLK ATO
2023-03-31 BRK-B BSX BDX AMGN CVX ABBV CL BLK ADM AME BIIB CME AMCR COR BKNG
2023-04-28 BRK-B CVX BSX BDX AMGN CL BLK AVGO AME BF-B BF.B ABBV ADM AMCR CME
2023-05-31 BRK-B BDX CVX AMGN CL BSX CME EOG AWK BIIB COR EA CHD APD BF-B
2023-06-30 BRK-B CVX CL BDX COR ACN EOG AWK GS BSX CME BLK EA CSX FISV
2023-07-31 BRK-B CL CVX AFL COR AME ACN CHD EOG CAH COP BSX AWK BIIB BLK
2023-08-31 BRK-B CL ACN AME CVX COR JPM AMP ATO EOG BLK CHD COP AFL AMGN
2023-09-29 BRK-B AME CL CME CVX AFL JPM BIIB COR ACN AMP BLK CHD AVB ATO
2023-10-31 BRK-B AFL BDX CME ACN COR CL AME JPM BLK ADM BIIB C CBOE ABBV
2023-11-30 BRK-B AFL AKAM ACN ADM CL CME AME COR JPM JNJ IBM CSX BK CVX
2023-12-29 ACN BRK-B AKAM AFL AME COR CL IBM JPM JNJ CME CSX ATO ELV BK
2024-01-31 BRK-B ACN AKAM CVX CL AME JPM BSX AFL JNJ CSX AMP BK BNY ELV
2024-02-29 BRK-B ACN BSX AMP CL CSX AME JNJ JPM BK BNY ELV AVY BLK ATO
2024-03-28 BRK-B AMP CL JNJ AME BSX CSX ELV JPM BK BNY ACGL BLK AVY FISV
2024-04-30 BRK-B CL AME AMP CSX BDX BK BNY ELV CME ATO BRO COR AVY CHD
2024-05-31 BRK-B CL AMP JNJ AFL BK APD COR BNY AVY ATO BDX BLK ECL CHD
2024-06-28 BRK-B CL AFL JNJ BSX AMP BLK CME ATO AVY CSX AM CHD AVB BK
2024-07-31 BRK-B AFL CL BSX CME BLK IBM JNJ AVB ATO AM BDX CHD MO COP
2024-08-30 BRK-B JNJ CL CME BLK BSX ATO BDX AFL IBM AVB COR COP CHD DUK
2024-09-30 BRK-B JNJ CL CME BSX BLK BDX ATO AFL AVB COR IBM ACGL CMS AWK
2024-10-31 BRK-B BSX JNJ BDX CME CL ATO BLK BK BNY AFL AVB CLX CMS AMP
2024-11-29 BRK-B BSX CME CVX BLK BK ATO BNY AFL CLX ALLE BDX CL BR CMS
2024-12-31 BRK-B CVX BSX CME BDX ALLE BK BLK BNY CLX ATO AVY CL CMS BR
2025-01-31 BRK-B APD BSX CME CVX BDX ALLE CLX BLK CL ATO COR CMS ECL BR
2025-02-28 BRK-B AME BSX CVX CAH CME AMCR COR BR CMS AVB CSX CPRT JPM BRO
2025-03-31 BRK-B CME AME CAH AFL COR BDX BRO AMCR AVB ATO CPRT BR CMS APD
2025-04-30 BRK-B CME COR ATO CAH BDX AMCR ACN CNP AWK CMS AFL CHD CL EXC
2025-05-30 BRK-B CME ATO COR CAH AMCR CL CNP BUD ACN CLX AFL JNJ CMS ECL
2025-06-30 BRK-B CME ATO CL AMCR CNP CAH COR BUD CMS JNJ AFL ACN ADSK AWK
2025-07-31 BRK-B BK BNY BSX APD CL AFL CME ATO AME JPM AMCR DLR GS ECL
2025-08-29 BRK-B BK BNY AFL CVX BSX CME AME APD GS ATO CL CTVA CMS JPM
2025-09-30 BRK-B BK BNY BSX AFL CME CVX AME CL ATO AMGN GS APD CMS AEP
2025-10-31 BRK-B AFL BSX BK CME BNY CL ATO CNP CMS AMGN JNJ JPM AM AVB
2025-11-28 BRK-B AFL CME ADSK ATO BK BNY CL CNP AVB BSX AMCR BR CMS BDX
2025-12-31 BRK-B AFL ATO ACGL BK EA BNY CME ADSK AVB CSX CNP BR JNJ CMS
2026-01-30 BRK-B AFL ACGL ATO BK BNY EA CME AVB AIZ CNP CMS ALLE AEP CSX
2026-02-27 BRK-B AFL AME ATO ACGL EA CME CSX CMS BHF CNP AWK AIV CL ECL
2026-03-31 BRK-B AFL ATO ACGL EA CME AME CMS CNP AIV BHF JNJ ALL AVB AM
2026-04-30 BRK-B AFL ATO CME EA APD ACGL JNJ ALL CNP CMS AIV AMGN BDX BHF
2026-05-29 BRK-B AFL BK BNY APD ATO AMGN ACGL ALL EA AIV EQIX AWK JNJ AMP
2026-06-26 BRK-B APD AFL BK AES ATO BNY AMGN ACGL EA AIV AWK AMP EQIX AIZ
Scoring script (python)
FORMULA_NAME = "Recovery Quality Contrarian 52-Week Hybrid (Relay Arbitration, v1130)"
LOGIC_VARIANT_COUNT = 3
NOTES = """mode=explore; family=recovery-quality-contrarian-52w-hybrid
This hybrid is a stock-level relay between three sleeves rather than a flat blend: leadership repair, off-high rebound, and defensive shelter. The regime picks the default sleeve, but each stock can be promoted or demoted when discount, repair, durability, and crowding conflict. In strong tapes, repaired laggards can graduate into leaders only after trend repair and quality confirmation; in mixed tapes, deep-off-high names must prove both business durability and tradability before the contrarian sleeve takes over; in stressed tapes, the model defaults to shelter but still admits selective fallen-angel recoveries when stability and quality are unusually strong.
Deliberate metric coverage: momentum active via 3m, 6m, 12m, and 12_1 metrics; trend/recovery active via both 200d and 52w-high distance with opposite signs by sleeve; volatility active via realized 3m vol; liquidity active via share volume, dollar volume, and trading-days continuity; income active via dividend yield and dividend_ttm in the shelter sleeve; valuation active via PE and PEG; growth active via forward EPS plus operating-income and free-cash-flow growth; quality active via operating and free-cash-flow margins; size active via market_cap as a stability tilt in defense and a modest contrarian tilt in rebound.
Deliberate weight-0 metrics this run: return_1m_pct, forward_pe, revenue_growth_pct, eps_growth_pct, shares_outstanding, close, adj_close, high_52w, ma_200d, eps_ttm, revenue_ttm, operating_income_ttm, free_cash_flow_ttm."""

LEADER_SLEEVE = {
    "momentum_12_1_pct": (0.20, +1),
    "return_6m_pct": (0.14, +1),
    "from_200d_ma_pct": (0.14, +1),
    "from_52w_high_pct": (0.10, +1),
    "forward_eps": (0.12, +1),
    "operating_margin_pct": (0.12, +1),
    "avg_daily_dollar_volume_3m": (0.10, +1),
    "realized_vol_3m": (0.08, -1),
}

REBOUND_SLEEVE = {
    "from_52w_high_pct": (0.22, -1),
    "from_200d_ma_pct": (0.14, +1),
    "return_3m_pct": (0.12, +1),
    "return_12m_pct": (0.08, +1),
    "free_cash_flow_growth_pct": (0.12, +1),
    "free_cash_flow_margin_pct": (0.10, +1),
    "peg": (0.10, -1),
    "avg_daily_volume_3m": (0.08, +1),
    "market_cap": (0.04, -1),
}

SHELTER_SLEEVE = {
    "realized_vol_3m": (0.18, -1),
    "trading_days_3m": (0.14, +1),
    "dividend_yield_ttm_pct": (0.10, +1),
    "dividend_ttm": (0.10, +1),
    "pe": (0.10, -1),
    "operating_income_growth_pct": (0.12, +1),
    "operating_margin_pct": (0.10, +1),
    "market_cap": (0.10, +1),
    "avg_daily_dollar_volume_3m": (0.06, +1),
}


def score_universe(stocks, regime, ctx):
    def _num(v):
        return isinstance(v, (int, float)) and v == v

    def _rank_map(metric, direction):
        pairs = []
        for stock in stocks:
            value = stock.get(metric)
            if _num(value):
                pairs.append((stock.get("symbol"), value))
        n = len(pairs)
        if n == 0:
            return {}
        pairs.sort(key=lambda item: item[1], reverse=(direction > 0))
        if n == 1:
            return {pairs[0][0]: 1.0}
        out = {}
        denom = float(n - 1)
        i = 0
        while i < n:
            out[pairs[i][0]] = 1.0 - (i / denom)
            i += 1
        return out

    def _blend(spec, rank_cache):
        scores = {}
        for stock in stocks:
            symbol = stock.get("symbol")
            total = 0.0
            used = 0.0
            for metric, cfg in spec.items():
                weight = cfg[0]
                rank = rank_cache[metric][cfg[1]].get(symbol)
                if rank is not None:
                    total += weight * rank
                    used += weight
            if used > 0.0:
                scores[symbol] = total / used
            else:
                scores[symbol] = 0.0
        return scores

    def _avg_symbol(symbol, maps):
        total = 0.0
        count = 0
        for mapping in maps:
            value = mapping.get(symbol)
            if value is not None:
                total += value
                count += 1
        if count == 0:
            return 0.5
        return total / count

    def _branch_name(regime_info):
        breadth = regime_info.get("breadth", 0)
        avg_vol = regime_info.get("avg_realized_vol_3m", 0)
        median_momo = regime_info.get("median_momentum_12_1_pct", 0)
        median_trend = regime_info.get("median_from_200d_ma_pct", 0)
        if regime_info.get("bull") and breadth >= 62 and avg_vol <= 29 and median_momo >= 4 and median_trend >= 2:
            return "leadership"
        if breadth <= 45 or avg_vol >= 38 or median_trend < -1:
            return "defense"
        return "rebuild"

    metrics = {
        "momentum_12_1_pct",
        "return_3m_pct",
        "return_6m_pct",
        "return_12m_pct",
        "from_200d_ma_pct",
        "from_52w_high_pct",
        "forward_eps",
        "operating_margin_pct",
        "avg_daily_dollar_volume_3m",
        "realized_vol_3m",
        "free_cash_flow_growth_pct",
        "free_cash_flow_margin_pct",
        "peg",
        "avg_daily_volume_3m",
        "market_cap",
        "trading_days_3m",
        "dividend_yield_ttm_pct",
        "dividend_ttm",
        "pe",
        "operating_income_growth_pct",
    }

    rank_cache = {}
    for metric in metrics:
        rank_cache[metric] = {
            +1: _rank_map(metric, +1),
            -1: _rank_map(metric, -1),
        }

    leader_scores = _blend(LEADER_SLEEVE, rank_cache)
    rebound_scores = _blend(REBOUND_SLEEVE, rank_cache)
    shelter_scores = _blend(SHELTER_SLEEVE, rank_cache)

    branch = _branch_name(regime)
    scores = {}

    for stock in stocks:
        symbol = stock.get("symbol")

        repair_signal = _avg_symbol(
            symbol,
            [
                rank_cache["from_200d_ma_pct"][+1],
                rank_cache["return_3m_pct"][+1],
                rank_cache["return_6m_pct"][+1],
            ],
        )
        discount_signal = rank_cache["from_52w_high_pct"][-1].get(symbol, 0.5)
        durability_signal = _avg_symbol(
            symbol,
            [
                rank_cache["operating_margin_pct"][+1],
                rank_cache["free_cash_flow_margin_pct"][+1],
                rank_cache["forward_eps"][+1],
                rank_cache["operating_income_growth_pct"][+1],
                rank_cache["free_cash_flow_growth_pct"][+1],
            ],
        )
        liquidity_signal = _avg_symbol(
            symbol,
            [
                rank_cache["avg_daily_volume_3m"][+1],
                rank_cache["avg_daily_dollar_volume_3m"][+1],
                rank_cache["trading_days_3m"][+1],
            ],
        )
        momentum_signal = _avg_symbol(
            symbol,
            [
                rank_cache["momentum_12_1_pct"][+1],
                rank_cache["return_6m_pct"][+1],
                rank_cache["return_12m_pct"][+1],
            ],
        )
        value_signal = _avg_symbol(
            symbol,
            [
                rank_cache["pe"][-1],
                rank_cache["peg"][-1],
            ],
        )
        income_signal = _avg_symbol(
            symbol,
            [
                rank_cache["dividend_yield_ttm_pct"][+1],
                rank_cache["dividend_ttm"][+1],
            ],
        )
        stability_signal = _avg_symbol(
            symbol,
            [
                rank_cache["realized_vol_3m"][-1],
                rank_cache["market_cap"][+1],
            ],
        )
        crowding_signal = _avg_symbol(
            symbol,
            [
                rank_cache["momentum_12_1_pct"][+1],
                rank_cache["return_12m_pct"][+1],
                rank_cache["from_52w_high_pct"][+1],
            ],
        )

        leader = leader_scores.get(symbol, 0.0)
        rebound = rebound_scores.get(symbol, 0.0)
        shelter = shelter_scores.get(symbol, 0.0)

        if branch == "leadership":
            score = leader + 0.08 * durability_signal + 0.05 * liquidity_signal + 0.05 * repair_signal

            if discount_signal > 0.62 and repair_signal > 0.56 and durability_signal > 0.52:
                score = 0.72 * rebound + 0.28 * leader + 0.10 * durability_signal
            elif crowding_signal > 0.74 and value_signal < 0.34 and durability_signal < 0.48:
                score -= 0.18
            elif discount_signal > 0.76 and repair_signal < 0.44:
                score -= 0.12

            if stability_signal < 0.34:
                score -= 0.06

        elif branch == "rebuild":
            score = rebound + 0.09 * durability_signal + 0.07 * value_signal + 0.05 * liquidity_signal

            if discount_signal > 0.60 and repair_signal > 0.58 and durability_signal > 0.50 and liquidity_signal > 0.45:
                score += 0.18 + 0.08 * momentum_signal
            elif discount_signal > 0.70 and durability_signal < 0.42:
                score = 0.65 * shelter + 0.35 * rebound - 0.14
            elif leader > rebound and momentum_signal > 0.66 and discount_signal < 0.45:
                score = 0.55 * leader + 0.45 * rebound + 0.08 * durability_signal

            if momentum_signal < 0.35:
                score -= 0.08

        else:
            score = shelter + 0.10 * durability_signal + 0.08 * income_signal + 0.06 * value_signal + 0.05 * stability_signal

            if discount_signal > 0.68 and durability_signal > 0.58 and stability_signal > 0.52 and liquidity_signal > 0.46:
                score = 0.58 * shelter + 0.42 * rebound + 0.12 * income_signal
            elif durability_signal < 0.38 or liquidity_signal < 0.35:
                score -= 0.18
            elif discount_signal > 0.78 and repair_signal < 0.42:
                score -= 0.10

            if crowding_signal > 0.70 and value_signal < 0.30:
                score -= 0.08

        scores[symbol] = score

    return scores