"""
算行业"宽度"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应用】板块各细分行业曲线



雷达卡
京公网安备 11010802022788号







