exp_1185

Contrarian 52-Week Regime Momentum Recovery Quality Hybrid (Escrow Referee, v1185)

← All V2 experiments
Relative return
1.064x
Excess vs bench
6.40%
Benchmark
CAPW_UNIV
Rolling windows
179 · monthly
Mean strategy gain
21.43%
Mean benchmark gain
14.08%
Mean excess gain
7.34%
Dispersion (ref)
7.85%
Win-rate vs bench (ref)
96.65%
Worst / best ratio (ref)
0.987x / 1.198x
Logic variants
4
Updated
Jul 21, 2026
Anchored windows (reference — strategy vs benchmark)
Kept from V1 for continuity; the objective ranks on the full rolling set, not these four.
WindowStrategyBenchmarkRatio
2006-07-03 … 2011-06-30 9.45% 2.22% 1.071x
2011-07-01 … 2016-06-30 17.72% 13.74% 1.035x
2016-07-01 … 2021-06-30 29.79% 20.63% 1.076x
2021-07-01 … 2026-06-26 44.41% 15.48% 1.251x
All rolling windows — the objective set (equal-weighted mean ratio)
Strategy Benchmark (CAPW_UNIV) Excess
2006200720082009201020112012201320142015201620172018201920202021 -10%0%10%20%30%40%
rolling 5y windows, monthly step — 179 windows · mean ratio 1.064x · beat benchmark in 173/179
#WindowStrategyBenchmarkRatio
1 2006-07-31 … 2011-07-29 9.08% 1.79% 1.072x
2 2006-08-31 … 2011-08-31 8.85% 0.21% 1.086x
3 2006-09-29 … 2011-08-31 8.63% -0.14% 1.088x
4 2006-10-31 … 2011-10-31 6.86% 0.23% 1.066x
5 2006-11-30 … 2011-11-30 6.02% -0.05% 1.061x
6 2006-12-29 … 2011-11-30 6.09% -0.32% 1.064x
7 2007-01-31 … 2012-01-31 6.57% 0.93% 1.056x
8 2007-02-28 … 2012-01-31 7.49% 1.43% 1.060x
9 2007-03-30 … 2012-03-30 9.74% 3.09% 1.065x
10 2007-04-30 … 2012-04-30 9.49% 2.42% 1.069x
11 2007-05-31 … 2012-05-31 7.19% 0.60% 1.066x
12 2007-06-29 … 2012-06-29 8.18% 1.92% 1.061x
13 2007-07-31 … 2012-07-31 8.55% 2.69% 1.057x
14 2007-08-31 … 2012-08-31 8.89% 2.95% 1.058x
15 2007-09-28 … 2012-09-28 8.42% 3.20% 1.051x
16 2007-10-31 … 2012-10-31 6.72% 2.60% 1.040x
17 2007-11-30 … 2012-11-30 8.18% 3.45% 1.046x
18 2007-12-31 … 2012-12-31 7.65% 3.69% 1.038x
19 2008-01-31 … 2013-01-31 11.17% 5.85% 1.050x
20 2008-02-29 … 2013-02-28 10.27% 6.82% 1.032x
21 2008-03-31 … 2013-03-28 12.46% 7.73% 1.044x
22 2008-04-30 … 2013-04-30 11.23% 7.51% 1.035x
23 2008-05-30 … 2013-04-30 10.49% 7.81% 1.025x
24 2008-06-30 … 2013-06-28 11.88% 9.33% 1.023x
25 2008-07-31 … 2013-07-31 15.41% 10.48% 1.045x
26 2008-08-29 … 2013-07-31 15.97% 10.52% 1.049x
27 2008-09-30 … 2013-09-30 17.83% 11.48% 1.057x
28 2008-10-31 … 2013-10-31 19.80% 15.76% 1.035x
29 2008-11-28 … 2013-10-31 20.87% 17.46% 1.029x
30 2008-12-31 … 2013-12-31 23.11% 18.44% 1.039x
31 2009-01-30 … 2013-12-31 24.86% 20.64% 1.035x
32 2009-02-27 … 2014-01-31 27.73% 21.63% 1.050x
33 2009-03-31 … 2014-03-31 27.18% 20.60% 1.054x
34 2009-04-30 … 2014-04-30 26.37% 19.00% 1.062x
35 2009-05-29 … 2014-04-30 25.35% 18.32% 1.059x
36 2009-06-30 … 2014-06-30 28.41% 19.01% 1.079x
37 2009-07-31 … 2014-07-31 24.73% 17.39% 1.062x
38 2009-08-31 … 2014-08-29 25.29% 17.70% 1.064x
39 2009-09-30 … 2014-09-30 23.94% 16.64% 1.063x
40 2009-10-30 … 2014-09-30 25.49% 17.08% 1.072x
41 2009-11-30 … 2014-11-28 24.46% 16.82% 1.065x
42 2009-12-31 … 2014-12-31 23.32% 16.28% 1.061x
43 2010-01-29 … 2014-12-31 24.99% 17.23% 1.066x
44 2010-02-26 … 2015-01-30 23.30% 15.80% 1.065x
45 2010-03-31 … 2015-03-31 21.57% 15.40% 1.053x
46 2010-04-30 … 2015-04-30 19.20% 15.38% 1.033x
47 2010-05-28 … 2015-04-30 21.27% 17.09% 1.036x
48 2010-06-30 … 2015-06-30 24.01% 17.45% 1.056x
49 2010-07-30 … 2015-06-30 23.85% 16.43% 1.064x
50 2010-08-31 … 2015-08-31 21.64% 15.76% 1.051x
51 2010-09-30 … 2015-09-30 20.30% 13.61% 1.059x
52 2010-10-29 … 2015-09-30 19.48% 13.06% 1.057x
53 2010-11-30 … 2015-11-30 20.66% 15.09% 1.048x
54 2010-12-31 … 2015-12-31 19.27% 13.55% 1.050x
55 2011-01-31 … 2016-01-29 19.07% 11.90% 1.064x
56 2011-02-28 … 2016-01-29 17.93% 11.53% 1.057x
57 2011-03-31 … 2016-03-31 18.38% 12.90% 1.048x
58 2011-04-29 … 2016-04-29 17.17% 12.39% 1.042x
59 2011-05-31 … 2016-05-31 17.46% 12.94% 1.040x
60 2011-06-30 … 2016-06-30 17.36% 13.30% 1.036x
61 2011-07-29 … 2016-07-29 17.25% 14.52% 1.024x
62 2011-08-31 … 2016-08-31 16.88% 15.19% 1.015x
63 2011-09-30 … 2016-09-30 19.09% 16.32% 1.024x
64 2011-10-31 … 2016-10-31 17.11% 14.02% 1.027x
65 2011-11-30 … 2016-11-30 18.41% 14.66% 1.033x
66 2011-12-30 … 2016-12-30 18.33% 14.92% 1.030x
67 2012-01-31 … 2017-01-31 18.38% 14.63% 1.033x
68 2012-02-29 … 2017-02-28 18.19% 14.78% 1.030x
69 2012-03-30 … 2017-02-28 17.45% 14.43% 1.026x
70 2012-04-30 … 2017-04-28 15.91% 14.61% 1.011x
71 2012-05-31 … 2017-05-31 18.40% 15.98% 1.021x
72 2012-06-29 … 2017-05-31 17.97% 15.44% 1.022x
73 2012-07-31 … 2017-07-31 17.68% 15.43% 1.020x
74 2012-08-31 … 2017-08-31 17.85% 15.12% 1.024x
75 2012-09-28 … 2017-08-31 17.68% 14.77% 1.025x
76 2012-10-31 … 2017-10-31 21.04% 16.12% 1.042x
77 2012-11-30 … 2017-11-30 20.06% 16.79% 1.028x
78 2012-12-31 … 2017-12-29 19.90% 16.93% 1.025x
79 2013-01-31 … 2018-01-31 20.91% 17.57% 1.028x
80 2013-02-28 … 2018-02-28 21.28% 16.21% 1.044x
81 2013-03-28 … 2018-02-28 20.34% 15.81% 1.039x
82 2013-04-30 … 2018-04-30 18.94% 14.25% 1.041x
83 2013-05-31 … 2018-05-31 19.02% 14.57% 1.039x
84 2013-06-28 … 2018-05-31 20.18% 14.97% 1.045x
85 2013-07-31 … 2018-07-31 18.22% 14.83% 1.030x
86 2013-08-30 … 2018-07-31 19.37% 15.59% 1.033x
87 2013-09-30 … 2018-09-28 19.67% 15.84% 1.033x
88 2013-10-31 … 2018-10-31 16.92% 12.89% 1.036x
89 2013-11-29 … 2018-10-31 15.82% 12.60% 1.029x
90 2013-12-31 … 2018-12-31 12.93% 9.93% 1.027x
91 2014-01-31 … 2019-01-31 12.72% 12.37% 1.003x
92 2014-02-28 … 2019-02-28 11.88% 12.38% 0.996x
93 2014-03-31 … 2019-03-29 13.18% 12.76% 1.004x
94 2014-04-30 … 2019-04-30 14.80% 13.73% 1.009x
95 2014-05-30 … 2019-04-30 14.17% 13.54% 1.006x
96 2014-06-30 … 2019-06-28 11.35% 12.81% 0.987x
97 2014-07-31 … 2019-07-31 12.66% 13.30% 0.994x
98 2014-08-29 … 2019-07-31 11.99% 12.80% 0.993x
99 2014-09-30 … 2019-09-30 12.44% 12.70% 0.998x
100 2014-10-31 … 2019-10-31 13.11% 12.91% 1.002x
101 2014-11-28 … 2019-10-31 12.42% 12.60% 0.998x
102 2014-12-31 … 2019-12-31 14.57% 14.16% 1.004x
103 2015-01-30 … 2019-12-31 14.88% 14.85% 1.000x
104 2015-02-27 … 2020-01-31 14.54% 14.04% 1.004x
105 2015-03-31 … 2020-03-31 10.43% 8.56% 1.017x
106 2015-04-30 … 2020-04-30 14.67% 11.65% 1.027x
107 2015-05-29 … 2020-05-29 15.32% 12.61% 1.024x
108 2015-06-30 … 2020-06-30 16.15% 13.64% 1.022x
109 2015-07-31 … 2020-07-31 17.85% 14.60% 1.028x
110 2015-08-31 … 2020-08-31 23.42% 18.07% 1.045x
111 2015-09-30 … 2020-09-30 21.72% 17.05% 1.040x
112 2015-10-30 … 2020-10-30 19.81% 14.60% 1.045x
113 2015-11-30 … 2020-11-30 24.15% 17.43% 1.057x
114 2015-12-31 … 2020-12-31 25.44% 18.65% 1.057x
115 2016-01-29 … 2021-01-29 27.62% 19.26% 1.070x
116 2016-02-29 … 2021-02-26 29.68% 19.79% 1.083x
117 2016-03-31 … 2021-03-31 27.33% 19.42% 1.066x
118 2016-04-29 … 2021-03-31 28.15% 19.66% 1.071x
119 2016-05-31 … 2021-05-28 29.85% 20.42% 1.078x
120 2016-06-30 … 2021-06-30 29.26% 21.06% 1.068x
121 2016-07-29 … 2021-06-30 29.79% 20.63% 1.076x
122 2016-08-31 … 2021-08-31 34.07% 21.75% 1.101x
123 2016-09-30 … 2021-09-30 31.65% 20.22% 1.095x
124 2016-10-31 … 2021-10-29 35.04% 22.50% 1.102x
125 2016-11-30 … 2021-11-30 34.31% 21.87% 1.102x
126 2016-12-30 … 2021-11-30 34.44% 21.75% 1.104x
127 2017-01-31 … 2022-01-31 29.87% 20.17% 1.081x
128 2017-02-28 … 2022-02-28 30.09% 18.51% 1.098x
129 2017-03-31 … 2022-03-31 32.35% 19.46% 1.108x
130 2017-04-28 … 2022-03-31 32.66% 19.46% 1.111x
131 2017-05-31 … 2022-05-31 32.38% 15.59% 1.145x
132 2017-06-30 … 2022-06-30 28.28% 13.08% 1.134x
133 2017-07-31 … 2022-07-29 28.00% 15.16% 1.111x
134 2017-08-31 … 2022-08-31 28.50% 13.72% 1.130x
135 2017-09-29 … 2022-08-31 28.23% 13.56% 1.129x
136 2017-10-31 … 2022-10-31 28.56% 11.86% 1.149x
137 2017-11-30 … 2022-11-30 28.43% 12.52% 1.141x
138 2017-12-29 … 2022-11-30 29.02% 12.46% 1.147x
139 2018-01-31 … 2023-01-31 25.77% 11.01% 1.133x
140 2018-02-28 … 2023-02-28 24.32% 11.03% 1.120x
141 2018-03-29 … 2023-02-28 24.78% 11.72% 1.117x
142 2018-04-30 … 2023-04-28 23.64% 13.01% 1.094x
143 2018-05-31 … 2023-05-31 21.88% 12.95% 1.079x
144 2018-06-29 … 2023-05-31 22.80% 13.01% 1.087x
145 2018-07-31 … 2023-07-31 25.93% 14.67% 1.098x
146 2018-08-31 … 2023-08-31 23.23% 13.51% 1.086x
147 2018-09-28 … 2023-08-31 22.93% 13.56% 1.083x
148 2018-10-31 … 2023-10-31 20.43% 12.60% 1.070x
149 2018-11-30 … 2023-11-30 23.08% 14.58% 1.074x
150 2018-12-31 … 2023-12-29 26.52% 17.26% 1.079x
151 2019-01-31 … 2024-01-31 26.74% 16.27% 1.090x
152 2019-02-28 … 2024-01-31 26.19% 15.94% 1.088x
153 2019-03-29 … 2024-03-28 30.13% 17.50% 1.107x
154 2019-04-30 … 2024-04-30 27.54% 15.50% 1.104x
155 2019-05-31 … 2024-05-31 30.93% 18.12% 1.108x
156 2019-06-28 … 2024-06-28 31.36% 17.99% 1.113x
157 2019-07-31 … 2024-07-31 29.65% 17.70% 1.102x
158 2019-08-30 … 2024-08-30 29.87% 18.41% 1.097x
159 2019-09-30 … 2024-09-30 30.76% 18.65% 1.102x
160 2019-10-31 … 2024-10-31 30.30% 17.87% 1.105x
161 2019-11-29 … 2024-11-29 33.69% 18.64% 1.127x
162 2019-12-31 … 2024-12-31 30.56% 17.62% 1.110x
163 2020-01-31 … 2025-01-31 32.07% 18.07% 1.119x
164 2020-02-28 … 2025-02-28 31.99% 19.00% 1.109x
165 2020-03-31 … 2025-03-31 31.59% 19.24% 1.104x
166 2020-04-30 … 2025-04-30 29.55% 16.49% 1.112x
167 2020-05-29 … 2025-04-30 28.33% 15.80% 1.108x
168 2020-06-30 … 2025-06-30 30.65% 18.19% 1.105x
169 2020-07-31 … 2025-07-31 29.47% 17.87% 1.098x
170 2020-08-31 … 2025-08-29 26.91% 16.69% 1.088x
171 2020-09-30 … 2025-09-30 32.23% 18.57% 1.115x
172 2020-10-30 … 2025-09-30 33.11% 19.43% 1.115x
173 2020-11-30 … 2025-11-28 31.38% 17.77% 1.116x
174 2020-12-31 … 2025-12-31 31.03% 16.92% 1.121x
175 2021-01-29 … 2025-12-31 30.14% 17.20% 1.110x
176 2021-02-26 … 2026-01-30 34.05% 17.04% 1.145x
177 2021-03-31 … 2026-03-31 32.86% 14.07% 1.165x
178 2021-04-30 … 2026-04-30 39.02% 16.03% 1.198x
179 2021-05-28 … 2026-04-30 38.26% 16.22% 1.190x
Notes
mode=explore; family=contrarian-52w-regime-momentum-recovery-quality-hybrid New hybrid family built as an escrow-referee structure rather than a static blend: each stock first earns evidence inside three distinct sleeves, a washed-out 52-week contrarian sleeve, a trend-respecting momentum sleeve, and a recovery-quality sleeve, and then a branch-specific referee decides which edge is allowed to cash out. The arbitration is explicit and non-mechanical: deep drawdowns cannot win without repair evidence, momentum cannot dominate when extension outruns durability, and recovery candidates receive only partial credit unless quality, liquidity, and stabilization unlock the escrow. This makes the family structurally distinct from the parent relay/admission designs because sleeve conflict is settled through admissibility gates, conflict taxes, and branch-level release multipliers instead of simple dominance weights. Deliberate metric coverage this run: momentum uses return_1m_pct, return_3m_pct, return_6m_pct, return_12m_pct, and momentum_12_1_pct; trend/recovery uses from_200d_ma_pct and from_52w_high_pct; volatility uses realized_vol_3m; liquidity uses avg_daily_volume_3m, avg_daily_dollar_volume_3m, and trading_days_3m; income uses dividend_yield_ttm_pct and dividend_ttm; valuation uses pe, forward_pe, and peg; growth uses eps_growth_pct, revenue_growth_pct, operating_income_growth_pct, free_cash_flow_growth_pct, and forward_eps; quality uses operating_margin_pct and free_cash_flow_margin_pct; size uses market_cap as a stability and crowding moderator rather than a raw rank target. Deliberate weight-0 metrics this run: shares_outstanding, close, adj_close, high_52w, ma_200d, eps_ttm, revenue_ttm, operating_income_ttm, and free_cash_flow_ttm. Sparse fundamentals are normalized inside each sleeve so missing fields reduce confidence rather than forcing large-cap-only selection.
Lesson notes
#885 · degrade · relative_return Δ -0.3193 · parent exp_1174 · Jul 21, 2026 · auto/explore; benchmark CAPW_UNIV
explore/contrarian-52w-regime-momentum-recovery-quality-hybrid: relative_return 1.0640x (delta -0.3193 vs exp_1174); win-rate 96.648%, worst-window 0.98704, dispersion 7.8497%.
Monthly picks — top stocks selected each month (whole timeline)
timeline — 240 months · top 15 each
Month 123456789101112131415
2006-07-31 T WFC MO JPM OXY BAC MRK SLB XOM PEP MS CVX VLO CMCSA DIS
2006-08-31 T MO XOM BAC JPM ORCL CMCSA PFE PEP FCX VZ WFC CSCO PG MRK
2006-09-29 T ORCL MS BAC AAPL JPM CMCSA VZ PFE LMT WFC GS MRK GILD CSCO
2006-10-31 T GS MS CMCSA GOOGL AAPL ORCL CSCO VZ ATI MRK NVDA AAL NEE XOM
2006-11-30 CSCO XOM GS T MS GOOGL ORCL AAPL VNO CVX CMCSA NEE SPG MCD AAL
2006-12-29 XOM T CVX GS CSCO CMCSA MS TWX MCD NEE IBM BRK-B C MSFT ATI
2007-01-31 T GS SPG HPQ PSA CMCSA MS NEE VZ TWX MSFT IBM MO DIS BMY
2007-02-28 T WY NEE SYK GS SPG ABT MAT ICE DE SRE ETR NRG TEX TAP
2007-03-30 T NRG NEE GS TAP VLO MAT KR ETR SYK AEP GT MO FCX BAX
2007-04-30 NEE CI HON ETR T CVX MCD XOM MO BAX VLO NRG SRE PEG FSLR
2007-05-31 FCX CVX NRG VZ T VLO MCD HON EIX XOM ETR AAPL GS COP CI
2007-06-29 FCX XOM CVX ICE COP SLB NRG HON AMZN T VLO MCD NOV WBD APA
2007-07-31 COP FCX CVX XOM SLB IBM AAPL VZ MDR HON X RTX WBD NOV AXON
2007-08-31 COP CVX XOM IBM SLB OXY HPQ FCX CSCO BIIB INTC VRSN MMM RTX DE
2007-09-28 CVX COP FCX XOM SLB OXY RTX HAL FLR APA IBM GE DE CSCO WYNN
2007-10-31 OXY FCX APA GOOG GOOGL DVN XOM CVX COP HAL BIIB MSFT KO GRMN BRK-B
2007-11-30 OXY BRK-B VRSN SCHW FCX MRK MO KO PEP XOM PG CVX GOOGL RTX MDR
2007-12-31 OXY SCHW BRK-B APA FCX HPQ XOM CVX COP DE RTX MO AAPL MCD GOOGL
2008-01-31 MOS MO NEM BRK-B OXY GILD WMT FSLR PFE HUM ESRX KO XOM RTX CL
2008-02-29 OXY MOS HAL DVN WDC CF BRK-B CVX BKNG APA XOM FCX IBM COP SLB
2008-03-31 HAL DVN OXY MOS BKNG APA IBM WMT CSX ABT MO CF PG GE KO
2008-04-30 MOS HAL OXY CVX CF DVN WDC SLB BKNG FCX IBM WMT UNP XOM APA
2008-05-30 MA OXY HAL WDC MOS APA DVN UNP X BKNG CVX CF IBM CSX COP
2008-06-30 HAL MOS OXY MA CF DVN APA WDC COP NBR CVX D X IBM XOM
2008-07-31 CF MOS ABT HAL IBM OXY SRCL QCOM BCR APOL CEPH MA SWN RTN RE
2008-08-29 CF MCD SCHW BCR SWN SRCL CEPH APOL ABT JNJ RTN STJ ATGE OXY RE
2008-09-30 MCD SCHW ABT WMT JNJ CPB ED D GIS PG MRSH BRK-B LMT IBM BCR
2008-10-31 ABT MCD ED AON CPB MRSH PG WWY JNJ MO WMT BRK-B KR MDLZ KMB
2008-11-28 MCD ABT AON D ED XOM PG KR CVX SHW DLTR TRV JNJ SJM MMM
2008-12-31 MCD ABT BMY XOM AON AMGN JNJ SHW VZ ED PG WM RTX T WMT
2009-01-30 ABT XOM MCD BMY CVX ED JNJ OXY AMGN VZ MDLZ SJM PCG WEC IBM
2009-02-27 XOM MCD ABT IBM BMY AON ED V DRI VTRS PCG OXY VZ JNJ AMGN
2009-03-31 BMY MS IBM ED DRI CVX OXY MCD VTRS AAPL AON UPS XOM AZO ORCL
2009-04-30 DRI BKNG IBM WBD AAPL WDC EBAY UPS OXY MS AZO MNST CVX YUM PH
2009-05-29 MS WDC EBAY BKNG OXY WBD MOS IBM AAPL RTX FCX MCD DRI GPS F
2009-06-30 BKNG F AAPL MS WBD MSFT IBM ORCL EBAY TJX ELV MSI OXY FFIV ICE
2009-07-31 F BKNG EBAY AAPL WBD TJX MOS IBM FCX MS MMM WDC OXY WLL ADBE
2009-08-31 BKNG AAPL COF WDC EBAY WBD F WHR FITB TGT ISRG MU CTSH IP PALM
2009-09-30 BKNG AAPL WBD GE GS EBAY GNW F WLL ISRG FCX EOG FMCC CTSH MU
2009-10-30 AAPL BKNG WBD MSFT EBAY GOOG GNW HIG TT FCX GOOGL MA EOG HAL IBM
2009-11-30 BKNG WBD F WLL AAPL MSFT FCX ISRG TT GOOG FLEX RTX PSKY CCI GOOGL
2009-12-31 BKNG F MSFT WLL GOOG CI SPG FCX ISRG GOOGL AAPL WBD MAC SLG WDC
2010-01-29 BKNG F ISRG DD WBD MSFT CI SLG MTW TXT WLL SYK RTX GIS PFE
2010-02-26 BKNG F WLL ISRG SPG AMD UIS GNW CRM PXD CLF MTW BRK-B WBD SNDK
2010-03-31 BKNG F WLL LVS ISRG GE ZION XRX WSM CLF DDR EBAY DPZ FFIV UAL
2010-04-30 BKNG BBWI XRX WBD AAPL WLL NFLX UAL LVS HBAN LPX VIAV ZION F CMI
2010-05-28 WBD AAPL NTAP BBWI HAS UAL HON WLL NFLX ZION HBAN LVS MTG COR CRM
2010-06-30 NEM NTAP AAPL HAS BRK-B WBD COR BMY BBWI MO ZION KDP GIS SBUX ISRG
2010-07-30 NTAP HAS NEM ETN WBD AIG MO AAPL INTU BBWI AZO BMY BKNG LVS C
2010-08-31 NEM BKNG BMY NTAP CCI MCD ED NI MO BRK-B AAPL CB INTU SO T
2010-09-30 BKNG NTAP AAPL NEM VZ QCOM MO NFLX WLL LVS BMY INTU AMZN TXN CCI
2010-10-29 BKNG AAPL NTAP FCX LVS TXN MBI MO INTU NEM LYB VRSN WLL VZ NFLX
2010-11-30 TXN AAPL BBWI NTAP BKNG XOM FCX COP F WLL LVS MCHP INTC PH RCL
2010-12-31 AIG TXN FCX WLL LULU BKNG MGM COP DECK LVS RCL ADI NTAP MBI BBWI
2011-01-31 MOS TER WLL TXN LULU COP CIEN XOM CLF AAPL DE BKNG ADI QCOM ON
2011-02-28 COP VIAV QCOM MU TER KLAC LULU PSKY MOS XOM TXN ANDV WMB VLO CVX
2011-03-31 COP XOM WYNN BKNG CAT TER PSKY CVX NOV LULU KLAC TXN NFLX CBRE DE
2011-04-29 WYNN BKNG COP BBWI LULU BIIB PSKY MCO ANDV XOM OXY LYB HUM CIEN KKR
2011-05-31 WYNN BKNG BBWI MCO LULU REGN BIIB TMUS XOM ELV AET PSKY CVX CAT MSI
2011-06-30 WYNN BKNG MCO BBWI LULU COP MNST XOM UNH TDC CAT MA PSKY BIIB GR
2011-07-29 WYNN BKNG AAPL CF IBM SPG COP XOM LULU D CVX HAL MA PM AXP
2011-08-31 CF AAPL WYNN BKNG MA IBM MCD KO VFC V XOM COP BBWI MSFT SPG
2011-09-30 AAPL IBM DUK V MA MCD VZ KO TJX VFC DLTR INTC SPG XOM KMB
2011-10-31 CF KLAC AAPL SPG INTC V DUK IBM MA XOM MCD ISRG NEM BIIB RL
2011-11-30 MA KLAC V INTC IBM PM XOM TJX WMB AAPL PFE MCD ISRG OXY DUK
2011-12-30 KLAC PFE V XOM MA ISRG AAPL PM MCD LLY SPG TJX WMB VZ INTC
2012-01-31 AAPL CF LYB CAT KLAC INTC TJX PFE YUM GILD HD V XOM SPG MA
2012-02-29 AAPL V ISRG BKNG MSFT TJX CMCSA MA M HD CF URI CAT WFC EQIX
2012-03-30 AAPL BKNG QCOM TJX PSKY WBD ISRG WFC CF EQIX MSFT HD INTC YUM V
2012-04-30 AAPL BKNG WBD V SPG ISRG WFC TJX SHW WMB MSFT AXP EBAY PM SBAC
2012-05-31 AAPL BKNG SPG WBD YUM EBAY WFC SHW TJX DIS NEE V STX SRE DAL
2012-06-29 STX AAPL BKNG WBD SPG CF V CMCSA EBAY DIS NEE GE SRE VRTX WFC
2012-07-31 AAPL STX V SPG CMCSA NEE DIS EBAY MRK WFC BKNG KMB CF SHW PM
2012-08-31 STX AAPL WDC VLO EBAY CMCSA ALL GILD SPG DIS CF WBD TWX PSKY HD
2012-09-28 STX AAPL CF VLO WBD DIS ALL GILD CMCSA EBAY GE WMB GOOGL TWX GOOG
2012-10-31 CMCSA ALL LEN EBAY WBD LLY SBAC GE GILD JPM XOM MDT VLO CF HD
2012-11-30 META EBAY AMGN ALL CMCSA TWX GILD LLY V GE HD WBD JPM GS TRV
2012-12-31 STX GS WDC PPG AMGN GILD WBD JPM EBAY CCI ORCL ALL ETN APTV CMCSA
2013-01-31 STX META WDC GS DAL WBD EBAY PHM LEN BLK STT GILD KKR V PPG
2013-02-28 GS KKR WBD ALL BRK-B STX GILD DAL JPM WDC TRV CMCSA TSN STT TWX
2013-03-28 STX KKR GS AMGN ALL VLO GILD TWX HON TRV BLK DAL WDC WBD STT
2013-04-30 AMGN WDC KKR TWX REGN DIS GILD VRTX STX ALL FNMA WBD COR JNJ FMCC
2013-05-31 STX WDC GS VLO TSLA JPM REGN MCO FNMA GILD BX BKNG DIS STT BLK
2013-06-28 STX WDC JPM KKR GILD CSCO MCO WFC DIS BKNG REGN GS HON TSLA BRK-B
2013-07-31 WDC BKNG WFC REGN CSCO JPM GILD FNMA RTX GS TSLA TYL FSLR BX MCO
2013-08-30 BKNG MA META CI TSLA TSN DAL JNJ WFC RTX TRIP GILD MU MTG PRU
2013-09-30 BKNG META REGN MA TSLA RTX DAL GILD MCO MGM WYNN TRIP OMX BX NOC
2013-10-31 BKNG META MA BX MU VLO NXPI FNMA DAL GILD FMCC WYNN BA SBUX OMX
2013-11-29 BKNG MA REGN BX MS BA MCK META DAL PBI FNMA GILD FSLR MU INCY
2013-12-31 BKNG MA URI BX VLO META WYNN ABBV MU FNMA LVS FMCC DAL MCK BA
2014-01-31 BKNG MU META BX URI DAL V GOOG MGM WYNN FNMA GILD TSLA FMCC VLO
2014-02-28 REGN BKNG MU META URI BX V WYNN TSLA MA MTCH DAL TMO ILMN MGM
2014-03-31 BX URI WYNN MSFT EOG MU DAL TSN WFC VLO GLW META BAC RCL FSLR
2014-04-30 EOG MU URI VLO DAL VTRS LYB TSLA PSX DD WFC BKR SLB FNMA MSFT
2014-05-30 META MU EOG URI DAL COP SLB LYB WLL WMB WFC LUV BKNG VLO GD
2014-06-30 META MU URI SLB EOG COP DVN WLL TSLA HAL DAL AAL TRGP JNJ LYB
2014-07-31 MU META URI EOG COP GILD BX MSFT SLB HAL AAPL BKNG DAL V LUV
2014-08-29 MU GILD META NXPI URI WDC LYB MSFT AAPL DAL LUV INTC EOG TRGP DIS
2014-09-30 GILD META MU NXPI MSFT MS UNP LRCX URI LUV VZ BRK-B MO RCL WDC
2014-10-31 GILD MU META AMGN ABBV NXPI AAPL MSFT LUV GD MO MS REGN MCO UNH
2014-11-28 MU META NXPI ABBV DAL V LUV RCL AAPL AMGN ZTS BRK-B MSFT TWX MO
2014-12-31 RCL AEP DAL KR AMGN WDC REGN AAPL ED SHW META SO WELL WEC MU
2015-01-30 KR NXPI WELL PCG SHW RCL GILD VTR STZ BX MO AAPL BRK-B DAL LUV
2015-02-27 CI VLO TXN AAPL KR DIS BX RCL MO LOW LUV DLTR NOC BBWI MAC
2015-03-31 AAPL SBUX CI KR COR DRI NXPI VLO TXN META REGN BX BIIB UAL SWKS
2015-04-30 SBUX AAPL BX DIS CI NXPI INCY COR SWKS PANW LOW VMC MCO HAS CRM
2015-05-29 GILD SBUX BX CI PANW AAPL DIS NXPI SWKS GS JPM EXPE REGN HAS NCLH
2015-06-30 GILD SBUX JPM BX GS PANW DIS VLO DRI AAPL CI NKE HAS MA META
2015-07-31 SBUX GILD VLO DIS META JPM PANW NKE AMGN KR CI MDLZ GS HAS V
2015-08-31 SBUX NKE VLO STZ MO HD PGR CI JPM GILD META PANW V HAS PSA
2015-09-30 SBUX MO PSA PANW NKE VLO PGR JPM BKNG ORLY HD V PEG HUM AZO
2015-10-30 SBUX BKNG MO META VLO PSA COST GE PSX INTC GOOG V PGR NKE EXPE
2015-11-30 VLO PSA GOOGL MO SBUX HD PSX PANW META V AMZN MCD PLD COST INTC
2015-12-31 PSA VLO GOOGL GE MO GOOG HD AVGO MCD META AMZN PLD V COST ADBE
2016-01-29 PSA MO META GOOGL VLO NEE GOOG STZ SBUX MCD PM GE JNJ SO HD
2016-02-29 T VZ KLAC META TSN MO PSA JNJ ISRG XEL SYY MCD AEP SPG NEE
2016-03-31 T VZ PSA KLAC META PM EXC MCD ISRG AEP ED ETN SPG GE EMR
2016-04-29 T ISRG META VZ ABBV JNJ BAX EMR MCD RTX EW TSN ETN AWK PM
2016-05-31 T META ABBV NXPI SPGI VZ DLR NVDA WCG ULTA ISRG EQIX AMZN ADBE IBM
2016-06-30 T MO CCI DLR JNJ ISRG VZ WM EQIX NEE SYK K IRM AWK ULTA
2016-07-29 T TXN DLR VZ DHR ABBV SPGI META ISRG TSN OKE NVDA PLD WCG JNJ
2016-08-31 SPGI T GEN DHR META TXN ULTA NVDA VTR OKE CSCO AMAT TSN AMZN CHTR
2016-09-30 SPGI NVDA AMZN GEN META ISRG QCOM DHR AMAT HPQ TXN ABBV EBAY BKNG T
2016-10-31 META NXPI NVDA SPGI DHR QCOM GEN MSFT JPM TXN LRCX BAC C AMAT ADBE
2016-11-30 JPM MS NVDA TXN SPGI QCOM AMAT DHR T UNH KLAC CLF BKNG MSFT GS
2016-12-30 JPM MS GS NVDA PNC TWX T BAC DHR BRK-B MSFT TMUS AMAT TFC C
2017-01-31 MS JPM AMAT NVDA GS CHTR TXN SCHW BBY UAL TMUS IBM CSX URI BAC
2017-02-28 JPM MS CLF NVDA XRX GS AAPL AMAT BAC BKNG HWM PNC LUV ADI CHTR
2017-03-31 AMAT KLAC NVDA ADBE BKNG JPM INCY META GEN BAC TXN URI GS LRCX AXP
2017-04-28 AMAT KLAC ADBE BKNG CHTR META ISRG VRTX MSFT CCL JPM LRCX NVDA BAC GOOGL
2017-05-31 META GOOGL AMAT NVDA ADBE LRCX KLAC ISRG VRTX BX MSFT PYPL AAPL BKNG WB
2017-06-30 NVDA VRTX BX REGN SPGI AMAT LRCX META PAYC TSLA MSFT ADBE ANET ISRG CCL
2017-07-31 AMAT VRTX META NVDA LRCX ADBE BKNG CHTR PYPL SPGI REGN ISRG MSFT MA LITE
2017-08-31 META RCL MU NVDA VRTX ADBE AMAT LRCX BA UNH AMT V REGN MSFT MA
2017-09-29 MU NVDA AMAT LRCX BA META ABBV VRTX MA MCHP RCL V WB TXN MSFT
2017-10-31 MU AMAT NVDA LRCX ADBE TXN RCL ABBV MSFT BA MA MCHP JPM XYZ GM
2017-11-30 MU INTC XYZ BA NVDA TXN LRCX ANET ADBE ON PYPL AMAT MA META WB
2017-12-29 MU TXN INTC BA MAR WYNN ON NVDA BBBY META ADBE PYPL PGR MSFT ANET
2018-01-31 TXN MU BA NVDA ABBV MAR ON ADBE MSFT BLK JPM TROW BBBY HD ISRG
2018-02-28 MU TXN MA MSFT ADBE INTC BA NVDA JPM NOW ANET ON AMAT BAC WYNN
2018-03-29 MU WYNN ADBE ON PGR MA ANET XYZ MPC NOW BA NEE LRCX PSX URI
2018-04-30 MU PSX WYNN VLO ADBE PANW MPC COP V ANET MA BKNG PGR PFE XYZ
2018-05-31 MU PSX OXY ADBE V PANW MA VLO SEDG XYZ NVDA NOW INTU INTC PGR
2018-06-29 MU PSX V MA OXY INTU TJX META EOG ADBE CRM VLO PFE M COP
2018-07-31 MU PSX V PFE MA ADBE MSFT SEDG CSX XYZ INTU CRM ISRG TJX M
2018-08-31 PFE TJX V XYZ MA AAPL MSFT ISRG AMZN ADBE COST CRM INTU REGN PSX
2018-09-28 PFE V PGR XYZ MA TJX INTU ADBE MSFT AAPL MTCH ISRG DIS CRM ABMD
2018-10-31 PFE VZ MRK PGR TJX ESRX DIS MKC XYZ AAPL SPG ROST NEE CMCSA COST
2018-11-30 PFE VZ MRK SBUX DELL NEE CMCSA ESRX MCD ETSY UAL BRK-B MKC HCA PG
2018-12-31 PFE VZ SBUX MRK AVGO NEE CME NRG YUM BRK-B AET EXC XEL ABBV DUK
2019-01-31 AVGO SBUX REGN AMD PFE VRTX NOW MTCH PAYC ETSY WELL PG BALL LULU VZ
2019-02-28 AVGO PGR SBUX ETSY PFE BA MRK AZO INTU PAYC ADI NEE NOW PANW XYZ
2019-03-29 AVGO MA PEP TTD INTU SBUX V MTCH MSFT AZO CDNS PG PGR PYPL INTC
2019-04-30 MSFT META MA ADI KLAC PEP V HON PYPL CSCO AVGO PGR TTD AMD SBUX
2019-05-31 PEP MA PGR MTCH MSFT SO HSY PAYX WELL LLY V LIN PYPL SBUX CCI
2019-06-28 MSFT LIN QCOM MTCH PEP TTD META MA V SBUX LULU PGR XRX AXP BALL
2019-07-31 MTCH MSFT HSY MA V SBUX FISV PEP LIN GS PG DIS PGR SYK SNPS
2019-08-30 QCOM PEP MSFT TSN KLAC LMT ZTS CCI KO MA V SYK SO WEC SBUX
2019-09-30 SO KLAC T NXPI BMY PEP QCOM MSFT SBUX NEE SPGI TXN LMT JPM HET
2019-10-31 BMY T QCOM WU SO KLAC NXPI MSFT PEP JPM PLD PHM VRTX AMGN NEE
2019-11-29 QCOM BMY JPM MSFT HET XRX VRTX URI TER KLAC AMGN AAPL AMAT PSX T
2019-12-31 QCOM JPM MSFT BMY URI HET VRTX AMGN BAC ENPH AAPL TER KLAC MTCH MU
2020-01-31 MSFT BMY QCOM SO SPGI HET LLY JPM LMT TSLA INTC VRTX V MA NEM
2020-02-28 MSFT BMY VRTX TSLA QCOM NEM HET LLY ADBE GOOGL ZTS NEE INTC MA PEP
2020-03-31 NEM MSFT LLY PGR VRTX ADBE QCOM ABBV GEN KR ENPH COST TSLA AMT SPGI
2020-04-30 NEM LLY MSFT ENPH SPGI ADBE CDNS ABBV NOW TMO GIS UNH VEEV QCOM REGN
2020-05-29 NEM LLY MSFT VRTX SPGI CDNS ABBV META ENPH ADBE VEEV REGN QCOM LULU MA
2020-06-30 MSFT NEM ABBV EBAY SPGI ADBE AAPL TSLA CDNS VRTX LOW QCOM META ENPH XYZ
2020-07-31 QCOM NEM TSLA EBAY CDNS LOW ENPH MSFT META ABBV SPGI ADBE XYZ AAPL NVDA
2020-08-31 META MSFT ADBE ENPH AAPL LOW EBAY XYZ REGN SPGI AMD CDNS NEM BBBY ETSY
2020-09-30 META LOW ENPH TGT DHI LEN DHR ADBE FDX AAPL NVDA ETSY SPGI CHTR SEDG
2020-10-30 ENPH META LOW ETSY SEDG AAPL VIAC TSLA DHR NVDA PENN XYZ TMO PGR NOW
2020-11-30 MRNA ENPH ETSY TER XYZ MS VIAC QCOM TSLA LRCX TTD SEDG TGT PLTR KLAC
2020-12-31 ETSY ENPH TSLA MS AMAT TER LRCX XYZ TTD PENN QCOM MRNA PANW CRWD CDNS
2021-01-29 ENPH AMAT MS KLAC MRNA ETSY PLTR GS TSLA LRCX PSKY CLF FCX TTD CVNA
2021-02-26 ENPH ETSY AMAT MS GS TER FCX PENN KLAC WBD PYPL CRWD TUP PSKY GNRC
2021-03-31 GS MS AMAT JPM DVN TRIP ETSY GME GM FANG SPG CPRI VIAC FCX MO
2021-04-30 AMAT GS MS MRNA DVN FCX LRCX DELL LPX JPM CZR STX URI DE BBWI
2021-05-28 GS MS DVN AMAT FCX CLF STX GME LPX NUE JPM KKR BBWI ORCL BRK-B
2021-06-30 BX GS MRNA TGT NVDA MS KKR CRWD GOOGL F CLF TRGP MAC PYPL DVN
2021-07-30 BX MRNA GS ORCL MS TGT GOOGL INTU META NVDA SIVB KKR SBNY GOOG FCX
2021-08-31 MRNA BX GS GOOGL KKR SIVB SBNY MS INTU DHR GOOG CRWD PFE NUE TGT
2021-09-30 MRNA BX WFC GOOGL PANW GS KKR JPM TSLA DHR SIVB AMD PFE TMO MS
2021-10-29 BX KKR GS NVDA TSLA GOOGL WFC EOG ETSY MSFT COIN ORCL AMD SIVB MS
2021-11-30 MRNA BX KKR PFE AMD KLAC NVDA PANW DVN COP MSFT ON TMO AAPL AVGO
2021-12-31 AMD PFE BX KKR AVGO KLAC DVN NVDA FCX TMO QCOM TSLA AAPL MSFT ON
2022-01-31 PFE WFC CVX BX COP EOG DVN XOM OXY BRK-B ABBV AAPL AVGO ON WY
2022-02-28 WFC CVX COP EOG OXY ABBV DVN XOM AXP FCX BRK-B RTX BX WMB EXC
2022-03-31 PFE COP CVX ABBV XOM REGN FCX EOG BRK-B OXY CF DVN TSLA MOS MPC
2022-04-29 PFE COP CVX XOM ABBV EOG DVN REGN BMY OXY CF MPC WMB VLO MCK
2022-05-31 XOM PFE EOG CVX OXY DVN COP ABBV CF APA MOS MPC PSX VLO REGN
2022-06-30 PFE XOM ABBV DVN EOG BMY OXY CVX COP MRK KO T CF MCK PEP
2022-07-29 XOM OXY DVN CVX ON COP EOG CF PFE VICI ABBV MRO MPC VLO MOS
2022-08-31 COP DVN XOM OXY VRTX CF ON EOG MPC CVX MCK MRO VLO PSX MOS
2022-09-30 COP VRTX XOM DVN CF EOG OXY MPC ON CVX REGN PCG AZO MRK PFE
2022-10-31 COP DVN XOM CVX EOG OXY VRTX PSX MRO MPC APA AZO VLO CF AMGN
2022-11-30 XOM COP MPC MRNA EOG MRK PSX CVX AMGN ABBV VRTX JPM MCHP GS TJX
2022-12-30 XOM CVX COP MRNA PSX APA MRK MPC AIG PCG SLB EOG URI TJX JPM
2023-01-31 BKNG MPC URI XOM COP FCX JPM AVGO MRNA VRTX VLO EOG MS CAT LVS
2023-02-28 BKNG URI ON XOM JPM MCHP AVGO ADI ORCL MPC ULTA ABBV CAT ACGL STLD
2023-03-31 BKNG MPC ADI ON AVGO LEN MCHP VLO ORCL XOM URI PHM DHI GE ULTA
2023-04-28 BKNG XOM DHI AVGO LEN PHM MSFT ORCL MDLZ MRK HCA VRTX ADI V CVX
2023-05-31 AVGO ORCL PHM MSFT BKNG LEN PANW KLAC UBER VRTX GE AAPL ANET DHI LLY
2023-06-30 AVGO PHM LEN PANW BKNG DAL KLAC MCHP ORCL TSLA ON URI ABNB MSFT RCL
2023-07-31 BKNG AVGO ABNB PHM ON KLAC PLTR UBER JPM MCHP ORCL NXPI MSFT ADBE EOG
2023-08-31 BKNG AVGO ORCL CAT PH PHM MPC TJX ADBE BRK-B ETN JPM PSX CSCO EOG
2023-09-29 PSX BKNG MPC CAT HAL SLB PLTR SMCI JPM XOM AVGO BRK-B CVNA EOG COP
2023-10-31 AVGO MPC NOW ANET PSX MSFT PANW KLAC JPM ADBE CSCO BRK-B ORCL V VRTX
2023-11-30 NOW IBM META PANW CRWD RCL PHM MSFT KKR UBER PGR JPM BKNG AVGO ADBE
2023-12-29 BKNG AVGO RCL PHM META JPM IBM CVNA UBER WFC SPG CRWD INTU ADBE COST
2024-01-31 NVDA IBM CRM META NOW JPM PANW CRWD BKNG SMCI KKR AVGO UBER COST MSFT
2024-02-29 META NVDA PGR GE CRM IBM JPM PLTR URI KKR AVGO SMCI PH UBER WFC
2024-03-28 META NVDA GE PGR SMCI IBM JPM URI WFC CAT AVGO ANET DELL CRM ANF
2024-04-30 NVDA META WFC PGR GE JPM PLTR AXP PH CAT ANF DAL VRT SMCI ETN
2024-05-31 META NVDA WFC COIN PGR JPM DELL GS CVNA ANF CAT QCOM GOOGL ANET ETN
2024-06-28 NVDA META PANW GOOGL COST WFC NFLX PGR JPM PLTR AMZN QCOM AVGO DELL MSFT
2024-07-31 NVDA GS KKR JPM AVGO URI META MO ANF AXP PLTR ANET IBM PGR COST
2024-08-30 NVDA PGR PLTR META TMUS JPM PANW MO KKR GS MCO AVGO PM LUMN IBM
2024-09-30 NVDA PGR IBM META PLTR KKR AMT T ORCL URI MO TMUS PM SPGI AVGO
2024-10-31 NVDA META PLTR BKNG KKR TMUS T BLK NFLX IBM PGR WMB ORCL MO VST
2024-11-29 NVDA COIN GS PLTR TMUS MS NFLX BKNG CRM ORCL VRT META FTNT LUMN BX
2024-12-31 NVDA PLTR GS NFLX META TMUS CRM BLK PYPL AXP BKNG MS APP TSLA V
2025-01-31 COIN META GS JPM PLTR NFLX MS WFC AMZN TPL CEG VST PGR V TSLA
2025-02-28 PLTR META PGR GS TMUS T V NFLX JPM PM HOOD WELL MA WFC BRK-B
2025-03-31 PGR MO PLTR TMUS BRK-B V JPM PM WELL VZ HOOD GS TRV FTNT META
2025-04-30 PGR BRK-B MO BKNG NFLX PLTR PM FTNT JPM V UBER NEM AMT TRV GS
2025-05-30 HOOD UBER GILD META BKNG PLTR NFLX PM JPM NEM V MO GE MA RCL
2025-06-30 GS HOOD JPM META UBER MS NEM RCL NFLX BKNG AVGO STX C NVDA PLTR
2025-07-31 NVDA HOOD GS C META RCL STX AVGO PLTR JPM WDC UBER MSFT SCHW GE
2025-08-29 NVDA GS NEM HOOD C RCL STX WDC PLTR MS GOOGL LRCX MPWR MU UBER
2025-09-30 AVGO COIN NEM GS NVDA HOOD C MS STX GOOGL WDC PLTR KLAC LRCX MU
2025-10-31 NEM MU AVGO NVDA KLAC WDC GOOGL STX HOOD MPWR LRCX PLTR MS GS C
2025-11-28 MU AVGO NEM STX GOOGL WDC LLY KLAC GS MS HOOD C MPWR WELL GOOG
2025-12-31 WDC MU C AVGO NEM STX GS MS LLY GOOGL KLAC LRCX NVDA JNJ AMD
2026-01-30 NEM WDC KLAC MU JNJ STX GILD GS GOOGL C LRCX LLY MPWR ADI MS
2026-02-27 WDC KLAC MU NEM JNJ STX GILD MPWR ADI GOOGL LRCX VZ AMGN APH MRK
2026-03-31 MU WDC NEM JNJ KLAC STX PSX LRCX CF GILD APA GOOGL GS AMD ADI
2026-04-30 MU WDC KLAC NEM STX ADI AVGO GOOGL AMD LRCX VRT GOOG NVDA JNJ TER
2026-05-29 MU WDC NVDA KLAC STX GS LRCX AMD ADI MS AVGO MRVL GOOGL TXN LITE
2026-06-26 WDC MU STX KLAC LRCX SPG MS C MRVL TXN ADI HPE LLY AMD CSCO
Scoring script (python)
FORMULA_NAME = "Contrarian 52-Week Regime Momentum Recovery Quality Hybrid (Escrow Referee, v1185)"
LOGIC_VARIANT_COUNT = 4
NOTES = """mode=explore; family=contrarian-52w-regime-momentum-recovery-quality-hybrid
New hybrid family built as an escrow-referee structure rather than a static blend: each stock first earns evidence inside three distinct sleeves, a washed-out 52-week contrarian sleeve, a trend-respecting momentum sleeve, and a recovery-quality sleeve, and then a branch-specific referee decides which edge is allowed to cash out. The arbitration is explicit and non-mechanical: deep drawdowns cannot win without repair evidence, momentum cannot dominate when extension outruns durability, and recovery candidates receive only partial credit unless quality, liquidity, and stabilization unlock the escrow. This makes the family structurally distinct from the parent relay/admission designs because sleeve conflict is settled through admissibility gates, conflict taxes, and branch-level release multipliers instead of simple dominance weights.
Deliberate metric coverage this run: momentum uses return_1m_pct, return_3m_pct, return_6m_pct, return_12m_pct, and momentum_12_1_pct; trend/recovery uses from_200d_ma_pct and from_52w_high_pct; volatility uses realized_vol_3m; liquidity uses avg_daily_volume_3m, avg_daily_dollar_volume_3m, and trading_days_3m; income uses dividend_yield_ttm_pct and dividend_ttm; valuation uses pe, forward_pe, and peg; growth uses eps_growth_pct, revenue_growth_pct, operating_income_growth_pct, free_cash_flow_growth_pct, and forward_eps; quality uses operating_margin_pct and free_cash_flow_margin_pct; size uses market_cap as a stability and crowding moderator rather than a raw rank target. Deliberate weight-0 metrics this run: shares_outstanding, close, adj_close, high_52w, ma_200d, eps_ttm, revenue_ttm, operating_income_ttm, and free_cash_flow_ttm. Sparse fundamentals are normalized inside each sleeve so missing fields reduce confidence rather than forcing large-cap-only selection."""

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


def score_universe(stocks, regime, ctx):
    def _get(stock, key, default=None):
        if isinstance(stock, dict):
            return stock.get(key, default)
        return default

    def _num(x):
        return isinstance(x, (int, float)) and x == x

    def _symbol(stock, idx):
        sym = _get(stock, "symbol", None)
        if sym is None:
            sym = _get(stock, "ticker", None)
        if sym is None:
            sym = "STK_" + str(idx)
        return sym

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

    def _avg(vals):
        total = 0.0
        count = 0
        for v in vals:
            if _num(v):
                total += v
                count += 1
        if count == 0:
            return None
        return total / count

    def _metric_rank(stock, metric, higher_is_better, cache):
        ranks = cache.get(metric)
        if ranks is None:
            vals = []
            for j, s in enumerate(stocks):
                v = _get(s, metric, None)
                if _num(v):
                    vals.append((v, j))
            vals.sort(key=lambda x: x[0])
            n = len(vals)
            ranks = {}
            if n == 1:
                ranks[vals[0][1]] = 0.5
            elif n > 1:
                for pos, pair in enumerate(vals):
                    ranks[pair[1]] = pos / float(n - 1)
            cache[metric] = ranks
        r = ranks.get(stock["_idx"])
        if r is None:
            return None
        return r if higher_is_better else (1.0 - r)

    def _blend(stock, metric_defs, cache):
        total = 0.0
        weight = 0.0
        for metric, w, sign in metric_defs:
            r = _metric_rank(stock, metric, sign > 0, cache)
            if r is not None:
                total += w * r
                weight += w
        if weight <= 0.0:
            return None
        return total / weight

    def _coverage(stock, metrics):
        seen = 0
        for metric in metrics:
            if _num(_get(stock, metric, None)):
                seen += 1
        if not metrics:
            return 0.0
        return seen / float(len(metrics))

    def _regime_branch(regime_obj):
        text = ""
        risk_off = False
        high_vol = False
        weak_trend = False
        if isinstance(regime_obj, str):
            text = regime_obj.lower()
        elif isinstance(regime_obj, dict):
            for key in (
                "regime",
                "label",
                "state",
                "market_regime",
                "trend_regime",
                "vol_regime",
                "risk_regime",
            ):
                val = regime_obj.get(key)
                if isinstance(val, str):
                    text += " " + val.lower()
            risk_off = bool(regime_obj.get("risk_off")) or bool(regime_obj.get("defensive"))
            high_vol = bool(regime_obj.get("high_vol")) or bool(regime_obj.get("volatile"))
            weak_trend = bool(regime_obj.get("weak_trend")) or bool(regime_obj.get("bearish"))
            vix_like = regime_obj.get("volatility", None)
            if _num(vix_like) and vix_like > 0.6:
                high_vol = True
            breadth = regime_obj.get("breadth", None)
            if _num(breadth) and breadth < -0.15:
                weak_trend = True
            trend = regime_obj.get("trend", None)
            if _num(trend) and trend < -0.1:
                weak_trend = True
        if "stress" in text or "panic" in text or "crash" in text:
            return "stressed"
        if "bear" in text or "defensive" in text or "risk-off" in text or risk_off:
            return "defensive"
        if "recovery" in text or "repair" in text or "transition" in text:
            return "recovery"
        if "bull" in text or "uptrend" in text or "risk-on" in text:
            return "bull"
        if high_vol and weak_trend:
            return "stressed"
        if weak_trend or risk_off:
            return "defensive"
        if high_vol:
            return "recovery"
        return "bull"

    stocks = list(stocks)
    for i, stock in enumerate(stocks):
        stock["_idx"] = i

    cache = {}

    momentum_cluster = (
        ("momentum_12_1_pct", 0.27, +1),
        ("return_6m_pct", 0.24, +1),
        ("return_3m_pct", 0.18, +1),
        ("return_1m_pct", 0.11, +1),
        ("return_12m_pct", 0.08, +1),
        ("from_200d_ma_pct", 0.12, +1),
    )
    contrarian_cluster = (
        ("from_52w_high_pct", 0.34, -1),
        ("from_200d_ma_pct", 0.22, -1),
        ("return_1m_pct", 0.10, -1),
        ("return_3m_pct", 0.08, -1),
        ("realized_vol_3m", 0.08, -1),
        ("avg_daily_dollar_volume_3m", 0.08, +1),
        ("trading_days_3m", 0.10, +1),
    )
    repair_cluster = (
        ("return_1m_pct", 0.16, +1),
        ("return_3m_pct", 0.16, +1),
        ("from_200d_ma_pct", 0.20, +1),
        ("from_52w_high_pct", 0.14, +1),
        ("eps_growth_pct", 0.08, +1),
        ("revenue_growth_pct", 0.08, +1),
        ("operating_income_growth_pct", 0.08, +1),
        ("free_cash_flow_growth_pct", 0.10, +1),
    )
    quality_cluster = (
        ("operating_margin_pct", 0.22, +1),
        ("free_cash_flow_margin_pct", 0.22, +1),
        ("dividend_yield_ttm_pct", 0.08, +1),
        ("dividend_ttm", 0.05, +1),
        ("pe", 0.09, -1),
        ("forward_pe", 0.10, -1),
        ("peg", 0.09, -1),
        ("forward_eps", 0.07, +1),
        ("market_cap", 0.08, +1),
    )
    liquidity_cluster = (
        ("avg_daily_volume_3m", 0.28, +1),
        ("avg_daily_dollar_volume_3m", 0.44, +1),
        ("trading_days_3m", 0.28, +1),
    )
    stability_cluster = (
        ("realized_vol_3m", 0.35, -1),
        ("avg_daily_dollar_volume_3m", 0.20, +1),
        ("market_cap", 0.20, +1),
        ("operating_margin_pct", 0.12, +1),
        ("free_cash_flow_margin_pct", 0.13, +1),
    )

    branch = _regime_branch(regime)
    scores = {}

    for i, stock in enumerate(stocks):
        sym = _symbol(stock, i)

        mom = _blend(stock, momentum_cluster, cache)
        contra = _blend(stock, contrarian_cluster, cache)
        repair = _blend(stock, repair_cluster, cache)
        quality = _blend(stock, quality_cluster, cache)
        liquid = _blend(stock, liquidity_cluster, cache)
        stable = _blend(stock, stability_cluster, cache)

        if mom is None:
            mom = 0.5
        if contra is None:
            contra = 0.5
        if repair is None:
            repair = 0.5
        if quality is None:
            quality = 0.5
        if liquid is None:
            liquid = 0.5
        if stable is None:
            stable = 0.5

        drawdown = _metric_rank(stock, "from_52w_high_pct", False, cache)
        above_200 = _metric_rank(stock, "from_200d_ma_pct", True, cache)
        cheapness = _avg(
            (
                _metric_rank(stock, "pe", False, cache),
                _metric_rank(stock, "forward_pe", False, cache),
                _metric_rank(stock, "peg", False, cache),
            )
        )
        growth = _avg(
            (
                _metric_rank(stock, "eps_growth_pct", True, cache),
                _metric_rank(stock, "revenue_growth_pct", True, cache),
                _metric_rank(stock, "operating_income_growth_pct", True, cache),
                _metric_rank(stock, "free_cash_flow_growth_pct", True, cache),
                _metric_rank(stock, "forward_eps", True, cache),
            )
        )
        if drawdown is None:
            drawdown = 0.5
        if above_200 is None:
            above_200 = 0.5
        if cheapness is None:
            cheapness = 0.5
        if growth is None:
            growth = 0.5

        contrarian_admissible = (
            0.55 * drawdown
            + 0.25 * repair
            + 0.10 * liquid
            + 0.10 * stable
        )
        momentum_admissible = (
            0.58 * mom
            + 0.17 * above_200
            + 0.15 * stable
            + 0.10 * quality
        )
        recovery_admissible = (
            0.34 * repair
            + 0.22 * quality
            + 0.14 * growth
            + 0.15 * stable
            + 0.15 * liquid
        )

        extension_tax = _clamp(mom - drawdown - 0.18, 0.0, 0.35)
        broken_tax = _clamp(drawdown - repair - 0.10, 0.0, 0.35)
        junk_tax = _clamp(0.52 - quality, 0.0, 0.25) + _clamp(0.48 - liquid, 0.0, 0.20)
        conflict_tax = 0.0
        if mom > 0.62 and contra > 0.62:
            conflict_tax += 0.08
        if drawdown > 0.70 and above_200 < 0.35:
            conflict_tax += 0.08

        contrarian_edge = (
            0.48 * contra
            + 0.22 * repair
            + 0.12 * cheapness
            + 0.10 * quality
            + 0.08 * liquid
            - 0.55 * broken_tax
        )
        momentum_edge = (
            0.56 * mom
            + 0.14 * above_200
            + 0.12 * quality
            + 0.10 * growth
            + 0.08 * liquid
            - 0.60 * extension_tax
        )
        recovery_edge = (
            0.30 * repair
            + 0.24 * quality
            + 0.16 * growth
            + 0.10 * cheapness
            + 0.10 * liquid
            + 0.10 * stable
            - 0.30 * broken_tax
        )

        contra_release = _clamp((contrarian_admissible - 0.45) / 0.35, 0.0, 1.0)
        mom_release = _clamp((momentum_admissible - 0.48) / 0.32, 0.0, 1.0)
        repair_release = _clamp((recovery_admissible - 0.46) / 0.34, 0.0, 1.0)

        released_contra = contrarian_edge * (0.35 + 0.65 * contra_release)
        released_mom = momentum_edge * (0.35 + 0.65 * mom_release)
        released_recovery = recovery_edge * (0.35 + 0.65 * repair_release)

        if branch == "bull":
            branch_score = (
                0.52 * released_mom
                + 0.22 * released_recovery
                + 0.16 * released_contra
                + 0.10 * stable
            )
            branch_score -= 0.10 * broken_tax + 0.06 * conflict_tax
        elif branch == "recovery":
            branch_score = (
                0.41 * released_recovery
                + 0.29 * released_mom
                + 0.20 * released_contra
                + 0.10 * cheapness
            )
            branch_score -= 0.07 * extension_tax + 0.05 * conflict_tax
        elif branch == "stressed":
            branch_score = (
                0.39 * released_contra
                + 0.31 * released_recovery
                + 0.18 * stable
                + 0.12 * quality
            )
            branch_score -= 0.12 * junk_tax + 0.05 * extension_tax
        else:
            branch_score = (
                0.37 * released_recovery
                + 0.25 * released_contra
                + 0.20 * quality
                + 0.10 * stable
                + 0.08 * cheapness
            )
            branch_score -= 0.10 * junk_tax + 0.06 * extension_tax

        primary = released_mom
        secondary = released_recovery
        if released_contra > primary:
            secondary = primary
            primary = released_contra
        elif released_contra > secondary:
            secondary = released_contra
        if released_recovery > primary:
            secondary = primary
            primary = released_recovery
        elif released_recovery > secondary:
            secondary = released_recovery

        agreement_bonus = 0.0
        if primary > 0.58 and secondary > 0.54:
            agreement_bonus = 0.06
        if released_mom > 0.60 and released_recovery > 0.55 and above_200 > 0.55:
            agreement_bonus += 0.04
        if released_contra > 0.60 and repair > 0.55 and quality > 0.52:
            agreement_bonus += 0.04

        metric_coverage = _coverage(stock, ACTIVE_METRICS)
        coverage_bonus = 0.05 * _clamp((metric_coverage - 0.35) / 0.45, 0.0, 1.0)
        sparse_penalty = 0.08 * _clamp(0.28 - metric_coverage, 0.0, 0.28) / 0.28

        final_score = branch_score + agreement_bonus + coverage_bonus - conflict_tax - sparse_penalty
        scores[sym] = final_score

    for stock in stocks:
        if "_idx" in stock:
            del stock["_idx"]

    return scores