{
  "schema_version": 1,
  "generated_at": "2026-06-11T07:37:43.491256+00:00",
  "as_of_date": "2026-06-11",
  "market": {
    "short": {
      "timeframe": "short",
      "timeframe_label": "Short-term (1-4 weeks)",
      "score": 55.7,
      "regime": "Neutral / Selective",
      "regime_description": "Mixed signals. Stick to highest-conviction setups, smaller size.",
      "confidence": 1.0,
      "categories": {
        "trend": {
          "score": 26.3,
          "weight": 0.28,
          "confidence": 1.0,
          "components": {
            "SPY": {
              "pct_above_10dma": -0.0178952204107784,
              "pct_above_20dma": -0.01234221463405838,
              "score_10dma": 15.130974486526997,
              "score_20dma": 27.657785365941617
            },
            "QQQ": {
              "pct_above_10dma": -0.031171442780743908,
              "pct_above_20dma": -0.019598859671077218,
              "score_10dma": 0.0,
              "score_20dma": 20.401140328922782
            },
            "IWM": {
              "pct_above_10dma": -0.011695881184607737,
              "pct_above_20dma": 0.0003895554494668385,
              "score_10dma": 22.880148519240326,
              "score_20dma": 40.38955544946683
            },
            "DIA": {
              "pct_above_10dma": -0.0017792800824188992,
              "pct_above_20dma": 0.00880602815671283,
              "score_10dma": 35.27589989697638,
              "score_20dma": 48.80602815671283
            }
          }
        },
        "breadth": {
          "score": 74.9,
          "weight": 0.22,
          "confidence": 1.0,
          "components": {
            "rsp_vs_spy": {
              "rs_60d": 0.02853484951340579,
              "score": 100.0,
              "interpretation": "Equal-weight outperforming \u2014 broad participation"
            },
            "iwm_vs_spy": {
              "rs_60d": 0.001956966715949471,
              "score": 53.05776049367105,
              "interpretation": "Small caps leading \u2014 risk-on"
            },
            "universe_breadth": {
              "n_above_50dma": 30,
              "n_total_50dma": 44,
              "pct_above_50dma": 0.6818181818181818,
              "n_above_200dma": 35,
              "n_total_200dma": 44,
              "pct_above_200dma": 0.7954545454545454,
              "score": 71.59090909090908
            }
          }
        },
        "volatility": {
          "score": 64.7,
          "weight": 0.2,
          "confidence": 1.0,
          "components": {
            "vix": {
              "level": 20.979999542236328,
              "1y_percentile": 0.8492063492063492,
              "absolute_score": 50.11111365424262,
              "percentile_score": 15.07936507936508,
              "blended_score": 36.0984142242916,
              "blend_weights": {
                "absolute": 0.6,
                "percentile": 0.4
              }
            },
            "vvix": {
              "level": 95.80999755859375,
              "1y_percentile": 0.36507936507936506,
              "score": 63.49206349206349
            },
            "vix_term_structure": {
              "vix3m_over_vix": 1.0157292626742773,
              "state": "contango",
              "score": 32.86463133713869
            },
            "discretionary_vs_staples": {
              "rs_60d": 0.049258013377198484,
              "score": 91.04834448099874,
              "interpretation": "Offense beating defense \u2014 risk-on"
            },
            "semis_vs_spy": {
              "rs_60d": 0.5817929119396092,
              "score": 100.0,
              "interpretation": "Semis leading \u2014 cycle confirmation"
            }
          }
        },
        "credit": {
          "score": 70.3,
          "weight": 0.1,
          "confidence": 1.0,
          "components": {
            "hy_30d_change": {
              "current": 2.78,
              "30d_ago": 2.83,
              "change_pp": -0.050000000000000266,
              "score": 55.00000000000003
            },
            "hy_spread": {
              "current": 2.78,
              "1y_percentile": 0.20238095238095238,
              "score": 79.76190476190477
            },
            "ig_spread": {
              "current": 0.93,
              "1y_percentile": 0.07539682539682539,
              "score": 92.46031746031747
            },
            "hyg_vs_lqd": {
              "rs_20d": 0.0015956466327111674,
              "score": 53.98911658177792,
              "interpretation": "Junk outperforming quality \u2014 credit risk appetite healthy"
            }
          }
        },
        "macro": {
          "score": 64.8,
          "weight": 0.05,
          "confidence": 1.0,
          "components": {
            "yield_curve": {
              "spread_10y_minus_2y": 0.42,
              "inverted": false,
              "score": 61.33333333333333
            },
            "dxy": {
              "level": 99.9219970703125,
              "30d_change_pct": 0.010129386574147192,
              "score": 33.11768904308801
            },
            "copper_gold": {
              "ratio_60d_change": 0.31899320884386784,
              "score": 100.0,
              "interpretation": "Copper outpacing gold \u2014 growth impulse"
            }
          }
        },
        "momentum": {
          "score": 57.5,
          "weight": 0.15,
          "confidence": 1.0,
          "components": {
            "spy_10d_return": {
              "return": -0.01803919393816733,
              "score": 19.934676769721115
            },
            "spy_rsi": {
              "rsi": 49.00024336517371,
              "score": 95.00121682586854
            }
          }
        }
      }
    },
    "medium": {
      "timeframe": "medium",
      "timeframe_label": "Medium-term (1-3 months)",
      "score": 59.6,
      "regime": "Neutral / Selective",
      "regime_description": "Mixed signals. Stick to highest-conviction setups, smaller size.",
      "confidence": 1.0,
      "categories": {
        "trend": {
          "score": 53.4,
          "weight": 0.25,
          "confidence": 1.0,
          "components": {
            "SPY": {
              "pct_above_20dma": -0.01234221463405838,
              "pct_above_50dma": 0.02731380704968145,
              "score_20dma": 22.072231707427022,
              "score_50dma": 67.31380704968146
            },
            "QQQ": {
              "pct_above_20dma": -0.019598859671077218,
              "pct_above_50dma": 0.05087924976385705,
              "score_20dma": 13.001425411153475,
              "score_50dma": 90.87924976385705
            },
            "IWM": {
              "pct_above_20dma": 0.0003895554494668385,
              "pct_above_50dma": 0.03384681574542037,
              "score_20dma": 37.98694431183355,
              "score_50dma": 73.84681574542037
            },
            "DIA": {
              "pct_above_20dma": 0.00880602815671283,
              "pct_above_50dma": 0.033724401459291675,
              "score_20dma": 48.50753519589104,
              "score_50dma": 73.72440145929168
            }
          }
        },
        "breadth": {
          "score": 55.1,
          "weight": 0.2,
          "confidence": 1.0,
          "components": {
            "rsp_vs_spy": {
              "rs_60d": -0.030318936338602054,
              "score": 0.0,
              "interpretation": "Cap-weight outperforming \u2014 narrow market"
            },
            "iwm_vs_spy": {
              "rs_60d": 0.041981443320443956,
              "score": 93.73067012546245,
              "interpretation": "Small caps leading \u2014 risk-on"
            },
            "universe_breadth": {
              "n_above_50dma": 30,
              "n_total_50dma": 44,
              "pct_above_50dma": 0.6818181818181818,
              "n_above_200dma": 35,
              "n_total_200dma": 44,
              "pct_above_200dma": 0.7954545454545454,
              "score": 71.59090909090908
            }
          }
        },
        "volatility": {
          "score": 64.7,
          "weight": 0.2,
          "confidence": 1.0,
          "components": {
            "vix": {
              "level": 20.979999542236328,
              "1y_percentile": 0.8492063492063492,
              "absolute_score": 50.11111365424262,
              "percentile_score": 15.07936507936508,
              "blended_score": 36.0984142242916,
              "blend_weights": {
                "absolute": 0.6,
                "percentile": 0.4
              }
            },
            "vvix": {
              "level": 95.80999755859375,
              "1y_percentile": 0.36507936507936506,
              "score": 63.49206349206349
            },
            "vix_term_structure": {
              "vix3m_over_vix": 1.0157292626742773,
              "state": "contango",
              "score": 32.86463133713869
            },
            "discretionary_vs_staples": {
              "rs_60d": 0.049258013377198484,
              "score": 91.04834448099874,
              "interpretation": "Offense beating defense \u2014 risk-on"
            },
            "semis_vs_spy": {
              "rs_60d": 0.5817929119396092,
              "score": 100.0,
              "interpretation": "Semis leading \u2014 cycle confirmation"
            }
          }
        },
        "credit": {
          "score": 70.3,
          "weight": 0.15,
          "confidence": 1.0,
          "components": {
            "hy_30d_change": {
              "current": 2.78,
              "30d_ago": 2.83,
              "change_pp": -0.050000000000000266,
              "score": 55.00000000000003
            },
            "hy_spread": {
              "current": 2.78,
              "1y_percentile": 0.20238095238095238,
              "score": 79.76190476190477
            },
            "ig_spread": {
              "current": 0.93,
              "1y_percentile": 0.07539682539682539,
              "score": 92.46031746031747
            },
            "hyg_vs_lqd": {
              "rs_20d": 0.0015956466327111674,
              "score": 53.98911658177792,
              "interpretation": "Junk outperforming quality \u2014 credit risk appetite healthy"
            }
          }
        },
        "macro": {
          "score": 64.8,
          "weight": 0.1,
          "confidence": 1.0,
          "components": {
            "yield_curve": {
              "spread_10y_minus_2y": 0.42,
              "inverted": false,
              "score": 61.33333333333333
            },
            "dxy": {
              "level": 99.9219970703125,
              "30d_change_pct": 0.010129386574147192,
              "score": 33.11768904308801
            },
            "copper_gold": {
              "ratio_60d_change": 0.31899320884386784,
              "score": 100.0,
              "interpretation": "Copper outpacing gold \u2014 growth impulse"
            }
          }
        },
        "momentum": {
          "score": 52.2,
          "weight": 0.1,
          "confidence": 1.0,
          "components": {
            "spy_macd": {
              "macd": 7.025798621838021,
              "signal": 10.51073537644896,
              "histogram": -3.4849367546109384,
              "histogram_pct": -0.004728223068080192,
              "histogram_rising": false,
              "score": 9.402438523438658
            },
            "spy_rsi": {
              "rsi": 49.00024336517371,
              "score": 95.00121682586854
            }
          }
        }
      }
    },
    "long": {
      "timeframe": "long",
      "timeframe_label": "Long-term (3-12 months)",
      "score": 72.3,
      "regime": "Healthy Bullish",
      "regime_description": "Most signals positive. Selective deployment in leading sectors.",
      "confidence": 1.0,
      "categories": {
        "trend": {
          "score": 87.0,
          "weight": 0.2,
          "confidence": 1.0,
          "components": {
            "SPY": {
              "pct_above_50dma": 0.02731380704968145,
              "pct_above_200dma": 0.07971900459332604,
              "score_50dma": 71.64225881210182,
              "score_200dma": 86.47933639555067
            },
            "QQQ": {
              "pct_above_50dma": 0.05087924976385705,
              "pct_above_200dma": 0.13735725903868334,
              "score_50dma": 100.0,
              "score_200dma": 100.0
            },
            "IWM": {
              "pct_above_50dma": 0.03384681574542037,
              "pct_above_200dma": 0.1162286491418616,
              "score_50dma": 79.80851968177546,
              "score_200dma": 100.0
            },
            "DIA": {
              "pct_above_50dma": 0.033724401459291675,
              "pct_above_200dma": 0.06709759483065603,
              "score_50dma": 79.6555018241146,
              "score_200dma": 78.06506322043734
            }
          }
        },
        "breadth": {
          "score": 68.5,
          "weight": 0.15,
          "confidence": 1.0,
          "components": {
            "rsp_vs_spy": {
              "rs_60d": 0.000287116155413214,
              "score": 50.287116155413216,
              "interpretation": "Equal-weight outperforming \u2014 broad participation"
            },
            "iwm_vs_spy": {
              "rs_60d": 0.048259306862396434,
              "score": 80.16206678899776,
              "interpretation": "Small caps leading \u2014 risk-on"
            },
            "universe_breadth": {
              "n_above_50dma": 30,
              "n_total_50dma": 44,
              "pct_above_50dma": 0.6818181818181818,
              "n_above_200dma": 35,
              "n_total_200dma": 44,
              "pct_above_200dma": 0.7954545454545454,
              "score": 75.0
            }
          }
        },
        "volatility": {
          "score": 64.7,
          "weight": 0.1,
          "confidence": 1.0,
          "components": {
            "vix": {
              "level": 20.979999542236328,
              "1y_percentile": 0.8492063492063492,
              "absolute_score": 50.11111365424262,
              "percentile_score": 15.07936507936508,
              "blended_score": 36.0984142242916,
              "blend_weights": {
                "absolute": 0.6,
                "percentile": 0.4
              }
            },
            "vvix": {
              "level": 95.80999755859375,
              "1y_percentile": 0.36507936507936506,
              "score": 63.49206349206349
            },
            "vix_term_structure": {
              "vix3m_over_vix": 1.0157292626742773,
              "state": "contango",
              "score": 32.86463133713869
            },
            "discretionary_vs_staples": {
              "rs_60d": 0.049258013377198484,
              "score": 91.04834448099874,
              "interpretation": "Offense beating defense \u2014 risk-on"
            },
            "semis_vs_spy": {
              "rs_60d": 0.5817929119396092,
              "score": 100.0,
              "interpretation": "Semis leading \u2014 cycle confirmation"
            }
          }
        },
        "credit": {
          "score": 70.3,
          "weight": 0.2,
          "confidence": 1.0,
          "components": {
            "hy_30d_change": {
              "current": 2.78,
              "30d_ago": 2.83,
              "change_pp": -0.050000000000000266,
              "score": 55.00000000000003
            },
            "hy_spread": {
              "current": 2.78,
              "1y_percentile": 0.20238095238095238,
              "score": 79.76190476190477
            },
            "ig_spread": {
              "current": 0.93,
              "1y_percentile": 0.07539682539682539,
              "score": 92.46031746031747
            },
            "hyg_vs_lqd": {
              "rs_20d": 0.0015956466327111674,
              "score": 53.98911658177792,
              "interpretation": "Junk outperforming quality \u2014 credit risk appetite healthy"
            }
          }
        },
        "macro": {
          "score": 64.8,
          "weight": 0.3,
          "confidence": 1.0,
          "components": {
            "yield_curve": {
              "spread_10y_minus_2y": 0.42,
              "inverted": false,
              "score": 61.33333333333333
            },
            "dxy": {
              "level": 99.9219970703125,
              "30d_change_pct": 0.010129386574147192,
              "score": 33.11768904308801
            },
            "copper_gold": {
              "ratio_60d_change": 0.31899320884386784,
              "score": 100.0,
              "interpretation": "Copper outpacing gold \u2014 growth impulse"
            }
          }
        },
        "momentum": {
          "score": 93.7,
          "weight": 0.05,
          "confidence": 1.0,
          "components": {
            "spy_6mo_return": {
              "return": 0.08889980769948669,
              "score": 94.44990384974335
            },
            "spy_200dma_slope": {
              "monthly_change": 0.017170785246983344,
              "score": 92.92696311745837
            }
          }
        }
      }
    }
  },
  "sectors": {
    "short": [
      {
        "score": 61.9,
        "classification": "Improving",
        "confidence": 1.0,
        "components": {
          "pct_above_ma": 0.03938812494732158,
          "relative_strength": 0.0836503446917306,
          "rs_slope": -0.0008012696986277101,
          "momentum_return": 0.08060692519064694,
          "range_position": 0.8454744525374441
        },
        "sub_scores": {
          "trend": 55.2,
          "relative_strength": 89.8,
          "rs_slope": 9.9,
          "momentum": 69.8,
          "range_position": 84.5
        },
        "ticker": "XLV",
        "name": "Health Care",
        "subsectors": [
          {
            "score": 79.6,
            "classification": "Leading",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.04385196092380905,
              "relative_strength": 0.06556833295599918,
              "rs_slope": 0.0015018721688713987,
              "momentum_return": 0.06252491345491551,
              "range_position": 1.0
            },
            "sub_scores": {
              "trend": 57.7,
              "relative_strength": 78.5,
              "rs_slope": 100.0,
              "momentum": 62.0,
              "range_position": 100.0
            },
            "ticker": "IHF",
            "name": "Healthcare Providers"
          },
          {
            "score": 54.1,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.024745237174196744,
              "relative_strength": 0.06523618503829287,
              "rs_slope": -0.0010192886133948476,
              "momentum_return": 0.062192765537209205,
              "range_position": 0.8337164094596426
            },
            "sub_scores": {
              "trend": 47.1,
              "relative_strength": 78.3,
              "rs_slope": 0.0,
              "momentum": 61.8,
              "range_position": 83.4
            },
            "ticker": "PPH",
            "name": "Pharmaceuticals"
          },
          {
            "score": 43.8,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.028405289867630135,
              "relative_strength": 0.07433678320331205,
              "rs_slope": -0.0036887684141754195,
              "momentum_return": 0.07129336370222839,
              "range_position": 0.2017211036655
            },
            "sub_scores": {
              "trend": 49.1,
              "relative_strength": 84.0,
              "rs_slope": 0.0,
              "momentum": 65.8,
              "range_position": 20.2
            },
            "ticker": "IHI",
            "name": "Medical Devices"
          },
          {
            "score": 37.9,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.002699766041957874,
              "relative_strength": -0.0007212827909659492,
              "rs_slope": -0.002601306820344895,
              "momentum_return": -0.0037647022920496154,
              "range_position": 0.8458419922268738
            },
            "sub_scores": {
              "trend": 34.8,
              "relative_strength": 37.0,
              "rs_slope": 0.0,
              "momentum": 33.1,
              "range_position": 84.6
            },
            "ticker": "IBB",
            "name": "Biotech"
          }
        ]
      },
      {
        "score": 59.0,
        "classification": "Improving",
        "confidence": 1.0,
        "components": {
          "pct_above_ma": -0.01423271909898216,
          "relative_strength": 0.019290323651734886,
          "rs_slope": 0.00454595217045225,
          "momentum_return": 0.01624690415065122,
          "range_position": 0.7800882284608217
        },
        "sub_scores": {
          "trend": 25.4,
          "relative_strength": 49.6,
          "rs_slope": 100.0,
          "momentum": 41.8,
          "range_position": 78.0
        },
        "ticker": "XLK",
        "name": "Technology",
        "subsectors": [
          {
            "score": 78.3,
            "classification": "Leading",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.027948326519666722,
              "relative_strength": 0.08982625574641323,
              "rs_slope": 0.018159451193732613,
              "momentum_return": 0.08678283624532956,
              "range_position": 0.7651966926619272
            },
            "sub_scores": {
              "trend": 48.9,
              "relative_strength": 93.6,
              "rs_slope": 100.0,
              "momentum": 72.5,
              "range_position": 76.5
            },
            "ticker": "DRAM",
            "name": "Memory"
          },
          {
            "score": 78.2,
            "classification": "Leading",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.005200917396827265,
              "relative_strength": 0.11716173277466602,
              "rs_slope": 0.006257366346797732,
              "momentum_return": 0.11411831327358235,
              "range_position": 0.7035753656796486
            },
            "sub_scores": {
              "trend": 36.2,
              "relative_strength": 100.0,
              "rs_slope": 100.0,
              "momentum": 84.4,
              "range_position": 70.4
            },
            "ticker": "HACK",
            "name": "Cybersecurity"
          },
          {
            "score": 73.0,
            "classification": "Improving",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.022154523886098065,
              "relative_strength": 0.05819021044685602,
              "rs_slope": 0.007667100193718512,
              "momentum_return": 0.05514679094577235,
              "range_position": 0.8648399546923659
            },
            "sub_scores": {
              "trend": 45.6,
              "relative_strength": 73.9,
              "rs_slope": 100.0,
              "momentum": 58.8,
              "range_position": 86.5
            },
            "ticker": "SOXX",
            "name": "Semiconductors"
          },
          {
            "score": 67.7,
            "classification": "Improving",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.0008040469467600619,
              "relative_strength": 0.06655776997745655,
              "rs_slope": 0.0036148977173412478,
              "momentum_return": 0.06351435047637288,
              "range_position": 0.6300725906830141
            },
            "sub_scores": {
              "trend": 33.8,
              "relative_strength": 79.1,
              "rs_slope": 100.0,
              "momentum": 62.4,
              "range_position": 63.0
            },
            "ticker": "SKYY",
            "name": "Cloud Computing"
          },
          {
            "score": 52.5,
            "classification": "Improving",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": -0.025001739518913935,
              "relative_strength": 0.02796341559763349,
              "rs_slope": 0.0028478607679586323,
              "momentum_return": 0.024919996096549824,
              "range_position": 0.42393315433510415
            },
            "sub_scores": {
              "trend": 19.4,
              "relative_strength": 55.0,
              "rs_slope": 100.0,
              "momentum": 45.6,
              "range_position": 42.4
            },
            "ticker": "IGV",
            "name": "Software"
          },
          {
            "score": 43.7,
            "classification": "Neutral",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": -0.02216768022379223,
              "relative_strength": 0.017677879649126704,
              "rs_slope": -0.00014790159487567677,
              "momentum_return": 0.014634460148043038,
              "range_position": 0.6522146815141435
            },
            "sub_scores": {
              "trend": 21.0,
              "relative_strength": 48.5,
              "rs_slope": 42.6,
              "momentum": 41.1,
              "range_position": 65.2
            },
            "ticker": "FDN",
            "name": "Internet"
          }
        ]
      },
      {
        "score": 45.4,
        "classification": "Weakening",
        "confidence": 1.0,
        "components": {
          "pct_above_ma": 0.01831935337335744,
          "relative_strength": 0.012018100421383404,
          "rs_slope": -0.0018383820306340838,
          "momentum_return": 0.008974680920299738,
          "range_position": 1.0
        },
        "sub_scores": {
          "trend": 43.5,
          "relative_strength": 45.0,
          "rs_slope": 0.0,
          "momentum": 38.7,
          "range_position": 100.0
        },
        "ticker": "XLRE",
        "name": "Real Estate",
        "subsectors": [
          {
            "score": 42.6,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.011966512410464869,
              "relative_strength": 0.0059974308638729434,
              "rs_slope": -0.0012869792941241965,
              "momentum_return": 0.0029540113627892772,
              "range_position": 0.9582546297317095
            },
            "sub_scores": {
              "trend": 40.0,
              "relative_strength": 41.2,
              "rs_slope": 0.0,
              "momentum": 36.1,
              "range_position": 95.8
            },
            "ticker": "REZ",
            "name": "Residential REITs"
          },
          {
            "score": 27.6,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.002632459827771383,
              "relative_strength": -0.021889772340830893,
              "rs_slope": -0.003951629564755482,
              "momentum_return": -0.02493319184191456,
              "range_position": 0.555901043724977
            },
            "sub_scores": {
              "trend": 34.8,
              "relative_strength": 23.8,
              "rs_slope": 0.0,
              "momentum": 23.9,
              "range_position": 55.6
            },
            "ticker": "REM",
            "name": "Mortgage REITs"
          }
        ]
      },
      {
        "score": 42.3,
        "classification": "Weakening",
        "confidence": 1.0,
        "components": {
          "pct_above_ma": 0.014401528306456468,
          "relative_strength": 0.006242761587822554,
          "rs_slope": -0.0018154680252251032,
          "momentum_return": 0.0031993420867388878,
          "range_position": 0.926504159125051
        },
        "sub_scores": {
          "trend": 41.3,
          "relative_strength": 41.4,
          "rs_slope": 0.0,
          "momentum": 36.2,
          "range_position": 92.7
        },
        "ticker": "XLI",
        "name": "Industrials",
        "subsectors": [
          {
            "score": 63.8,
            "classification": "Improving",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.041247607817430865,
              "relative_strength": 0.07636346603600808,
              "rs_slope": -0.0007850736086917776,
              "momentum_return": 0.07332004653492441,
              "range_position": 1.0
            },
            "sub_scores": {
              "trend": 56.2,
              "relative_strength": 85.2,
              "rs_slope": 10.7,
              "momentum": 66.7,
              "range_position": 100.0
            },
            "ticker": "IYT",
            "name": "Transportation"
          },
          {
            "score": 43.8,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.01608897648585228,
              "relative_strength": 0.022778767731839955,
              "rs_slope": -0.0008185237195934836,
              "momentum_return": 0.01973534823075629,
              "range_position": 0.7242724051795796
            },
            "sub_scores": {
              "trend": 42.3,
              "relative_strength": 51.7,
              "rs_slope": 9.1,
              "momentum": 43.4,
              "range_position": 72.4
            },
            "ticker": "ITA",
            "name": "Aerospace & Defense"
          },
          {
            "score": 18.3,
            "classification": "Lagging",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": -0.040674260138321094,
              "relative_strength": -0.06472599096432108,
              "rs_slope": -0.001134238867613252,
              "momentum_return": -0.06776941046540474,
              "range_position": 0.7566145229818463
            },
            "sub_scores": {
              "trend": 10.7,
              "relative_strength": 0.0,
              "rs_slope": 0.0,
              "momentum": 5.3,
              "range_position": 75.7
            },
            "ticker": "XME",
            "name": "Metals & Mining"
          }
        ]
      },
      {
        "score": 39.9,
        "classification": "Weakening",
        "confidence": 1.0,
        "components": {
          "pct_above_ma": 0.016735617006685244,
          "relative_strength": 0.028053164941968967,
          "rs_slope": -0.0021540566239832914,
          "momentum_return": 0.0250097454408853,
          "range_position": 0.5601349320790403
        },
        "sub_scores": {
          "trend": 42.6,
          "relative_strength": 55.0,
          "rs_slope": 0.0,
          "momentum": 45.7,
          "range_position": 56.0
        },
        "ticker": "XLF",
        "name": "Financials",
        "subsectors": [
          {
            "score": 51.4,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.03259093901760357,
              "relative_strength": 0.04228477168571698,
              "rs_slope": -0.0023339882711469863,
              "momentum_return": 0.039241352184633316,
              "range_position": 0.8954607034382398
            },
            "sub_scores": {
              "trend": 51.4,
              "relative_strength": 63.9,
              "rs_slope": 0.0,
              "momentum": 51.8,
              "range_position": 89.5
            },
            "ticker": "KRE",
            "name": "Regional Banks"
          },
          {
            "score": 49.7,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.030198419895295148,
              "relative_strength": 0.03753163043711527,
              "rs_slope": -0.002462160094940241,
              "momentum_return": 0.034488210936031605,
              "range_position": 0.8790035178349782
            },
            "sub_scores": {
              "trend": 50.1,
              "relative_strength": 61.0,
              "rs_slope": 0.0,
              "momentum": 49.8,
              "range_position": 87.9
            },
            "ticker": "KBE",
            "name": "Banks"
          },
          {
            "score": 39.5,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.0020411175328636233,
              "relative_strength": 0.016258978762881626,
              "rs_slope": -0.0012841167850947688,
              "momentum_return": 0.01321555926179796,
              "range_position": 0.7473791513473624
            },
            "sub_scores": {
              "trend": 34.5,
              "relative_strength": 47.7,
              "rs_slope": 0.0,
              "momentum": 40.5,
              "range_position": 74.7
            },
            "ticker": "IAI",
            "name": "Capital Markets"
          },
          {
            "score": 34.8,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.009153958415097696,
              "relative_strength": 0.01657133543922551,
              "rs_slope": -0.0026426965623455923,
              "momentum_return": 0.013527915938141843,
              "range_position": 0.4728758399475545
            },
            "sub_scores": {
              "trend": 38.4,
              "relative_strength": 47.9,
              "rs_slope": 0.0,
              "momentum": 40.7,
              "range_position": 47.3
            },
            "ticker": "KIE",
            "name": "Insurance"
          }
        ]
      },
      {
        "score": 37.0,
        "classification": "Weakening",
        "confidence": 1.0,
        "components": {
          "pct_above_ma": -0.016612560600998583,
          "relative_strength": 0.006891613094740845,
          "rs_slope": -0.0008770048699182742,
          "momentum_return": 0.0038481935936571787,
          "range_position": 0.7657958234710331
        },
        "sub_scores": {
          "trend": 24.1,
          "relative_strength": 41.8,
          "rs_slope": 6.1,
          "momentum": 36.5,
          "range_position": 76.6
        },
        "ticker": "XLE",
        "name": "Energy",
        "subsectors": [
          {
            "score": 45.0,
            "classification": "Improving",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": -0.07134271966388861,
              "relative_strength": -0.01630626203370611,
              "rs_slope": 0.004962857012775312,
              "momentum_return": -0.019349681534789775,
              "range_position": 0.7110793179197585
            },
            "sub_scores": {
              "trend": 0.0,
              "relative_strength": 27.3,
              "rs_slope": 100.0,
              "momentum": 26.4,
              "range_position": 71.1
            },
            "ticker": "TAN",
            "name": "Solar / Clean Energy"
          },
          {
            "score": 29.9,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": -0.03229701592212264,
              "relative_strength": -0.021078102112532138,
              "rs_slope": -0.0010304354837205154,
              "momentum_return": -0.024121521613615804,
              "range_position": 0.8558790052725624
            },
            "sub_scores": {
              "trend": 15.4,
              "relative_strength": 24.3,
              "rs_slope": 0.0,
              "momentum": 24.3,
              "range_position": 85.6
            },
            "ticker": "OIH",
            "name": "Oil Services"
          },
          {
            "score": 25.1,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": -0.031936355591676624,
              "relative_strength": -0.02428967969407092,
              "rs_slope": -0.002021843993595995,
              "momentum_return": -0.027333099195154587,
              "range_position": 0.6480070639736343
            },
            "sub_scores": {
              "trend": 15.6,
              "relative_strength": 22.3,
              "rs_slope": 0.0,
              "momentum": 22.9,
              "range_position": 64.8
            },
            "ticker": "XOP",
            "name": "Oil & Gas Exploration"
          }
        ]
      },
      {
        "score": 36.3,
        "classification": "Weakening",
        "confidence": 1.0,
        "components": {
          "pct_above_ma": 0.0012083269243003958,
          "relative_strength": 0.01179951526082601,
          "rs_slope": -0.0013923064635501636,
          "momentum_return": 0.008756095759742344,
          "range_position": 0.6378406419298783
        },
        "sub_scores": {
          "trend": 34.0,
          "relative_strength": 44.9,
          "rs_slope": 0.0,
          "momentum": 38.6,
          "range_position": 63.8
        },
        "ticker": "XLP",
        "name": "Consumer Staples",
        "subsectors": [
          {
            "score": 28.2,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": -0.011737329674860963,
              "relative_strength": -0.016552305992102445,
              "rs_slope": -0.0032054226238028504,
              "momentum_return": -0.01959572549318611,
              "range_position": 0.6075438851538849
            },
            "sub_scores": {
              "trend": 26.8,
              "relative_strength": 27.2,
              "rs_slope": 0.0,
              "momentum": 26.3,
              "range_position": 60.8
            },
            "ticker": "PBJ",
            "name": "Food & Beverage"
          }
        ]
      },
      {
        "score": 30.7,
        "classification": "Weakening",
        "confidence": 1.0,
        "components": {
          "pct_above_ma": -0.0017597470382336722,
          "relative_strength": -0.02546783024297905,
          "rs_slope": -0.002669519154490113,
          "momentum_return": -0.028511249744062717,
          "range_position": 0.7739082926185131
        },
        "sub_scores": {
          "trend": 32.4,
          "relative_strength": 21.6,
          "rs_slope": 0.0,
          "momentum": 22.4,
          "range_position": 77.4
        },
        "ticker": "XLB",
        "name": "Materials",
        "subsectors": [
          {
            "score": 15.3,
            "classification": "Lagging",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": -0.06926354360148645,
              "relative_strength": -0.1389561629723607,
              "rs_slope": -0.0027553920755075843,
              "momentum_return": -0.14199958247344435,
              "range_position": 0.7660320788729511
            },
            "sub_scores": {
              "trend": 0.0,
              "relative_strength": 0.0,
              "rs_slope": 0.0,
              "momentum": 0.0,
              "range_position": 76.6
            },
            "ticker": "LIT",
            "name": "Lithium & Battery Metals"
          },
          {
            "score": 8.3,
            "classification": "Lagging",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": -0.10548770020915832,
              "relative_strength": -0.20197709739509406,
              "rs_slope": -0.005071588947766487,
              "momentum_return": -0.20502051689617773,
              "range_position": 0.41581452385192963
            },
            "sub_scores": {
              "trend": 0.0,
              "relative_strength": 0.0,
              "rs_slope": 0.0,
              "momentum": 0.0,
              "range_position": 41.6
            },
            "ticker": "GDX",
            "name": "Gold Miners"
          }
        ]
      },
      {
        "score": 26.8,
        "classification": "Weakening",
        "confidence": 1.0,
        "components": {
          "pct_above_ma": -0.009225153159910016,
          "relative_strength": -0.022654406442576436,
          "rs_slope": -0.0034172596618843977,
          "momentum_return": -0.025697825943660102,
          "range_position": 0.5898584273139084
        },
        "sub_scores": {
          "trend": 28.2,
          "relative_strength": 23.3,
          "rs_slope": 0.0,
          "momentum": 23.6,
          "range_position": 59.0
        },
        "ticker": "XLU",
        "name": "Utilities",
        "subsectors": []
      },
      {
        "score": 24.9,
        "classification": "Lagging",
        "confidence": 1.0,
        "components": {
          "pct_above_ma": -0.017717849086508308,
          "relative_strength": -0.026277179639978332,
          "rs_slope": -0.002178996482432094,
          "momentum_return": -0.029320599141061998,
          "range_position": 0.5785079643375302
        },
        "sub_scores": {
          "trend": 23.5,
          "relative_strength": 21.1,
          "rs_slope": 0.0,
          "momentum": 22.0,
          "range_position": 57.9
        },
        "ticker": "XLY",
        "name": "Consumer Discretionary",
        "subsectors": [
          {
            "score": 66.6,
            "classification": "Improving",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.04163246059811332,
              "relative_strength": 0.07632409634677495,
              "rs_slope": 2.3577141711661477e-05,
              "momentum_return": 0.07328067684569128,
              "range_position": 0.7337494045174057
            },
            "sub_scores": {
              "trend": 56.5,
              "relative_strength": 85.2,
              "rs_slope": 51.2,
              "momentum": 66.6,
              "range_position": 73.4
            },
            "ticker": "JETS",
            "name": "Airlines & Travel"
          },
          {
            "score": 49.3,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.05638770047084729,
              "relative_strength": 0.05649356716242904,
              "rs_slope": -0.0037177914625734164,
              "momentum_return": 0.05345014766134537,
              "range_position": 0.5109125924470098
            },
            "sub_scores": {
              "trend": 64.7,
              "relative_strength": 72.8,
              "rs_slope": 0.0,
              "momentum": 58.0,
              "range_position": 51.1
            },
            "ticker": "XHB",
            "name": "Homebuilders"
          },
          {
            "score": 45.9,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.03100430142021926,
              "relative_strength": 0.041862890806302455,
              "rs_slope": -0.0034293195604934877,
              "momentum_return": 0.03881947130521879,
              "range_position": 0.6354482985955064
            },
            "sub_scores": {
              "trend": 50.6,
              "relative_strength": 63.7,
              "rs_slope": 0.0,
              "momentum": 51.7,
              "range_position": 63.5
            },
            "ticker": "XRT",
            "name": "Retail"
          }
        ]
      },
      {
        "score": 21.7,
        "classification": "Lagging",
        "confidence": 1.0,
        "components": {
          "pct_above_ma": -0.030220758753882193,
          "relative_strength": -0.032429832005817394,
          "rs_slope": -0.0026895273033580025,
          "momentum_return": -0.03547325150690106,
          "range_position": 0.5527471624032128
        },
        "sub_scores": {
          "trend": 16.5,
          "relative_strength": 17.2,
          "rs_slope": 0.0,
          "momentum": 19.4,
          "range_position": 55.3
        },
        "ticker": "XLC",
        "name": "Communication Services",
        "subsectors": [
          {
            "score": 23.7,
            "classification": "Lagging",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.0021215950108728343,
              "relative_strength": -0.0089095703992913,
              "rs_slope": -0.0026013588505335973,
              "momentum_return": -0.011952989900374966,
              "range_position": 0.2267829104897186
            },
            "sub_scores": {
              "trend": 34.5,
              "relative_strength": 31.9,
              "rs_slope": 0.0,
              "momentum": 29.6,
              "range_position": 22.7
            },
            "ticker": "SOCL",
            "name": "Social Media"
          }
        ]
      }
    ],
    "medium": [
      {
        "score": 88.1,
        "classification": "Leading",
        "confidence": 1.0,
        "components": {
          "pct_above_ma": 0.09520274502411641,
          "relative_strength": 0.2071407527219733,
          "rs_slope": 0.00454595217045225,
          "momentum_return": 0.32306108691884194,
          "range_position": 0.7800882284608217
        },
        "sub_scores": {
          "trend": 62.6,
          "relative_strength": 100.0,
          "rs_slope": 100.0,
          "momentum": 100.0,
          "range_position": 78.0
        },
        "ticker": "XLK",
        "name": "Technology",
        "subsectors": [
          {
            "score": 96.6,
            "classification": "Leading",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.19085804462907419,
              "relative_strength": 0.5817929119396092,
              "rs_slope": 0.007667100193718512,
              "momentum_return": 0.6977132461364779,
              "range_position": 0.8648399546923659
            },
            "sub_scores": {
              "trend": 96.7,
              "relative_strength": 100.0,
              "rs_slope": 100.0,
              "momentum": 100.0,
              "range_position": 86.5
            },
            "ticker": "SOXX",
            "name": "Semiconductors"
          },
          {
            "score": 81.3,
            "classification": "Leading",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.11751470039197875,
              "relative_strength": 0.10459040727722702,
              "rs_slope": 0.006257366346797732,
              "momentum_return": 0.22051074147409566,
              "range_position": 0.7035753656796486
            },
            "sub_scores": {
              "trend": 70.5,
              "relative_strength": 73.1,
              "rs_slope": 100.0,
              "momentum": 92.6,
              "range_position": 70.4
            },
            "ticker": "HACK",
            "name": "Cybersecurity"
          },
          {
            "score": 78.0,
            "classification": "Leading",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.0915841747135917,
              "relative_strength": 0.10485889723167174,
              "rs_slope": 0.0036148977173412478,
              "momentum_return": 0.2207792314285404,
              "range_position": 0.6300725906830141
            },
            "sub_scores": {
              "trend": 61.3,
              "relative_strength": 73.2,
              "rs_slope": 100.0,
              "momentum": 92.7,
              "range_position": 63.0
            },
            "ticker": "SKYY",
            "name": "Cloud Computing"
          },
          {
            "score": 76.5,
            "classification": "Leading",
            "confidence": 0.2,
            "components": {
              "pct_above_ma": null,
              "relative_strength": null,
              "rs_slope": null,
              "momentum_return": null,
              "range_position": 0.7651966926619272
            },
            "sub_scores": {
              "trend": null,
              "relative_strength": null,
              "rs_slope": null,
              "momentum": null,
              "range_position": 76.5
            },
            "ticker": "DRAM",
            "name": "Memory"
          },
          {
            "score": 56.9,
            "classification": "Improving",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.05141108294564334,
              "relative_strength": -0.011870040185621544,
              "rs_slope": 0.0028478607679586323,
              "momentum_return": 0.1040502940112471,
              "range_position": 0.42393315433510415
            },
            "sub_scores": {
              "trend": 46.9,
              "relative_strength": 31.5,
              "rs_slope": 100.0,
              "momentum": 63.5,
              "range_position": 42.4
            },
            "ticker": "IGV",
            "name": "Software"
          },
          {
            "score": 48.9,
            "classification": "Neutral",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.018061230573060305,
              "relative_strength": -0.001301474079859588,
              "rs_slope": -0.00014790159487567677,
              "momentum_return": 0.11461886011700906,
              "range_position": 0.6522146815141435
            },
            "sub_scores": {
              "trend": 35.0,
              "relative_strength": 35.2,
              "rs_slope": 42.6,
              "momentum": 66.2,
              "range_position": 65.2
            },
            "ticker": "FDN",
            "name": "Internet"
          }
        ]
      },
      {
        "score": 42.9,
        "classification": "Weakening",
        "confidence": 1.0,
        "components": {
          "pct_above_ma": 0.03036332000360975,
          "relative_strength": -0.04438753153602848,
          "rs_slope": -0.0018383820306340838,
          "momentum_return": 0.07153280266084017,
          "range_position": 1.0
        },
        "sub_scores": {
          "trend": 39.4,
          "relative_strength": 19.9,
          "rs_slope": 0.0,
          "momentum": 55.4,
          "range_position": 100.0
        },
        "ticker": "XLRE",
        "name": "Real Estate",
        "subsectors": [
          {
            "score": 39.7,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.030428361169587692,
              "relative_strength": -0.06441772066105567,
              "rs_slope": -0.0012869792941241965,
              "momentum_return": 0.05150261353581298,
              "range_position": 0.9582546297317095
            },
            "sub_scores": {
              "trend": 39.4,
              "relative_strength": 12.7,
              "rs_slope": 0.0,
              "momentum": 50.4,
              "range_position": 95.8
            },
            "ticker": "REZ",
            "name": "Residential REITs"
          },
          {
            "score": 25.7,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": -0.01442807440832694,
              "relative_strength": -0.08716365522092073,
              "rs_slope": -0.003951629564755482,
              "momentum_return": 0.028756678975947914,
              "range_position": 0.555901043724977
            },
            "sub_scores": {
              "trend": 23.4,
              "relative_strength": 4.6,
              "rs_slope": 0.0,
              "momentum": 44.7,
              "range_position": 55.6
            },
            "ticker": "REM",
            "name": "Mortgage REITs"
          }
        ]
      },
      {
        "score": 40.7,
        "classification": "Weakening",
        "confidence": 1.0,
        "components": {
          "pct_above_ma": 0.023405483485044787,
          "relative_strength": -0.04641880602846915,
          "rs_slope": -0.0018154680252251032,
          "momentum_return": 0.0695015281683995,
          "range_position": 0.926504159125051
        },
        "sub_scores": {
          "trend": 36.9,
          "relative_strength": 19.1,
          "rs_slope": 0.0,
          "momentum": 54.9,
          "range_position": 92.7
        },
        "ticker": "XLI",
        "name": "Industrials",
        "subsectors": [
          {
            "score": 60.6,
            "classification": "Improving",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.06826291595352174,
              "relative_strength": 0.06126693351202306,
              "rs_slope": -0.0007850736086917776,
              "momentum_return": 0.1771872677088917,
              "range_position": 1.0
            },
            "sub_scores": {
              "trend": 53.0,
              "relative_strength": 57.6,
              "rs_slope": 10.7,
              "momentum": 81.8,
              "range_position": 100.0
            },
            "ticker": "IYT",
            "name": "Transportation"
          },
          {
            "score": 34.0,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": -0.016208419030910304,
              "relative_strength": -0.05041595208604743,
              "rs_slope": -0.001134238867613252,
              "momentum_return": 0.06550438211082121,
              "range_position": 0.7566145229818463
            },
            "sub_scores": {
              "trend": 22.8,
              "relative_strength": 17.7,
              "rs_slope": 0.0,
              "momentum": 53.9,
              "range_position": 75.7
            },
            "ticker": "XME",
            "name": "Metals & Mining"
          },
          {
            "score": 31.6,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.025980511147966512,
              "relative_strength": -0.1104281585199487,
              "rs_slope": -0.0008185237195934836,
              "momentum_return": 0.0054921756769199526,
              "range_position": 0.7242724051795796
            },
            "sub_scores": {
              "trend": 37.9,
              "relative_strength": 0.0,
              "rs_slope": 9.1,
              "momentum": 38.9,
              "range_position": 72.4
            },
            "ticker": "ITA",
            "name": "Aerospace & Defense"
          }
        ]
      },
      {
        "score": 39.0,
        "classification": "Weakening",
        "confidence": 1.0,
        "components": {
          "pct_above_ma": 0.05057185482542481,
          "relative_strength": -0.07976670536283215,
          "rs_slope": -0.0008012696986277101,
          "momentum_return": 0.0361536288340365,
          "range_position": 0.8454744525374441
        },
        "sub_scores": {
          "trend": 46.6,
          "relative_strength": 7.2,
          "rs_slope": 9.9,
          "momentum": 46.5,
          "range_position": 84.5
        },
        "ticker": "XLV",
        "name": "Health Care",
        "subsectors": [
          {
            "score": 86.7,
            "classification": "Leading",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.10894744017719549,
              "relative_strength": 0.10538681483662726,
              "rs_slope": 0.0015018721688713987,
              "momentum_return": 0.2213071490334959,
              "range_position": 1.0
            },
            "sub_scores": {
              "trend": 67.5,
              "relative_strength": 73.4,
              "rs_slope": 100.0,
              "momentum": 92.8,
              "range_position": 100.0
            },
            "ticker": "IHF",
            "name": "Healthcare Providers"
          },
          {
            "score": 33.8,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.03116413326495282,
              "relative_strength": -0.09294814867581103,
              "rs_slope": -0.0010192886133948476,
              "momentum_return": 0.02297218552105762,
              "range_position": 0.8337164094596426
            },
            "sub_scores": {
              "trend": 39.7,
              "relative_strength": 2.5,
              "rs_slope": 0.0,
              "momentum": 43.2,
              "range_position": 83.4
            },
            "ticker": "PPH",
            "name": "Pharmaceuticals"
          },
          {
            "score": 31.6,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": -0.003984999734618522,
              "relative_strength": -0.09191144993819633,
              "rs_slope": -0.002601306820344895,
              "momentum_return": 0.024008884258672314,
              "range_position": 0.8458419922268738
            },
            "sub_scores": {
              "trend": 27.1,
              "relative_strength": 2.9,
              "rs_slope": 0.0,
              "momentum": 43.5,
              "range_position": 84.6
            },
            "ticker": "IBB",
            "name": "Biotech"
          },
          {
            "score": 13.5,
            "classification": "Lagging",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": -0.004685463854043448,
              "relative_strength": -0.1832558464175772,
              "rs_slope": -0.0036887684141754195,
              "momentum_return": -0.06733551222070855,
              "range_position": 0.2017211036655
            },
            "sub_scores": {
              "trend": 26.9,
              "relative_strength": 0.0,
              "rs_slope": 0.0,
              "momentum": 20.7,
              "range_position": 20.2
            },
            "ticker": "IHI",
            "name": "Medical Devices"
          }
        ]
      },
      {
        "score": 34.3,
        "classification": "Weakening",
        "confidence": 1.0,
        "components": {
          "pct_above_ma": 0.02033273135460556,
          "relative_strength": -0.037383563168945866,
          "rs_slope": -0.0021540566239832914,
          "momentum_return": 0.07853677102792278,
          "range_position": 0.5601349320790403
        },
        "sub_scores": {
          "trend": 35.8,
          "relative_strength": 22.4,
          "rs_slope": 0.0,
          "momentum": 57.1,
          "range_position": 56.0
        },
        "ticker": "XLF",
        "name": "Financials",
        "subsectors": [
          {
            "score": 48.9,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.034298493568086785,
              "relative_strength": 0.019458156853405573,
              "rs_slope": -0.0023339882711469863,
              "momentum_return": 0.13537849105027422,
              "range_position": 0.8954607034382398
            },
            "sub_scores": {
              "trend": 40.8,
              "relative_strength": 42.7,
              "rs_slope": 0.0,
              "momentum": 71.3,
              "range_position": 89.5
            },
            "ticker": "KRE",
            "name": "Regional Banks"
          },
          {
            "score": 48.0,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.03155680244668968,
              "relative_strength": 0.016391276870816762,
              "rs_slope": -0.002462160094940241,
              "momentum_return": 0.1323116110676854,
              "range_position": 0.8790035178349782
            },
            "sub_scores": {
              "trend": 39.8,
              "relative_strength": 41.6,
              "rs_slope": 0.0,
              "momentum": 70.6,
              "range_position": 87.9
            },
            "ticker": "KBE",
            "name": "Banks"
          },
          {
            "score": 42.8,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.021404302399238517,
              "relative_strength": 0.0010413605820380756,
              "rs_slope": -0.0012841167850947688,
              "momentum_return": 0.11696169477890672,
              "range_position": 0.7473791513473624
            },
            "sub_scores": {
              "trend": 36.2,
              "relative_strength": 36.1,
              "rs_slope": 0.0,
              "momentum": 66.7,
              "range_position": 74.7
            },
            "ticker": "IAI",
            "name": "Capital Markets"
          },
          {
            "score": 25.9,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.005232691198779671,
              "relative_strength": -0.08304293501024551,
              "rs_slope": -0.0026426965623455923,
              "momentum_return": 0.032877399186623135,
              "range_position": 0.4728758399475545
            },
            "sub_scores": {
              "trend": 30.4,
              "relative_strength": 6.1,
              "rs_slope": 0.0,
              "momentum": 45.7,
              "range_position": 47.3
            },
            "ticker": "KIE",
            "name": "Insurance"
          }
        ]
      },
      {
        "score": 31.5,
        "classification": "Weakening",
        "confidence": 1.0,
        "components": {
          "pct_above_ma": -0.007766657528870513,
          "relative_strength": -0.07920999224656766,
          "rs_slope": -0.002669519154490113,
          "momentum_return": 0.036710341950300984,
          "range_position": 0.7739082926185131
        },
        "sub_scores": {
          "trend": 25.8,
          "relative_strength": 7.4,
          "rs_slope": 0.0,
          "momentum": 46.7,
          "range_position": 77.4
        },
        "ticker": "XLB",
        "name": "Materials",
        "subsectors": [
          {
            "score": 37.7,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": -0.05385365940701614,
              "relative_strength": 0.0006989684526443884,
              "rs_slope": -0.0027553920755075843,
              "momentum_return": 0.11661930264951303,
              "range_position": 0.7660320788729511
            },
            "sub_scores": {
              "trend": 9.3,
              "relative_strength": 36.0,
              "rs_slope": 0.0,
              "momentum": 66.7,
              "range_position": 76.6
            },
            "ticker": "LIT",
            "name": "Lithium & Battery Metals"
          },
          {
            "score": 8.3,
            "classification": "Lagging",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": -0.1467363207696799,
              "relative_strength": -0.28394526921080665,
              "rs_slope": -0.005071588947766487,
              "momentum_return": -0.168024935013938,
              "range_position": 0.41581452385192963
            },
            "sub_scores": {
              "trend": 0.0,
              "relative_strength": 0.0,
              "rs_slope": 0.0,
              "momentum": 0.0,
              "range_position": 41.6
            },
            "ticker": "GDX",
            "name": "Gold Miners"
          }
        ]
      },
      {
        "score": 29.1,
        "classification": "Weakening",
        "confidence": 1.0,
        "components": {
          "pct_above_ma": -0.010247629392638902,
          "relative_strength": -0.11479433359118008,
          "rs_slope": -0.0008770048699182742,
          "momentum_return": 0.0011260006056885707,
          "range_position": 0.7657958234710331
        },
        "sub_scores": {
          "trend": 24.9,
          "relative_strength": 0.0,
          "rs_slope": 6.1,
          "momentum": 37.8,
          "range_position": 76.6
        },
        "ticker": "XLE",
        "name": "Energy",
        "subsectors": [
          {
            "score": 61.7,
            "classification": "Improving",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.01759355382923511,
              "relative_strength": 0.0005477163365035231,
              "rs_slope": 0.004962857012775312,
              "momentum_return": 0.11646805053337217,
              "range_position": 0.7110793179197585
            },
            "sub_scores": {
              "trend": 34.9,
              "relative_strength": 35.9,
              "rs_slope": 100.0,
              "momentum": 66.6,
              "range_position": 71.1
            },
            "ticker": "TAN",
            "name": "Solar / Clean Energy"
          },
          {
            "score": 44.7,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": -0.010354408868317622,
              "relative_strength": 0.017779432635121717,
              "rs_slope": -0.0010304354837205154,
              "momentum_return": 0.13369976683199036,
              "range_position": 0.8558790052725624
            },
            "sub_scores": {
              "trend": 24.9,
              "relative_strength": 42.1,
              "rs_slope": 0.0,
              "momentum": 70.9,
              "range_position": 85.6
            },
            "ticker": "OIH",
            "name": "Oil Services"
          },
          {
            "score": 22.4,
            "classification": "Lagging",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": -0.039163234888578646,
              "relative_strength": -0.13486530031768762,
              "rs_slope": -0.002021843993595995,
              "momentum_return": -0.018944966120818973,
              "range_position": 0.6480070639736343
            },
            "sub_scores": {
              "trend": 14.6,
              "relative_strength": 0.0,
              "rs_slope": 0.0,
              "momentum": 32.8,
              "range_position": 64.8
            },
            "ticker": "XOP",
            "name": "Oil & Gas Exploration"
          }
        ]
      },
      {
        "score": 28.9,
        "classification": "Weakening",
        "confidence": 1.0,
        "components": {
          "pct_above_ma": -0.006194217256318302,
          "relative_strength": -0.06862857266939737,
          "rs_slope": -0.002178996482432094,
          "momentum_return": 0.04729176152747128,
          "range_position": 0.5785079643375302
        },
        "sub_scores": {
          "trend": 26.4,
          "relative_strength": 11.2,
          "rs_slope": 0.0,
          "momentum": 49.3,
          "range_position": 57.9
        },
        "ticker": "XLY",
        "name": "Consumer Discretionary",
        "subsectors": [
          {
            "score": 65.1,
            "classification": "Improving",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.0750097689947169,
              "relative_strength": 0.07160566879493269,
              "rs_slope": 2.3577141711661477e-05,
              "momentum_return": 0.18752600299180133,
              "range_position": 0.7337494045174057
            },
            "sub_scores": {
              "trend": 55.4,
              "relative_strength": 61.3,
              "rs_slope": 51.2,
              "momentum": 84.4,
              "range_position": 73.4
            },
            "ticker": "JETS",
            "name": "Airlines & Travel"
          },
          {
            "score": 33.8,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.01881746531806483,
              "relative_strength": -0.05294508823865218,
              "rs_slope": -0.0034293195604934877,
              "momentum_return": 0.06297524595821646,
              "range_position": 0.6354482985955064
            },
            "sub_scores": {
              "trend": 35.3,
              "relative_strength": 16.8,
              "rs_slope": 0.0,
              "momentum": 53.2,
              "range_position": 63.5
            },
            "ticker": "XRT",
            "name": "Retail"
          },
          {
            "score": 33.5,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.04099182090592923,
              "relative_strength": -0.0481393960238119,
              "rs_slope": -0.0037177914625734164,
              "momentum_return": 0.06778093817305675,
              "range_position": 0.5109125924470098
            },
            "sub_scores": {
              "trend": 43.2,
              "relative_strength": 18.5,
              "rs_slope": 0.0,
              "momentum": 54.4,
              "range_position": 51.1
            },
            "ticker": "XHB",
            "name": "Homebuilders"
          }
        ]
      },
      {
        "score": 26.6,
        "classification": "Weakening",
        "confidence": 1.0,
        "components": {
          "pct_above_ma": 0.010596216833496985,
          "relative_strength": -0.11788658604659585,
          "rs_slope": -0.0013923064635501636,
          "momentum_return": -0.0019662518497272075,
          "range_position": 0.6378406419298783
        },
        "sub_scores": {
          "trend": 32.4,
          "relative_strength": 0.0,
          "rs_slope": 0.0,
          "momentum": 37.0,
          "range_position": 63.8
        },
        "ticker": "XLP",
        "name": "Consumer Staples",
        "subsectors": [
          {
            "score": 22.0,
            "classification": "Lagging",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": -0.029409745397627418,
              "relative_strength": -0.14097514291136426,
              "rs_slope": -0.0032054226238028504,
              "momentum_return": -0.025054808714495613,
              "range_position": 0.6075438851538849
            },
            "sub_scores": {
              "trend": 18.1,
              "relative_strength": 0.0,
              "rs_slope": 0.0,
              "momentum": 31.2,
              "range_position": 60.8
            },
            "ticker": "PBJ",
            "name": "Food & Beverage"
          }
        ]
      },
      {
        "score": 20.8,
        "classification": "Lagging",
        "confidence": 1.0,
        "components": {
          "pct_above_ma": -0.03210679578491882,
          "relative_strength": -0.1387621865773726,
          "rs_slope": -0.0026895273033580025,
          "momentum_return": -0.022841852380503957,
          "range_position": 0.5527471624032128
        },
        "sub_scores": {
          "trend": 17.1,
          "relative_strength": 0.0,
          "rs_slope": 0.0,
          "momentum": 31.8,
          "range_position": 55.3
        },
        "ticker": "XLC",
        "name": "Communication Services",
        "subsectors": [
          {
            "score": 18.2,
            "classification": "Lagging",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.007644969232359244,
              "relative_strength": -0.11786082903333306,
              "rs_slope": -0.0026013588505335973,
              "momentum_return": -0.0019404948364644126,
              "range_position": 0.2267829104897186
            },
            "sub_scores": {
              "trend": 31.3,
              "relative_strength": 0.0,
              "rs_slope": 0.0,
              "momentum": 37.0,
              "range_position": 22.7
            },
            "ticker": "SOCL",
            "name": "Social Media"
          }
        ]
      },
      {
        "score": 19.9,
        "classification": "Lagging",
        "confidence": 1.0,
        "components": {
          "pct_above_ma": -0.03108972754286421,
          "relative_strength": -0.17283081618133744,
          "rs_slope": -0.0034172596618843977,
          "momentum_return": -0.0569104819844688,
          "range_position": 0.5898584273139084
        },
        "sub_scores": {
          "trend": 17.5,
          "relative_strength": 0.0,
          "rs_slope": 0.0,
          "momentum": 23.3,
          "range_position": 59.0
        },
        "ticker": "XLU",
        "name": "Utilities",
        "subsectors": []
      }
    ],
    "long": [
      {
        "score": 81.1,
        "classification": "Leading",
        "confidence": 1.0,
        "components": {
          "pct_above_ma": 0.22826415064981198,
          "relative_strength": 0.1849532512937313,
          "rs_slope": 0.00454595217045225,
          "momentum_return": 0.273853058993218,
          "range_position": 0.7800882284608217
        },
        "sub_scores": {
          "trend": 74.1,
          "relative_strength": 74.4,
          "rs_slope": 100.0,
          "momentum": 79.0,
          "range_position": 78.0
        },
        "ticker": "XLK",
        "name": "Technology",
        "subsectors": [
          {
            "score": 97.3,
            "classification": "Leading",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.617199903438344,
              "relative_strength": 0.801340431785758,
              "rs_slope": 0.007667100193718512,
              "momentum_return": 0.8902402394852447,
              "range_position": 0.8648399546923659
            },
            "sub_scores": {
              "trend": 100.0,
              "relative_strength": 100.0,
              "rs_slope": 100.0,
              "momentum": 100.0,
              "range_position": 86.5
            },
            "ticker": "SOXX",
            "name": "Semiconductors"
          },
          {
            "score": 76.5,
            "classification": "Leading",
            "confidence": 0.2,
            "components": {
              "pct_above_ma": null,
              "relative_strength": null,
              "rs_slope": null,
              "momentum_return": null,
              "range_position": 0.7651966926619272
            },
            "sub_scores": {
              "trend": null,
              "relative_strength": null,
              "rs_slope": null,
              "momentum": null,
              "range_position": 76.5
            },
            "ticker": "DRAM",
            "name": "Memory"
          },
          {
            "score": 67.6,
            "classification": "Improving",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.14992221675532935,
              "relative_strength": 0.07385834189748697,
              "rs_slope": 0.006257366346797732,
              "momentum_return": 0.16275814959697366,
              "range_position": 0.7035753656796486
            },
            "sub_scores": {
              "trend": 57.4,
              "relative_strength": 49.7,
              "rs_slope": 100.0,
              "momentum": 60.5,
              "range_position": 70.4
            },
            "ticker": "HACK",
            "name": "Cybersecurity"
          },
          {
            "score": 54.6,
            "classification": "Improving",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.08045808064021664,
              "relative_strength": -0.03573951578052603,
              "rs_slope": 0.0036148977173412478,
              "momentum_return": 0.053160291918960656,
              "range_position": 0.6300725906830141
            },
            "sub_scores": {
              "trend": 42.7,
              "relative_strength": 25.4,
              "rs_slope": 100.0,
              "momentum": 42.2,
              "range_position": 63.0
            },
            "ticker": "SKYY",
            "name": "Cloud Computing"
          },
          {
            "score": 36.5,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.009738742726411953,
              "relative_strength": -0.08788993671572709,
              "rs_slope": -0.00014790159487567677,
              "momentum_return": 0.0010098709837595976,
              "range_position": 0.6522146815141435
            },
            "sub_scores": {
              "trend": 27.6,
              "relative_strength": 13.8,
              "rs_slope": 42.6,
              "momentum": 33.5,
              "range_position": 65.2
            },
            "ticker": "FDN",
            "name": "Internet"
          },
          {
            "score": 33.9,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": -0.05682110605443724,
              "relative_strength": -0.2069375960423162,
              "rs_slope": 0.0028478607679586323,
              "momentum_return": -0.11803778834282952,
              "range_position": 0.42393315433510415
            },
            "sub_scores": {
              "trend": 13.4,
              "relative_strength": 0.0,
              "rs_slope": 100.0,
              "momentum": 13.7,
              "range_position": 42.4
            },
            "ticker": "IGV",
            "name": "Software"
          }
        ]
      },
      {
        "score": 59.7,
        "classification": "Improving",
        "confidence": 1.0,
        "components": {
          "pct_above_ma": 0.14570869487025306,
          "relative_strength": 0.2002654652833149,
          "rs_slope": -0.0008770048699182742,
          "momentum_return": 0.2891652729828016,
          "range_position": 0.7657958234710331
        },
        "sub_scores": {
          "trend": 56.5,
          "relative_strength": 77.8,
          "rs_slope": 6.1,
          "momentum": 81.5,
          "range_position": 76.6
        },
        "ticker": "XLE",
        "name": "Energy",
        "subsectors": [
          {
            "score": 79.4,
            "classification": "Leading",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.17389858977655237,
              "relative_strength": 0.21086900095539352,
              "rs_slope": 0.004962857012775312,
              "momentum_return": 0.2997688086548802,
              "range_position": 0.7110793179197585
            },
            "sub_scores": {
              "trend": 62.5,
              "relative_strength": 80.2,
              "rs_slope": 100.0,
              "momentum": 83.3,
              "range_position": 71.1
            },
            "ticker": "TAN",
            "name": "Solar / Clean Energy"
          },
          {
            "score": 72.9,
            "classification": "Improving",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.2509969259784972,
              "relative_strength": 0.35376465542105984,
              "rs_slope": -0.0010304354837205154,
              "momentum_return": 0.4426644631205465,
              "range_position": 0.8558790052725624
            },
            "sub_scores": {
              "trend": 78.9,
              "relative_strength": 100.0,
              "rs_slope": 0.0,
              "momentum": 100.0,
              "range_position": 85.6
            },
            "ticker": "OIH",
            "name": "Oil Services"
          },
          {
            "score": 54.6,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.130065545701739,
              "relative_strength": 0.1885235784860375,
              "rs_slope": -0.002021843993595995,
              "momentum_return": 0.2774233861855242,
              "range_position": 0.6480070639736343
            },
            "sub_scores": {
              "trend": 53.2,
              "relative_strength": 75.2,
              "rs_slope": 0.0,
              "momentum": 79.6,
              "range_position": 64.8
            },
            "ticker": "XOP",
            "name": "Oil & Gas Exploration"
          }
        ]
      },
      {
        "score": 47.1,
        "classification": "Weakening",
        "confidence": 1.0,
        "components": {
          "pct_above_ma": 0.07826498569085505,
          "relative_strength": 0.029825178174833544,
          "rs_slope": -0.0018383820306340838,
          "momentum_return": 0.11872498587432023,
          "range_position": 1.0
        },
        "sub_scores": {
          "trend": 42.2,
          "relative_strength": 40.0,
          "rs_slope": 0.0,
          "momentum": 53.1,
          "range_position": 100.0
        },
        "ticker": "XLRE",
        "name": "Real Estate",
        "subsectors": [
          {
            "score": 45.0,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.07369158857356872,
              "relative_strength": 0.016050502334596928,
              "rs_slope": -0.0012869792941241965,
              "momentum_return": 0.10495031003408362,
              "range_position": 0.9582546297317095
            },
            "sub_scores": {
              "trend": 41.2,
              "relative_strength": 36.9,
              "rs_slope": 0.0,
              "momentum": 50.8,
              "range_position": 95.8
            },
            "ticker": "REZ",
            "name": "Residential REITs"
          },
          {
            "score": 26.0,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.0001870840616193803,
              "relative_strength": -0.08435526105484747,
              "rs_slope": -0.003951629564755482,
              "momentum_return": 0.0045445466446392135,
              "range_position": 0.555901043724977
            },
            "sub_scores": {
              "trend": 25.6,
              "relative_strength": 14.6,
              "rs_slope": 0.0,
              "momentum": 34.1,
              "range_position": 55.6
            },
            "ticker": "REM",
            "name": "Mortgage REITs"
          }
        ]
      },
      {
        "score": 46.5,
        "classification": "Weakening",
        "confidence": 1.0,
        "components": {
          "pct_above_ma": 0.08620496237217035,
          "relative_strength": 0.036627643221073036,
          "rs_slope": -0.0018154680252251032,
          "momentum_return": 0.12552745092055972,
          "range_position": 0.926504159125051
        },
        "sub_scores": {
          "trend": 43.9,
          "relative_strength": 41.5,
          "rs_slope": 0.0,
          "momentum": 54.3,
          "range_position": 92.7
        },
        "ticker": "XLI",
        "name": "Industrials",
        "subsectors": [
          {
            "score": 53.4,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.1353634089010003,
              "relative_strength": 0.05228846508128382,
              "rs_slope": -0.0007850736086917776,
              "momentum_return": 0.1411882727807705,
              "range_position": 1.0
            },
            "sub_scores": {
              "trend": 54.3,
              "relative_strength": 45.0,
              "rs_slope": 10.7,
              "momentum": 56.9,
              "range_position": 100.0
            },
            "ticker": "IYT",
            "name": "Transportation"
          },
          {
            "score": 45.1,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.08268272301008595,
              "relative_strength": 0.06444293227735631,
              "rs_slope": -0.001134238867613252,
              "momentum_return": 0.153342739976843,
              "range_position": 0.7566145229818463
            },
            "sub_scores": {
              "trend": 43.1,
              "relative_strength": 47.7,
              "rs_slope": 0.0,
              "momentum": 58.9,
              "range_position": 75.7
            },
            "ticker": "XME",
            "name": "Metals & Mining"
          },
          {
            "score": 40.7,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.050836264376654894,
              "relative_strength": 0.011079027055447943,
              "rs_slope": -0.0008185237195934836,
              "momentum_return": 0.09997883475493463,
              "range_position": 0.7242724051795796
            },
            "sub_scores": {
              "trend": 36.3,
              "relative_strength": 35.8,
              "rs_slope": 9.1,
              "momentum": 50.0,
              "range_position": 72.4
            },
            "ticker": "ITA",
            "name": "Aerospace & Defense"
          }
        ]
      },
      {
        "score": 43.4,
        "classification": "Weakening",
        "confidence": 1.0,
        "components": {
          "pct_above_ma": 0.06641995433237713,
          "relative_strength": 0.047160110204728545,
          "rs_slope": -0.002669519154490113,
          "momentum_return": 0.13605991790421523,
          "range_position": 0.7739082926185131
        },
        "sub_scores": {
          "trend": 39.7,
          "relative_strength": 43.8,
          "rs_slope": 0.0,
          "momentum": 56.0,
          "range_position": 77.4
        },
        "ticker": "XLB",
        "name": "Materials",
        "subsectors": [
          {
            "score": 54.8,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.14979664522339609,
              "relative_strength": 0.15026792126551802,
              "rs_slope": -0.0027553920755075843,
              "momentum_return": 0.2391677289650047,
              "range_position": 0.7660320788729511
            },
            "sub_scores": {
              "trend": 57.4,
              "relative_strength": 66.7,
              "rs_slope": 0.0,
              "momentum": 73.2,
              "range_position": 76.6
            },
            "ticker": "LIT",
            "name": "Lithium & Battery Metals"
          },
          {
            "score": 13.2,
            "classification": "Lagging",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": -0.09940146629598823,
              "relative_strength": -0.16782126138384124,
              "rs_slope": -0.005071588947766487,
              "momentum_return": -0.07892145368435455,
              "range_position": 0.41581452385192963
            },
            "sub_scores": {
              "trend": 4.4,
              "relative_strength": 0.0,
              "rs_slope": 0.0,
              "momentum": 20.2,
              "range_position": 41.6
            },
            "ticker": "GDX",
            "name": "Gold Miners"
          }
        ]
      },
      {
        "score": 35.1,
        "classification": "Weakening",
        "confidence": 1.0,
        "components": {
          "pct_above_ma": 0.043975418530617816,
          "relative_strength": -0.09039649318774878,
          "rs_slope": -0.0008012696986277101,
          "momentum_return": -0.001496685488262095,
          "range_position": 0.8454744525374441
        },
        "sub_scores": {
          "trend": 34.9,
          "relative_strength": 13.2,
          "rs_slope": 9.9,
          "momentum": 33.1,
          "range_position": 84.5
        },
        "ticker": "XLV",
        "name": "Health Care",
        "subsectors": [
          {
            "score": 66.6,
            "classification": "Improving",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.11957502658669106,
              "relative_strength": 0.0008137003758856842,
              "rs_slope": 0.0015018721688713987,
              "momentum_return": 0.08971350807537237,
              "range_position": 1.0
            },
            "sub_scores": {
              "trend": 51.0,
              "relative_strength": 33.5,
              "rs_slope": 100.0,
              "momentum": 48.3,
              "range_position": 100.0
            },
            "ticker": "IHF",
            "name": "Healthcare Providers"
          },
          {
            "score": 37.3,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.06472551977682661,
              "relative_strength": -0.045678301567620094,
              "rs_slope": -0.0010192886133948476,
              "momentum_return": 0.043221506131866594,
              "range_position": 0.8337164094596426
            },
            "sub_scores": {
              "trend": 39.3,
              "relative_strength": 23.2,
              "rs_slope": 0.0,
              "momentum": 40.5,
              "range_position": 83.4
            },
            "ticker": "PPH",
            "name": "Pharmaceuticals"
          },
          {
            "score": 33.0,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.03349590907983768,
              "relative_strength": -0.0872053745913739,
              "rs_slope": -0.002601306820344895,
              "momentum_return": 0.0016944331081127917,
              "range_position": 0.8458419922268738
            },
            "sub_scores": {
              "trend": 32.7,
              "relative_strength": 14.0,
              "rs_slope": 0.0,
              "momentum": 33.6,
              "range_position": 84.6
            },
            "ticker": "IBB",
            "name": "Biotech"
          },
          {
            "score": 4.5,
            "classification": "Lagging",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": -0.12357766604296705,
              "relative_strength": -0.27475283719210075,
              "rs_slope": -0.0036887684141754195,
              "momentum_return": -0.18585302949261406,
              "range_position": 0.2017211036655
            },
            "sub_scores": {
              "trend": 0.0,
              "relative_strength": 0.0,
              "rs_slope": 0.0,
              "momentum": 2.4,
              "range_position": 20.2
            },
            "ticker": "IHI",
            "name": "Medical Devices"
          }
        ]
      },
      {
        "score": 34.5,
        "classification": "Weakening",
        "confidence": 1.0,
        "components": {
          "pct_above_ma": 0.04103326985664846,
          "relative_strength": -0.018434192294321194,
          "rs_slope": -0.0013923064635501636,
          "momentum_return": 0.0704656154051655,
          "range_position": 0.6378406419298783
        },
        "sub_scores": {
          "trend": 34.3,
          "relative_strength": 29.2,
          "rs_slope": 0.0,
          "momentum": 45.1,
          "range_position": 63.8
        },
        "ticker": "XLP",
        "name": "Consumer Staples",
        "subsectors": [
          {
            "score": 30.8,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.012004447204060575,
              "relative_strength": -0.04251461693792691,
              "rs_slope": -0.0032054226238028504,
              "momentum_return": 0.04638519076155978,
              "range_position": 0.6075438851538849
            },
            "sub_scores": {
              "trend": 28.1,
              "relative_strength": 23.9,
              "rs_slope": 0.0,
              "momentum": 41.1,
              "range_position": 60.8
            },
            "ticker": "PBJ",
            "name": "Food & Beverage"
          }
        ]
      },
      {
        "score": 28.7,
        "classification": "Weakening",
        "confidence": 1.0,
        "components": {
          "pct_above_ma": -0.0025303625374729632,
          "relative_strength": -0.05652418181170149,
          "rs_slope": -0.0034172596618843977,
          "momentum_return": 0.0323756258877852,
          "range_position": 0.5898584273139084
        },
        "sub_scores": {
          "trend": 25.0,
          "relative_strength": 20.8,
          "rs_slope": 0.0,
          "momentum": 38.7,
          "range_position": 59.0
        },
        "ticker": "XLU",
        "name": "Utilities",
        "subsectors": []
      },
      {
        "score": 22.9,
        "classification": "Lagging",
        "confidence": 1.0,
        "components": {
          "pct_above_ma": 0.003665879752307255,
          "relative_strength": -0.1266529594048068,
          "rs_slope": -0.0021540566239832914,
          "momentum_return": -0.03775315170532012,
          "range_position": 0.5601349320790403
        },
        "sub_scores": {
          "trend": 26.3,
          "relative_strength": 5.2,
          "rs_slope": 0.0,
          "momentum": 27.0,
          "range_position": 56.0
        },
        "ticker": "XLF",
        "name": "Financials",
        "subsectors": [
          {
            "score": 41.7,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.08645717880779302,
              "relative_strength": -0.016911149399187142,
              "rs_slope": -0.0023339882711469863,
              "momentum_return": 0.07198865830029955,
              "range_position": 0.8954607034382398
            },
            "sub_scores": {
              "trend": 43.9,
              "relative_strength": 29.6,
              "rs_slope": 0.0,
              "momentum": 45.3,
              "range_position": 89.5
            },
            "ticker": "KRE",
            "name": "Regional Banks"
          },
          {
            "score": 39.1,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.07134761579742221,
              "relative_strength": -0.03718121714812894,
              "rs_slope": -0.002462160094940241,
              "momentum_return": 0.051718590551357746,
              "range_position": 0.8790035178349782
            },
            "sub_scores": {
              "trend": 40.7,
              "relative_strength": 25.1,
              "rs_slope": 0.0,
              "momentum": 42.0,
              "range_position": 87.9
            },
            "ticker": "KBE",
            "name": "Banks"
          },
          {
            "score": 31.8,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.029939444939452553,
              "relative_strength": -0.0747606670880343,
              "rs_slope": -0.0012841167850947688,
              "momentum_return": 0.014139140611452383,
              "range_position": 0.7473791513473624
            },
            "sub_scores": {
              "trend": 31.9,
              "relative_strength": 16.7,
              "rs_slope": 0.0,
              "momentum": 35.7,
              "range_position": 74.7
            },
            "ticker": "IAI",
            "name": "Capital Markets"
          },
          {
            "score": 19.2,
            "classification": "Lagging",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": -0.010748883464613335,
              "relative_strength": -0.14392518179005853,
              "rs_slope": -0.0026426965623455923,
              "momentum_return": -0.055025374090571844,
              "range_position": 0.4728758399475545
            },
            "sub_scores": {
              "trend": 23.2,
              "relative_strength": 1.3,
              "rs_slope": 0.0,
              "momentum": 24.2,
              "range_position": 47.3
            },
            "ticker": "KIE",
            "name": "Insurance"
          }
        ]
      },
      {
        "score": 22.1,
        "classification": "Lagging",
        "confidence": 1.0,
        "components": {
          "pct_above_ma": -0.012610992757225326,
          "relative_strength": -0.13323682363960665,
          "rs_slope": -0.002178996482432094,
          "momentum_return": -0.04433701594011996,
          "range_position": 0.5785079643375302
        },
        "sub_scores": {
          "trend": 22.8,
          "relative_strength": 3.7,
          "rs_slope": 0.0,
          "momentum": 25.9,
          "range_position": 57.9
        },
        "ticker": "XLY",
        "name": "Consumer Discretionary",
        "subsectors": [
          {
            "score": 43.4,
            "classification": "Neutral",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.0753628406406277,
              "relative_strength": -0.07894102983225659,
              "rs_slope": 2.3577141711661477e-05,
              "momentum_return": 0.009958777867230095,
              "range_position": 0.7337494045174057
            },
            "sub_scores": {
              "trend": 41.6,
              "relative_strength": 15.8,
              "rs_slope": 51.2,
              "momentum": 35.0,
              "range_position": 73.4
            },
            "ticker": "JETS",
            "name": "Airlines & Travel"
          },
          {
            "score": 25.2,
            "classification": "Weakening",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": 0.004112554645308686,
              "relative_strength": -0.1172002805523722,
              "rs_slope": -0.0034293195604934877,
              "momentum_return": -0.028300472852885505,
              "range_position": 0.6354482985955064
            },
            "sub_scores": {
              "trend": 26.4,
              "relative_strength": 7.3,
              "rs_slope": 0.0,
              "momentum": 28.6,
              "range_position": 63.5
            },
            "ticker": "XRT",
            "name": "Retail"
          },
          {
            "score": 24.6,
            "classification": "Lagging",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": -0.002106551783343291,
              "relative_strength": -0.08947392812071064,
              "rs_slope": -0.0037177914625734164,
              "momentum_return": -0.0005741204212239559,
              "range_position": 0.5109125924470098
            },
            "sub_scores": {
              "trend": 25.1,
              "relative_strength": 13.5,
              "rs_slope": 0.0,
              "momentum": 33.2,
              "range_position": 51.1
            },
            "ticker": "XHB",
            "name": "Homebuilders"
          }
        ]
      },
      {
        "score": 21.3,
        "classification": "Lagging",
        "confidence": 1.0,
        "components": {
          "pct_above_ma": -0.030448183305567422,
          "relative_strength": -0.1264068401939752,
          "rs_slope": -0.0026895273033580025,
          "momentum_return": -0.0375070324944885,
          "range_position": 0.5527471624032128
        },
        "sub_scores": {
          "trend": 19.1,
          "relative_strength": 5.2,
          "rs_slope": 0.0,
          "momentum": 27.1,
          "range_position": 55.3
        },
        "ticker": "XLC",
        "name": "Communication Services",
        "subsectors": [
          {
            "score": 6.4,
            "classification": "Lagging",
            "confidence": 1.0,
            "components": {
              "pct_above_ma": -0.12207926717521311,
              "relative_strength": -0.2319120391467493,
              "rs_slope": -0.0026013588505335973,
              "momentum_return": -0.1430122314472626,
              "range_position": 0.2267829104897186
            },
            "sub_scores": {
              "trend": 0.0,
              "relative_strength": 0.0,
              "rs_slope": 0.0,
              "momentum": 9.5,
              "range_position": 22.7
            },
            "ticker": "SOCL",
            "name": "Social Media"
          }
        ]
      }
    ]
  },
  "insights": [
    {
      "tone": "positive",
      "text": "VIX term structure holds contango (1.02) \u2014 options markets price calm ahead; junk bonds are outperforming quality (HYG>LQD)."
    },
    {
      "tone": "positive",
      "text": "Under the surface: 30 of 44 tracked ETFs (68%) hold their 50-day average, 80% hold their 200-day \u2014 participation is broad and structurally healthy."
    },
    {
      "tone": "neutral",
      "text": "Score attribution (medium-term): momentum is the biggest drag (52/100, +0.2 weighted pts vs neutral); credit is the biggest support (70/100, +3.0 pts)."
    },
    {
      "tone": "positive",
      "text": "Hidden leader: Healthcare Providers (IHF) scores 87 inside Health Care (39, ranked #4) \u2014 strength the sector-level view masks."
    }
  ],
  "predictions": {
    "disclaimer": "Experimental. These outlooks are probabilistic tilts derived from leading indicators, trend trajectory, and historical rotation patterns \u2014 not guarantees. Position sizing and risk management still matter.",
    "history_days_available": 10,
    "short": {
      "market": {
        "bias_score": -10.5,
        "label": "Headwinds building",
        "tone": "caution",
        "confidence": "moderate",
        "drivers": [
          {
            "impact": -10.0,
            "text": "Score trajectory: short-term market score -11 pts over the past 10 sessions"
          },
          {
            "impact": -8.5,
            "text": "Trend persistence: trend category at 26 (a drag for continuation)"
          },
          {
            "impact": 8,
            "text": "Divergence: breadth improving under a flat tape \u2014 broadening participation often precedes upside"
          }
        ]
      },
      "sectors": [
        {
          "ticker": "XLK",
          "name": "Technology",
          "current_score": 59.0,
          "outlook": "Heating Up",
          "conviction": "Low",
          "reasons": [
            "Mid-pack score with improving relative strength \u2014 upgrades often follow",
            "Score lost 36 pts over recent sessions"
          ]
        },
        {
          "ticker": "XLP",
          "name": "Consumer Staples",
          "current_score": 36.3,
          "outlook": "Bottoming",
          "conviction": "Low",
          "reasons": [
            "Weak score with no sign of relative repair",
            "Defensive rotation candidate if broad weakness develops"
          ]
        },
        {
          "ticker": "XLV",
          "name": "Health Care",
          "current_score": 61.9,
          "outlook": "Range-bound",
          "conviction": "Low",
          "reasons": [
            "Mid-pack score with deteriorating relative strength",
            "Score gained 20 pts over recent sessions",
            "Defensive rotation candidate if broad weakness develops"
          ]
        },
        {
          "ticker": "XLRE",
          "name": "Real Estate",
          "current_score": 45.4,
          "outlook": "Cooling",
          "conviction": "Low",
          "reasons": [
            "Mid-pack score with deteriorating relative strength",
            "Score gained 4 pts over recent sessions",
            "Rising yields pressure REITs"
          ]
        },
        {
          "ticker": "XLI",
          "name": "Industrials",
          "current_score": 42.3,
          "outlook": "Cooling",
          "conviction": "Moderate",
          "reasons": [
            "Mid-pack score with deteriorating relative strength"
          ]
        },
        {
          "ticker": "XLF",
          "name": "Financials",
          "current_score": 39.9,
          "outlook": "Staying Weak",
          "conviction": "Low",
          "reasons": [
            "Weak score with no sign of relative repair",
            "Score gained 16 pts over recent sessions",
            "Flattening curve squeezes bank margins"
          ]
        },
        {
          "ticker": "XLE",
          "name": "Energy",
          "current_score": 37.0,
          "outlook": "Staying Weak",
          "conviction": "Low",
          "reasons": [
            "Weak score with no sign of relative repair",
            "Score gained 10 pts over recent sessions"
          ]
        },
        {
          "ticker": "XLB",
          "name": "Materials",
          "current_score": 30.7,
          "outlook": "Staying Weak",
          "conviction": "Moderate",
          "reasons": [
            "Weak score with no sign of relative repair"
          ]
        },
        {
          "ticker": "XLU",
          "name": "Utilities",
          "current_score": 26.8,
          "outlook": "Staying Weak",
          "conviction": "Moderate",
          "reasons": [
            "Weak score with no sign of relative repair",
            "Rising yields pressure bond proxies",
            "Defensive rotation candidate if broad weakness develops"
          ]
        },
        {
          "ticker": "XLY",
          "name": "Consumer Discretionary",
          "current_score": 24.9,
          "outlook": "Staying Weak",
          "conviction": "High",
          "reasons": [
            "Weak score with no sign of relative repair",
            "Score lost 23 pts over recent sessions"
          ]
        },
        {
          "ticker": "XLC",
          "name": "Communication Services",
          "current_score": 21.7,
          "outlook": "Staying Weak",
          "conviction": "High",
          "reasons": [
            "Weak score with no sign of relative repair",
            "Score lost 12 pts over recent sessions"
          ]
        }
      ]
    },
    "medium": {
      "market": {
        "bias_score": -7.0,
        "label": "Range-bound / mixed",
        "tone": "neutral",
        "confidence": "low",
        "drivers": [
          {
            "impact": -8.2,
            "text": "Score trajectory: medium-term market score -8 pts over the past 10 sessions"
          },
          {
            "impact": 1.2,
            "text": "Trend persistence: trend category at 53 (supportive for continuation)"
          }
        ]
      },
      "sectors": [
        {
          "ticker": "XLK",
          "name": "Technology",
          "current_score": 88.1,
          "outlook": "Staying Strong",
          "conviction": "Low",
          "reasons": [
            "High score with intact relative strength",
            "Score lost 12 pts over recent sessions"
          ]
        },
        {
          "ticker": "XLRE",
          "name": "Real Estate",
          "current_score": 42.9,
          "outlook": "Cooling",
          "conviction": "High",
          "reasons": [
            "Mid-pack score with deteriorating relative strength",
            "Rising yields pressure REITs"
          ]
        },
        {
          "ticker": "XLI",
          "name": "Industrials",
          "current_score": 40.7,
          "outlook": "Cooling",
          "conviction": "Low",
          "reasons": [
            "Mid-pack score with deteriorating relative strength",
            "Score gained 5 pts over recent sessions"
          ]
        },
        {
          "ticker": "XLV",
          "name": "Health Care",
          "current_score": 39.0,
          "outlook": "Staying Weak",
          "conviction": "Low",
          "reasons": [
            "Weak score with no sign of relative repair",
            "Score gained 12 pts over recent sessions"
          ]
        },
        {
          "ticker": "XLF",
          "name": "Financials",
          "current_score": 34.3,
          "outlook": "Staying Weak",
          "conviction": "Low",
          "reasons": [
            "Weak score with no sign of relative repair",
            "Score gained 7 pts over recent sessions",
            "Flattening curve squeezes bank margins"
          ]
        },
        {
          "ticker": "XLB",
          "name": "Materials",
          "current_score": 31.5,
          "outlook": "Staying Weak",
          "conviction": "Moderate",
          "reasons": [
            "Weak score with no sign of relative repair"
          ]
        },
        {
          "ticker": "XLE",
          "name": "Energy",
          "current_score": 29.1,
          "outlook": "Staying Weak",
          "conviction": "Moderate",
          "reasons": [
            "Weak score with no sign of relative repair"
          ]
        },
        {
          "ticker": "XLY",
          "name": "Consumer Discretionary",
          "current_score": 28.9,
          "outlook": "Staying Weak",
          "conviction": "High",
          "reasons": [
            "Weak score with no sign of relative repair",
            "Score lost 20 pts over recent sessions"
          ]
        },
        {
          "ticker": "XLP",
          "name": "Consumer Staples",
          "current_score": 26.6,
          "outlook": "Staying Weak",
          "conviction": "Moderate",
          "reasons": [
            "Weak score with no sign of relative repair"
          ]
        },
        {
          "ticker": "XLC",
          "name": "Communication Services",
          "current_score": 20.8,
          "outlook": "Staying Weak",
          "conviction": "High",
          "reasons": [
            "Weak score with no sign of relative repair",
            "Score lost 13 pts over recent sessions"
          ]
        },
        {
          "ticker": "XLU",
          "name": "Utilities",
          "current_score": 19.9,
          "outlook": "Staying Weak",
          "conviction": "High",
          "reasons": [
            "Weak score with no sign of relative repair",
            "Score lost 6 pts over recent sessions",
            "Rising yields pressure bond proxies"
          ]
        }
      ]
    },
    "long": {
      "market": {
        "bias_score": 5.3,
        "label": "Range-bound / mixed",
        "tone": "neutral",
        "confidence": "low",
        "drivers": [
          {
            "impact": 13.3,
            "text": "Trend persistence: trend category at 87 (supportive for continuation)"
          },
          {
            "impact": -6,
            "text": "Yield curve flattening \u2014 late-cycle caution"
          },
          {
            "impact": -2.0,
            "text": "Score trajectory: long-term market score -2 pts over the past 10 sessions"
          }
        ]
      },
      "sectors": [
        {
          "ticker": "XLK",
          "name": "Technology",
          "current_score": 81.1,
          "outlook": "Staying Strong",
          "conviction": "Low",
          "reasons": [
            "High score with intact relative strength",
            "Score lost 19 pts over recent sessions"
          ]
        },
        {
          "ticker": "XLE",
          "name": "Energy",
          "current_score": 59.7,
          "outlook": "Cooling",
          "conviction": "High",
          "reasons": [
            "Mid-pack score with deteriorating relative strength",
            "Score lost 16 pts over recent sessions"
          ]
        },
        {
          "ticker": "XLRE",
          "name": "Real Estate",
          "current_score": 47.1,
          "outlook": "Cooling",
          "conviction": "High",
          "reasons": [
            "Mid-pack score with deteriorating relative strength",
            "Score lost 19 pts over recent sessions",
            "Rising yields pressure REITs"
          ]
        },
        {
          "ticker": "XLI",
          "name": "Industrials",
          "current_score": 46.5,
          "outlook": "Cooling",
          "conviction": "High",
          "reasons": [
            "Mid-pack score with deteriorating relative strength",
            "Score lost 28 pts over recent sessions"
          ]
        },
        {
          "ticker": "XLB",
          "name": "Materials",
          "current_score": 43.4,
          "outlook": "Cooling",
          "conviction": "High",
          "reasons": [
            "Mid-pack score with deteriorating relative strength",
            "Score lost 30 pts over recent sessions"
          ]
        },
        {
          "ticker": "XLV",
          "name": "Health Care",
          "current_score": 35.1,
          "outlook": "Staying Weak",
          "conviction": "Low",
          "reasons": [
            "Weak score with no sign of relative repair",
            "Score gained 6 pts over recent sessions"
          ]
        },
        {
          "ticker": "XLP",
          "name": "Consumer Staples",
          "current_score": 34.5,
          "outlook": "Staying Weak",
          "conviction": "High",
          "reasons": [
            "Weak score with no sign of relative repair",
            "Score lost 17 pts over recent sessions"
          ]
        },
        {
          "ticker": "XLU",
          "name": "Utilities",
          "current_score": 28.7,
          "outlook": "Staying Weak",
          "conviction": "High",
          "reasons": [
            "Weak score with no sign of relative repair",
            "Score lost 10 pts over recent sessions",
            "Rising yields pressure bond proxies"
          ]
        },
        {
          "ticker": "XLF",
          "name": "Financials",
          "current_score": 22.9,
          "outlook": "Staying Weak",
          "conviction": "High",
          "reasons": [
            "Weak score with no sign of relative repair",
            "Flattening curve squeezes bank margins"
          ]
        },
        {
          "ticker": "XLY",
          "name": "Consumer Discretionary",
          "current_score": 22.1,
          "outlook": "Staying Weak",
          "conviction": "High",
          "reasons": [
            "Weak score with no sign of relative repair",
            "Score lost 20 pts over recent sessions"
          ]
        },
        {
          "ticker": "XLC",
          "name": "Communication Services",
          "current_score": 21.3,
          "outlook": "Staying Weak",
          "conviction": "High",
          "reasons": [
            "Weak score with no sign of relative repair",
            "Score lost 15 pts over recent sessions"
          ]
        }
      ]
    }
  },
  "data_quality": {
    "yahoo": {
      "successes": [
        "SPY",
        "QQQ",
        "IWM",
        "DIA",
        "RSP",
        "XLK",
        "XLV",
        "XLF",
        "XLY",
        "XLC",
        "XLI",
        "XLP",
        "XLE",
        "XLU",
        "XLB",
        "XLRE",
        "SOXX",
        "DRAM",
        "IGV",
        "SKYY",
        "FDN",
        "HACK",
        "IBB",
        "IHI",
        "IHF",
        "PPH",
        "KBE",
        "KRE",
        "KIE",
        "IAI",
        "XRT",
        "XHB",
        "JETS",
        "SOCL",
        "ITA",
        "IYT",
        "XME",
        "XOP",
        "OIH",
        "TAN",
        "GDX",
        "LIT",
        "PBJ",
        "REM",
        "REZ",
        "^VIX",
        "^VVIX",
        "^VIX3M",
        "HYG",
        "LQD",
        "DX-Y.NYB",
        "GC=F",
        "HG=F",
        "CL=F",
        "^TNX",
        "^TYX",
        "^IRX"
      ],
      "failures": {},
      "warnings": [
        "SPY: dropped 1/275 rows with NaN in OHLC",
        "QQQ: dropped 1/275 rows with NaN in OHLC",
        "IWM: dropped 1/275 rows with NaN in OHLC",
        "DIA: dropped 1/275 rows with NaN in OHLC",
        "RSP: dropped 1/275 rows with NaN in OHLC",
        "XLK: dropped 1/275 rows with NaN in OHLC",
        "XLV: dropped 1/275 rows with NaN in OHLC",
        "XLF: dropped 1/275 rows with NaN in OHLC",
        "XLY: dropped 1/275 rows with NaN in OHLC",
        "XLC: dropped 1/275 rows with NaN in OHLC",
        "XLI: dropped 1/275 rows with NaN in OHLC",
        "XLP: dropped 1/275 rows with NaN in OHLC",
        "XLE: dropped 1/275 rows with NaN in OHLC",
        "XLU: dropped 1/275 rows with NaN in OHLC",
        "XLB: dropped 1/275 rows with NaN in OHLC",
        "XLRE: dropped 1/275 rows with NaN in OHLC",
        "SOXX: dropped 1/275 rows with NaN in OHLC",
        "DRAM: dropped 1/48 rows with NaN in OHLC",
        "IGV: dropped 1/275 rows with NaN in OHLC",
        "SKYY: dropped 1/275 rows with NaN in OHLC",
        "FDN: dropped 1/275 rows with NaN in OHLC",
        "HACK: dropped 1/275 rows with NaN in OHLC",
        "IBB: dropped 1/275 rows with NaN in OHLC",
        "IHI: dropped 1/275 rows with NaN in OHLC",
        "IHF: dropped 1/275 rows with NaN in OHLC",
        "PPH: dropped 1/275 rows with NaN in OHLC",
        "KBE: dropped 1/275 rows with NaN in OHLC",
        "KRE: dropped 1/275 rows with NaN in OHLC",
        "KIE: dropped 1/275 rows with NaN in OHLC",
        "IAI: dropped 1/275 rows with NaN in OHLC",
        "XRT: dropped 1/275 rows with NaN in OHLC",
        "XHB: dropped 1/275 rows with NaN in OHLC",
        "JETS: dropped 1/275 rows with NaN in OHLC",
        "SOCL: dropped 1/275 rows with NaN in OHLC",
        "ITA: dropped 1/275 rows with NaN in OHLC",
        "IYT: dropped 1/275 rows with NaN in OHLC",
        "XME: dropped 1/275 rows with NaN in OHLC",
        "XOP: dropped 1/275 rows with NaN in OHLC",
        "OIH: dropped 1/275 rows with NaN in OHLC",
        "TAN: dropped 1/275 rows with NaN in OHLC",
        "GDX: dropped 1/275 rows with NaN in OHLC",
        "LIT: dropped 1/275 rows with NaN in OHLC",
        "PBJ: dropped 1/275 rows with NaN in OHLC",
        "REM: dropped 1/275 rows with NaN in OHLC",
        "REZ: dropped 1/275 rows with NaN in OHLC",
        "HYG: dropped 1/275 rows with NaN in OHLC",
        "LQD: dropped 1/275 rows with NaN in OHLC"
      ]
    },
    "fred": {
      "successes": [
        "T10Y2Y",
        "DGS2",
        "DGS10",
        "BAMLH0A0HYM2",
        "BAMLC0A4CBBB",
        "DFF",
        "WALCL"
      ],
      "failures": {},
      "warnings": []
    }
  },
  "universe": [
    {
      "group": "Broad market",
      "ticker": "SPY",
      "name": "S&P 500",
      "why": "The benchmark. Cap-weighted; dominated by mega-caps."
    },
    {
      "group": "Broad market",
      "ticker": "QQQ",
      "name": "Nasdaq 100",
      "why": "Tech-heavy growth proxy. Risk-on leadership signal."
    },
    {
      "group": "Broad market",
      "ticker": "IWM",
      "name": "Russell 2000",
      "why": "Small caps. Strength signals risk appetite; weakness signals defensiveness."
    },
    {
      "group": "Broad market",
      "ticker": "DIA",
      "name": "Dow Jones",
      "why": "Old-economy blue chips. Confirmation index for SPY moves."
    },
    {
      "group": "Broad market",
      "ticker": "RSP",
      "name": "S&P 500 Equal Weight",
      "why": "Used to compare against SPY: if RSP keeps up, breadth is healthy."
    },
    {
      "group": "Sectors",
      "ticker": "XLK",
      "name": "Technology",
      "why": "Largest sector by weight; drives index moves."
    },
    {
      "group": "Sectors",
      "ticker": "XLV",
      "name": "Health Care",
      "why": "Defensive growth. Often leads in late-cycle environments."
    },
    {
      "group": "Sectors",
      "ticker": "XLF",
      "name": "Financials",
      "why": "Levered to rates and credit conditions."
    },
    {
      "group": "Sectors",
      "ticker": "XLY",
      "name": "Consumer Discretionary",
      "why": "Cyclical. Strength = healthy consumer / risk-on."
    },
    {
      "group": "Sectors",
      "ticker": "XLC",
      "name": "Communication Services",
      "why": "Mega-cap tech + media. Often correlated with QQQ."
    },
    {
      "group": "Sectors",
      "ticker": "XLI",
      "name": "Industrials",
      "why": "Cyclical. Leads in early-cycle / reflationary regimes."
    },
    {
      "group": "Sectors",
      "ticker": "XLP",
      "name": "Consumer Staples",
      "why": "Defensive. Outperformance signals risk-off rotation."
    },
    {
      "group": "Sectors",
      "ticker": "XLE",
      "name": "Energy",
      "why": "Commodity-driven. Inflation hedge; sensitive to oil prices."
    },
    {
      "group": "Sectors",
      "ticker": "XLU",
      "name": "Utilities",
      "why": "Bond proxy. Outperformance signals defensive positioning or falling yields."
    },
    {
      "group": "Sectors",
      "ticker": "XLB",
      "name": "Materials",
      "why": "Cyclical. Tracks global growth and commodity demand."
    },
    {
      "group": "Sectors",
      "ticker": "XLRE",
      "name": "Real Estate",
      "why": "Rate-sensitive. Hurts when long-end yields rise."
    },
    {
      "group": "Volatility",
      "ticker": "^VIX",
      "name": "VIX",
      "why": "S&P 500 30-day implied vol. The fear gauge \u2014 high = stressed, low = complacent."
    },
    {
      "group": "Volatility",
      "ticker": "^VVIX",
      "name": "VVIX",
      "why": "Volatility of the VIX. Spikes when traders are unsure how scared to be."
    },
    {
      "group": "Volatility",
      "ticker": "^VIX3M",
      "name": "VIX 3-Month",
      "why": "3-month implied vol. VIX3M/VIX term structure: contango = calm, backwardation = genuine stress."
    },
    {
      "group": "Credit ETFs",
      "ticker": "HYG",
      "name": "High Yield Corporate Bonds",
      "why": "Junk bond ETF. HYG vs LQD relative strength is a real-time credit risk gauge."
    },
    {
      "group": "Credit ETFs",
      "ticker": "LQD",
      "name": "Investment Grade Corporate Bonds",
      "why": "IG bond ETF. The quality benchmark HYG is measured against."
    },
    {
      "group": "Macro & commodities",
      "ticker": "DX-Y.NYB",
      "name": "US Dollar Index (DXY)",
      "why": "Strong DXY tightens global liquidity and pressures non-US earnings."
    },
    {
      "group": "Macro & commodities",
      "ticker": "GC=F",
      "name": "Gold",
      "why": "Safe-haven asset; rises when real yields fall or risk-off bid emerges."
    },
    {
      "group": "Macro & commodities",
      "ticker": "HG=F",
      "name": "Copper",
      "why": "Dr. Copper \u2014 global growth proxy. Rising = expansion."
    },
    {
      "group": "Macro & commodities",
      "ticker": "CL=F",
      "name": "WTI Crude Oil",
      "why": "Inflation input; supply shocks are macro events."
    },
    {
      "group": "Macro & commodities",
      "ticker": "^TNX",
      "name": "10-Year Treasury Yield",
      "why": "Discount rate for risk assets. Rising yields = headwind."
    },
    {
      "group": "Macro & commodities",
      "ticker": "^TYX",
      "name": "30-Year Treasury Yield",
      "why": "Long-end inflation expectations."
    },
    {
      "group": "Macro & commodities",
      "ticker": "^IRX",
      "name": "13-Week Treasury Yield",
      "why": "Short-end rate; proxy for cash yield."
    },
    {
      "group": "Macro (FRED)",
      "ticker": "T10Y2Y",
      "name": "10Y-2Y Treasury spread",
      "why": "The yield curve. Negative (inverted) historically precedes recessions by 6\u201318 months."
    },
    {
      "group": "Macro (FRED)",
      "ticker": "DGS2",
      "name": "2-Year Treasury Yield",
      "why": "Reflects near-term Fed policy expectations."
    },
    {
      "group": "Macro (FRED)",
      "ticker": "DGS10",
      "name": "10-Year Treasury Yield",
      "why": "Discount rate for long-duration assets."
    },
    {
      "group": "Macro (FRED)",
      "ticker": "BAMLH0A0HYM2",
      "name": "High-Yield Credit Spread",
      "why": "Premium over Treasuries demanded for junk bonds. Widening = stress, tightening = calm."
    },
    {
      "group": "Macro (FRED)",
      "ticker": "BAMLC0A4CBBB",
      "name": "Investment-Grade BBB Spread",
      "why": "Investment-grade credit stress. Confirms or contradicts HY signal."
    },
    {
      "group": "Macro (FRED)",
      "ticker": "DFF",
      "name": "Federal Funds Effective Rate",
      "why": "The Fed's primary policy rate."
    },
    {
      "group": "Macro (FRED)",
      "ticker": "WALCL",
      "name": "Fed Balance Sheet",
      "why": "Total Fed assets. Expansion = QE/easing, contraction = QT/tightening."
    },
    {
      "group": "Subsectors \u2014 Technology (XLK)",
      "ticker": "SOXX",
      "name": "Semiconductors",
      "why": "Broad chip exposure (NVDA, AVGO, AMD, TSM, etc.). The standard semis fund."
    },
    {
      "group": "Subsectors \u2014 Technology (XLK)",
      "ticker": "DRAM",
      "name": "Memory",
      "why": "Pure-play memory chips (SK Hynix, Samsung, Micron). HBM + DRAM + NAND. Limited history \u2014 launched April 2026."
    },
    {
      "group": "Subsectors \u2014 Technology (XLK)",
      "ticker": "IGV",
      "name": "Software",
      "why": "Application + systems software pure-play (MSFT, ORCL, CRM, etc.)."
    },
    {
      "group": "Subsectors \u2014 Technology (XLK)",
      "ticker": "SKYY",
      "name": "Cloud Computing",
      "why": "Cloud infrastructure plays \u2014 overlaps with software but skews toward AWS/Azure/GCP ecosystem."
    },
    {
      "group": "Subsectors \u2014 Technology (XLK)",
      "ticker": "FDN",
      "name": "Internet",
      "why": "Consumer internet + mega-cap platforms (META, GOOG, AMZN concentration)."
    },
    {
      "group": "Subsectors \u2014 Technology (XLK)",
      "ticker": "HACK",
      "name": "Cybersecurity",
      "why": "Pure-play security (CRWD, PANW, ZS, etc.). Narrow but distinct theme."
    },
    {
      "group": "Subsectors \u2014 Health Care (XLV)",
      "ticker": "IBB",
      "name": "Biotech",
      "why": "Biotech-focused. Distinct beta from broad healthcare; binary clinical-trial risk."
    },
    {
      "group": "Subsectors \u2014 Health Care (XLV)",
      "ticker": "IHI",
      "name": "Medical Devices",
      "why": "Device manufacturers (MDT, ABT, ISRG, etc.). Narrower than XLV."
    },
    {
      "group": "Subsectors \u2014 Health Care (XLV)",
      "ticker": "IHF",
      "name": "Healthcare Providers",
      "why": "Insurers + hospital operators (UNH, CVS, ELV). Different beta from biotech."
    },
    {
      "group": "Subsectors \u2014 Health Care (XLV)",
      "ticker": "PPH",
      "name": "Pharmaceuticals",
      "why": "Big pharma pure play (LLY, JNJ, PFE, etc.)."
    },
    {
      "group": "Subsectors \u2014 Financials (XLF)",
      "ticker": "KBE",
      "name": "Banks",
      "why": "Standard regional + national banks ETF."
    },
    {
      "group": "Subsectors \u2014 Financials (XLF)",
      "ticker": "KRE",
      "name": "Regional Banks",
      "why": "Smaller/mid-cap regionals specifically. Trades quite differently from KBE."
    },
    {
      "group": "Subsectors \u2014 Financials (XLF)",
      "ticker": "KIE",
      "name": "Insurance",
      "why": "Insurance carriers \u2014 life, P&C, brokers."
    },
    {
      "group": "Subsectors \u2014 Financials (XLF)",
      "ticker": "IAI",
      "name": "Capital Markets",
      "why": "Broker-dealers + exchanges (GS, MS, ICE, etc.)."
    },
    {
      "group": "Subsectors \u2014 Consumer Discretionary (XLY)",
      "ticker": "XRT",
      "name": "Retail",
      "why": "Equal-weight retail (AMZN, TGT, COST, BBY, etc.). The classic retail proxy."
    },
    {
      "group": "Subsectors \u2014 Consumer Discretionary (XLY)",
      "ticker": "XHB",
      "name": "Homebuilders",
      "why": "Homebuilding + housing-adjacent. Highly rate-sensitive."
    },
    {
      "group": "Subsectors \u2014 Consumer Discretionary (XLY)",
      "ticker": "JETS",
      "name": "Airlines & Travel",
      "why": "Airlines, cruise lines, hotels. Niche but cleanly defined cyclical."
    },
    {
      "group": "Subsectors \u2014 Communication Services (XLC)",
      "ticker": "SOCL",
      "name": "Social Media",
      "why": "Social platforms \u2014 META, SNAP, PINS. Useful pure-play exposure."
    },
    {
      "group": "Subsectors \u2014 Industrials (XLI)",
      "ticker": "ITA",
      "name": "Aerospace & Defense",
      "why": "Defense contractors + aerospace (LMT, RTX, BA, etc.)."
    },
    {
      "group": "Subsectors \u2014 Industrials (XLI)",
      "ticker": "IYT",
      "name": "Transportation",
      "why": "Rails, trucking, freight (UNP, UPS, FDX). Classic 'Dow Theory' confirmation."
    },
    {
      "group": "Subsectors \u2014 Industrials (XLI)",
      "ticker": "XME",
      "name": "Metals & Mining",
      "why": "Industrial metals miners. Distinct from precious metals in XLB."
    },
    {
      "group": "Subsectors \u2014 Energy (XLE)",
      "ticker": "XOP",
      "name": "Oil & Gas Exploration",
      "why": "Pure upstream E&P. Higher beta than XLE itself."
    },
    {
      "group": "Subsectors \u2014 Energy (XLE)",
      "ticker": "OIH",
      "name": "Oil Services",
      "why": "Services + equipment (SLB, HAL, BKR). Distinct from explorers."
    },
    {
      "group": "Subsectors \u2014 Energy (XLE)",
      "ticker": "TAN",
      "name": "Solar / Clean Energy",
      "why": "Solar pure-play. Distinct from fossil fuels."
    },
    {
      "group": "Subsectors \u2014 Materials (XLB)",
      "ticker": "GDX",
      "name": "Gold Miners",
      "why": "Major gold miners (NEM, GOLD, AEM). Very different from broad materials."
    },
    {
      "group": "Subsectors \u2014 Materials (XLB)",
      "ticker": "LIT",
      "name": "Lithium & Battery Metals",
      "why": "Theme exposure to battery supply chain."
    },
    {
      "group": "Subsectors \u2014 Consumer Staples (XLP)",
      "ticker": "PBJ",
      "name": "Food & Beverage",
      "why": "Food + beverage companies. Cleanest staples sub-cut available."
    },
    {
      "group": "Subsectors \u2014 Real Estate (XLRE)",
      "ticker": "REM",
      "name": "Mortgage REITs",
      "why": "Mortgage REITs (rate-spread plays). Behaves very differently from equity REITs."
    },
    {
      "group": "Subsectors \u2014 Real Estate (XLRE)",
      "ticker": "REZ",
      "name": "Residential REITs",
      "why": "Apartment + single-family rental REITs."
    }
  ]
}