{
"generated": "2026-11-08T13:55:02Z",
"direction": "short",
"weights": {
"trend": 0.35,
"rel_strength": 0.25,
"volume": 0.15,
"fundamentals": 0.15,
"analyst": 0.1
},
"breadth": {
"mom5": 1.715,
"mom20": 7.382,
"state": "BROADENING",
"smooth": 5,
"max_tilt_points": 5.0
},
"catalyst": {
"window_hours": 24,
"max_points": 3.0,
"saturates_at": 5
},
"count": 10,
"description": {
"_about": "Each item in `symbols` is one ranked candidate; the fields below explain its shape.",
"rank": "1-based position in this list (best first).",
"symbol": "Ticker.",
"sector": "Sector, taken from the symbol's own snapshot (the label its sector-ETF comparison was run against) and translated into the liquid universe's vocabulary; falls back to the universe bucket when the snapshot has no known sector.",
"in_target_sector": "True if the sector is in today's strong sectors for long (sectors.green) / weak sectors for short (sectors.red).",
"score": "0-100 overall quality used for ranking = `score_before_breadth` + `breadth_tilt` + `news_tilt`, clamped to 0-100.",
"score_before_breadth": "Coverage-weighted sum of the subscores (see top-level `weights`) before either tilt. NOT renormalized: a missing subscore forfeits its weight, so a name measured on half its dimensions can score at most 50. Below half the total weight the candidate is not ranked at all.",
"breadth_tilt": "Points added by the RSP/SPY regime (top-level `breadth`), from +max_tilt_points for the smallest name in the pool to -max_tilt_points for the largest, or the reverse. Rising RSP/SPY = the average stock is beating the largest ones, so longs tilt small and shorts tilt large; falling RSP/SPY flips both. 0 when there is no regime call.",
"subscores": {
"trend": "0-1: fraction of trend/momentum/crossover checks passed (EMA stack, ADX>30, RSI band, ROC, MACD, higher-highs, fresh cross, ...). Short uses its own bearish set, which grades magnitude (ADX>30, ROC<-5, RSI<35) alongside direction so that clearing the bear prefilter is not by itself a 1.0.",
"rel_strength": "0-1: the 10-session return gap to the sector ETF, saturating at RS_FULL_GAP points ahead (long) or behind (short). Falls back to the fraction of relative-strength booleans passed (beats SPY 5/10/20d, beats sector 10d, RS line at high, sector top-3), inverted for short, only when either leg of the gap is missing.",
"volume": "0-1: fraction of volume-confirmation checks passed (rel-vol>2, up-vol beats down, OBV new high, surge day, last up beats down).",
"fundamentals": "0-1: mean of bounded valuation/quality pieces (DCF upside, P/E band, net margin, ROE, net-debt/EBITDA). Short = 1 minus the long value.",
"analyst": "0-1: mean of consensus target upside, overall rating/5, and a recent upgrade-minus-downgrade nudge. Short = 1 minus the long value."
},
"news_24h": "Headlines the symbol printed in the last 24 hours, deduped across five providers. A catalyst proxy: it counts attention, not sentiment, so it never says whether the news helps this direction. Items whose provider date cannot be parsed are not counted.",
"news_tilt": "Points added by `news_24h` (top-level `catalyst`), 0 up to max_points and saturating at saturates_at headlines. One-sided: news is a small bonus, silence is neutral. Deliberately not one of `weights` — the subscores are not renormalized, so a sixth dimension would cap every quiet name below every noisy one whatever its setup.",
"price": "Latest quote.",
"dcf_upside_pct": "FMP DCF fair value vs price, percent (can be noisy/inflated).",
"adx": "ADX(14) trend strength.",
"avg_dollar_vol": "Average daily dollar volume (liquidity); also the short tie-break.",
"reasons": "Up to 4 human-readable signals behind the ranking.",
"reasons_long": "Same signals as full sentences, all of them, for the detail modal."
},
"symbols": [
{
"rank": 1,
"symbol": "CVS",
"sector": "Health Care",
"in_target_sector": true,
"score": 74.6,
"score_before_breadth": 69.0,
"breadth_tilt": 4.44,
"news_24h": 2,
"news_tilt": 1.2,
"subscores": {
"trend": 0.818,
"rel_strength": 0.892,
"volume": 0.75,
"fundamentals": 0.29,
"analyst": 0.247
},
"price": 83.85,
"dcf_upside_pct": 327.7,
"adx": 23.26419007590704,
"avg_dollar_vol": 711097246.8000001,
"reasons": ["Price below SMA50", "Weak RSI (<45)", "Lags SPY/sector", "Negative momentum"],
"reasons_long": ["The price is trading below its 50-day moving average, the usual dividing line between an uptrend and a downtrend — sellers currently have the upper hand.", "The 14-day RSI is under 45, showing momentum has rolled over and rallies are being sold into rather than bought.", "The stock is underperforming both the S&P 500 and its own sector, so money is rotating out of it rather than into it.", "Rate of change over the last 10 sessions is negative — the stock has lost ground outright, before even adjusting for the market."]
},
{
"rank": 2,
"symbol": "TT",
"sector": "Industrials",
"in_target_sector": true,
"score": 72.6,
"score_before_breadth": 68.7,
"breadth_tilt": 3.89,
"news_24h": 0,
"news_tilt": 0.0,
"subscores": {
"trend": 1.0,
"rel_strength": 0.568,
"volume": 0.75,
"fundamentals": 0.309,
"analyst": 0.359
},
"price": 401.76,
"dcf_upside_pct": -37.0,
"adx": 30.53332632586237,
"avg_dollar_vol": 493935395.03999996,
"reasons": ["Price below SMA50", "Weak RSI (<45)", "Lags SPY/sector", "Negative momentum"],
"reasons_long": ["The price is trading below its 50-day moving average, the usual dividing line between an uptrend and a downtrend — sellers currently have the upper hand.", "The 14-day RSI is under 45, showing momentum has rolled over and rallies are being sold into rather than bought.", "The stock is underperforming both the S&P 500 and its own sector, so money is rotating out of it rather than into it.", "Rate of change over the last 10 sessions is negative — the stock has lost ground outright, before even adjusting for the market."]
},
{
"rank": 3,
"symbol": "ROK",
"sector": "Industrials",
"in_target_sector": true,
"score": 71.2,
"score_before_breadth": 70.0,
"breadth_tilt": 0.56,
"news_24h": 1,
"news_tilt": 0.6,
"subscores": {
"trend": 0.818,
"rel_strength": 0.708,
"volume": 1.0,
"fundamentals": 0.327,
"analyst": 0.38
},
"price": 375.86,
"dcf_upside_pct": -47.5,
"adx": 15.804580928317003,
"avg_dollar_vol": 298568269.79999995,
"reasons": ["Price below SMA50", "Weak RSI (<45)", "Lags SPY/sector", "Negative momentum"],
"reasons_long": ["The price is trading below its 50-day moving average, the usual dividing line between an uptrend and a downtrend — sellers currently have the upper hand.", "The 14-day RSI is under 45, showing momentum has rolled over and rallies are being sold into rather than bought.", "The stock is underperforming both the S&P 500 and its own sector, so money is rotating out of it rather than into it.", "Rate of change over the last 10 sessions is negative — the stock has lost ground outright, before even adjusting for the market."]
},
{
"rank": 4,
"symbol": "LAUR",
"sector": "Consumer Staples",
"in_target_sector": true,
"score": 70.7,
"score_before_breadth": 73.5,
"breadth_tilt": -2.78,
"news_24h": 0,
"news_tilt": 0.0,
"subscores": {
"trend": 1.0,
"rel_strength": 1.0,
"volume": 0.5,
"fundamentals": 0.093,
"analyst": 0.459
},
"price": 33.59,
"dcf_upside_pct": 63.0,
"adx": 30.900292857707647,
"avg_dollar_vol": 37281751.9848,
"reasons": ["Price below SMA50", "Weak RSI (<45)", "Lags SPY/sector", "Negative momentum"],
"reasons_long": ["The price is trading below its 50-day moving average, the usual dividing line between an uptrend and a downtrend — sellers currently have the upper hand.", "The 14-day RSI is under 45, showing momentum has rolled over and rallies are being sold into rather than bought.", "The stock is underperforming both the S&P 500 and its own sector, so money is rotating out of it rather than into it.", "Rate of change over the last 10 sessions is negative — the stock has lost ground outright, before even adjusting for the market."]
},
{
"rank": 5,
"symbol": "LOPE",
"sector": "Consumer Staples",
"in_target_sector": true,
"score": 69.8,
"score_before_breadth": 74.8,
"breadth_tilt": -5.0,
"news_24h": 0,
"news_tilt": 0.0,
"subscores": {
"trend": 0.909,
"rel_strength": 1.0,
"volume": 1.0,
"fundamentals": 0.055,
"analyst": 0.212
},
"price": 117.69,
"dcf_upside_pct": 99.4,
"adx": 21.798449968508205,
"avg_dollar_vol": 38070938.13,
"reasons": ["Price below SMA50", "Weak RSI (<45)", "Lags SPY/sector", "Negative momentum"],
"reasons_long": ["The price is trading below its 50-day moving average, the usual dividing line between an uptrend and a downtrend — sellers currently have the upper hand.", "The 14-day RSI is under 45, showing momentum has rolled over and rallies are being sold into rather than bought.", "The stock is underperforming both the S&P 500 and its own sector, so money is rotating out of it rather than into it.", "Rate of change over the last 10 sessions is negative — the stock has lost ground outright, before even adjusting for the market."]
},
{
"rank": 6,
"symbol": "BA",
"sector": "Industrials",
"in_target_sector": true,
"score": 69.0,
"score_before_breadth": 62.8,
"breadth_tilt": 5.0,
"news_24h": 2,
"news_tilt": 1.2,
"subscores": {
"trend": 0.909,
"rel_strength": 0.448,
"volume": 0.75,
"fundamentals": 0.381,
"analyst": 0.279
},
"price": 173.4,
"dcf_upside_pct": -346.6,
"adx": 32.283962132558564,
"avg_dollar_vol": 1249092611.29161,
"reasons": ["Price below SMA50", "Weak RSI (<45)", "Lags SPY/sector", "Negative momentum"],
"reasons_long": ["The price is trading below its 50-day moving average, the usual dividing line between an uptrend and a downtrend — sellers currently have the upper hand.", "The 14-day RSI is under 45, showing momentum has rolled over and rallies are being sold into rather than bought.", "The stock is underperforming both the S&P 500 and its own sector, so money is rotating out of it rather than into it.", "Rate of change over the last 10 sessions is negative — the stock has lost ground outright, before even adjusting for the market."]
},
{
"rank": 7,
"symbol": "CVSA",
"sector": "Consumer Staples",
"in_target_sector": true,
"score": 67.4,
"score_before_breadth": 71.3,
"breadth_tilt": -3.89,
"news_24h": 0,
"news_tilt": 0.0,
"subscores": {
"trend": 0.818,
"rel_strength": 1.0,
"volume": 0.75,
"fundamentals": 0.153,
"analyst": 0.411
},
"price": 110.32,
"dcf_upside_pct": 121.5,
"adx": 25.233069048914526,
"avg_dollar_vol": 39045116.32,
"reasons": ["Price below SMA50", "Weak RSI (<45)", "Lags SPY/sector", "Negative momentum"],
"reasons_long": ["The price is trading below its 50-day moving average, the usual dividing line between an uptrend and a downtrend — sellers currently have the upper hand.", "The 14-day RSI is under 45, showing momentum has rolled over and rallies are being sold into rather than bought.", "The stock is underperforming both the S&P 500 and its own sector, so money is rotating out of it rather than into it.", "Rate of change over the last 10 sessions is negative — the stock has lost ground outright, before even adjusting for the market."]
},
{
"rank": 8,
"symbol": "JCI",
"sector": "Basic Materials",
"in_target_sector": true,
"score": 62.4,
"score_before_breadth": 58.5,
"breadth_tilt": 3.33,
"news_24h": 1,
"news_tilt": 0.6,
"subscores": {
"trend": 0.727,
"rel_strength": 0.497,
"volume": 0.75,
"fundamentals": 0.39,
"analyst": 0.351
},
"price": 135.03,
"dcf_upside_pct": -62.3,
"adx": 21.866199655572277,
"avg_dollar_vol": 493842923.49,
"reasons": ["Price below SMA50", "Weak RSI (<45)", "Lags SPY/sector", "Negative momentum"],
"reasons_long": ["The price is trading below its 50-day moving average, the usual dividing line between an uptrend and a downtrend — sellers currently have the upper hand.", "The 14-day RSI is under 45, showing momentum has rolled over and rallies are being sold into rather than bought.", "The stock is underperforming both the S&P 500 and its own sector, so money is rotating out of it rather than into it.", "Rate of change over the last 10 sessions is negative — the stock has lost ground outright, before even adjusting for the market."]
},
{
"rank": 9,
"symbol": "IBKR",
"sector": "Finance",
"in_target_sector": true,
"score": 60.4,
"score_before_breadth": 60.4,
"breadth_tilt": -0.0,
"news_24h": 0,
"news_tilt": 0.0,
"subscores": {
"trend": 0.909,
"rel_strength": 0.523,
"volume": 0.5,
"fundamentals": 0.334,
"analyst": 0.296
},
"price": 75.82,
"dcf_upside_pct": -80.0,
"adx": 30.087275630557468,
"avg_dollar_vol": 330434476.0992,
"reasons": ["Price below SMA50", "Weak RSI (<45)", "Lags SPY/sector", "Negative momentum"],
"reasons_long": ["The price is trading below its 50-day moving average, the usual dividing line between an uptrend and a downtrend — sellers currently have the upper hand.", "The 14-day RSI is under 45, showing momentum has rolled over and rallies are being sold into rather than bought.", "The stock is underperforming both the S&P 500 and its own sector, so money is rotating out of it rather than into it.", "Rate of change over the last 10 sessions is negative — the stock has lost ground outright, before even adjusting for the market."]
},
{
"rank": 10,
"symbol": "CVE",
"sector": "Energy",
"in_target_sector": true,
"score": 57.3,
"score_before_breadth": 55.6,
"breadth_tilt": 1.67,
"news_24h": 0,
"news_tilt": 0.0,
"subscores": {
"trend": 0.909,
"rel_strength": 0.359,
"volume": 0.5,
"fundamentals": 0.226,
"analyst": 0.388
},
"price": 27.45,
"dcf_upside_pct": 14.7,
"adx": 23.824724857172168,
"avg_dollar_vol": 194570431.2,
"reasons": ["Price below SMA50", "Weak RSI (<45)", "Lags SPY/sector", "Negative momentum"],
"reasons_long": ["The price is trading below its 50-day moving average, the usual dividing line between an uptrend and a downtrend — sellers currently have the upper hand.", "The 14-day RSI is under 45, showing momentum has rolled over and rallies are being sold into rather than bought.", "The stock is underperforming both the S&P 500 and its own sector, so money is rotating out of it rather than into it.", "Rate of change over the last 10 sessions is negative — the stock has lost ground outright, before even adjusting for the market."]
}
]
}