楼主: yunnandlg
28633 31

[学科前沿] The Conservative Formula: Quantitative Investing Made Easy [推广有奖]

31
宽客老丁(未真实交易用户) 发表于 2026-1-30 10:45:03
"""
算行业"宽度"DF

用你给的 THEME_GROUPS(人形机器人、CPO、AI眼镜…)。
对每只股票判断:今天收盘价 > 自己的20日均线 吗?是=1,否=0。
同样口径,算每天每个题材里">20日均线"的比例(%)。

得到 DF_THEME:行=日期,列=题材(还有"合计")。

一句话:第1列就是把行业和题材的"强弱宽度曲线"都算出来了。
"""
from jqdata import *
import datetime
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import math


# 获取股票和价格数据
stocks = get_index_stocks("000985.XSHG")
# yesterday = attribute_history('000300.XSHG', 1).index[0].strftime("%Y-%m-%d")
yesterday = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")  # 实时时间
count = 60 # 1年的交易日
h = get_price(
    stocks,
    end_date=yesterday,
    frequency="1d",
    fields=["close"],
    count=count + 20,
    panel=False,
)

# 获取行业信息
def getStockIndustry(stocks):
    industry = get_industry(stocks)
    dict = {
        stock: info["sw_l1"]["industry_name"]
        for stock, info in industry.items()
        if "sw_l1" in info
    }
    return pd.Series(dict)

# 处理数据(行业占比 DF,保持你的原逻辑不变)
h["date"] = pd.DatetimeIndex(h.time).date
df_close = h.pivot(index="code", columns="date", values="close").dropna(axis=0)
df_ma20 = df_close.rolling(window=20, axis=1).mean().iloc[:, -count:]
df_bias = df_close.iloc[:, -count:] > df_ma20
df_bias["industry_name"] = getStockIndustry(stocks)
df_ratio = (
    (df_bias.groupby("industry_name").sum() * 100.0)
    / df_bias.groupby("industry_name").count()
).round()
df_ratio.loc['合计'] = df_ratio.sum().astype("int32")  # 你原来的"合计"
DF = df_ratio.T  # 行=日期,列=行业(含"合计"列)

# ========= 自定义题材分组(按你给的组合,逐字保留) =========
THEME_GROUPS = {
    "可控核聚变":[
        "601985.XSHG",  # 中国核电 | 国内最大核电运营商(中核集团控股),机组规模/在运在建领先。
        "003816.XSHE",  # 中国广核 | 核电运营 + 项目开发双主线  
        "600875.XSHG",  # 东方电气 | 核岛主设备/常规岛成套能力,国内最主要核电设备商之一。
        "601727.XSHG",  # 上海电气 | 反应堆压力容器/堆内构件等制造,参与高温气冷堆示范项目。
          "601212.XSHG",  # 白银有色 | 有色冶炼平台,核能相关金属材料上游供给能力。
        "688102.XSHG",  #斯瑞新材 | 高温合金/难熔金属材料,核能耐高温部件材料储备。
          "000777.XSHE",  # 中核科技 | 核电专用阀门龙头,长期配套"两核"体系。
          "600522.XSHG",  # 中天科技 | (同上,海缆/电缆在核电送出与岛内配电环节应用)
        "002255.XSHE",  # 海陆重工 | 锅炉/换热/装备制造,核常规岛辅机配套。
        "000400.XSHE",  # 许继电气 | 二次系统/继电保护,核电站及送出工程自动化。
        "600363.XSHG",  # 联创光电 | 电力电子/光电器件,核电监控/指示系统配套。
       "603011.XSHG",  # 合锻智能
         "600105.XSHG",  # 永鼎股份
         "600353.XSHG",  # 旭光电子 | 光电子元件
          "000969.XSHE",  # 安泰科技 | 特种合金/金属材料平台,涉核高端材料配套。
          "601611.XSHG",  # 中国核建 | 核电站+电网配套施工
          "688122.XSHG",  # 西部超导 | 低温超导
          "300820.XSHE",  # 英杰电气 | 聚变电气设备
         "688663.XSHG",  # 新风光 | 聚变电气设备
        "600577.XSHG",  # 精达股份 | 涨停6次,电磁线+互连基础材料
         "301137.XSHE",  # 哈焊华通 | 焊材
         "300963.XSHE",  # 中洲特材 | 焊材
          "002255.XSHE",  # 海陆重工 | 主机
         "600501.XSHG",  # 航天晨光 | 主机
          "603308.XSHG",  # 应流股份 | 主机
         
    ],
    "半导体": [
        # 【设计/MCU/存储】
        "603986.XSHG",  # 兆易创新 | 存储+MCU龙头
        "002049.XSHE",  # 紫光国微 | 安全芯片龙头
        "688008.XSHG",  # 澜起科技 | 接口芯片
        "688018.XSHG",  # 乐鑫科技 | WiFi MCU
        "300223.XSHE",  # 北京君正 | 存储+计算
        "688123.XSHG",  # 聚辰股份 | 存储芯片
        "001309.XSHE",  # 德明利 | 存储模组
        "688525.XSHG",  # 佰维存储 | 存储芯片
        "300475.XSHE",  # 香农芯创 | 存储分销
        "301308.XSHE",  # 江波龙 | 存储模组
        "688262.XSHG",  # 国芯科技 | 嵌入式CPU
        "300458.XSHE",  # 全志科技 | SoC设计
        "688521.XSHG",  # 芯原股份 | IP授权
        "300327.XSHE",  # 中颖电子 | 家电MCU
        "300671.XSHE",  # 富满微 | 模拟+MCU
        "688484.XSHG",  # 南芯科技 | 电源管理IC
        # 【制造/IDM】
        "688981.XSHG",  # 中芯国际 | 晶圆代工龙头
        "688347.XSHG",  # 华虹公司 | 特色工艺代工
        "688396.XSHG",  # 华润微 | IDM龙头
        "605358.XSHG",  # 立昂微 | 硅片+功率器件
        "688469.XSHG",  # 芯联集成 | 特色工艺晶圆厂
        "300373.XSHE",  # 扬杰科技 | 功率IDM
        "688249.XSHG",  # 晶合集成 | 显示驱动制造
        "688409.XSHG",  # 富创精密 | 设备精密结构件
        # 【设备】
        "002371.XSHE",  # 北方华创 | 平台型设备龙头
        "688012.XSHG",  # 中微公司 | 刻蚀设备龙头
        "688082.XSHG",  # 盛美上海 | 清洗/镀膜设备
        "688037.XSHG",  # 芯源微 | 涂胶显影设备
        "688361.XSHG",  # 中科飞测 | 检测量测设备
        "688072.XSHG",  # 拓荆科技 | 薄膜沉积设备
        "300567.XSHE",  # 精测电子 | 测试设备
        "300666.XSHE",  # 江丰电子 | 靶材龙头
        "688409.XSHG",  # 富创精密 | 设备精密部件
        "688167.XSHG",  # 炬光科技 | 激光光源
        # 【材料】
        "688432.XSHG",  # 有研硅 | 硅材料
        "688268.XSHG",  # 华特气体 | 电子特气
        "688146.XSHG",  # 中船特气 | 电子特气
        "603078.XSHG",  # 江化微 | 湿电子化学品
        "002409.XSHE",  # 雅克科技 | 前驱体/光刻胶
        "688019.XSHG",  # 安集科技 | CMP抛光液
        "300655.XSHE",  # 晶瑞电材 | 光刻胶
        "603650.XSHG",  # 彤程新材 | 光刻胶
        "688199.XSHG",  # 久日新材 | 光刻胶原料
        "300666.XSHE",  # 江丰电子 | 半导体靶材 (光刻机耗材)
        # 【封测】
        "600584.XSHG",  # 长电科技 | 封测龙头
        "002185.XSHE",  # 华天科技 | 封测龙头
        "002156.XSHE",  # 通富微电 | 封测龙头
        "603005.XSHG",  # 晶方科技 | 传感器封测
        "688372.XSHG",  # 伟测科技 | 芯片测试
        "301348.XSHE",  # 蓝箭电子 | 封测
        "688362.XSHG",  # 甬矽电子 | 封测
        "688135.XSHG",  # 利扬芯片 | 测试
        "300604.XSHE",  # 长川科技 | 测试设备
    ],
    "电池与储能": [
        # 【电池与系统集成】
        "300750.XSHE",  # 宁德时代 | 动力电池全球龙头
        "002594.XSHE",  # 比亚迪 | 整车+电池龙头
        "300014.XSHE",  # 亿纬锂能 | 动力+储能电池
        "002074.XSHE",  # 国轩高科 | 动力电池
        "688063.XSHG",  # 派能科技 | 户储龙头
        "300207.XSHE",  # 欣旺达 | 消费+动力电池
        "688772.XSHG",  # 珠海冠宇 | 消费电池
        "002733.XSHE",  # 雄韬股份 | 铅酸+锂电
        "300068.XSHE",  # 南都电源 | 工业储能
        "688411.XSHG",  # 海博思创 | 储能系统
        # 【核心材料】
        "002709.XSHE",  # 天赐材料 | 电解液龙头
        "300037.XSHE",  # 新宙邦 | 电解液
        "603659.XSHG",  # 璞泰来 | 负极材料龙头
        "300073.XSHE",  # 当升科技 | 正极材料龙头
        "688005.XSHG",  # 容百科技 | 高镍正极
        "300769.XSHE",  # 德方纳米 | 磷酸铁锂正极
        "301358.XSHE",  # 湖南裕能 | 磷酸铁锂正极
        "688116.XSHG",  # 天奈科技 | 碳纳米管导电剂
        "002812.XSHE",  # 恩捷股份 | 隔膜龙头
        "300568.XSHE",  # 星源材质 | 隔膜
        "002340.XSHE",  # 格林美 | 回收与前驱体
        # 【新技术】
        "002460.XSHE",  # 赣锋锂业 | 固态电池布局
        "300438.XSHE",  # 鹏辉能源 | 固态电池研发
        "002585.XSHE",  # 双星新材 | PET铜箔基膜
        "002992.XSHE",  # 宝明科技 | 复合铜箔
        "688388.XSHG",  # 嘉元科技 | 铜箔+复合铜箔
        "600110.XSHG",  # 诺德股份 | 锂电铜箔
        "603659.XSHG",  # 璞泰来 | 锂电负极,布局复合集流体
        # 【设备】
        "300450.XSHE",  # 先导智能 | 整线设备龙头
        "688006.XSHG",  # 杭可科技 | 后道设备龙头
        "300457.XSHE",  # 赢合科技 | 前中道设备
        "688559.XSHG",  # 海目星 | 激光制片设备
        "688097.XSHG",  # 博众精工 | 自动化设备
    ],
    "AI应用": [
    # ==================== 上游:AI基础支撑 ====================
    # 1.1 算力硬件 (芯片/GPU/服务器)
    "000977.XSHE",  # 浪潮信息 | AI服务器龙头
    "603019.XSHG",  # 中科曙光 | 高端计算/服务器
    "601138.XSHG",  # 工业富联 | 服务器代工
    "688041.XSHG",  # 海光信息 | AI/DCU芯片
    "300474.XSHE",  # 景嘉微 | GPU设计
    "603256.XSHG",  # 宏和科技 | 高端电子级玻璃纤维布 (PCB核心材料)
    "300476.XSHE",  # 胜宏科技 | 高端PCB,用于显卡/服务器
    "603228.XSHG",  # 景旺电子 | PCB
    "603296.XSHG",  # 华勤技术 | 服务器ODM
    "300223.XSHE",  # 北京君正 | 存储芯片,用于边缘计算
    # 1.2 数据中心与连接 (IDC/光通信/CPO)
    "300383.XSHE",  # 光环新网 | IDC运营
    "603881.XSHG",  # 数据港 | IDC运营
    "300442.XSHE",  # 润泽科技 | IDC运营
    "300308.XSHE",  # 中际旭创 | 光模块/CPO龙头
    "300502.XSHE",  # 新易盛 | 光模块/CPO龙头
    "002281.XSHE",  # 光迅科技 | 光器件
    "300394.XSHE",  # 天孚通信 | 光器件/CPO关键环节
    "603083.XSHG",  # 剑桥科技 | 光模块
    "300913.XSHE",  # 兆龙互连 | 高速互连线缆
    "600487.XSHG",  # 亨通光电 | 光纤光缆
    "600498.XSHG",  # 烽火通信 | 光通信设备
    # 1.3 液冷与散热 (AI算力配套)
    "002837.XSHE",  # 英维克 | 机房温控/液冷龙头
    "301018.XSHE",  # 申菱环境 | 数据中心冷却
    "300499.XSHE",  # 高澜股份 | 液冷产品
    "002126.XSHE",  # 银轮股份 | 热管理
    "300335.XSHE",  # 迪森股份 | 余热利用

    # ==================== 中游:AI核心平台 ====================
    # 2.1 大模型与算法
    "002230.XSHE",  # 科大讯飞 | 星火认知大模型
    "300229.XSHE",  # 拓尔思 | 语义智能大模型
    "300624.XSHE",  # 万兴科技 | AIGC应用软件
    # 2.2 行业AI平台与解决方案
    "300378.XSHE",  # 鼎捷软件 | 工业软件/智能制造
    "300170.XSHE",  # 汉得信息 | 企业数字化
    "002410.XSHE",  # 广联达 | 建筑信息化AI
    "300212.XSHE",  # 易华录 | 数据湖与智慧交通
    "300451.XSHE",  # 创业慧康 | 医疗信息化AI
    # 2.3 AI开发工具与数据服务
    "300047.XSHE",  # 天源迪科 | 数据治理

    # ==================== 下游:AI应用落地 ====================
    # 3.1 AI+金融/支付
    "002657.XSHE",  # 中科金财 | AI+金融科技
    "300773.XSHE",  # 拉卡拉 | 支付+金融科技
    "000997.XSHE",  # 新大陆 | 支付设备与识别
    "300468.XSHE",  # 四方精创 | 区块链与金融IT
    "002537.XSHE",  # 海联金汇 | 金融科技与跨境支付
    "600415.XSHG",  # 小商品城 | 支付+跨境贸易
    # 3.2 AI+机器人/智能制造
    # (人形机器人整板块已独立,此处为具备AI感知/决策的工业应用)
    "300124.XSHE",  # 汇川技术 | 工业自动化/机器人AI控制
    "300607.XSHE",  # 拓斯达 | 工业机器人集成
    "002527.XSHE",  # 新时达 | 机器人控制与驱动
    # 3.3 AI+视觉/感知 (传感器、光学)
    "002273.XSHE",  # 水晶光电 | AR/光波导 (AI眼镜)
    "001314.XSHE",  # 亿道信息 | XR设备 (AI眼镜)
    "002189.XSHE",  # 中光学 | 光学镜头
    "002414.XSHE",  # 高德红外 | 红外视觉
    "300007.XSHE",  # 汉威科技 | 气体传感
    "603662.XSHG",  # 柯力传感 | 多维力传感
    "688322.XSHG",  # 奥比中光 | 3D视觉
    # 3.4 AI+自动驾驶/智能交通
    "002405.XSHE",  # 四维图新 | 高精度地图与车规芯片
    "002906.XSHE",  # 华阳集团 | 智能座舱
    "600699.XSHG",  # 均胜电子 | 智能驾驶与汽车安全
    "000997.XSHE",  # 新大陆 | (也涉及车路协同)
    # 3.5 AI+内容与营销 (AIGC)
    "300058.XSHE",  # 蓝色光标 | AI营销
    "300781.XSHE",  # 因赛集团 | AI营销
    "300413.XSHE",  # 芒果超媒 | 内容制作与推荐算法
    "002558.XSHE",  # 巨人网络 | 游戏AI
    # 3.6 AI+医疗
    "300253.XSHE",  # 卫宁健康 | 医疗信息化与AI辅助诊断
    "002030.XSHE",  # 达安基因 | 基因检测与AI分析
    # 3.7 AI+安全
    "002439.XSHE",  # 启明星辰 | 网络安全与AI安防
    "300297.SZ",  # 蓝盾股份 | 网络安全
    ],
    "电力与电网": [
        # 【发电-传统】
        "600011.XSHG",  # 华能国际 | 火电龙头
        "600900.XSHG",  # 长江电力 | 水电龙头
        "600025.XSHG",  # 华能水电 | 大型水电
        "001289.XSHE",  # 龙源电力 | 新能源发电
        # 【发电-新能源】
        "601016.XSHG",  # 节能风电 | 风电运营
        "600905.XSHG",  # 三峡能源 | 风光运营龙头
        "601615.XSHG",  # 明阳智能 | 风电整机龙头
        "002202.XSHE",  # 金风科技 | 风电整机龙头
        "601012.XSHG",  # 隆基绿能 | 光伏组件龙头
        "688223.XSHG",  # 晶科能源 | 光伏组件龙头
        "300118.XSHE",  # 东方日升 | 光伏组件
        "300274.XSHE",  # 阳光电源 | 逆变器龙头
        # 【电网设备】
        "600089.XSHG",  # 特变电工 | 变压器/多晶硅
        "600312.XSHG",  # 平高电气 | 高压开关
        "000400.XSHE",  # 许继电气 | 二次设备/直流
        "600406.XSHG",  # 国电南瑞 | 电网自动化龙头
        "002028.XSHE",  # 思源电气 | 开关/EPC
        # 【电气装备】
        "600875.XSHG",  # 东方电气 | 发电设备龙头
        "601727.XSHG",  # 上海电气 | 综合装备龙头
        # 【线缆】
        "600522.XSHG",  # 中天科技 | 海缆/光纤龙头
        "600869.XSHG",  # 远东股份 | 线缆龙头
        "603618.XSHG",  # 杭电股份 | 电缆
        # 【工程建设】
        "601868.XSHG",  # 中国能建 | 电力工程总包
        "601669.XSHG",  # 中国电建 | 水利电力工程
    ],
    "光伏": [
        # 【硅料/硅片】
        "600438.XSHG",  # 通威股份 | 硅料+电池片龙头
        "002129.XSHE",  # TCL中环 | 硅片龙头
        # 【电池/组件】
        "688223.XSHG",  # 晶科能源 | 组件龙头
        "688599.XSHG",  # 天合光能 | 组件龙头
        "601012.XSHG",  # 隆基绿能 | 一体化龙头
        "002459.XSHE",  # 晶澳科技 | 一体化龙头
        "600732.XSHG",  # 爱旭股份 | 电池片龙头
        # 【逆变器】
        "300274.XSHE",  # 阳光电源 | 逆变器+储能龙头
        # 【辅材】
        "603806.XSHG",  # 福斯特 | 胶膜龙头
        "601865.XSHG",  # 福莱特 | 光伏玻璃龙头
        "688680.XSHG",  # 海优新材 | 胶膜
        "300842.XSHE",  # 帝科股份 | 导电银浆
        "688503.XSHG",  # 聚和材料 | 导电银浆
        "603212.XSHG",  # 赛伍技术 | 背板
        "301266.XSHE",  # 宇邦新材 | 焊带
        "001269.XSHE",  # 欧晶科技 | 石英坩埚
        # 【设备】
        "603396.XSHG",  # 金辰股份 | 电池设备
        "300724.XSHE",  # 捷佳伟创 | 电池设备
    ],
    "大消费": [
        # 【白酒】
        "600519.XSHG",  # 贵州茅台 | 白酒龙头
        "000858.XSHE",  # 五粮液 | 白酒龙头
        "000568.XSHE",  # 泸州老窖 | 高端白酒
        "600809.XSHG",  # 山西汾酒 | 清香龙头
        # 【食品饮料】
        "600887.XSHG",  # 伊利股份 | 乳业龙头
        "605499.XSHG",  # 东鹏饮料 | 功能饮料龙头
        "603711.XSHG",  # 香飘飘 | 杯装奶茶龙头
        "002568.XSHE",  # 百润股份 | 预调酒龙头 (RIO)
        "600132.XSHG",  # 重庆啤酒 | 啤酒龙头
        # 【珠宝首饰】
        "600612.XSHG",  # 老凤祥 | 黄金珠宝龙头
        "002867.XSHE",  # 周大生 | 珠宝连锁
        "600916.XSHG",  # 中国黄金 | 黄金零售
        # 【零售】
        "601933.XSHG",  # 永辉超市 | 商超龙头
        "002251.XSHE",  # 步步高 | 区域零售
        # 【宠物】
        "301498.XSHE",  # 乖宝宠物 | 宠物食品龙头
        "001222.XSHE",  # 源飞宠物 | 宠物用品
    ],
    "交通运输": [
        # 【航运港口】
        "601919.XSHG",  # 中远海控 | 集装箱航运龙头
        "600428.XSHG",  # 中远海特 | 特种船运输
        "601018.XSHG",  # 宁波港 | 港口
        # 【公路铁路】
        "600020.XSHG",  # 中原高速 | 高速公路
        "000548.XSHE",  # 湖南投资 | 路桥收费
        "001213.XSHE",  # 中铁特货 | 铁路货运
        # 【海工装备】
        "600685.XSHG",  # 中船防务 | 船舶制造
        "601989.XSHG",  # 中国重工 | 船舶制造
        # 【低空经济/飞行汽车】
        "002085.XSHE",  # 万丰奥威 | 通用航空+汽车部件
        "002708.XSHE",  # 光洋股份 | 轴承,飞行汽车部件
        "000099.XSHE",  # 中信海直 | 直升机运营
    ],
    "工业母机": [
        "300780.XSHE",  # 德恩精工
        "300508.XSHE",  # 维宏股份
        "002943.XSHE",  # 宇晶股份
        "688518.XSHG",  # 联赢激光
        "601106.XSHG",  # 中国一重
        "301338.XSHE",  # 凯格精机
        "688237.XSHG",  # 超卓航科
        "300503.XSHE",  # 昊志机电
    ],
    "有色金属": [
    # 1. 黄金
        "600547.XSHG",  # 山东黄金 | 黄金开采龙头
        "600489.XSHG",  # 中金黄金 | 黄金开采龙头
        "601899.XSHG",  # 紫金矿业 | 铜金矿巨头
        "600988.XSHG",  # 赤峰黄金 | 黄金开采
        "000975.XSHE",  # 银泰黄金 | 黄金开采
        "601069.XSHG",  # 西部黄金 | 黄金开采
        "002155.XSHE",  # 湖南黄金 | 黄金开采
        "002237.XSHE",  # 恒邦股份 | 黄金冶炼
    # 2. 白银 (及其他贵金属)
        "601212.XSHG",  # 白银有色 | 铜铅锌冶炼,副产白银  
    # 3. 铜
        "600362.XSHG",  # 江西铜业 | 铜冶炼龙头
        "000630.XSHE",  # 铜陵有色 | 铜冶炼龙头
        "000878.XSHE",  # 云南铜业 | 西南铜业龙头
        "603993.XSHG",  # 洛阳钼业 | 铜钴矿巨头
        "600490.XSHG",  # 鹏欣资源 | 海外铜矿
        "000737.XSHE",  # 北方铜业 | 山西铜资源
    # 4. 铝
        "601600.XSHG",  # 中国铝业 | 铝业龙头
        "000807.XSHE",  # 云铝股份 | 电解铝
        "000933.XSHE",  # 神火股份 | 煤电铝
        "601702.XSHG",  # 华峰铝业 | 铝热传输材料
        "000612.XSHE",  # 焦作万方 | 电解铝
        "601388.XSHG",  # 怡球资源 | 再生铝
    # 5. 铅锌
        "000060.XSHE",  # 中金岭南 | 铅锌龙头
        "601168.XSHG",  # 西部矿业 | 铅锌铜多金属
        "600497.XSHG",  # 驰宏锌锗 | 铅锌冶炼
        "600961.XSHG",  # 株冶集团 | 铅锌冶炼
        "000426.XSHE",  # 兴业银锡 | 铅锌锡
        "000688.XSHE",  # 国城矿业 | 铅锌矿
        "000758.XSHE",  # 中色股份 | 铅锌工程承包
        "600338.XSHG",  # 西藏珠峰 | 铅锌资源
        "600531.XSHG",  # 豫光金铅 | 铅冶炼龙头
    # 6. 其他工业金属 (锡、镍等)
        "000960.XSHE",  # 锡业股份 | 锡业龙头
        "603799.XSHG",  # 华友钴业 | 钴业龙头,兼具镍业务
    ],
    "稀有金属": [
    # 1. 锂
        "002460.XSHE",  # 赣锋锂业 | 锂业龙头
        "002466.XSHE",  # 天齐锂业 | 锂矿巨头
        "002756.XSHE",  # 永兴材料 | 云母提锂
        "002192.XSHE",  # 融捷股份 | 锂矿
        "000762.XSHE",  # 西藏矿业 | 盐湖提锂   
    # 2. 钴
        "603799.XSHG",  # 华友钴业 | 钴盐龙头
        "300618.XSHE",  # 寒锐钴业 | 钴粉龙头   
    # 3. 镍
        "600432.XSHG",  # 退市吉恩 (注:原镍业龙头,已退市,此处保留分类结构,实际可替换为其他镍相关公司,如“格林美”)
        "002340.XSHE",  # 格林美 | 镍资源回收与前驱体  
    # 4. 稀土及磁材
        "600111.XSHG",  # 北方稀土 | 稀土配额龙头
        "600392.XSHG",  # 盛和资源 | 稀土全产业链
        "600259.SH",  # 广晟有色 | 稀土分离
        "000831.SZ",  # 中国稀土 | 稀土整合
        "300748.XSHE",  # 金力永磁 | 稀土永磁龙头
        "000970.XSHE",  # 中科三环 | 钕铁硼磁材
        "300224.XSHE",  # 正海磁材 | 高性能磁材
        "600366.XSHG",  # 宁波韵升 | 钕铁硼磁材
        "300835.XSHE",  # 龙磁科技 | 磁性材料
        "002056.XSHE",  # 横店东磁 | 磁材+器件
    # 5. 钨
        "600549.XSHG",  # 厦门钨业 | 钨钼稀土
        "000657.XSHE",  # 中钨高新 | 钨制品
        "002378.XSHE",  # 章源钨业 | 钨矿采选
    # 6. 钛
        "600456.XSHG",  # 宝钛股份 | 钛材龙头
        "002145.XSHE",  # 中核钛白 | 钛白粉 (注:归入化工亦合理,此处按钛元素分类)
    # 7. 钼
        "601958.XSHG",  # 金钼股份 | 钼业龙头  
    # 8. 其他稀有/战略小金属
        "000969.XSHE",  # 安泰科技 | 非晶/纳米晶带材
        "002182.XSHE",  # 云海金属 | 镁合金龙头
        "000962.XSHE",  # 东方钽业 | 钽铌制品
        "002428.XSHE",  # 云南锗业 | 锗材料
        "600459.XSHG",  # 贵研铂业 | 贵金属材料 (铂、钯等)
        "002149.XSHE",  # 西部材料 | 稀有金属材料
],
    "石油石化": [
        # 【油气开采】
        "601857.XSHG",  # 中国石油 | 综合油气巨头
        "600938.XSHG",  # 中国海油 | 海上油气龙头
        "600028.XSHG",  # 中国石化 | 炼化一体化巨头
        "600759.XSHG",  # 洲际油气 | 油气勘探
        # 【炼油化工】
        "600346.XSHG",  # 恒力石化 | 民营炼化龙头
        "002493.XSHE",  # 荣盛石化 | 民营炼化龙头
        "000301.XSHE",  # 东方盛虹 | 炼化聚酯
        "000703.XSHE",  # 恒逸石化 | 涤纶产业链
        "600688.XSHG",  # 上海石化 | 炼化一体化
        "600871.XSHG",  # 石化油服 | 业务含炼化工程 (此处因其业务重叠,也列入油服)
        # 【油服工程】
        "600871.XSHG",  # 石化油服 | 综合油服龙头
        "600583.XSHG",  # 海油工程 | 海上油服工程
        "603619.XSHG",  # 中曼石油 | 钻井工程
        "300164.XSHE",  # 通源石油 | 油服技术
        "300191.XSHE",  # 潜能恒信 | 油服技术
        "002207.XSHE",  # 准油股份 | 油田技术服务
        "002554.XSHE",  # 惠博普 | 油气装备与工程
        "603727.XSHG",  # 博迈科 | 海洋油气工程模块
        "601808.XSHG",  # 中海油服 | 海上油服
        "600968.XSHG",  # 海油发展 | 近海油田服务
        # 【销售贸易】
        "603353.XSHG",  # 和顺石油 | 成品油销售
        "000554.XSHE",  # 泰山石油 | 成品油销售
        "601808.XSHG",  # 中海油服 | 海上油服 (补全)
        "600968.XSHG",  # 海油发展 | 近海油田服务 (补全)
    ],
    "细分化工": [
        # 【大炼化/聚酯】 (与石油石化有重叠)
        "600346.XSHG",  # 恒力石化 | 民营炼化龙头
        "002493.XSHE",  # 荣盛石化 | 民营炼化龙头
        "601233.XSHG",  # 桐昆股份 | PTA、涤纶龙头
        "000703.XSHE",  # 恒逸石化 | 涤纶产业链
        "000301.XSHE",  # 东方盛虹 | 炼化聚酯
        # 【基础化工龙头】
        "600309.XSHG",  # 万华化学 | MDI/聚氨酯全球龙头
        "600426.XSHG",  # 华鲁恒升 | 煤化工龙头
        "002648.XSHE",  # 卫星化学 | C2(乙烯)产业链龙头
        # 3. 化肥与磷化工
        "000792.XSHE",  # 盐湖股份 | 钾肥龙头 (亦属有色金属)
        "000422.XSHE",  # 湖北宜化 | 化肥+化工
        "600141.XSHG",  # 兴发集团 | 磷硅化工龙头
        "600096.XSHG",  # 云天化 | 磷肥龙头
        "002170.XSHE",  # 芭田股份 | 复合肥
        "600331.XSHG",  # 宏达股份 | 磷化工
        # 4. 氟化工
        "600160.XSHG",  # 巨化股份 | 氟化工龙头
        "002407.XSHE",  # 多氟多 | 氟化工、六氟磷酸锂
        # 5. 煤化工
        "600989.XSHG",  # 宝丰能源 | 煤基烯烃龙头
        # 6. 精细化工及新材料
        "300285.XSHE",  # 国瓷材料 | 陶瓷材料、催化材料
        "300821.XSHE",  # 东岳硅材 | 有机硅
        "300037.XSHE",  # 新宙邦 | 电解液、功能化学品
        "300487.XSHE",  # 蓝晓科技 | 吸附分离材料
        "300699.XSHE",  # 光威复材 | 碳纤维及复合材料
        "002709.XSHE",  # 天赐材料 | 电解液龙头 (亦属电池材料)
        "002812.XSHE",  # 恩捷股份 | 隔膜龙头 (亦属电池材料)
        # 7. 其他化工
        "002601.XSHE",  # 龙佰集团 | 钛白粉龙头
        "002064.XSHE",  # 华峰化学 | 氨纶、己二酸
        "002096.XSHE",  # 易普力 | 民爆产品
    ],
    "煤炭": [
        "601088.XSHG",  # 中国神华 | 煤电运一体化龙头
        "601699.XSHG",  # 潞安环能 | 喷吹煤龙头
        "600188.XSHG",  # 兖矿能源 | 动力煤龙头
        "600123.XSHG",  # 兰花科创 | 无烟煤
        "601225.XSHG",  # 陕西煤业 | 优质动力煤龙头
        "600740.XSHG",  # 山西焦化 | 焦炭
        "600408.XSHG",  # 安泰集团 | 焦炭
        "601015.XSHG",  # 陕西黑猫 | 焦炭
        "600397.XSHG",  # 安源煤业 | 江西煤炭开采
        "600403.XSHG",  # 大有能源 | 河南煤炭
        "000723.XSHE",  # 美锦能源 | 焦化龙头
        "601898.XSHG",  # 中煤能源 | 煤炭央企
        "000571.XSHE",  # 新大洲A | 煤炭采掘
        "000612.XSHE",  # 焦作万方 | (因其持有煤矿股权,常被列入煤炭概念)
    ],
    "人形机器人": [
    # 电机与驱动
        "300124.XSHE",  # 汇川技术 | 伺服系统龙头
        "600580.XSHG",  # 卧龙电驱 | 电机及驱动,持股宇树科技
        "603728.XSHG",  # 鸣志电器 | 步进电机、空心杯电机
        "300660.XSHE",  # 江苏雷利 | 微型电机,应用于灵巧手
        "603344.XSHG",  # 星德胜 | 微特电机(曾用于扫地机)
        "002801.XSHE",  # 微光股份 | 无框力矩电机
        "002196.XSHE",  # 方正电机 | 驱动电机
        "003021.XSHE",  # 兆威机电 | 微型传动系统,用于灵巧手
        "002249.XSHE",  # 大洋电机 | 电机及驱动
        "002823.XSHE",  # 凯中精密 | 电机换向器
        "300503.XSHE",  # 昊志机电 | 无框力矩电机、机器人关节模组
        "605488.XSHG",  # 福莱新材 | (曾涉及灵巧手材料)
        "605288.XSHG",  # 凯迪股份 | 线性驱动执行器
    # 减速器与传动
        "002896.XSHE",  # 中大力德 | RV/谐波减速器
        "300611.XSHE",  # 美力科技 | 弹簧、精密零件
        "301261.XSHE",  # 恒工精密 | 精密传动部件
        "301007.XSHE",  # 德迈仕 | 精密轴、齿件
        "300580.XSHE",  # 贝斯特 | 精密零部件
        "301368.XSHE",  # 丰立智能 | 精密齿轮、减速器零件
        "002472.XSHE",  # 双环传动 | 高精密齿轮龙头
        "603009.XSHG",  # 北特科技 | 转向器齿条、减震器活塞杆
        "002520.XSHE",  # 日发精机 | 轴承磨超设备、零部件加工
        "300695.XSHE",  # 兆丰股份 | 汽车轮毂轴承单元
        "002850.XSHE",  # 科达利 | 精密结构件,布局关节模组
        "301029.XSHE",  # 怡合达 | 工厂自动化零部件一站式供应商
        "603119.XSHG",  # 浙江荣泰 | (曾与特斯拉合作)
        "688017.XSHG",  # 绿的谐波 | 谐波减速器龙头
        "301596.XSHE",  # 瑞迪智驱 | 自动化驱动部件
        "601177.XSHG",  # 杭齿前进 | 齿轮箱、传动装置
        "301550.XSHE",  # 斯菱股份 | 汽车轴承
        "603667.XSHG",  # 五洲新春 | 轴承套圈、丝杆
        "603809.XSHG",  # 豪能股份 | 同步器齿环、差速器
        "688165.XSHG",  # 埃夫特 | 工业机器人整机
        "300709.XSHE",  # 精研科技 | MIM零件、传动机构
    # 整机与集成
        "300115.XSHE",  # 长盈精密 | 精密结构件,布局机器人
        "002527.XSHE",  # 新时达 | 工业机器人整机
        "688585.XSHG",  # 上纬新材 | (曾与智元机器人有关联)
        "603486.XSHG",  # 科沃斯 | 服务机器人(扫地机)
        "688169.XSHG",  # 石头科技 | 服务机器人(扫地机)
        "002048.XSHE",  # 宁波华翔 | 汽车零部件,涉及机器人组装
    # 传感器
        "603662.XSHG",  # 柯力传感 | 称重/多维力传感器
        "688286.XSHG",  # 敏芯股份 | MEMS麦克风、压力传感器芯片
        "002414.XSHE",  # 高德红外 | 红外热成像传感器
        "300007.XSHE",  # 汉威科技 | 气体、压力传感器
        "688322.XSHG",  # 奥比中光 | 3D视觉传感器
        "301413.XSHE",  # 安培龙 | 压力、温度传感器
        "002338.XSHE",  # 奥普光电 | 光电测控仪器
        "600460.XSHG",  # 士兰微 | MEMS传感器、功率半导体
        "688665.XSHG",  # 四方光电 | 气体传感器
        "300667.XSHE",  # 必创科技 | MEMS传感器芯片、物联网
        "688582.XSHG",  # 芯动联科 | MEMS陀螺仪、加速度计
        "000988.XSHE",  # 华工科技 | 温度、压力传感器
        "300701.XSHE",  # 森霸传感 | 热释电红外传感器
        "688123.XSHG",  # 聚辰股份 | EEPROM,可用于传感器存储
],
    "锂电池": [
        # 【上游锂资源】
        "002460.XSHE",  # 赣锋锂业 | 全球锂盐龙头,垂直整合资源与加工
        "002466.XSHE",  # 天齐锂业 | 全球锂矿巨头,控股格林布什矿
        "002756.XSHE",  # 永兴材料 | 云母提锂龙头,成本优势显著
        "002192.XSHE",  # 融捷股份 | 锂矿采选+冶炼,资源自给率高
        "002240.XSHE",  # 盛新锂能 | 锂盐产能快速扩张
        "000762.XSHE",  # 西藏矿业 | 盐湖提锂,扎布耶盐湖资源
        "002497.XSHE",  # 雅化集团 | 锂盐+民爆,与澳洲矿商合作
        # 【电池制造与系统】
        "300750.XSHE",  # 宁德时代 | 全球动力电池绝对龙头
        "002594.XSHE",  # 比亚迪 | 整车+自供电池龙头,刀片电池技术
        "300014.XSHE",  # 亿纬锂能 | 动力+储能+消费电池全面布局
        "002074.XSHE",  # 国轩高科 | 动力电池老牌厂商,大众入股
        "688063.XSHG",  # 派能科技 | 户用储能电池龙头
        "300207.XSHE",  # 欣旺达 | 消费电池龙头,动力电池快速成长
        "300438.XSHE",  # 鹏辉能源 | 储能与轻型动力电池
        # 【关键材料-正极】
        "300073.XSHE",  # 当升科技 | 高镍正极材料全球核心供应商
        "688005.XSHG",  # 容百科技 | 高镍正极龙头,产能规模领先
        "300769.XSHE",  # 德方纳米 | 磷酸铁锂正极龙头,液相法工艺
        "301358.XSHE",  # 湖南裕能 | 磷酸铁锂正极主要供应商
        "688707.XSHG",  # 振华新材 | 中高镍单晶正极材料
        # 【关键材料-负极】
        "603659.XSHG",  # 璞泰来 | 人造石墨负极龙头,一体化布局
        "300035.XSHE",  # 中科电气 | 负极材料石墨化领先企业
        "300890.XSHE",  # 翔丰华 | 人造石墨及硅碳负极
        # 【关键材料-电解液】
        "002709.XSHE",  # 天赐材料 | 电解液全球龙头,六氟磷酸锂自供
        "300037.XSHE",  # 新宙邦 | 电解液第二梯队,半导体化学品并重
        "002407.XSHE",  # 多氟多 | 六氟磷酸锂核心供应商,向电解液延伸
        # 【关键材料-隔膜】
        "002812.XSHE",  # 恩捷股份 | 湿法隔膜全球霸主,龙头地位稳固
        "300568.XSHE",  # 星源材质 | 干法隔膜龙头,湿法快速放量
        # 【关键材料-辅材及其他】
        "688116.XSHG",  # 天奈科技 | 碳纳米管导电剂龙头
        "300919.XSHE",  # 中伟股份 | 三元前驱体龙头
        "002340.XSHE",  # 格林美 | 电池回收与前驱体制造
        # 【锂电设备】
        "300450.XSHE",  # 先导智能 | 锂电整线设备全球龙头
        "688006.XSHG",  # 杭可科技 | 后段化成分容设备龙头
        "300457.XSHE",  # 赢合科技 | 中段卷绕/叠片设备领先者
        "688559.XSHG",  # 海目星 | 激光制片、焊接设备高速增长
        # 【新技术方向】
        "002585.XSHE",  # 双星新材 | PET铜箔/复合集流体基膜
        "002992.XSHE",  # 宝明科技 | 复合铜箔产业化的领先厂商
        "688388.XSHG",  # 嘉元科技 | 锂电铜箔龙头,加码复合铜箔
    ],
    "创新药": [
        # 【A股】
        "688235.XSHG",  # 百济神州 | 本土创新药龙头,泽布替尼全球上市
        "300049.XSHE",  # 福瑞股份 | 肝病诊断与治疗
        "688506.XSHG",  # 百利天恒 | 双抗/ADC平台型创新药企
        "002294.XSHE",  # 信立泰 | 心脑血管领域,转型创新药
        # 【港股】(注意:需确认您的数据源支持港股行情)
        "09926.HK",  # 康方生物 | 双抗龙头,依沃西(AK112)等管线领先
        "06990.HK",  # 科伦博泰生物-B | 科伦药业分拆,ADC平台型公司
        "01530.HK",  # 三生制药 | 生物制药,主打产品特比澳、益赛普等
        "01801.HK",  # 信达生物 | PD-1龙头之一,多条肿瘤管线推进
        "02268.HK",  # 药明合联 | 药明系,专注ADC等生物偶联药CRDMO
        "09606.HK",  # 映恩生物-B | 临床阶段生物科技公司,专注于ADC药物
        "01093.HK",  # 石药集团 | 传统药企转型,创新药收入占比提升
        "01276.HK",  # 远大医药 | 心脑血管急救及创新药布局
        "06160.HK",  # 百济神州 | 与A股688235为同一公司,港股主体
        "03692.HK",  # 翰森制药 | 豪森药业,中枢神经、肿瘤等创新药
        "09995.HK",  # 荣昌生物 | ADC、自免双抗平台,维迪西妥单抗已上市
        # 【已去重】原始列表中的第二个“01530”已合并
    ],
    "商业航天": [
        # 【卫星总体与运营】
        "600118.XSHG",  # 中国卫星 | 国内小卫星制造及卫星应用龙头
        "601698.XSHG",  # 中国卫通 | 国内唯一通信卫星运营公司
        # 【卫星通信与载荷】
        "002465.XSHE",  # 海格通信 | 军用通信及北斗导航装备核心供应商
        "300762.XSHE",  # 上海瀚讯 | 军用宽带移动通信,可用于卫星通信
        "300136.XSHE",  # 信维通信 | 终端天线龙头,布局卫星通信天线
        # 【卫星导航与定位】
        "002151.XSHE",  # 北斗星通 | 北斗芯片、板卡核心供应商
        "600435.XSHG",  # 北方导航 | 惯性导航及光电导航系统
        "300627.XSHE",  # 华测导航 | 高精度GNSS接收机及解决方案提供商
        "688568.XSHG",  # 中科星图 | 数字地球产品,空天信息可视化与应用
        # 【关键元器件与部组件】
        "600879.XSHG",  # 航天电子 | 航天电子专用产品,配套多型火箭、卫星
        "688375.XSHG",  # 国博电子 | 有源相控阵T/R组件核心供应商,用于卫星载荷
        "688270.XSHG",  # 臻镭科技 | 射频芯片及电源管理芯片,用于卫星通信终端
        "300782.XSHE",  # 卓胜微 | 射频前端芯片,可用于卫星通信终端
        "300593.XSHE",  # 新雷能 | 特种电源,广泛配套于航天星箭领域
        # 【遥感与探测】
        "688002.XSHG",  # 睿创微纳 | 非制冷红外探测器及芯片,可用于卫星遥感
        "688385.XSHG",  # 复旦微电 | FPGA芯片,可用于星上数据处理
    ],
    "传媒游戏": [
        "002174.XSHE",  # 游族网络 | 网络游戏研发与运营
        "002517.XSHE",  # 恺英网络 | 游戏研发、运营及IP资源
        "002555.XSHE",  # 三七互娱 | 国内领先的移动游戏发行商
        "002558.XSHE",  # 巨人网络 | 客户端及移动端游戏研发运营
        "002624.XSHE",  # 完美世界 | 影游联动龙头,涵盖游戏、影视
        "300002.XSHE",  # 神州泰岳 | ICT运营管理,旗下有游戏业务(壳木软件)
        "300251.XSHE",  # 光线传媒 | 综合性影视传媒集团,涉足动漫游戏
        "300315.XSHE",  # 掌趣科技 | 移动游戏开发商
        "600633.XSHG",  # 浙数文化 | 数字文化、数字科技产业,含游戏业务
        "603444.XSHG",  # 吉比特 | 网络游戏研发和运营商
    ],
    "猪肉": [
        # 【生猪养殖龙头】
        "002714.XSHE",  # 牧原股份 | 自繁自养模式龙头,成本控制行业领先
        "300498.XSHE",  # 温氏股份 | “公司+农户”模式代表,养殖巨头
        "000876.XSHE",  # 新希望 | 饲料+养殖一体化龙头,产业链布局完整
        # 【饲料与养殖】
        "002311.XSHE",  # 海大集团 | 饲料行业龙头,业务延伸至生猪养殖
        "002385.XSHE",  # 大北农 | 饲料、种业为主,积极布局生猪养殖
        "002157.XSHE",  # 正邦科技 | 饲料与生猪养殖业务
        # 【动物保健】
        "600201.XSHG",  # 生物股份 | 动物疫苗龙头,受益于养殖业防疫需求
        # 【饲料原料/添加剂】
        "600873.XSHG",  # 梅花生物 | 氨基酸产品是饲料重要原料
        # 【禽肉(替代消费)】
        "002299.XSHE",  # 圣农发展 | 白羽肉鸡一体化龙头,与猪肉存在消费替代关系
        "300761.XSHE",  # 立华股份 | 黄羽肉鸡养殖龙头
    ],
    "CPO": [
        "300308.XSHE",  # 中际旭创 | 光模块/CPO龙头
        "300502.XSHE",  # 新易盛 | 光模块/CPO龙头
        "002281.XSHE",  # 光迅科技 | 光器件
        "300394.XSHE",  # 天孚通信 | 光器件/CPO关键环节
        "603083.XSHG",  # 剑桥科技 | 光模块
        "300913.XSHE",  # 兆龙互连 | 高速互连线缆
        "600487.XSHG",  # 亨通光电 | 光纤光缆
        "600498.XSHG",  # 烽火通信 | 光通信设备
        "300620.XSHE",  # 光库科技 | 光子集成
],
}

# 基于 df_bias 生成题材占比矩阵(行=日期,列=题材)
def build_theme_matrix_from_bias(df_bias: pd.DataFrame, theme_groups: dict,
                                 as_percent: bool = True, rounding: int = 0) -> pd.DataFrame:
    # 仅使用日期列(排除 industry_name)
    date_cols = [c for c in df_bias.columns if c != 'industry_name']
    bias_num = df_bias[date_cols].astype(float)  # True->1.0, False->0.0

    out = {}
    for theme, codes in theme_groups.items():
        codes_in = [c for c in codes if c in bias_num.index]
        if not codes_in:
            out[theme] = pd.Series(index=bias_num.columns, dtype=float)
            continue
        sub = bias_num.loc[codes_in]
        denom = sub.notna().sum(axis=0)
        num = sub.sum(axis=0)
        with np.errstate(divide='ignore', invalid='ignore'):
            ratio = num / denom
        if as_percent:
            ratio = ratio * 100.0
        if rounding is not None:
            ratio = ratio.round(rounding)
        out[theme] = ratio.fillna(0.0)

    DF_THEME = pd.DataFrame(out)
    DF_THEME.index.name = 'date'
    DF_THEME = DF_THEME.sort_index()

    # 为与第三列热力图兼容,补上"合计"列:直接复用行业版 DF 的"合计"
    if '合计' in DF.columns:
        DF_THEME['合计'] = DF['合计']
    return DF_THEME

# 生成题材矩阵
DF_THEME = build_theme_matrix_from_bias(df_bias, THEME_GROUPS, as_percent=True, rounding=0)

# 通用绘制函数(含末端数值和红色圆点)
import matplotlib.dates as mdates

# 通用绘制函数(含末端数值和红色圆点)- 现在放在调用之前定义
def draw_industry_line(df, industry_name, show_extremes=False, *,
                       lookback_days=63,  # ≈ 3个月交易日
                       tick_every=5):      # 主刻度每5日
    # 取列并保证索引为时间序列
    if industry_name not in df.columns:
        raise KeyError(f"{industry_name} 不在 DataFrame 的列中。")
    industry_data = df[industry_name].copy()
    if not isinstance(industry_data.index, pd.DatetimeIndex):
        try:
            industry_data.index = pd.to_datetime(industry_data.index)
        except Exception:
            pass
    industry_data = industry_data.sort_index().dropna()

    # 仅保留最近 lookback_days 个交易日
    if lookback_days is not None and lookback_days > 0:
        industry_data = industry_data.tail(lookback_days)
    if industry_data.empty:
        raise ValueError(f"{industry_name} 对应序列为空或全 NaN。")

    # 分位阈值在可见窗口内计算
    bottom_threshold = industry_data.quantile(0.20)
    top_threshold    = industry_data.quantile(0.80)

    plt.figure(figsize=(16, 6))
    ax = plt.gca()

    # 主线
    ax.plot(industry_data.index, industry_data.values, color='blue', linewidth=2, label=industry_name)

    # 顶/底区间填色(仅在落入区间时)
    ymin, ymax = industry_data.min(), industry_data.max()
    ax.fill_between(industry_data.index, ymin, np.minimum(industry_data.values, bottom_threshold),
                    where=industry_data.values <= bottom_threshold, color='red', alpha=0.2, label='Bottom 20%')
    ax.fill_between(industry_data.index, np.maximum(industry_data.values, top_threshold), ymax,
                    where=industry_data.values >= top_threshold, color='green', alpha=0.2, label='Top 20%')

    # 最新点
    last_date = industry_data.index[-1]
    last_value = industry_data.iloc[-1]
    ax.plot(last_date, last_value, 'ro', markersize=8, label='Latest Value')
    ax.annotate(f'{last_value:.2f}', xy=(last_date, last_value), xytext=(10, 5),
                textcoords='offset points', fontsize=12, color='red',
                bbox=dict(boxstyle='round,pad=0.3', fc='white', ec='black', alpha=0.8))

    # 可选:极值反转点(与你原逻辑一致)
    if show_extremes and len(industry_data) >= 2:
        in_bottom = in_top = False
        bottom_trend = top_trend = None
        bottom_reversal_marked = top_reversal_marked = False
        for i in range(1, len(industry_data)):
            curr_value = industry_data.iloc[i]
            prev_value = industry_data.iloc[i-1]
            curr_date  = industry_data.index[i]

            if not in_bottom and curr_value <= bottom_threshold:
                in_bottom = True
                bottom_trend = -1 if curr_value < prev_value else 1
                bottom_reversal_marked = False
            elif in_bottom:
                current_trend = 1 if curr_value > prev_value else -1
                if bottom_trend == -1 and current_trend == 1 and not bottom_reversal_marked:
                    ax.annotate(f'底部反转: {curr_value:.2f}\n{curr_date.strftime("%Y-%m-%d")}',
                                xy=(curr_date, curr_value), xytext=(-10, -20), textcoords='offset points',
                                arrowprops=dict(arrowstyle='->', color='black', linewidth=1),
                                fontsize=9, bbox=dict(boxstyle='round,pad=0.3', fc='white', ec='red', alpha=0.8))
                    ax.plot(curr_date, curr_value, 'rv', markersize=7)
                    bottom_reversal_marked = True
                bottom_trend = current_trend
                if curr_value > bottom_threshold:
                    in_bottom = False
                    bottom_trend = None

            if not in_top and curr_value >= top_threshold:
                in_top = True
                top_trend = 1 if curr_value > prev_value else -1
                top_reversal_marked = False
            elif in_top:
                current_trend = 1 if curr_value > prev_value else -1
                if top_trend == 1 and current_trend == -1 and not top_reversal_marked:
                    ax.annotate(f'顶部反转: {curr_value:.2f}\n{curr_date.strftime("%Y-%m-%d")}',
                                xy=(curr_date, curr_value), xytext=(10, 10), textcoords='offset points',
                                arrowprops=dict(arrowstyle='->', color='black', linewidth=1),
                                fontsize=9, bbox=dict(boxstyle='round,pad=0.3', fc='white', ec='green', alpha=0.8))
                    ax.plot(curr_date, curr_value, 'g^', markersize=7)
                    top_reversal_marked = True
                top_trend = current_trend
                if curr_value < top_threshold:
                    in_top = False
                    top_trend = None

    # —— 关键:X 轴刻度/网格 —— #
    # ✅ 只显示交易日(不显示周末)
    # 把 tick_every 个交易日作为主刻度,formatter 用交易日日期
    valid_dates = pd.to_datetime(industry_data.index)

    # 主刻度:每 tick_every 个交易日
    ax.set_xticks(valid_dates[::tick_every])
    ax.set_xticklabels(valid_dates[::tick_every].strftime('%Y-%m-%d'), rotation=45, ha='right', fontsize=9)

    # 次刻度:每个交易日一根竖线
    ax.set_xticks(valid_dates, minor=True)

    # 网格
    ax.grid(True, which='major', linestyle='--', alpha=0.6)
    ax.grid(True, which='minor', linestyle='-',  alpha=0.15)

    # 网格:主刻度较明显,次刻度较淡
    ax.grid(True, which='major', linestyle='--', alpha=0.6)
    ax.grid(True, which='minor', linestyle='-',  alpha=0.15)

    ax.legend(loc='upper left', fontsize=12)
    ax.set_title(f'{industry_name} Trend', fontsize=16, pad=12)
    ax.set_xlabel('Date', fontsize=12)
    ax.set_ylabel('Value (%)', fontsize=12)
    plt.setp(ax.get_xticklabels(), rotation=45, ha='right', fontsize=9)
    ax.tick_params(axis='y', labelsize=10)
    plt.tight_layout()
    plt.show()

# 修改热力图函数,删除"合计"行并调整右侧图例,横轴时间顺序改为倒序
def draw_heatmap(df):
    """
    df: 行=日期, 列=行业/题材
    修改:删除"合计"行,调整右侧图例大小和位置,横轴时间顺序改为倒序(从左到右从新到老)
    纵坐标按各板块最近的宽度值从大到小排列,"可控核聚变"始终在第一排
    """
    df_copy = df.copy()

    # 删除"合计"列
    if '合计' in df_copy.columns:
        df_copy = df_copy.drop(columns=['合计'])

    # 确保"可控核聚变"在第一列
    if '可控核聚变' in df_copy.columns:
        # 获取其他列(不包括"可控核聚变")
        other_cols = [c for c in df_copy.columns if c != '可控核聚变']
        
        # 按最后一个交易日的值降序排序其他列
        last_row = df_copy.iloc[-1]
        other_cols_sorted = sorted(other_cols, key=lambda x: last_row[x], reverse=True)
        
        # 重新排列列顺序:可控核聚变 + 排序后的其他列
        new_cols = ['可控核聚变'] + other_cols_sorted
        df_copy = df_copy[new_cols]

    # 反转DataFrame的行顺序,使横轴时间从左到右从新到老
    df_copy = df_copy.iloc[::-1]

    # 转置DataFrame:横坐标显示日期,纵坐标显示板块
    df_transposed = df_copy.T

    # 动态尺寸
    fig_width = max(20, df_transposed.shape[1] * 0.8)
    fig_height = max(10, df_transposed.shape[0] * 0.5)
   
    # 创建图形和坐标轴
    fig, ax = plt.subplots(figsize=(fig_width, fig_height))
   
    # 绘制热力图,不显示默认颜色条
    heatmap = sns.heatmap(
        df_transposed,
        annot=True,
        cmap='RdYlGn_r',
        cbar=False,  # 不显示默认颜色条
        annot_kws={'size': 10},
        square=True,
        linewidths=0.5,
        fmt=".0f",
        ax=ax
    )
   
    # 手动创建颜色条,调整大小和位置
    from mpl_toolkits.axes_grid1 import make_axes_locatable
   
    # 创建与热力图顶部对齐的颜色条
    divider = make_axes_locatable(ax)
    cax = divider.append_axes("right", size="2%", pad=0.1)  # 宽度为2%
   
    # 获取颜色映射
    vmin = df_transposed.min().min()
    vmax = df_transposed.max().max()
   
    # 创建颜色条
    sm = plt.cm.ScalarMappable(cmap='RdYlGn_r', norm=plt.Normalize(vmin=vmin, vmax=vmax))
    sm.set_array([])
   
    # 设置颜色条高度为10行格子高度
    cbar = plt.colorbar(sm, cax=cax)
   
    # 调整颜色条位置与热力图顶部对齐
    cax.set_position([ax.get_position().x1 + 0.01,
                     ax.get_position().y1 - 0.1,  # 与顶部对齐
                     0.02,  # 宽度
                     0.1])  # 高度(10行格子高度)
   
    plt.title('市场宽度', fontsize=16, pad=20)
    plt.xlabel('日期', fontsize=14)
    plt.ylabel('行业/题材', fontsize=14)
    plt.tight_layout()
    plt.show()

# 使用修改后的热力图函数
draw_heatmap(DF_THEME)

# =========================================================
# 题材版:画"合计"并打印分位阈值(交易日对齐版)
# 与 draw_heatmap 使用相同交易日序列
# =========================================================
from jqdata import *
import pandas as pd

# === Step 1. 确保索引是 DatetimeIndex
if not isinstance(DF_THEME.index, pd.DatetimeIndex):
    DF_THEME = DF_THEME.copy()
    DF_THEME.index = pd.to_datetime(DF_THEME.index)

# === Step 2. 获取交易日序列(与热力图一致)
start = DF_THEME.index.min().strftime('%Y-%m-%d')
end   = DF_THEME.index.max().strftime('%Y-%m-%d')

trade_days = get_trade_days(start_date=start, end_date=end)     # list of datetime.date
trade_index = pd.DatetimeIndex(pd.to_datetime(trade_days))      # 转为 DatetimeIndex

# === Step 3. 重建交易日索引,只保留真实交易日(跳过周末、节假日)
DF_THEME_TD = DF_THEME.reindex(trade_index).dropna(how='all')

# === Step 4. 画"合计"曲线并打印分位线
col = '合计'
if col not in DF_THEME_TD.columns:
    print("⚠️ 未找到列:合计")
else:
    draw_industry_line(DF_THEME_TD, col, show_extremes=True)

    series = DF_THEME_TD[col].dropna()
    bottom_threshold = series.quantile(0.20)
    top_threshold    = series.quantile(0.80)
    print(f"顶: {top_threshold:.0f} , 底: {bottom_threshold:.0f}")

    # === 可选增强:打印当前分位位置
    current_value = series.iloc[-1]
    quantile_rank = (series < current_value).sum() / len(series)
    print(f"当前值: {current_value:.0f} , 位于历史分位: {quantile_rank*100:.1f}%")

# 打印近3日(含当天)每日排名最高的前5名"题材"
from jqdata import *
import pandas as pd

def print_daily_top_themes_trade(df, days=3):
    """
    用交易所日历对齐到交易日(剔除周末/法定节假日),再打印近N个交易日的Top5题材(排除'合计')
    """
    # 1) 统一日期索引
    df = df.copy()
    if not isinstance(df.index, pd.DatetimeIndex):
        df.index = pd.to_datetime(df.index)

    # 2) 生成交易日索引,并重建到交易日
    start = str(df.index.min().date())
    end   = str(df.index.max().date())
    trade_days = get_trade_days(start_date=start, end_date=end)
    trade_index = pd.DatetimeIndex(trade_days)

    df_td = df.reindex(trade_index)          # 与交易日对齐
    df_td = df_td.dropna(how='all')          # 整行全空的去掉(非交易日或完全缺数')

    # 3) 近N个"交易日"样本(倒序,含当天)
    df_td = df_td.sort_index(ascending=False)
    if df_td.shape[0] < days:
        print(f"警告: 交易日样本不足{days}天,仅分析{df_td.shape[0]}天")
        days = df_td.shape[0]

    recent = df_td.iloc[:days, :].drop(columns=[c for c in df_td.columns if c == '合计'], errors='ignore')

    # 4) 逐日Top5打印
    for i in range(days):
        s = recent.iloc[i].dropna().sort_values(ascending=False).head(5)
        day_str = recent.index[i].strftime('%Y-%m-%d')
        print(f"\n{day_str} 排名最高的前5名题材:")
        for rank, (theme, score) in enumerate(s.items(), 1):
            print(f"{rank}. {theme}: {score}")

# 调用
print_daily_top_themes_trade(DF_THEME, days=3)

import math
import numpy as np
import pandas as pd

def chunk_list(lst, size):
    for i in range(0, len(lst), size):
        yield lst[i:i+size]

# 1) 选出要排序的题材列(去掉"合计")
df_rank = DF_THEME.drop(columns=['合计'], errors='ignore').copy()

# 确保按时间升序
if not isinstance(df_rank.index, pd.DatetimeIndex):
    try:
        df_rank.index = pd.to_datetime(df_rank.index)
    except:
        pass
df_rank = df_rank.sort_index()

# 2) 按"最后一个有效值"计算当日强弱并排序(降序)
last_valid = df_rank.apply(lambda s: s.dropna().iloc[-1] if s.notna().any() else -np.inf)

# 确保"可控核聚变"在第一位,然后其他按降序排列
theme_names = ['可控核聚变'] if '可控核聚变' in last_valid.index else []
other_themes = [c for c in last_valid.index if c != '可控核聚变']
other_themes_sorted = sorted(other_themes, key=lambda x: last_valid[x], reverse=True)
theme_names.extend(other_themes_sorted)

# ---- 如果你更想按"近N日均值"排序,用下面这段替换 2) ----
# N = 3  # 例如近3日
# rolling_mean = df_rank.tail(N).mean()
# theme_names = ['可控核聚变'] if '可控核聚变' in rolling_mean.index else []
# other_themes = [c for c in rolling_mean.index if c != '可控核聚变']
# other_themes_sorted = sorted(other_themes, key=lambda x: rolling_mean[x], reverse=True)
# theme_names.extend(other_themes_sorted)
# ------------------------------------------------------------

# 3) 分成三页,保持"高→低"的顺序
page_size = math.ceil(len(theme_names) / 3)
theme_pages = list(chunk_list(theme_names, page_size))

# 4) 打印一下当前整体排名(可选)
print("当前题材强弱排名(降序):")
for i, (k, v) in enumerate(last_valid.sort_values(ascending=False).items(), 1):
    print(f"{i:2d}. {k}: {v:.0f}")

# 5) 第6列:绘制第1页题材(从强到弱,可控核聚变在第一位)
# 第6列:第一页
if len(theme_pages) >= 1:
    for theme in theme_pages[0]:
        if theme in DF_THEME.columns:
            draw_industry_line(DF_THEME, theme, show_extremes=False,
                               lookback_days=63, tick_every=5)

# 第7列:第二页(索引 1)
if len(theme_pages) >= 2:
    for theme in theme_pages[1]:
        if theme in DF_THEME.columns:
            draw_industry_line(DF_THEME, theme, show_extremes=False,
                               lookback_days=63, tick_every=5)

# 第8列:绘制第3页题材
if len(theme_pages) >= 3:
    for theme in theme_pages[2]:
        if theme in DF_THEME.columns:
            draw_industry_line(DF_THEME, theme, show_extremes=False,
                               lookback_days=63, tick_every=5)
收起代码 ↑   


顶: 2256 , 底: 947
当前值: 1710 , 位于历史分位: 51.7%

2026-01-29 排名最高的前5名题材:
1. 有色金属: 100.0展开输出 ↓   





















# ========= 板块内部细分结构定义 =========
THEME_SUB_GROUPS = {
    "AI应用": {
        "上游_算力硬件(芯片/GPU/服务器)": [
            "000977.XSHE",  # 浪潮信息 | AI服务器龙头展开代码 ↓   
【AI应用】板块内部细分行业宽度热力图

【AI应用】板块整体宽度曲线

  当前值: 1710 | 顶部阈值(80%分位): 2256 | 底部阈值(20%分位): 947

【AI应用】板块各细分行业曲线








32
宽客老丁(未真实交易用户) 发表于 2026-1-30 10:45:24
"""
算行业"宽度"DF

用你给的 THEME_GROUPS(人形机器人、CPO、AI眼镜…)。
对每只股票判断:今天收盘价 > 自己的20日均线 吗?是=1,否=0。
同样口径,算每天每个题材里">20日均线"的比例(%)。

得到 DF_THEME:行=日期,列=题材(还有"合计")。

一句话:第1列就是把行业和题材的"强弱宽度曲线"都算出来了。
"""
from jqdata import *
import datetime
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import math


# 获取股票和价格数据
stocks = get_index_stocks("000985.XSHG")
# yesterday = attribute_history('000300.XSHG', 1).index[0].strftime("%Y-%m-%d")
yesterday = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")  # 实时时间
count = 60 # 1年的交易日
h = get_price(
    stocks,
    end_date=yesterday,
    frequency="1d",
    fields=["close"],
    count=count + 20,
    panel=False,
)

# 获取行业信息
def getStockIndustry(stocks):
    industry = get_industry(stocks)
    dict = {
        stock: info["sw_l1"]["industry_name"]
        for stock, info in industry.items()
        if "sw_l1" in info
    }
    return pd.Series(dict)

# 处理数据(行业占比 DF,保持你的原逻辑不变)
h["date"] = pd.DatetimeIndex(h.time).date
df_close = h.pivot(index="code", columns="date", values="close").dropna(axis=0)
df_ma20 = df_close.rolling(window=20, axis=1).mean().iloc[:, -count:]
df_bias = df_close.iloc[:, -count:] > df_ma20
df_bias["industry_name"] = getStockIndustry(stocks)
df_ratio = (
    (df_bias.groupby("industry_name").sum() * 100.0)
    / df_bias.groupby("industry_name").count()
).round()
df_ratio.loc['合计'] = df_ratio.sum().astype("int32")  # 你原来的"合计"
DF = df_ratio.T  # 行=日期,列=行业(含"合计"列)

# ========= 自定义题材分组(按你给的组合,逐字保留) =========
THEME_GROUPS = {
    "可控核聚变":[
        "601985.XSHG",  # 中国核电 | 国内最大核电运营商(中核集团控股),机组规模/在运在建领先。
        "003816.XSHE",  # 中国广核 | 核电运营 + 项目开发双主线  
        "600875.XSHG",  # 东方电气 | 核岛主设备/常规岛成套能力,国内最主要核电设备商之一。
        "601727.XSHG",  # 上海电气 | 反应堆压力容器/堆内构件等制造,参与高温气冷堆示范项目。
          "601212.XSHG",  # 白银有色 | 有色冶炼平台,核能相关金属材料上游供给能力。
        "688102.XSHG",  #斯瑞新材 | 高温合金/难熔金属材料,核能耐高温部件材料储备。
          "000777.XSHE",  # 中核科技 | 核电专用阀门龙头,长期配套"两核"体系。
          "600522.XSHG",  # 中天科技 | (同上,海缆/电缆在核电送出与岛内配电环节应用)
        "002255.XSHE",  # 海陆重工 | 锅炉/换热/装备制造,核常规岛辅机配套。
        "000400.XSHE",  # 许继电气 | 二次系统/继电保护,核电站及送出工程自动化。
        "600363.XSHG",  # 联创光电 | 电力电子/光电器件,核电监控/指示系统配套。
       "603011.XSHG",  # 合锻智能
         "600105.XSHG",  # 永鼎股份
         "600353.XSHG",  # 旭光电子 | 光电子元件
          "000969.XSHE",  # 安泰科技 | 特种合金/金属材料平台,涉核高端材料配套。
          "601611.XSHG",  # 中国核建 | 核电站+电网配套施工
          "688122.XSHG",  # 西部超导 | 低温超导
          "300820.XSHE",  # 英杰电气 | 聚变电气设备
         "688663.XSHG",  # 新风光 | 聚变电气设备
        "600577.XSHG",  # 精达股份 | 涨停6次,电磁线+互连基础材料
         "301137.XSHE",  # 哈焊华通 | 焊材
         "300963.XSHE",  # 中洲特材 | 焊材
          "002255.XSHE",  # 海陆重工 | 主机
         "600501.XSHG",  # 航天晨光 | 主机
          "603308.XSHG",  # 应流股份 | 主机
         
    ],
    "半导体": [
        # 【设计/MCU/存储】
        "603986.XSHG",  # 兆易创新 | 存储+MCU龙头
        "002049.XSHE",  # 紫光国微 | 安全芯片龙头
        "688008.XSHG",  # 澜起科技 | 接口芯片
        "688018.XSHG",  # 乐鑫科技 | WiFi MCU
        "300223.XSHE",  # 北京君正 | 存储+计算
        "688123.XSHG",  # 聚辰股份 | 存储芯片
        "001309.XSHE",  # 德明利 | 存储模组
        "688525.XSHG",  # 佰维存储 | 存储芯片
        "300475.XSHE",  # 香农芯创 | 存储分销
        "301308.XSHE",  # 江波龙 | 存储模组
        "688262.XSHG",  # 国芯科技 | 嵌入式CPU
        "300458.XSHE",  # 全志科技 | SoC设计
        "688521.XSHG",  # 芯原股份 | IP授权
        "300327.XSHE",  # 中颖电子 | 家电MCU
        "300671.XSHE",  # 富满微 | 模拟+MCU
        "688484.XSHG",  # 南芯科技 | 电源管理IC
        # 【制造/IDM】
        "688981.XSHG",  # 中芯国际 | 晶圆代工龙头
        "688347.XSHG",  # 华虹公司 | 特色工艺代工
        "688396.XSHG",  # 华润微 | IDM龙头
        "605358.XSHG",  # 立昂微 | 硅片+功率器件
        "688469.XSHG",  # 芯联集成 | 特色工艺晶圆厂
        "300373.XSHE",  # 扬杰科技 | 功率IDM
        "688249.XSHG",  # 晶合集成 | 显示驱动制造
        "688409.XSHG",  # 富创精密 | 设备精密结构件
        # 【设备】
        "002371.XSHE",  # 北方华创 | 平台型设备龙头
        "688012.XSHG",  # 中微公司 | 刻蚀设备龙头
        "688082.XSHG",  # 盛美上海 | 清洗/镀膜设备
        "688037.XSHG",  # 芯源微 | 涂胶显影设备
        "688361.XSHG",  # 中科飞测 | 检测量测设备
        "688072.XSHG",  # 拓荆科技 | 薄膜沉积设备
        "300567.XSHE",  # 精测电子 | 测试设备
        "300666.XSHE",  # 江丰电子 | 靶材龙头
        "688409.XSHG",  # 富创精密 | 设备精密部件
        "688167.XSHG",  # 炬光科技 | 激光光源
        # 【材料】
        "688432.XSHG",  # 有研硅 | 硅材料
        "688268.XSHG",  # 华特气体 | 电子特气
        "688146.XSHG",  # 中船特气 | 电子特气
        "603078.XSHG",  # 江化微 | 湿电子化学品
        "002409.XSHE",  # 雅克科技 | 前驱体/光刻胶
        "688019.XSHG",  # 安集科技 | CMP抛光液
        "300655.XSHE",  # 晶瑞电材 | 光刻胶
        "603650.XSHG",  # 彤程新材 | 光刻胶
        "688199.XSHG",  # 久日新材 | 光刻胶原料
        "300666.XSHE",  # 江丰电子 | 半导体靶材 (光刻机耗材)
        # 【封测】
        "600584.XSHG",  # 长电科技 | 封测龙头
        "002185.XSHE",  # 华天科技 | 封测龙头
        "002156.XSHE",  # 通富微电 | 封测龙头
        "603005.XSHG",  # 晶方科技 | 传感器封测
        "688372.XSHG",  # 伟测科技 | 芯片测试
        "301348.XSHE",  # 蓝箭电子 | 封测
        "688362.XSHG",  # 甬矽电子 | 封测
        "688135.XSHG",  # 利扬芯片 | 测试
        "300604.XSHE",  # 长川科技 | 测试设备
    ],
    "电池与储能": [
        # 【电池与系统集成】
        "300750.XSHE",  # 宁德时代 | 动力电池全球龙头
        "002594.XSHE",  # 比亚迪 | 整车+电池龙头
        "300014.XSHE",  # 亿纬锂能 | 动力+储能电池
        "002074.XSHE",  # 国轩高科 | 动力电池
        "688063.XSHG",  # 派能科技 | 户储龙头
        "300207.XSHE",  # 欣旺达 | 消费+动力电池
        "688772.XSHG",  # 珠海冠宇 | 消费电池
        "002733.XSHE",  # 雄韬股份 | 铅酸+锂电
        "300068.XSHE",  # 南都电源 | 工业储能
        "688411.XSHG",  # 海博思创 | 储能系统
        # 【核心材料】
        "002709.XSHE",  # 天赐材料 | 电解液龙头
        "300037.XSHE",  # 新宙邦 | 电解液
        "603659.XSHG",  # 璞泰来 | 负极材料龙头
        "300073.XSHE",  # 当升科技 | 正极材料龙头
        "688005.XSHG",  # 容百科技 | 高镍正极
        "300769.XSHE",  # 德方纳米 | 磷酸铁锂正极
        "301358.XSHE",  # 湖南裕能 | 磷酸铁锂正极
        "688116.XSHG",  # 天奈科技 | 碳纳米管导电剂
        "002812.XSHE",  # 恩捷股份 | 隔膜龙头
        "300568.XSHE",  # 星源材质 | 隔膜
        "002340.XSHE",  # 格林美 | 回收与前驱体
        # 【新技术】
        "002460.XSHE",  # 赣锋锂业 | 固态电池布局
        "300438.XSHE",  # 鹏辉能源 | 固态电池研发
        "002585.XSHE",  # 双星新材 | PET铜箔基膜
        "002992.XSHE",  # 宝明科技 | 复合铜箔
        "688388.XSHG",  # 嘉元科技 | 铜箔+复合铜箔
        "600110.XSHG",  # 诺德股份 | 锂电铜箔
        "603659.XSHG",  # 璞泰来 | 锂电负极,布局复合集流体
        # 【设备】
        "300450.XSHE",  # 先导智能 | 整线设备龙头
        "688006.XSHG",  # 杭可科技 | 后道设备龙头
        "300457.XSHE",  # 赢合科技 | 前中道设备
        "688559.XSHG",  # 海目星 | 激光制片设备
        "688097.XSHG",  # 博众精工 | 自动化设备
    ],
    "AI应用": [
    # ==================== 上游:AI基础支撑 ====================
    # 1.1 算力硬件 (芯片/GPU/服务器)
    "000977.XSHE",  # 浪潮信息 | AI服务器龙头
    "603019.XSHG",  # 中科曙光 | 高端计算/服务器
    "601138.XSHG",  # 工业富联 | 服务器代工
    "688041.XSHG",  # 海光信息 | AI/DCU芯片
    "300474.XSHE",  # 景嘉微 | GPU设计
    "603256.XSHG",  # 宏和科技 | 高端电子级玻璃纤维布 (PCB核心材料)
    "300476.XSHE",  # 胜宏科技 | 高端PCB,用于显卡/服务器
    "603228.XSHG",  # 景旺电子 | PCB
    "603296.XSHG",  # 华勤技术 | 服务器ODM
    "300223.XSHE",  # 北京君正 | 存储芯片,用于边缘计算
    # 1.2 数据中心与连接 (IDC/光通信/CPO)
    "300383.XSHE",  # 光环新网 | IDC运营
    "603881.XSHG",  # 数据港 | IDC运营
    "300442.XSHE",  # 润泽科技 | IDC运营
    "300308.XSHE",  # 中际旭创 | 光模块/CPO龙头
    "300502.XSHE",  # 新易盛 | 光模块/CPO龙头
    "002281.XSHE",  # 光迅科技 | 光器件
    "300394.XSHE",  # 天孚通信 | 光器件/CPO关键环节
    "603083.XSHG",  # 剑桥科技 | 光模块
    "300913.XSHE",  # 兆龙互连 | 高速互连线缆
    "600487.XSHG",  # 亨通光电 | 光纤光缆
    "600498.XSHG",  # 烽火通信 | 光通信设备
    # 1.3 液冷与散热 (AI算力配套)
    "002837.XSHE",  # 英维克 | 机房温控/液冷龙头
    "301018.XSHE",  # 申菱环境 | 数据中心冷却
    "300499.XSHE",  # 高澜股份 | 液冷产品
    "002126.XSHE",  # 银轮股份 | 热管理
    "300335.XSHE",  # 迪森股份 | 余热利用

    # ==================== 中游:AI核心平台 ====================
    # 2.1 大模型与算法
    "002230.XSHE",  # 科大讯飞 | 星火认知大模型
    "300229.XSHE",  # 拓尔思 | 语义智能大模型
    "300624.XSHE",  # 万兴科技 | AIGC应用软件
    # 2.2 行业AI平台与解决方案
    "300378.XSHE",  # 鼎捷软件 | 工业软件/智能制造
    "300170.XSHE",  # 汉得信息 | 企业数字化
    "002410.XSHE",  # 广联达 | 建筑信息化AI
    "300212.XSHE",  # 易华录 | 数据湖与智慧交通
    "300451.XSHE",  # 创业慧康 | 医疗信息化AI
    # 2.3 AI开发工具与数据服务
    "300047.XSHE",  # 天源迪科 | 数据治理

    # ==================== 下游:AI应用落地 ====================
    # 3.1 AI+金融/支付
    "002657.XSHE",  # 中科金财 | AI+金融科技
    "300773.XSHE",  # 拉卡拉 | 支付+金融科技
    "000997.XSHE",  # 新大陆 | 支付设备与识别
    "300468.XSHE",  # 四方精创 | 区块链与金融IT
    "002537.XSHE",  # 海联金汇 | 金融科技与跨境支付
    "600415.XSHG",  # 小商品城 | 支付+跨境贸易
    # 3.2 AI+机器人/智能制造
    # (人形机器人整板块已独立,此处为具备AI感知/决策的工业应用)
    "300124.XSHE",  # 汇川技术 | 工业自动化/机器人AI控制
    "300607.XSHE",  # 拓斯达 | 工业机器人集成
    "002527.XSHE",  # 新时达 | 机器人控制与驱动
    # 3.3 AI+视觉/感知 (传感器、光学)
    "002273.XSHE",  # 水晶光电 | AR/光波导 (AI眼镜)
    "001314.XSHE",  # 亿道信息 | XR设备 (AI眼镜)
    "002189.XSHE",  # 中光学 | 光学镜头
    "002414.XSHE",  # 高德红外 | 红外视觉
    "300007.XSHE",  # 汉威科技 | 气体传感
    "603662.XSHG",  # 柯力传感 | 多维力传感
    "688322.XSHG",  # 奥比中光 | 3D视觉
    # 3.4 AI+自动驾驶/智能交通
    "002405.XSHE",  # 四维图新 | 高精度地图与车规芯片
    "002906.XSHE",  # 华阳集团 | 智能座舱
    "600699.XSHG",  # 均胜电子 | 智能驾驶与汽车安全
    "000997.XSHE",  # 新大陆 | (也涉及车路协同)
    # 3.5 AI+内容与营销 (AIGC)
    "300058.XSHE",  # 蓝色光标 | AI营销
    "300781.XSHE",  # 因赛集团 | AI营销
    "300413.XSHE",  # 芒果超媒 | 内容制作与推荐算法
    "002558.XSHE",  # 巨人网络 | 游戏AI
    # 3.6 AI+医疗
    "300253.XSHE",  # 卫宁健康 | 医疗信息化与AI辅助诊断
    "002030.XSHE",  # 达安基因 | 基因检测与AI分析
    # 3.7 AI+安全
    "002439.XSHE",  # 启明星辰 | 网络安全与AI安防
    "300297.SZ",  # 蓝盾股份 | 网络安全
    ],
    "电力与电网": [
        # 【发电-传统】
        "600011.XSHG",  # 华能国际 | 火电龙头
        "600900.XSHG",  # 长江电力 | 水电龙头
        "600025.XSHG",  # 华能水电 | 大型水电
        "001289.XSHE",  # 龙源电力 | 新能源发电
        # 【发电-新能源】
        "601016.XSHG",  # 节能风电 | 风电运营
        "600905.XSHG",  # 三峡能源 | 风光运营龙头
        "601615.XSHG",  # 明阳智能 | 风电整机龙头
        "002202.XSHE",  # 金风科技 | 风电整机龙头
        "601012.XSHG",  # 隆基绿能 | 光伏组件龙头
        "688223.XSHG",  # 晶科能源 | 光伏组件龙头
        "300118.XSHE",  # 东方日升 | 光伏组件
        "300274.XSHE",  # 阳光电源 | 逆变器龙头
        # 【电网设备】
        "600089.XSHG",  # 特变电工 | 变压器/多晶硅
        "600312.XSHG",  # 平高电气 | 高压开关
        "000400.XSHE",  # 许继电气 | 二次设备/直流
        "600406.XSHG",  # 国电南瑞 | 电网自动化龙头
        "002028.XSHE",  # 思源电气 | 开关/EPC
        # 【电气装备】
        "600875.XSHG",  # 东方电气 | 发电设备龙头
        "601727.XSHG",  # 上海电气 | 综合装备龙头
        # 【线缆】
        "600522.XSHG",  # 中天科技 | 海缆/光纤龙头
        "600869.XSHG",  # 远东股份 | 线缆龙头
        "603618.XSHG",  # 杭电股份 | 电缆
        # 【工程建设】
        "601868.XSHG",  # 中国能建 | 电力工程总包
        "601669.XSHG",  # 中国电建 | 水利电力工程
    ],
    "光伏": [
        # 【硅料/硅片】
        "600438.XSHG",  # 通威股份 | 硅料+电池片龙头
        "002129.XSHE",  # TCL中环 | 硅片龙头
        # 【电池/组件】
        "688223.XSHG",  # 晶科能源 | 组件龙头
        "688599.XSHG",  # 天合光能 | 组件龙头
        "601012.XSHG",  # 隆基绿能 | 一体化龙头
        "002459.XSHE",  # 晶澳科技 | 一体化龙头
        "600732.XSHG",  # 爱旭股份 | 电池片龙头
        # 【逆变器】
        "300274.XSHE",  # 阳光电源 | 逆变器+储能龙头
        # 【辅材】
        "603806.XSHG",  # 福斯特 | 胶膜龙头
        "601865.XSHG",  # 福莱特 | 光伏玻璃龙头
        "688680.XSHG",  # 海优新材 | 胶膜
        "300842.XSHE",  # 帝科股份 | 导电银浆
        "688503.XSHG",  # 聚和材料 | 导电银浆
        "603212.XSHG",  # 赛伍技术 | 背板
        "301266.XSHE",  # 宇邦新材 | 焊带
        "001269.XSHE",  # 欧晶科技 | 石英坩埚
        # 【设备】
        "603396.XSHG",  # 金辰股份 | 电池设备
        "300724.XSHE",  # 捷佳伟创 | 电池设备
    ],
    "大消费": [
        # 【白酒】
        "600519.XSHG",  # 贵州茅台 | 白酒龙头
        "000858.XSHE",  # 五粮液 | 白酒龙头
        "000568.XSHE",  # 泸州老窖 | 高端白酒
        "600809.XSHG",  # 山西汾酒 | 清香龙头
        # 【食品饮料】
        "600887.XSHG",  # 伊利股份 | 乳业龙头
        "605499.XSHG",  # 东鹏饮料 | 功能饮料龙头
        "603711.XSHG",  # 香飘飘 | 杯装奶茶龙头
        "002568.XSHE",  # 百润股份 | 预调酒龙头 (RIO)
        "600132.XSHG",  # 重庆啤酒 | 啤酒龙头
        # 【珠宝首饰】
        "600612.XSHG",  # 老凤祥 | 黄金珠宝龙头
        "002867.XSHE",  # 周大生 | 珠宝连锁
        "600916.XSHG",  # 中国黄金 | 黄金零售
        # 【零售】
        "601933.XSHG",  # 永辉超市 | 商超龙头
        "002251.XSHE",  # 步步高 | 区域零售
        # 【宠物】
        "301498.XSHE",  # 乖宝宠物 | 宠物食品龙头
        "001222.XSHE",  # 源飞宠物 | 宠物用品
    ],
    "交通运输": [
        # 【航运港口】
        "601919.XSHG",  # 中远海控 | 集装箱航运龙头
        "600428.XSHG",  # 中远海特 | 特种船运输
        "601018.XSHG",  # 宁波港 | 港口
        # 【公路铁路】
        "600020.XSHG",  # 中原高速 | 高速公路
        "000548.XSHE",  # 湖南投资 | 路桥收费
        "001213.XSHE",  # 中铁特货 | 铁路货运
        # 【海工装备】
        "600685.XSHG",  # 中船防务 | 船舶制造
        "601989.XSHG",  # 中国重工 | 船舶制造
        # 【低空经济/飞行汽车】
        "002085.XSHE",  # 万丰奥威 | 通用航空+汽车部件
        "002708.XSHE",  # 光洋股份 | 轴承,飞行汽车部件
        "000099.XSHE",  # 中信海直 | 直升机运营
    ],
    "工业母机": [
        "300780.XSHE",  # 德恩精工
        "300508.XSHE",  # 维宏股份
        "002943.XSHE",  # 宇晶股份
        "688518.XSHG",  # 联赢激光
        "601106.XSHG",  # 中国一重
        "301338.XSHE",  # 凯格精机
        "688237.XSHG",  # 超卓航科
        "300503.XSHE",  # 昊志机电
    ],
    "有色金属": [
    # 1. 黄金
        "600547.XSHG",  # 山东黄金 | 黄金开采龙头
        "600489.XSHG",  # 中金黄金 | 黄金开采龙头
        "601899.XSHG",  # 紫金矿业 | 铜金矿巨头
        "600988.XSHG",  # 赤峰黄金 | 黄金开采
        "000975.XSHE",  # 银泰黄金 | 黄金开采
        "601069.XSHG",  # 西部黄金 | 黄金开采
        "002155.XSHE",  # 湖南黄金 | 黄金开采
        "002237.XSHE",  # 恒邦股份 | 黄金冶炼
    # 2. 白银 (及其他贵金属)
        "601212.XSHG",  # 白银有色 | 铜铅锌冶炼,副产白银  
    # 3. 铜
        "600362.XSHG",  # 江西铜业 | 铜冶炼龙头
        "000630.XSHE",  # 铜陵有色 | 铜冶炼龙头
        "000878.XSHE",  # 云南铜业 | 西南铜业龙头
        "603993.XSHG",  # 洛阳钼业 | 铜钴矿巨头
        "600490.XSHG",  # 鹏欣资源 | 海外铜矿
        "000737.XSHE",  # 北方铜业 | 山西铜资源
    # 4. 铝
        "601600.XSHG",  # 中国铝业 | 铝业龙头
        "000807.XSHE",  # 云铝股份 | 电解铝
        "000933.XSHE",  # 神火股份 | 煤电铝
        "601702.XSHG",  # 华峰铝业 | 铝热传输材料
        "000612.XSHE",  # 焦作万方 | 电解铝
        "601388.XSHG",  # 怡球资源 | 再生铝
    # 5. 铅锌
        "000060.XSHE",  # 中金岭南 | 铅锌龙头
        "601168.XSHG",  # 西部矿业 | 铅锌铜多金属
        "600497.XSHG",  # 驰宏锌锗 | 铅锌冶炼
        "600961.XSHG",  # 株冶集团 | 铅锌冶炼
        "000426.XSHE",  # 兴业银锡 | 铅锌锡
        "000688.XSHE",  # 国城矿业 | 铅锌矿
        "000758.XSHE",  # 中色股份 | 铅锌工程承包
        "600338.XSHG",  # 西藏珠峰 | 铅锌资源
        "600531.XSHG",  # 豫光金铅 | 铅冶炼龙头
    # 6. 其他工业金属 (锡、镍等)
        "000960.XSHE",  # 锡业股份 | 锡业龙头
        "603799.XSHG",  # 华友钴业 | 钴业龙头,兼具镍业务
    ],
    "稀有金属": [
    # 1. 锂
        "002460.XSHE",  # 赣锋锂业 | 锂业龙头
        "002466.XSHE",  # 天齐锂业 | 锂矿巨头
        "002756.XSHE",  # 永兴材料 | 云母提锂
        "002192.XSHE",  # 融捷股份 | 锂矿
        "000762.XSHE",  # 西藏矿业 | 盐湖提锂   
    # 2. 钴
        "603799.XSHG",  # 华友钴业 | 钴盐龙头
        "300618.XSHE",  # 寒锐钴业 | 钴粉龙头   
    # 3. 镍
        "600432.XSHG",  # 退市吉恩 (注:原镍业龙头,已退市,此处保留分类结构,实际可替换为其他镍相关公司,如“格林美”)
        "002340.XSHE",  # 格林美 | 镍资源回收与前驱体  
    # 4. 稀土及磁材
        "600111.XSHG",  # 北方稀土 | 稀土配额龙头
        "600392.XSHG",  # 盛和资源 | 稀土全产业链
        "600259.SH",  # 广晟有色 | 稀土分离
        "000831.SZ",  # 中国稀土 | 稀土整合
        "300748.XSHE",  # 金力永磁 | 稀土永磁龙头
        "000970.XSHE",  # 中科三环 | 钕铁硼磁材
        "300224.XSHE",  # 正海磁材 | 高性能磁材
        "600366.XSHG",  # 宁波韵升 | 钕铁硼磁材
        "300835.XSHE",  # 龙磁科技 | 磁性材料
        "002056.XSHE",  # 横店东磁 | 磁材+器件
    # 5. 钨
        "600549.XSHG",  # 厦门钨业 | 钨钼稀土
        "000657.XSHE",  # 中钨高新 | 钨制品
        "002378.XSHE",  # 章源钨业 | 钨矿采选
    # 6. 钛
        "600456.XSHG",  # 宝钛股份 | 钛材龙头
        "002145.XSHE",  # 中核钛白 | 钛白粉 (注:归入化工亦合理,此处按钛元素分类)
    # 7. 钼
        "601958.XSHG",  # 金钼股份 | 钼业龙头  
    # 8. 其他稀有/战略小金属
        "000969.XSHE",  # 安泰科技 | 非晶/纳米晶带材
        "002182.XSHE",  # 云海金属 | 镁合金龙头
        "000962.XSHE",  # 东方钽业 | 钽铌制品
        "002428.XSHE",  # 云南锗业 | 锗材料
        "600459.XSHG",  # 贵研铂业 | 贵金属材料 (铂、钯等)
        "002149.XSHE",  # 西部材料 | 稀有金属材料
],
    "石油石化": [
        # 【油气开采】
        "601857.XSHG",  # 中国石油 | 综合油气巨头
        "600938.XSHG",  # 中国海油 | 海上油气龙头
        "600028.XSHG",  # 中国石化 | 炼化一体化巨头
        "600759.XSHG",  # 洲际油气 | 油气勘探
        # 【炼油化工】
        "600346.XSHG",  # 恒力石化 | 民营炼化龙头
        "002493.XSHE",  # 荣盛石化 | 民营炼化龙头
        "000301.XSHE",  # 东方盛虹 | 炼化聚酯
        "000703.XSHE",  # 恒逸石化 | 涤纶产业链
        "600688.XSHG",  # 上海石化 | 炼化一体化
        "600871.XSHG",  # 石化油服 | 业务含炼化工程 (此处因其业务重叠,也列入油服)
        # 【油服工程】
        "600871.XSHG",  # 石化油服 | 综合油服龙头
        "600583.XSHG",  # 海油工程 | 海上油服工程
        "603619.XSHG",  # 中曼石油 | 钻井工程
        "300164.XSHE",  # 通源石油 | 油服技术
        "300191.XSHE",  # 潜能恒信 | 油服技术
        "002207.XSHE",  # 准油股份 | 油田技术服务
        "002554.XSHE",  # 惠博普 | 油气装备与工程
        "603727.XSHG",  # 博迈科 | 海洋油气工程模块
        "601808.XSHG",  # 中海油服 | 海上油服
        "600968.XSHG",  # 海油发展 | 近海油田服务
        # 【销售贸易】
        "603353.XSHG",  # 和顺石油 | 成品油销售
        "000554.XSHE",  # 泰山石油 | 成品油销售
        "601808.XSHG",  # 中海油服 | 海上油服 (补全)
        "600968.XSHG",  # 海油发展 | 近海油田服务 (补全)
    ],
    "细分化工": [
        # 【大炼化/聚酯】 (与石油石化有重叠)
        "600346.XSHG",  # 恒力石化 | 民营炼化龙头
        "002493.XSHE",  # 荣盛石化 | 民营炼化龙头
        "601233.XSHG",  # 桐昆股份 | PTA、涤纶龙头
        "000703.XSHE",  # 恒逸石化 | 涤纶产业链
        "000301.XSHE",  # 东方盛虹 | 炼化聚酯
        # 【基础化工龙头】
        "600309.XSHG",  # 万华化学 | MDI/聚氨酯全球龙头
        "600426.XSHG",  # 华鲁恒升 | 煤化工龙头
        "002648.XSHE",  # 卫星化学 | C2(乙烯)产业链龙头
        # 3. 化肥与磷化工
        "000792.XSHE",  # 盐湖股份 | 钾肥龙头 (亦属有色金属)
        "000422.XSHE",  # 湖北宜化 | 化肥+化工
        "600141.XSHG",  # 兴发集团 | 磷硅化工龙头
        "600096.XSHG",  # 云天化 | 磷肥龙头
        "002170.XSHE",  # 芭田股份 | 复合肥
        "600331.XSHG",  # 宏达股份 | 磷化工
        # 4. 氟化工
        "600160.XSHG",  # 巨化股份 | 氟化工龙头
        "002407.XSHE",  # 多氟多 | 氟化工、六氟磷酸锂
        # 5. 煤化工
        "600989.XSHG",  # 宝丰能源 | 煤基烯烃龙头
        # 6. 精细化工及新材料
        "300285.XSHE",  # 国瓷材料 | 陶瓷材料、催化材料
        "300821.XSHE",  # 东岳硅材 | 有机硅
        "300037.XSHE",  # 新宙邦 | 电解液、功能化学品
        "300487.XSHE",  # 蓝晓科技 | 吸附分离材料
        "300699.XSHE",  # 光威复材 | 碳纤维及复合材料
        "002709.XSHE",  # 天赐材料 | 电解液龙头 (亦属电池材料)
        "002812.XSHE",  # 恩捷股份 | 隔膜龙头 (亦属电池材料)
        # 7. 其他化工
        "002601.XSHE",  # 龙佰集团 | 钛白粉龙头
        "002064.XSHE",  # 华峰化学 | 氨纶、己二酸
        "002096.XSHE",  # 易普力 | 民爆产品
    ],
    "煤炭": [
        "601088.XSHG",  # 中国神华 | 煤电运一体化龙头
        "601699.XSHG",  # 潞安环能 | 喷吹煤龙头
        "600188.XSHG",  # 兖矿能源 | 动力煤龙头
        "600123.XSHG",  # 兰花科创 | 无烟煤
        "601225.XSHG",  # 陕西煤业 | 优质动力煤龙头
        "600740.XSHG",  # 山西焦化 | 焦炭
        "600408.XSHG",  # 安泰集团 | 焦炭
        "601015.XSHG",  # 陕西黑猫 | 焦炭
        "600397.XSHG",  # 安源煤业 | 江西煤炭开采
        "600403.XSHG",  # 大有能源 | 河南煤炭
        "000723.XSHE",  # 美锦能源 | 焦化龙头
        "601898.XSHG",  # 中煤能源 | 煤炭央企
        "000571.XSHE",  # 新大洲A | 煤炭采掘
        "000612.XSHE",  # 焦作万方 | (因其持有煤矿股权,常被列入煤炭概念)
    ],
    "人形机器人": [
    # 电机与驱动
        "300124.XSHE",  # 汇川技术 | 伺服系统龙头
        "600580.XSHG",  # 卧龙电驱 | 电机及驱动,持股宇树科技
        "603728.XSHG",  # 鸣志电器 | 步进电机、空心杯电机
        "300660.XSHE",  # 江苏雷利 | 微型电机,应用于灵巧手
        "603344.XSHG",  # 星德胜 | 微特电机(曾用于扫地机)
        "002801.XSHE",  # 微光股份 | 无框力矩电机
        "002196.XSHE",  # 方正电机 | 驱动电机
        "003021.XSHE",  # 兆威机电 | 微型传动系统,用于灵巧手
        "002249.XSHE",  # 大洋电机 | 电机及驱动
        "002823.XSHE",  # 凯中精密 | 电机换向器
        "300503.XSHE",  # 昊志机电 | 无框力矩电机、机器人关节模组
        "605488.XSHG",  # 福莱新材 | (曾涉及灵巧手材料)
        "605288.XSHG",  # 凯迪股份 | 线性驱动执行器
    # 减速器与传动
        "002896.XSHE",  # 中大力德 | RV/谐波减速器
        "300611.XSHE",  # 美力科技 | 弹簧、精密零件
        "301261.XSHE",  # 恒工精密 | 精密传动部件
        "301007.XSHE",  # 德迈仕 | 精密轴、齿件
        "300580.XSHE",  # 贝斯特 | 精密零部件
        "301368.XSHE",  # 丰立智能 | 精密齿轮、减速器零件
        "002472.XSHE",  # 双环传动 | 高精密齿轮龙头
        "603009.XSHG",  # 北特科技 | 转向器齿条、减震器活塞杆
        "002520.XSHE",  # 日发精机 | 轴承磨超设备、零部件加工
        "300695.XSHE",  # 兆丰股份 | 汽车轮毂轴承单元
        "002850.XSHE",  # 科达利 | 精密结构件,布局关节模组
        "301029.XSHE",  # 怡合达 | 工厂自动化零部件一站式供应商
        "603119.XSHG",  # 浙江荣泰 | (曾与特斯拉合作)
        "688017.XSHG",  # 绿的谐波 | 谐波减速器龙头
        "301596.XSHE",  # 瑞迪智驱 | 自动化驱动部件
        "601177.XSHG",  # 杭齿前进 | 齿轮箱、传动装置
        "301550.XSHE",  # 斯菱股份 | 汽车轴承
        "603667.XSHG",  # 五洲新春 | 轴承套圈、丝杆
        "603809.XSHG",  # 豪能股份 | 同步器齿环、差速器
        "688165.XSHG",  # 埃夫特 | 工业机器人整机
        "300709.XSHE",  # 精研科技 | MIM零件、传动机构
    # 整机与集成
        "300115.XSHE",  # 长盈精密 | 精密结构件,布局机器人
        "002527.XSHE",  # 新时达 | 工业机器人整机
        "688585.XSHG",  # 上纬新材 | (曾与智元机器人有关联)
        "603486.XSHG",  # 科沃斯 | 服务机器人(扫地机)
        "688169.XSHG",  # 石头科技 | 服务机器人(扫地机)
        "002048.XSHE",  # 宁波华翔 | 汽车零部件,涉及机器人组装
    # 传感器
        "603662.XSHG",  # 柯力传感 | 称重/多维力传感器
        "688286.XSHG",  # 敏芯股份 | MEMS麦克风、压力传感器芯片
        "002414.XSHE",  # 高德红外 | 红外热成像传感器
        "300007.XSHE",  # 汉威科技 | 气体、压力传感器
        "688322.XSHG",  # 奥比中光 | 3D视觉传感器
        "301413.XSHE",  # 安培龙 | 压力、温度传感器
        "002338.XSHE",  # 奥普光电 | 光电测控仪器
        "600460.XSHG",  # 士兰微 | MEMS传感器、功率半导体
        "688665.XSHG",  # 四方光电 | 气体传感器
        "300667.XSHE",  # 必创科技 | MEMS传感器芯片、物联网
        "688582.XSHG",  # 芯动联科 | MEMS陀螺仪、加速度计
        "000988.XSHE",  # 华工科技 | 温度、压力传感器
        "300701.XSHE",  # 森霸传感 | 热释电红外传感器
        "688123.XSHG",  # 聚辰股份 | EEPROM,可用于传感器存储
],
    "锂电池": [
        # 【上游锂资源】
        "002460.XSHE",  # 赣锋锂业 | 全球锂盐龙头,垂直整合资源与加工
        "002466.XSHE",  # 天齐锂业 | 全球锂矿巨头,控股格林布什矿
        "002756.XSHE",  # 永兴材料 | 云母提锂龙头,成本优势显著
        "002192.XSHE",  # 融捷股份 | 锂矿采选+冶炼,资源自给率高
        "002240.XSHE",  # 盛新锂能 | 锂盐产能快速扩张
        "000762.XSHE",  # 西藏矿业 | 盐湖提锂,扎布耶盐湖资源
        "002497.XSHE",  # 雅化集团 | 锂盐+民爆,与澳洲矿商合作
        # 【电池制造与系统】
        "300750.XSHE",  # 宁德时代 | 全球动力电池绝对龙头
        "002594.XSHE",  # 比亚迪 | 整车+自供电池龙头,刀片电池技术
        "300014.XSHE",  # 亿纬锂能 | 动力+储能+消费电池全面布局
        "002074.XSHE",  # 国轩高科 | 动力电池老牌厂商,大众入股
        "688063.XSHG",  # 派能科技 | 户用储能电池龙头
        "300207.XSHE",  # 欣旺达 | 消费电池龙头,动力电池快速成长
        "300438.XSHE",  # 鹏辉能源 | 储能与轻型动力电池
        # 【关键材料-正极】
        "300073.XSHE",  # 当升科技 | 高镍正极材料全球核心供应商
        "688005.XSHG",  # 容百科技 | 高镍正极龙头,产能规模领先
        "300769.XSHE",  # 德方纳米 | 磷酸铁锂正极龙头,液相法工艺
        "301358.XSHE",  # 湖南裕能 | 磷酸铁锂正极主要供应商
        "688707.XSHG",  # 振华新材 | 中高镍单晶正极材料
        # 【关键材料-负极】
        "603659.XSHG",  # 璞泰来 | 人造石墨负极龙头,一体化布局
        "300035.XSHE",  # 中科电气 | 负极材料石墨化领先企业
        "300890.XSHE",  # 翔丰华 | 人造石墨及硅碳负极
        # 【关键材料-电解液】
        "002709.XSHE",  # 天赐材料 | 电解液全球龙头,六氟磷酸锂自供
        "300037.XSHE",  # 新宙邦 | 电解液第二梯队,半导体化学品并重
        "002407.XSHE",  # 多氟多 | 六氟磷酸锂核心供应商,向电解液延伸
        # 【关键材料-隔膜】
        "002812.XSHE",  # 恩捷股份 | 湿法隔膜全球霸主,龙头地位稳固
        "300568.XSHE",  # 星源材质 | 干法隔膜龙头,湿法快速放量
        # 【关键材料-辅材及其他】
        "688116.XSHG",  # 天奈科技 | 碳纳米管导电剂龙头
        "300919.XSHE",  # 中伟股份 | 三元前驱体龙头
        "002340.XSHE",  # 格林美 | 电池回收与前驱体制造
        # 【锂电设备】
        "300450.XSHE",  # 先导智能 | 锂电整线设备全球龙头
        "688006.XSHG",  # 杭可科技 | 后段化成分容设备龙头
        "300457.XSHE",  # 赢合科技 | 中段卷绕/叠片设备领先者
        "688559.XSHG",  # 海目星 | 激光制片、焊接设备高速增长
        # 【新技术方向】
        "002585.XSHE",  # 双星新材 | PET铜箔/复合集流体基膜
        "002992.XSHE",  # 宝明科技 | 复合铜箔产业化的领先厂商
        "688388.XSHG",  # 嘉元科技 | 锂电铜箔龙头,加码复合铜箔
    ],
    "创新药": [
        # 【A股】
        "688235.XSHG",  # 百济神州 | 本土创新药龙头,泽布替尼全球上市
        "300049.XSHE",  # 福瑞股份 | 肝病诊断与治疗
        "688506.XSHG",  # 百利天恒 | 双抗/ADC平台型创新药企
        "002294.XSHE",  # 信立泰 | 心脑血管领域,转型创新药
        # 【港股】(注意:需确认您的数据源支持港股行情)
        "09926.HK",  # 康方生物 | 双抗龙头,依沃西(AK112)等管线领先
        "06990.HK",  # 科伦博泰生物-B | 科伦药业分拆,ADC平台型公司
        "01530.HK",  # 三生制药 | 生物制药,主打产品特比澳、益赛普等
        "01801.HK",  # 信达生物 | PD-1龙头之一,多条肿瘤管线推进
        "02268.HK",  # 药明合联 | 药明系,专注ADC等生物偶联药CRDMO
        "09606.HK",  # 映恩生物-B | 临床阶段生物科技公司,专注于ADC药物
        "01093.HK",  # 石药集团 | 传统药企转型,创新药收入占比提升
        "01276.HK",  # 远大医药 | 心脑血管急救及创新药布局
        "06160.HK",  # 百济神州 | 与A股688235为同一公司,港股主体
        "03692.HK",  # 翰森制药 | 豪森药业,中枢神经、肿瘤等创新药
        "09995.HK",  # 荣昌生物 | ADC、自免双抗平台,维迪西妥单抗已上市
        # 【已去重】原始列表中的第二个“01530”已合并
    ],
    "商业航天": [
        # 【卫星总体与运营】
        "600118.XSHG",  # 中国卫星 | 国内小卫星制造及卫星应用龙头
        "601698.XSHG",  # 中国卫通 | 国内唯一通信卫星运营公司
        # 【卫星通信与载荷】
        "002465.XSHE",  # 海格通信 | 军用通信及北斗导航装备核心供应商
        "300762.XSHE",  # 上海瀚讯 | 军用宽带移动通信,可用于卫星通信
        "300136.XSHE",  # 信维通信 | 终端天线龙头,布局卫星通信天线
        # 【卫星导航与定位】
        "002151.XSHE",  # 北斗星通 | 北斗芯片、板卡核心供应商
        "600435.XSHG",  # 北方导航 | 惯性导航及光电导航系统
        "300627.XSHE",  # 华测导航 | 高精度GNSS接收机及解决方案提供商
        "688568.XSHG",  # 中科星图 | 数字地球产品,空天信息可视化与应用
        # 【关键元器件与部组件】
        "600879.XSHG",  # 航天电子 | 航天电子专用产品,配套多型火箭、卫星
        "688375.XSHG",  # 国博电子 | 有源相控阵T/R组件核心供应商,用于卫星载荷
        "688270.XSHG",  # 臻镭科技 | 射频芯片及电源管理芯片,用于卫星通信终端
        "300782.XSHE",  # 卓胜微 | 射频前端芯片,可用于卫星通信终端
        "300593.XSHE",  # 新雷能 | 特种电源,广泛配套于航天星箭领域
        # 【遥感与探测】
        "688002.XSHG",  # 睿创微纳 | 非制冷红外探测器及芯片,可用于卫星遥感
        "688385.XSHG",  # 复旦微电 | FPGA芯片,可用于星上数据处理
    ],
    "传媒游戏": [
        "002174.XSHE",  # 游族网络 | 网络游戏研发与运营
        "002517.XSHE",  # 恺英网络 | 游戏研发、运营及IP资源
        "002555.XSHE",  # 三七互娱 | 国内领先的移动游戏发行商
        "002558.XSHE",  # 巨人网络 | 客户端及移动端游戏研发运营
        "002624.XSHE",  # 完美世界 | 影游联动龙头,涵盖游戏、影视
        "300002.XSHE",  # 神州泰岳 | ICT运营管理,旗下有游戏业务(壳木软件)
        "300251.XSHE",  # 光线传媒 | 综合性影视传媒集团,涉足动漫游戏
        "300315.XSHE",  # 掌趣科技 | 移动游戏开发商
        "600633.XSHG",  # 浙数文化 | 数字文化、数字科技产业,含游戏业务
        "603444.XSHG",  # 吉比特 | 网络游戏研发和运营商
    ],
    "猪肉": [
        # 【生猪养殖龙头】
        "002714.XSHE",  # 牧原股份 | 自繁自养模式龙头,成本控制行业领先
        "300498.XSHE",  # 温氏股份 | “公司+农户”模式代表,养殖巨头
        "000876.XSHE",  # 新希望 | 饲料+养殖一体化龙头,产业链布局完整
        # 【饲料与养殖】
        "002311.XSHE",  # 海大集团 | 饲料行业龙头,业务延伸至生猪养殖
        "002385.XSHE",  # 大北农 | 饲料、种业为主,积极布局生猪养殖
        "002157.XSHE",  # 正邦科技 | 饲料与生猪养殖业务
        # 【动物保健】
        "600201.XSHG",  # 生物股份 | 动物疫苗龙头,受益于养殖业防疫需求
        # 【饲料原料/添加剂】
        "600873.XSHG",  # 梅花生物 | 氨基酸产品是饲料重要原料
        # 【禽肉(替代消费)】
        "002299.XSHE",  # 圣农发展 | 白羽肉鸡一体化龙头,与猪肉存在消费替代关系
        "300761.XSHE",  # 立华股份 | 黄羽肉鸡养殖龙头
    ],
    "CPO": [
        "300308.XSHE",  # 中际旭创 | 光模块/CPO龙头
        "300502.XSHE",  # 新易盛 | 光模块/CPO龙头
        "002281.XSHE",  # 光迅科技 | 光器件
        "300394.XSHE",  # 天孚通信 | 光器件/CPO关键环节
        "603083.XSHG",  # 剑桥科技 | 光模块
        "300913.XSHE",  # 兆龙互连 | 高速互连线缆
        "600487.XSHG",  # 亨通光电 | 光纤光缆
        "600498.XSHG",  # 烽火通信 | 光通信设备
        "300620.XSHE",  # 光库科技 | 光子集成
],
}

# 基于 df_bias 生成题材占比矩阵(行=日期,列=题材)
def build_theme_matrix_from_bias(df_bias: pd.DataFrame, theme_groups: dict,
                                 as_percent: bool = True, rounding: int = 0) -> pd.DataFrame:
    # 仅使用日期列(排除 industry_name)
    date_cols = [c for c in df_bias.columns if c != 'industry_name']
    bias_num = df_bias[date_cols].astype(float)  # True->1.0, False->0.0

    out = {}
    for theme, codes in theme_groups.items():
        codes_in = [c for c in codes if c in bias_num.index]
        if not codes_in:
            out[theme] = pd.Series(index=bias_num.columns, dtype=float)
            continue
        sub = bias_num.loc[codes_in]
        denom = sub.notna().sum(axis=0)
        num = sub.sum(axis=0)
        with np.errstate(divide='ignore', invalid='ignore'):
            ratio = num / denom
        if as_percent:
            ratio = ratio * 100.0
        if rounding is not None:
            ratio = ratio.round(rounding)
        out[theme] = ratio.fillna(0.0)

    DF_THEME = pd.DataFrame(out)
    DF_THEME.index.name = 'date'
    DF_THEME = DF_THEME.sort_index()

    # 为与第三列热力图兼容,补上"合计"列:直接复用行业版 DF 的"合计"
    if '合计' in DF.columns:
        DF_THEME['合计'] = DF['合计']
    return DF_THEME

# 生成题材矩阵
DF_THEME = build_theme_matrix_from_bias(df_bias, THEME_GROUPS, as_percent=True, rounding=0)

# 通用绘制函数(含末端数值和红色圆点)
import matplotlib.dates as mdates

# 通用绘制函数(含末端数值和红色圆点)- 现在放在调用之前定义
def draw_industry_line(df, industry_name, show_extremes=False, *,
                       lookback_days=63,  # ≈ 3个月交易日
                       tick_every=5):      # 主刻度每5日
    # 取列并保证索引为时间序列
    if industry_name not in df.columns:
        raise KeyError(f"{industry_name} 不在 DataFrame 的列中。")
    industry_data = df[industry_name].copy()
    if not isinstance(industry_data.index, pd.DatetimeIndex):
        try:
            industry_data.index = pd.to_datetime(industry_data.index)
        except Exception:
            pass
    industry_data = industry_data.sort_index().dropna()

    # 仅保留最近 lookback_days 个交易日
    if lookback_days is not None and lookback_days > 0:
        industry_data = industry_data.tail(lookback_days)
    if industry_data.empty:
        raise ValueError(f"{industry_name} 对应序列为空或全 NaN。")

    # 分位阈值在可见窗口内计算
    bottom_threshold = industry_data.quantile(0.20)
    top_threshold    = industry_data.quantile(0.80)

    plt.figure(figsize=(16, 6))
    ax = plt.gca()

    # 主线
    ax.plot(industry_data.index, industry_data.values, color='blue', linewidth=2, label=industry_name)

    # 顶/底区间填色(仅在落入区间时)
    ymin, ymax = industry_data.min(), industry_data.max()
    ax.fill_between(industry_data.index, ymin, np.minimum(industry_data.values, bottom_threshold),
                    where=industry_data.values <= bottom_threshold, color='red', alpha=0.2, label='Bottom 20%')
    ax.fill_between(industry_data.index, np.maximum(industry_data.values, top_threshold), ymax,
                    where=industry_data.values >= top_threshold, color='green', alpha=0.2, label='Top 20%')

    # 最新点
    last_date = industry_data.index[-1]
    last_value = industry_data.iloc[-1]
    ax.plot(last_date, last_value, 'ro', markersize=8, label='Latest Value')
    ax.annotate(f'{last_value:.2f}', xy=(last_date, last_value), xytext=(10, 5),
                textcoords='offset points', fontsize=12, color='red',
                bbox=dict(boxstyle='round,pad=0.3', fc='white', ec='black', alpha=0.8))

    # 可选:极值反转点(与你原逻辑一致)
    if show_extremes and len(industry_data) >= 2:
        in_bottom = in_top = False
        bottom_trend = top_trend = None
        bottom_reversal_marked = top_reversal_marked = False
        for i in range(1, len(industry_data)):
            curr_value = industry_data.iloc[i]
            prev_value = industry_data.iloc[i-1]
            curr_date  = industry_data.index[i]

            if not in_bottom and curr_value <= bottom_threshold:
                in_bottom = True
                bottom_trend = -1 if curr_value < prev_value else 1
                bottom_reversal_marked = False
            elif in_bottom:
                current_trend = 1 if curr_value > prev_value else -1
                if bottom_trend == -1 and current_trend == 1 and not bottom_reversal_marked:
                    ax.annotate(f'底部反转: {curr_value:.2f}\n{curr_date.strftime("%Y-%m-%d")}',
                                xy=(curr_date, curr_value), xytext=(-10, -20), textcoords='offset points',
                                arrowprops=dict(arrowstyle='->', color='black', linewidth=1),
                                fontsize=9, bbox=dict(boxstyle='round,pad=0.3', fc='white', ec='red', alpha=0.8))
                    ax.plot(curr_date, curr_value, 'rv', markersize=7)
                    bottom_reversal_marked = True
                bottom_trend = current_trend
                if curr_value > bottom_threshold:
                    in_bottom = False
                    bottom_trend = None

            if not in_top and curr_value >= top_threshold:
                in_top = True
                top_trend = 1 if curr_value > prev_value else -1
                top_reversal_marked = False
            elif in_top:
                current_trend = 1 if curr_value > prev_value else -1
                if top_trend == 1 and current_trend == -1 and not top_reversal_marked:
                    ax.annotate(f'顶部反转: {curr_value:.2f}\n{curr_date.strftime("%Y-%m-%d")}',
                                xy=(curr_date, curr_value), xytext=(10, 10), textcoords='offset points',
                                arrowprops=dict(arrowstyle='->', color='black', linewidth=1),
                                fontsize=9, bbox=dict(boxstyle='round,pad=0.3', fc='white', ec='green', alpha=0.8))
                    ax.plot(curr_date, curr_value, 'g^', markersize=7)
                    top_reversal_marked = True
                top_trend = current_trend
                if curr_value < top_threshold:
                    in_top = False
                    top_trend = None

    # —— 关键:X 轴刻度/网格 —— #
    # ✅ 只显示交易日(不显示周末)
    # 把 tick_every 个交易日作为主刻度,formatter 用交易日日期
    valid_dates = pd.to_datetime(industry_data.index)

    # 主刻度:每 tick_every 个交易日
    ax.set_xticks(valid_dates[::tick_every])
    ax.set_xticklabels(valid_dates[::tick_every].strftime('%Y-%m-%d'), rotation=45, ha='right', fontsize=9)

    # 次刻度:每个交易日一根竖线
    ax.set_xticks(valid_dates, minor=True)

    # 网格
    ax.grid(True, which='major', linestyle='--', alpha=0.6)
    ax.grid(True, which='minor', linestyle='-',  alpha=0.15)

    # 网格:主刻度较明显,次刻度较淡
    ax.grid(True, which='major', linestyle='--', alpha=0.6)
    ax.grid(True, which='minor', linestyle='-',  alpha=0.15)

    ax.legend(loc='upper left', fontsize=12)
    ax.set_title(f'{industry_name} Trend', fontsize=16, pad=12)
    ax.set_xlabel('Date', fontsize=12)
    ax.set_ylabel('Value (%)', fontsize=12)
    plt.setp(ax.get_xticklabels(), rotation=45, ha='right', fontsize=9)
    ax.tick_params(axis='y', labelsize=10)
    plt.tight_layout()
    plt.show()

# 修改热力图函数,删除"合计"行并调整右侧图例,横轴时间顺序改为倒序
def draw_heatmap(df):
    """
    df: 行=日期, 列=行业/题材
    修改:删除"合计"行,调整右侧图例大小和位置,横轴时间顺序改为倒序(从左到右从新到老)
    纵坐标按各板块最近的宽度值从大到小排列,"可控核聚变"始终在第一排
    """
    df_copy = df.copy()

    # 删除"合计"列
    if '合计' in df_copy.columns:
        df_copy = df_copy.drop(columns=['合计'])

    # 确保"可控核聚变"在第一列
    if '可控核聚变' in df_copy.columns:
        # 获取其他列(不包括"可控核聚变")
        other_cols = [c for c in df_copy.columns if c != '可控核聚变']
        
        # 按最后一个交易日的值降序排序其他列
        last_row = df_copy.iloc[-1]
        other_cols_sorted = sorted(other_cols, key=lambda x: last_row[x], reverse=True)
        
        # 重新排列列顺序:可控核聚变 + 排序后的其他列
        new_cols = ['可控核聚变'] + other_cols_sorted
        df_copy = df_copy[new_cols]

    # 反转DataFrame的行顺序,使横轴时间从左到右从新到老
    df_copy = df_copy.iloc[::-1]

    # 转置DataFrame:横坐标显示日期,纵坐标显示板块
    df_transposed = df_copy.T

    # 动态尺寸
    fig_width = max(20, df_transposed.shape[1] * 0.8)
    fig_height = max(10, df_transposed.shape[0] * 0.5)
   
    # 创建图形和坐标轴
    fig, ax = plt.subplots(figsize=(fig_width, fig_height))
   
    # 绘制热力图,不显示默认颜色条
    heatmap = sns.heatmap(
        df_transposed,
        annot=True,
        cmap='RdYlGn_r',
        cbar=False,  # 不显示默认颜色条
        annot_kws={'size': 10},
        square=True,
        linewidths=0.5,
        fmt=".0f",
        ax=ax
    )
   
    # 手动创建颜色条,调整大小和位置
    from mpl_toolkits.axes_grid1 import make_axes_locatable
   
    # 创建与热力图顶部对齐的颜色条
    divider = make_axes_locatable(ax)
    cax = divider.append_axes("right", size="2%", pad=0.1)  # 宽度为2%
   
    # 获取颜色映射
    vmin = df_transposed.min().min()
    vmax = df_transposed.max().max()
   
    # 创建颜色条
    sm = plt.cm.ScalarMappable(cmap='RdYlGn_r', norm=plt.Normalize(vmin=vmin, vmax=vmax))
    sm.set_array([])
   
    # 设置颜色条高度为10行格子高度
    cbar = plt.colorbar(sm, cax=cax)
   
    # 调整颜色条位置与热力图顶部对齐
    cax.set_position([ax.get_position().x1 + 0.01,
                     ax.get_position().y1 - 0.1,  # 与顶部对齐
                     0.02,  # 宽度
                     0.1])  # 高度(10行格子高度)
   
    plt.title('市场宽度', fontsize=16, pad=20)
    plt.xlabel('日期', fontsize=14)
    plt.ylabel('行业/题材', fontsize=14)
    plt.tight_layout()
    plt.show()

# 使用修改后的热力图函数
draw_heatmap(DF_THEME)

# =========================================================
# 题材版:画"合计"并打印分位阈值(交易日对齐版)
# 与 draw_heatmap 使用相同交易日序列
# =========================================================
from jqdata import *
import pandas as pd

# === Step 1. 确保索引是 DatetimeIndex
if not isinstance(DF_THEME.index, pd.DatetimeIndex):
    DF_THEME = DF_THEME.copy()
    DF_THEME.index = pd.to_datetime(DF_THEME.index)

# === Step 2. 获取交易日序列(与热力图一致)
start = DF_THEME.index.min().strftime('%Y-%m-%d')
end   = DF_THEME.index.max().strftime('%Y-%m-%d')

trade_days = get_trade_days(start_date=start, end_date=end)     # list of datetime.date
trade_index = pd.DatetimeIndex(pd.to_datetime(trade_days))      # 转为 DatetimeIndex

# === Step 3. 重建交易日索引,只保留真实交易日(跳过周末、节假日)
DF_THEME_TD = DF_THEME.reindex(trade_index).dropna(how='all')

# === Step 4. 画"合计"曲线并打印分位线
col = '合计'
if col not in DF_THEME_TD.columns:
    print("⚠️ 未找到列:合计")
else:
    draw_industry_line(DF_THEME_TD, col, show_extremes=True)

    series = DF_THEME_TD[col].dropna()
    bottom_threshold = series.quantile(0.20)
    top_threshold    = series.quantile(0.80)
    print(f"顶: {top_threshold:.0f} , 底: {bottom_threshold:.0f}")

    # === 可选增强:打印当前分位位置
    current_value = series.iloc[-1]
    quantile_rank = (series < current_value).sum() / len(series)
    print(f"当前值: {current_value:.0f} , 位于历史分位: {quantile_rank*100:.1f}%")

# 打印近3日(含当天)每日排名最高的前5名"题材"
from jqdata import *
import pandas as pd

def print_daily_top_themes_trade(df, days=3):
    """
    用交易所日历对齐到交易日(剔除周末/法定节假日),再打印近N个交易日的Top5题材(排除'合计')
    """
    # 1) 统一日期索引
    df = df.copy()
    if not isinstance(df.index, pd.DatetimeIndex):
        df.index = pd.to_datetime(df.index)

    # 2) 生成交易日索引,并重建到交易日
    start = str(df.index.min().date())
    end   = str(df.index.max().date())
    trade_days = get_trade_days(start_date=start, end_date=end)
    trade_index = pd.DatetimeIndex(trade_days)

    df_td = df.reindex(trade_index)          # 与交易日对齐
    df_td = df_td.dropna(how='all')          # 整行全空的去掉(非交易日或完全缺数')

    # 3) 近N个"交易日"样本(倒序,含当天)
    df_td = df_td.sort_index(ascending=False)
    if df_td.shape[0] < days:
        print(f"警告: 交易日样本不足{days}天,仅分析{df_td.shape[0]}天")
        days = df_td.shape[0]

    recent = df_td.iloc[:days, :].drop(columns=[c for c in df_td.columns if c == '合计'], errors='ignore')

    # 4) 逐日Top5打印
    for i in range(days):
        s = recent.iloc[i].dropna().sort_values(ascending=False).head(5)
        day_str = recent.index[i].strftime('%Y-%m-%d')
        print(f"\n{day_str} 排名最高的前5名题材:")
        for rank, (theme, score) in enumerate(s.items(), 1):
            print(f"{rank}. {theme}: {score}")

# 调用
print_daily_top_themes_trade(DF_THEME, days=3)

import math
import numpy as np
import pandas as pd

def chunk_list(lst, size):
    for i in range(0, len(lst), size):
        yield lst[i:i+size]

# 1) 选出要排序的题材列(去掉"合计")
df_rank = DF_THEME.drop(columns=['合计'], errors='ignore').copy()

# 确保按时间升序
if not isinstance(df_rank.index, pd.DatetimeIndex):
    try:
        df_rank.index = pd.to_datetime(df_rank.index)
    except:
        pass
df_rank = df_rank.sort_index()

# 2) 按"最后一个有效值"计算当日强弱并排序(降序)
last_valid = df_rank.apply(lambda s: s.dropna().iloc[-1] if s.notna().any() else -np.inf)

# 确保"可控核聚变"在第一位,然后其他按降序排列
theme_names = ['可控核聚变'] if '可控核聚变' in last_valid.index else []
other_themes = [c for c in last_valid.index if c != '可控核聚变']
other_themes_sorted = sorted(other_themes, key=lambda x: last_valid[x], reverse=True)
theme_names.extend(other_themes_sorted)

# ---- 如果你更想按"近N日均值"排序,用下面这段替换 2) ----
# N = 3  # 例如近3日
# rolling_mean = df_rank.tail(N).mean()
# theme_names = ['可控核聚变'] if '可控核聚变' in rolling_mean.index else []
# other_themes = [c for c in rolling_mean.index if c != '可控核聚变']
# other_themes_sorted = sorted(other_themes, key=lambda x: rolling_mean[x], reverse=True)
# theme_names.extend(other_themes_sorted)
# ------------------------------------------------------------

# 3) 分成三页,保持"高→低"的顺序
page_size = math.ceil(len(theme_names) / 3)
theme_pages = list(chunk_list(theme_names, page_size))

# 4) 打印一下当前整体排名(可选)
print("当前题材强弱排名(降序):")
for i, (k, v) in enumerate(last_valid.sort_values(ascending=False).items(), 1):
    print(f"{i:2d}. {k}: {v:.0f}")

# 5) 第6列:绘制第1页题材(从强到弱,可控核聚变在第一位)
# 第6列:第一页
if len(theme_pages) >= 1:
    for theme in theme_pages[0]:
        if theme in DF_THEME.columns:
            draw_industry_line(DF_THEME, theme, show_extremes=False,
                               lookback_days=63, tick_every=5)

# 第7列:第二页(索引 1)
if len(theme_pages) >= 2:
    for theme in theme_pages[1]:
        if theme in DF_THEME.columns:
            draw_industry_line(DF_THEME, theme, show_extremes=False,
                               lookback_days=63, tick_every=5)

# 第8列:绘制第3页题材
if len(theme_pages) >= 3:
    for theme in theme_pages[2]:
        if theme in DF_THEME.columns:
            draw_industry_line(DF_THEME, theme, show_extremes=False,
                               lookback_days=63, tick_every=5)
收起代码 ↑   


顶: 2256 , 底: 947
当前值: 1710 , 位于历史分位: 51.7%

2026-01-29 排名最高的前5名题材:
1. 有色金属: 100.0展开输出 ↓   





















# ========= 板块内部细分结构定义 =========
THEME_SUB_GROUPS = {
    "AI应用": {
        "上游_算力硬件(芯片/GPU/服务器)": [
            "000977.XSHE",  # 浪潮信息 | AI服务器龙头展开代码 ↓   
【AI应用】板块内部细分行业宽度热力图

【AI应用】板块整体宽度曲线

  当前值: 1710 | 顶部阈值(80%分位): 2256 | 底部阈值(20%分位): 947

【AI应用】板块各细分行业曲线








您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-2-1 01:56