- name
- a-stock-operator-v2
- description
- 生成 A 股「行情复盘报告」与「个股诊断报告」(Markdown 文档,带日期,红涨绿跌,结论前置)。
行情模式:市场全景(核心指数 / 情绪周期定位 / 连板 / 主线题材 / 政策 / 热点)+ 近一月板块轮动专题(日期列头 × 每日 Top7 板块、动态色标记轮动、全量标注涨幅% 与涨停数 ×N + 资金轮动四象限 + 板块多因子趋势榜)。
情绪周期定位:基于「情绪温度计」(Model 04,温度+风险双维、五阶段、仓位建议)研判情绪阶段(冰点/启动/发酵/高潮/分歧)+ 短线操作建议 + 仓位参考;主线题材采用「动态热点发现引擎」(Model 01,五因子评分 + 每日动态 Top N,新热点自动纳入)+ 题材生命周期定位(Model 02,萌芽/启动/发酵/高潮/退潮五阶段 + 短线/中线策略);板块轮动采用「资金轮动四象限」(Model 03,主线/接力/脉冲/退潮 + 轮动速度 + 扩散指数)与「板块趋势多因子」(Model 06,15日涨幅+5日动量+资金持续+涨停持续加权,标记启动/加速/减速/回落)。
个股模式:单只个股六维诊断(评分 / SWOT / 估值 / 龙虎榜 / 筹码 / 关键价位)+ 最终诊断操作建议(渐变环形评分 + 关键价位双栏 + 操作策略 3 卡 + 避坑提示),卡片化、有层次。
自包含:脚本全在技能目录内,相对路径免配置;产物(采集数据/过程脚本)默认写到**当前会话/工作目录**下的 `<cwd>/a-stock-operator-v2/` 子目录,**报告统一输出为 Markdown(带日期)写到 `<cwd>` 根目录**(`A_STOCK_WORK`/`A_STOCK_OUT` 可指定工程目录),不写回技能目录;「今日」默认真实交易日(--date 可覆盖),联网实时采集。
加载后先让用户选择模式。适用:行情复盘、个股诊断、生成股票报告、板块轮动、情绪周期、短线/中线操作建议、重新生成报告。
- agent_created
- true
- display_name
- A股行情与个股报告生成器 v2
- display_name_en
- A-Share Market & Stock Report Generator v2
- description_zh
- A股行情复盘与个股诊断报告生成器(自包含 + 默认真实今日 + 双模式)
- description_en
- A-share market review and stock diagnosis report generator (self-contained, real-today default, dual-mode)
- visibility
- public
- disable-model-invocation
- false
# A股行情与个股报告生成器 v2(a-stock-operator-v2)
## 能力说明
本技能生成两份 **Markdown 报告**(带日期,红涨绿跌语义、结论前置、结构化列表/表格布局),输出到**当前会话根目录**:
- **行情分析模式**:市场全景复盘(核心指数 / 市场情绪 + **情绪周期定位** / 连板梯队 / 主线题材 / 重点政策消息 / 热点可持续板块)+ **近一月板块轮动**专题(日期为列头 × 每日 Top7 板块,动态色标记轮动轨迹,全量标注涨幅% 与涨停数 ×N,底部含颜色图例 + **资金轮动四象限** + **板块多因子趋势榜**)。
- **情绪温度计(Model 04 · 短线择时)**:将情绪周期定位升级为「温度 + 风险」双维量化。**情绪温度**(0~100)由五因子合成——涨停家数 25% / 封板率 25% / 连板高度 20% / 连板家数(≥2 板)15% / 市场宽度(上涨占比)15%;**风险度**(0~100)由四因子合成——炸板率 30% / 亏钱效应(大面率+跌停强度)30% / 过热(高温+极端连板)20% / 背离(涨停多但宽度差或炸板高,连续梯度 0~100)20%。据此判定 冰点/启动/发酵/高潮/分歧 五阶段——**分歧阈值随温度滑动**(温度≥65 → 阈值 55、≤45 → 阈值 65、中间线性插值,温度越高越易分歧),并输出 0~10 成仓位区间建议(冰点 0-2 成 / 启动 2-3 成 / 发酵 4-6 成 / 高潮 3-5 成 / 分歧 2-4 成)。报告情绪卡渲染温度计(刻度含五档并**高亮当前阶段**)+ 风险条 + 8 指标(涨停/连板高度/连板家数/封板率/炸板率/跌停/涨跌家数/大面家数)+ **温度/风险因子分解条**(逐条标注权重% 与数值)+ 仓位建议 + **仓位进度条**(用 `position_min`/`position_max` 映射 0~10 成并高亮建议档位);`emotion_{date}.json` 缺失时**优雅降级**为旧版 5 指标情绪卡。
- **主线题材(贴合热点 · 动态引擎)**:由「动态热点发现引擎」实时聚类当日 Top N 热点(五因子加权:涨停家数 0.30 / 主力净流入 0.25 / 板块涨幅 0.15 / 连板高度 0.15 / 扩散度 0.15),**不再写死题材词典,新热点自动纳入**;配合「题材生命周期定位」标注每个热点的萌芽/启动/发酵/高潮/退潮阶段与短线/中线策略。
- **资金轮动四象限(Model 03 · 短线择时)**:按「资金净流入 × 趋势一致性」把热点板块切入主线(流入+趋势一致)/ 接力(流入但未确认或新热点)/ 脉冲(流出但当日涨)/ 退潮(流出+转弱)四象限,输出轮动速度与扩散指数,辅助判断资金切换方向与快慢。
- **板块多因子趋势榜(Model 06 · 中线选板块)**:对全量板块按 15 日涨幅 40% + 5 日动量 30% + 资金持续 20% + 涨停持续 10% 加权出 0~1 趋势分并排名,标记启动/加速/减速/回落状态,辅助判断板块趋势方向与持续性。
- **次日轮动主线推荐(强化自学习)**:融合「位置(趋势)/资金/强度(趋势内涨停 Z 分)/热度(扩散度)」**四维**打分(emotion 封板率为市场级常量、无截面区分,已移出逐板块打分,改为风控门控),输出次日轮动主线题材/板块推荐(**主线/接力/潜伏**三层 + 依据 + 风险提示);自学习闭环「推荐落盘因子快照 → T+1~T+3 验证回填 → 反推权重 → 回写 → 更准」,权重随真实样本累积自动校准。
- **个股诊断联动(L1)**:行情报告「个股推荐」卡片(07 章)在对应诊断报告 `{name}_个股诊断-{YYYY-MM-DD}.md` 存在时,自动把个股标题改为跳转链接,实现行情 → 个股诊断交叉导航;诊断报告缺失时优雅降级为纯文本标题。
- **个股诊断模式**:单只个股六维诊断(综合评分 / SWOT / 估值分情景 / 龙虎榜席位 / 筹码与股东结构 / 关键价位)+ **最终诊断操作建议**(渐变描边环形评分 + 关键价位止损/目标双栏 + 操作策略 3 卡:回踩观察/突破确认/回避情形 + 避坑提示警示卡),层次清晰、不堆积。
## 何时使用
- 用户说「行情复盘 / 生成行情报告 / 板块轮动 / 市场复盘」→ 行情模式
- 用户说「个股诊断 / 分析某只股票 / 操作建议」→ 个股模式
- 用户说「重新生成报告 / 两份都来」→ 两者
## 运行要求(自包含)
| 依赖 | 说明 |
|------|------|
| Python 3.12+ | 运行 `scripts/*.py`。任意 Python 3.12+ 解释器均可(系统 `python` / `python3` / `py`) |
| 脚本 | **本技能目录内** `scripts/*.py`(已相对化,`BASE` 由 `__file__` 自动推导,无需改路径) |
| 数据 | 采集/分析数据写到**当前会话/工作目录**下的 `<cwd>/a-stock-operator-v2/data/*.json`(行情 `market_{date}.json`、个股 `*_analysis.json`、轮动 `boards_15d.json` / `zt_15d.json` / `fund_15d.json`);可用 `A_STOCK_WORK` 指定到某工程目录。**不写回技能目录** |
| 输出 | 生成的 **Markdown 报告写到当前会话/工作目录根**(`REPORT_ROOT` = 当前工作目录,可用环境变量 `A_STOCK_OUT` 指定到某工程目录),**不写回技能目录** |
| 联网 | 生成「今日真实数据」时需联网(东方财富 / 腾讯 / 新浪 / 同花顺公开接口);已有数据可离线重跑 |
> **无需 `cd` 到特定目录**:脚本代码用 `BASE`(由 `__file__` 推导)定位技能根目录下的 `scripts/`;但**采集数据(data/)**默认写到 `<cwd>/a-stock-operator-v2/data`,**报告(Markdown)**默认写到 `<cwd>` 根目录(`DATA_DIR`=`<cwd>/a-stock-operator-v2/data`、`REPORT_ROOT`=`<cwd>`,可用 `A_STOCK_WORK`/`A_STOCK_OUT` 指向固定工程目录),技能库只保留代码、保持纯净。
## 第一步:模式选择(必做)
加载技能后,**先**用 `AskUserQuestion` 让用户选择:
- 问题:「要生成哪种报告?」
- 选项 1:**行情分析**(市场复盘 + 板块轮动)
- 选项 2:**个股诊断**(单只个股六维 + 操作建议)
- 选项 3:**两者都生成**
若用户在提问中已明确指定模式,则跳过选择直接进入对应流程。
> **个股诊断必须先收集输入**:选「个股诊断」或「两者都生成」时,先向用户索取 **① 股票全称 ② 股票代码**(两者至少提供一个,用于确定诊断目标),以及**③ 持仓成本价**(可选)。用 `AskUserQuestion` 一次问齐(成本价标注「可选」),不要凭空编造代码/名称。收集完成后再执行模式 B。
## 模式 A:行情分析
### A.1 数据采集(联网,生成真实今日数据时执行)
> **采集脚本依赖 `requests`**:若默认 `python` 未装 requests,请换用已装 requests 的 Python 3.12+ 解释器(下称 `py312`,任意环境,如 conda/venv/系统 Python 均可)。生成脚本无此依赖,任意 `python` 均可。
>
> **推荐入口——全流程管线,每次运行都取最新数据**:
> ```bash
> py312 scripts/collect_all.py # 采集 → 健康检查 → 模型 → 报告,一条命令全流程
> py312 scripts/collect_all.py --only-check # 仅健康检查(诊断数据是否缺失/过期)
> py312 scripts/collect_all.py --no-models # 只采集+检查,不跑模型和报告
> py312 scripts/collect_all.py --skip collect_news.py,collect_fund_15d.py # 跳过指定步骤
> ```
> 默认**全量重采**(本地已有文件不跳过),模型与报告仅在数据校验全过后执行——报告永远基于当日新数据,杜绝「重采数据但忘跑模型」的陈旧报告。
> 健康检查 15 项严格校验(任一不过 → 汇总失败清单 + exit 1,停止生成)+ 2 类警告(不阻断):严格项 = market 关键项(指数/涨停池/炸板池/涨跌家数/时间戳/数据日期一致)、news 条数、boards_15d 覆盖与新鲜度、zt_15d 有效天数与新鲜度、fund_15d 覆盖与新鲜度、recommend 当日新鲜;警告项 = market 部分项沿用同日早间值(stale_kept,按日分键无跨日污染)、采集步骤部分失败(产物仍新鲜则继续,避免盘中偶发风控导致永远无法完成)。新鲜度基准 = 目标日往前最近工作日(盘中容忍 T-1,收盘后应为 T 日)。
>
> 逐个采集(collect_all 内部即按此顺序执行,通常无需单跑):
```bash
cd <你的工作目录> # 产物(data/、Markdown 报告)落在这里,不写回技能目录
py312 scripts/collect_data.py # 东财:指数/涨停池/炸板池/跌停池/涨跌家数/热因 -> market_{今日}.json(合并模式:失败项沿用旧值,关键项缺失 exit 1)
py312 scripts/collect_v2.py # 新浪:涨跌家数(含涨跌幅榜)+行业板块 东财资金 -> 合并进 market_{今日}.json(空结果不合并)
py312 scripts/collect_news.py # 东财快讯 -> news_{今日}.json(空结果不覆盖旧文件,exit 1)
py312 scripts/collect_boards_15d.py # 东财行业+概念全量板块近 15 日涨幅(键=东财板块名;东财失败兜底同花顺板块指数;成功率<30% 视为风控不落盘)
py312 scripts/collect_zt_15d.py # 15 日涨停池按板块关键词匹配涨停数(关键词=THS 14 短名+全量板块名+当日热点;boards 缺失按工作日日历兜底)
py312 scripts/collect_fund_15d.py # 东财板块主力资金流历史(行业+概念近15日)-> fund_15d.json(东财失败轮换备用 UT + 同花顺指数涨跌幅作资金方向代理;成功率<30% 不落盘)
py312 scripts/recommend.py --date 20260818 # 个股推荐(首板突破 + 放量热点)-> recommend_{date}.json(market 缺失/涨停池空/日期不符 → exit 1;新浪停牌行安全跳过)
python scripts/gen_hot_sectors.py --date 20260818 # 动态热点发现引擎(Model 01)-> hot_sectors_{date}.json
python scripts/gen_theme_lifecycle.py --date 20260818 # 题材生命周期定位(Model 02)-> theme_lifecycle_{date}.json
python scripts/gen_emotion_cycle.py --date 20260818 # 情绪温度计(Model 04)-> emotion_{date}.json(依赖 market_{date}.json)
```
> **「今日」= 真实交易日**:各采集/生成脚本默认 `datetime.now()`,`--date YYYYMMDD` 可覆盖。`collect_boards_15d.py` / `collect_zt_15d.py` 为滚动采集(自动取最新),无需传日期。
> 联网采集可能遇 429/断连/东财 IP 风控(push2/push2his 全系列 `RemoteDisconnected`,约 20 小时自动解除,换网络即刻恢复)。**失败不再污染数据**:空结果不落盘/不覆盖旧文件、失败项沿用旧值(`stale_kept` 标记)、关键项缺失 exit 1;重跑 `collect_all.py` 或换网络后再跑即可。`collect_news.py` 盘中采集只含开盘至今快讯、收盘后采集才完整。
### A.2 生成报告
```bash
cd <你的工作目录> # 产物(data/、Markdown 报告)落在这里,不写回技能目录
python scripts/gen_hot_sectors.py --date 20260818 # 必须先跑:产出 hot_sectors_{date}.json
python scripts/gen_theme_lifecycle.py --date 20260818 # 依赖上一步:产出 theme_lifecycle_{date}.json
python scripts/gen_rotation_v2.py --date 20260818 # P1:资金四象限 + 多因子趋势 -> rotation_{date}.json(供轮动章节引用)
python scripts/recommend_rotation.py --date 20260818 # 新增:次日轮动主线题材/板块推荐(主线/接力/潜伏三层)-> 次日轮动主线推荐-{date}.md
python scripts/gen_emotion_cycle.py --date 20260818 # P2:情绪温度计 -> emotion_{date}.json(供情绪卡引用,缺失回退旧情绪卡)
python scripts/generate_report_v3.py --date 20260818 # 生成 9 章(含 07 近一月板块轮动:轮动矩阵 + 资金四象限 + 多因子趋势榜)-> 行情复盘-2026-08-18.md(<cwd> 根目录)
python scripts/rotation_verify.py --date 20260903 # 新增:回填推荐板块次日真实涨幅 -> rotation_history.csv
python scripts/rotation_evolve.py --min-samples 20 # 新增:直读因子快照反推四维权重 -> rotation_params.json
python scripts/emotion_calibrate.py # 新增:情绪温度计权重观测校准(温度↔次日晋级率相关性)-> 情绪温度计权重校准-{date}.md
```
> **动态热点引擎是主线题材/热点板块的数据源**:`generate_report_v3.py` 会尝试读取 `hot_sectors_{date}.json` 与 `theme_lifecycle_{date}.json`;若文件缺失则相应章节降级为空(旧版写死的 20+ 题材词典已移除),故生成报告前必须保证这两个文件已产出。
> **P2 情绪温度计数据源**:`generate_report_v3.py` 优先读取 `emotion_{date}.json`(`gen_emotion_cycle.py` 产出)渲染温度计/风险条/8 指标/仓位建议;若该文件缺失则**优雅降级**为旧版硬编码 5 指标情绪卡,不报错。
> **P1 资金四象限/多因子趋势数据源**:`generate_report_v3.py` 内置 `_build_rotation_md()` 读取 `rotation_{date}.json`(`gen_rotation_v2.py` 产出)渲染「板块轮动矩阵 + 资金轮动四象限 + 板块多因子趋势榜」;若该文件缺失则相应小节降级为「数据暂缺」,不报错。
> **次日轮动主线推荐(强化自学习)**:`recommend_rotation.py` 融合「位置(趋势)/资金/强度(趋势内涨停 Z 分)/热度(扩散度)」**四维**打分(emotion 封板率为市场级常量、移出打分,改作风控门控:封板率 <25% 收缩至仅主线、<40% 减半),输出次日轮动主线题材/板块推荐(**主线/接力/潜伏**三层 + 推荐依据 + 风险提示),落盘时携带当日真实因子快照。自学习闭环:`rotation_verify.py` 批量回填所有 T+3 已可判定推荐的真实涨幅(携带因子快照)累计 `rotation_history.csv` → `rotation_evolve.py` 直读快照做 Spearman 秩相关反推四维权重、EMA 平滑后回写 `rotation_params.json` → `recommend_rotation.py` 下次自动加载覆盖内置先验(样本 <20 维持先验)。内置先验 weight = position0.48 / fund0.08 / strength0.09 / heat0.35(2026-09-04 经 90 日回溯实证得出,position 为唯一有效单因子、裸涨停数为过热负效应、emotion 无截面区分)。
### A.3 坑点
- **数据链路依赖(已防御化)**:`generate_report_v3.py` 依赖 `market_{date}.json` 与 `recommend_{date}.json`,但**均已做缺失兜底**:`sectors` 兼容 dict/list 两种结构、`breadth.top_gainers/top_losers` 缺失时降级为空表、`recommend` 缺失时不报错。`collect_data.py`(东财)产出不含正确的 `sectors` 涨跌幅榜与 `top_gainers`,**建议仍跑 `collect_v2.py`(新浪)合并**以补齐板块与涨跌幅榜数据(不跑不再崩溃,但相应章节数据为空)。
- **政策章节依赖 `news_{date}.json`**:05 章「重点政策/消息」由 `generate_report_v3.py` 内的 `build_policies()` 从 `data/news_{date}.json`(`collect_news.py` 产出)按关键词加权筛选 Top5。**若无该文件则 05 章为空**(不报错),跑一次 `collect_news.py --date {date}` 即可补齐。
- **定性内容已数据驱动**:verdict 定调 / 副标题 / 主线题材 / 热点板块 / 推荐 pick / 板块轮动 均从 `market` / `recommend` / `boards_15d` / `rotation` 数据自动生成,**换日期重跑即自动更新,无需手改脚本**。
- **板块池数据源**:热点板块池不再来自 `fund_rank`(那是「个股」主力资金排行,误当板块会用股票名污染聚类),现改为 `sectors`(东财行业/概念板块,含每板块 `main_net_yi`)+ `hybk`(涨停股行业板块)补充,`fund_rank` 仅极端降级兜底。`collect_v2.py` 的新浪行业板块改存 `sina_sectors` 键、仅当 `sectors` 缺失时兜底填充,不再覆盖以保住板块级资金流。
- **资金维度历史来源 `fund_15d.json`**:`gen_theme_lifecycle.py`(生命周期资金正天数)与 `gen_rotation_v2.py`(趋势一致性/资金持续性)优先读 `data/fund_15d.json`(`collect_fund_15d.py` 采集,键=东财板块名,与 hot_sectors 动态名对齐);缺失时优雅降级为涨停/涨幅代理(已验证不崩溃)。
- **命名桥接**:`boards_15d.json` 由 `collect_boards_15d.py` 动态采集东财「行业+概念」全量板块(键=东财板块名),新热点自动纳入涨幅历史,无覆盖上限;`zt_15d.json` 关键词 = THS 14 短名(`_common.py` 单一来源)+ boards 全量板块名 + 当日热点名。历史遗留的同花顺短名数据经 `bridge_ths_name()` 桥接兼容。`generate_report_v3.py` 的轮动矩阵 ×N 涨停数查询已做双路兜底(东财名直查 → 短名桥接)。
## 模式 B:个股诊断(用户提供 股票全称 / 代码 / 成本价)
### B.0 收集用户输入(必做,先于一切生成)
向用户索取(用 `AskUserQuestion` 一次问齐):
- **股票全称**(如「通鼎互联」)—— 与代码**至少提供一个**
- **股票代码**(如 `002491`)—— 与全称**至少提供一个**
- **持仓成本价**(如 `18.50`)—— **可选**
> **「全称 / 代码至少提供一个」的目的**:用于**确定诊断目标**——脚本据此定位该股票的分析 JSON(`data/{name|code}_analysis.json`,缺省回退通鼎样例)、生成动态文件名与标题。
> 若用户只给了其一(如仅代码 002491),可直接继续;**不要编造**另一个。若两者都未给,必须回问。
> **成本价(可选)的使用定位**:若有,主要应用于 **07「最终诊断操作建议」章节**(在综合评级卡展示「持仓成本 / 持仓盈亏%」),**不进入基础报告 01–06 章**。基础报告只做客观诊断,持仓视角单列在操作建议。
> 个股分析数据(六维/SWOT/龙虎榜/价位/操作建议等)来自一个**个股分析 JSON**(`--data`)。默认样例为 `data/tdhl_analysis.json`(通鼎互联)。**换成别的股票时,必须提供该股票的分析 JSON**(结构见 `data/tdhl_analysis.json`);脚本不会凭空生成其他股票的真实分析。
### B.1 数据准备(可选)
若目标股票的分析 JSON 缺失 / 需刷新,按对应采集脚本更新后写入该 JSON。已有数据时跳过。
```bash
cd <你的工作目录> # 产物(data/、Markdown 报告)落在这里,不写回技能目录
# 通鼎互联样例(默认):data/tdhl_analysis.json + data/tdhl_kline.json
# 其他股票:自备 <名称>_analysis.json(结构见下方「分析 JSON 字段结构」)
```
**分析 JSON 字段结构**(`data/tdhl_analysis.json` 为权威样例,换股时照此构建;字段名必须与脚本读取点一致):
```jsonc
{
"name": "通鼎互联", "code": "002491", "exchange": "SZ",
"asof": "2026-08-14", // 数据基准日(页脚/标题标注)
"tags": ["光纤光缆", "光通信", "AI算力基建"], // 顶部标签(hero tag-row)
"price_panel": { // 价格面板 KPI(基础报告 overview)
"price": "19.65", "chg": "+3.75%", "up": true, // up 决定涨跌颜色
"market_cap": "225亿", "pb": "8.9x", "pb_note": "PB(行业2.4)",
"turnover": "9.98%", "amount": "55.4亿"
},
"dims": [ // 六维诊断(score 0-10;weight 合计 100)
{"code":"D1","name":"宏观行业","score":8,"weight":15,
"detail":"...","verdict":"..."}, ...
],
"swot": {"S":[...],"W":[...],"O":[...],"T":[...]},
"scenarios": [ // 估值分情景
{"name":"悲观","cond":"...","val":"60–90 亿","color":"#2bd99f"}, ...
],
"scenarios_note": "估值情景补充说明",
"lhb": { // 龙虎榜(04 章)
"date":"2026-08-12","desc":"上榜原因",
"buy_total":"3.61 亿","sell_total":"1.82 亿","net":"1.79 亿",
"inst_net":"+403 万","north_net":"-4869 万","seat_net":"+2.24 亿",
"buy":[["席位名","+金额","类型","#颜色"],...], // 四元组 [名, 额, 类, 色]
Ver en GitHub