{
  "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."]
    }
  ]
}