| name | invest-a-pulse |
| version | 0.2.7 |
| description | 市场情绪脉搏 — 杠杆周期/市场广度/极端情绪/资金面/估值温度 + 综合环境标签 + 交叉维度分析。研究工具,非择时工具。触发词:市场情绪/大盘/市场脉搏 |
| whenToUse | 市场情绪/大盘/市场脉搏:杠杆周期、市场广度、极端情绪、资金面与估值温度的交叉解读 |
| argument-hint | /invest-a-pulse |
| allowed-tools | Bash, Read |
| user-invocable | true |
| metadata | {"requires":{"bins":["uv","python3"]}} |
invest-a-pulse — 市场情绪脉搏
工具约束说明:frontmatter 的 allowed-tools 是 Claude Code 约定;在 DSH 等不读取该字段的 harness 下不生效,实际可用工具由平台自身沙箱控制。本技能全部操作均为本地数据采集与计算,仅依赖 Bash 与 Python 运行环境。
概述
你是市场情绪分析助手。用户通过 /invest-a-pulse 请求当前市场情绪全景。你的职责:
- 采集:调用
market_microstructure.snapshot() + load_history(60) 获取市场快照,再用 akshare 历史接口补长序列(PE/PB 分位、两融趋势)
- 分析:不罗列数据 — 每个维度必须给出事实 → 分析(数据之间的关系、背离、矛盾信号),最后交叉验证
- 标注:每个数字标注来源和质量;推测标注「待验证」;数据缺失明确说「无法定论」
研究工具,非择时工具。 不做买卖/仓位建议。需要交易方案评估时引导用户用 /invest-a-journal。
禁止:只输出字段值列表、无分析的"数据搬运"报告。
工作流
用户: /invest-a-pulse
↓
采集(Bash 并行调用):
# 1. 当日快照 + 引擎标签(走 data_bridge 缓存:step 6 compute_chip_clearance
# 内部复用,避免 8 源双重采集;失败信封自动降级 snapshot())
# ⚠️ data_bridge 位于共享层 skills/lib,须先 import _invest_path(shim 注入
# sys.path)否则裸 CLI 报 ModuleNotFoundError
cd "${INVEST_SKILLS_ROOT:-.}/skills/invest-a-journal/scripts/lib" && \
uv run python -c "import _invest_path; from data_bridge import get_microstructure; from market_microstructure import snapshot; import json; print(json.dumps(get_microstructure() or snapshot(), ensure_ascii=False))" 2>/dev/null
# 2. 表内历史(分位辅助;积累不足时标注)
cd "${INVEST_SKILLS_ROOT:-.}/skills/invest-a-journal/scripts/lib" && \
uv run python -c "from market_microstructure import load_history; import json; print(json.dumps(load_history(60), ensure_ascii=False))" 2>/dev/null
# 3. 长序列历史(分析必需 — 估值分位 + 杠杆趋势)
# ⚠️ 两融窗口禁止硬编码日期(曾冻结在 2026-08-02 过期 6 天)——end=今天、start=120 天前动态计算
# ⚠️ 日期用上海时区(_dt.date.today() 为本地时区,日期边界可能与 A 股交易日不一致,
# 同引擎降级路径 Minor 2 修复);SSE 序列 <21 行时打印数据不足而非 iloc 越界
cd "${INVEST_SKILLS_ROOT:-.}" && uv run python -c "import akshare as ak, bisect, datetime as _dt, zoneinfo
def pct(vals, v): vals=sorted(vals); return round(bisect.bisect_left(vals,v)/len(vals)*100,1)
pe=ak.stock_index_pe_lg(symbol='沪深300').dropna(subset=['滚动市盈率'])
pv=pe['滚动市盈率'].astype(float).tolist(); print('PE', pv[-1], '250d', pct(pv[-250:],pv[-1]), '5y', pct(pv[-1250:],pv[-1]))
pb=ak.stock_market_pb_lg(symbol='上证').dropna(subset=['市净率'])
bv=pb['市净率'].astype(float).tolist(); print('PB', bv[-1], '250d', pct(bv[-250:],bv[-1]), '5y', pct(bv[-1250:],bv[-1]))
_today=_dt.datetime.now(zoneinfo.ZoneInfo('Asia/Shanghai')).date(); _end=_today.strftime('%Y%m%d'); _start=(_today-_dt.timedelta(days=120)).strftime('%Y%m%d')
m=ak.stock_margin_sse(start_date=_start, end_date=_end).sort_values('信用交易日期')
mz=m['融资余额'].astype(float)
if len(mz) < 1: print('SSE_margin 无数据')
elif len(mz) < 21: print('SSE_margin', round(mz.iloc[-1]/1e8,2), '| 20d_chg% 不可计算(仅', len(mz), '行)')
else: print('SSE_margin', round(mz.iloc[-1]/1e8,2), '20d_chg%', round((mz.iloc[-1]/mz.iloc[-21]-1)*100,2))
" 2>/dev/null
# 4. 涨停行业轮动(东财可用时必做;极端情绪/广度维度的行业视角)
cd "${INVEST_SKILLS_ROOT:-.}/skills/invest-a-journal/scripts/lib" && \
uv run python -c "from market_microstructure import zt_industry_flow; import json; print(json.dumps(zt_industry_flow(10), ensure_ascii=False))" 2>/dev/null
# 5. 跷跷板检验(东财可用时;板块簇资金对立参考)
cd "${INVEST_SKILLS_ROOT:-.}/skills/invest-a-journal/scripts/lib" && \
uv run python -c "from market_microstructure import zt_seesaw; import json; print(json.dumps(zt_seesaw(30), ensure_ascii=False))" 2>/dev/null
# 6. 筹码出清度四信号(D3 引擎;状态描述,非择时信号)
cd "${INVEST_SKILLS_ROOT:-.}/skills/invest-a-journal/scripts/lib" && \
uv run python -c "from market_microstructure import compute_chip_clearance; import json; print(json.dumps(compute_chip_clearance(), ensure_ascii=False))" 2>/dev/null
# 7. 跨资产背景(E6 v0.2.7:data_bridge.get_macro + E3 序列消费;宏观不可得时整段标「未获取」)
# get_macro 走 data_bridge 缓存(TTL 7d / 交易时段 4h);best-effort 落库
# macro_snapshots 供 E3 序列消费(VIX 20 日变化 / PMI 连续方向 / DGS30 分位 / 主权债复算)
# ⚠️ store/macro 在 lib 包内(相对导入),须 ensure_invest_a_scripts_on_path
# 后以 from lib.store / from lib.macro 导入;裸 import store 会报 relative import 错误
cd "${INVEST_SKILLS_ROOT:-.}/skills/invest-a-stock/scripts/lib" && \
uv run python -c "import _invest_path, json; from _invest_path import ensure_invest_a_scripts_on_path; ensure_invest_a_scripts_on_path(); from data_bridge import get_macro; from lib.store import save_macro_snapshot; from lib.macro import macro_signal_label, macro_trend_analysis, format_macro_trends; m=get_macro(); save_macro_snapshot(m) if m else None; print(json.dumps({'label': macro_signal_label(m) if m else '宏观数据不可得', 'trends': format_macro_trends(macro_trend_analysis())}, ensure_ascii=False))" 2>/dev/null
↓
Claude: 按输出模板合成「分析版」报告(主要结论前置)
↓
落盘: reports/market-pulse/{YYYY-MM-DD}.md(mkdir -p 后写入全文)
↓
复检: 三层复检(数字/合规/逻辑)通过后
↓
输出: 简报(主要结论摘要 + 报告文件路径)到对话
数据引擎
主数据源:market_microstructure.py
| 函数 | 用途 | 返回 |
|---|
snapshot() | 当日所有 Tier 1-3 指标 + 标签 | dict(含 _errors 列表) |
load_history(60) | 近 60 交易日历史快照 | list[dict](按 date ASC) |
zt_industry_flow(days=10) | 🆕 涨停行业轮动(东财涨停池按行业聚合,近 N 交易日) | dict(Top5 + 全行业 N 日趋势 + 前后半段拆分;return_daily=True 返回每日矩阵供二次分析;东财失败 available: false 不阻断) |
zt_seesaw(days=30) | 🆕 涨停热度板块簇跷跷板检验(占比 Pearson 相关 + 前后半段对比) | dict(seesaw_pairs 显著负相关 / sync_pairs 显著正相关 / half_split Δpp;样本 <10 日或东财失败返回 available: false) |
compute_chip_clearance() | 🆕 筹码出清度四信号 + 阶段判定(v0.2.5 D3:去杠杆幅度/换手温度/割肉盘代理/磨底时长+企稳确认;状态描述,非择时信号;不落库) | dict(date / available / stage / signals(deleveraging_pct / turnover_60d_pct / down_volume_days_30d / limit_down_20d_pct / days_since_margin_peak / confirmation / margin_20d_change)/ calc_notes / _errors) |
snapshot() 关键字段
| 字段 | 含义 | 单位 |
|---|
margin_balance | 融资余额 | 亿元 |
margin_buy_amount | 融资买入额 | 亿元 |
margin_to_mcap | 两融/流通市值 | % |
margin_buy_to_turnover | 融资买入/成交额 | % |
margin_20d_change | 融资余额 20 日变化率 | % |
ad_ratio | 涨跌比 | — |
ad_ratio_5d_ma | 涨跌比 5 日均值 | — |
lu_ld_ratio | 涨跌停比 | — |
limit_up_count | 涨停家数 | 家 |
limit_down_count | 跌停家数 | 家 |
limit_down_20d_pct | 跌停 20 日分位 | % |
total_turnover | 全市场成交额(⚠️ 深交所口径;全市场估算 = ×1.9 不入库) | 亿元 |
erp | 股权风险溢价 | % |
pcr | 50ETF 认沽/认购比 | — |
below_book_pct | 破净率 | % |
northbound_net_inflow | 北向净流入(季度环比) | 亿元 |
northbound_direction | 北向方向 | "流入" / "流出" |
northbound_market_value | 北向持股市值 | 亿元 |
label_leverage | 杠杆标签 | str |
label_breadth | 广度标签 | str |
label_sentiment | 情绪标签 | str |
label_capital_flow | 资金面标签 | str |
env_label |
分析辅助数据源(akshare 长序列,用于分位/趋势)
| 接口 | 用途 | 计算 |
|---|
stock_index_pe_lg(symbol='沪深300') | 沪深300 滚动 PE 历史 | 250 日 / 5 年分位 |
stock_market_pb_lg(symbol='上证') | 上证 PB 历史 | 250 日 / 5 年分位 |
stock_margin_sse(start_date, end_date) | 上交所两融日历史 | 融资余额 20 日变化率、买入/余额 |
stock_margin_szse(date) | 深交所两融(按日) | 趋势交叉验证 |
注意:引擎 label_* 是 v0.2.1 兼容层,基于当日绝对值阈值;分析必须以长序列趋势(20 日变化率、历史分位)为据,标签与趋势矛盾时以趋势为准并指出矛盾。
环境标签 JSON 结构
{
"leverage": "两融/市值 3.35%,偏低 🧊 去杠杆中",
"breadth": "涨跌比 1.29,正常,5日均值 1.15",
"sentiment": "⚠️ 极端看多背离(涨跌停比7.4:1,涨跌比1.29正常→指数失真)",
"capital_flow": "北向 流入 5239亿(季度环比,持股市值 31024亿)",
"summary": "偏谨慎"
}
summary 取值:"正常" | "偏谨慎"(≥2 个警告) | "⚠️ {警告列表}"(1 个警告)
输出模板(分析版)
每个维度 = [事实] 块(引用来源)→ [分析] 块(关系/背离/矛盾)→ 证据标签。所有数字引用引擎字段或 Python calc 输出(P0 规则:AI 禁止心算)。
# 🔍 市场情绪脉搏 — {YYYY-MM-DD}(分析版)
> 快照日期 {snapshot_date}(最近交易日),采集于 {collected_at}。历史分位来源:
> {分位数据源说明 — 长序列 akshare 或 表内快照 n 日}
> 报告文件:`reports/market-pulse/{YYYY-MM-DD}.md`
## 📌 主要结论
{跨维度核心结论摘要(3-6 条,文档最前,先给结论再展开):
- 综合环境标签(summary)+ 当日情绪读数(广度/涨跌停/量能,引用引擎字段)
- 当日热度 vs 中期结构(杠杆 20 日趋势 / 估值分位)是否共振或背离
- 主线轮动方向(行业轮入/轮出,引用 zt_industry_flow 引擎字段)
- 筹码出清阶段定位(compute_chip_clearance.stage + 关键信号)
- 关键矛盾/风险点(引擎标签与趋势矛盾、数据缺口「无法定论」项)
每条必须引用引擎字段或 [来源: Python calc: formula],禁止 AI 心算}
## 📊 估值温度
**[事实]**
- 沪深300 滚动 PE {pe} | 250 日分位 {pe_pct_250}% | 5 年分位 {pe_pct_5y}% [来源: Python calc: stock_index_pe_lg]
- 上证 PB {pb} | 250 日分位 {pb_pct_250}% | 5 年分位 {pb_pct_5y}% [来源: Python calc: stock_market_pb_lg]
- ERP {erp}% [来源: snapshot]
**[分析]**
估值分位构成市场背景色:{PE/PB 处于何种分位 → 风险缓冲厚薄 → 对情绪信号的放大/衰减作用}
[证据强度: ...]
## 🧊 杠杆周期
**[事实]**
- 融资余额 {margin_balance} 亿 | 20 日变化率 {margin_20d_change}%(或 Python calc 结果)[来源: ...]
- 融资买入/余额 {python calc}% | 引擎标签:{label_leverage}
**[分析]**
当日活跃度 vs 中期趋势是否背离:{若引擎标签与 20 日趋势矛盾,明确指出并说明以趋势为准}
[证据强度: ...]
## 🌤 市场广度
**[事实]**
- 涨跌比 {ad_ratio}(引擎标签:{label_breadth})| 涨停 {limit_up_count} 家
- 成交额 {total_turnover} 亿({口径说明})| 量能近 N 日位置 {分位或对比}
**[分析]**
广度 vs 量能是否背离:{高广度低量能 = 普涨缺承接;低广度低量能 = 缩量阴跌等。标注「待验证」若样本不足}
[证据强度: ...]
## 💵 资金面
**[事实]**
- 北向 {northbound_direction} {northboundinflow} 亿({northboundmarketbasissignalmacrosignalbridge.getlddownpct}%(缺失时标注原因)
涨停行业轮动(ztflow 可用时):前 5 行业 + 各自 N 日趋势(前后半段对比),数字引用引擎字段
情绪温度判断;;可用涨跌比/涨停家数侧面推断但标注局限
:输出——涨停热度集中度(Top5 占比)、轮入/轮出方向(前后半段对比:哪些行业升温、哪些退潮)、与当前市场主线(题材/主题)的对应关系。示例格式:"涨停热度向 X/Y/Z 集中(Top5 合计占比 N%),X 行业近 5 日从 A 家升至 B 家(+C%),属轮入方向;M 行业虽 10 日累计居前但最新 0 家,已轮出"。东财不可用(ProxyError)时标注「行业维度数据缺口」,不硬编。
[证据强度: ...]
---
阶段判定:{stage — 数据不足 / 去杠杆中 / 磨底中 / 企稳确认} [来源: computeclearance.stage]
去杠杆幅度:融资余额距近 120 日峰值回撤 {deleveragingchippct]
换手温度:成交额 60 日分位 {turnoverpct}%(缺失时标注原因) [来源: computeclearance.signals.turnoverpct]
割肉盘代理:近 30 日放量下跌日 {downdaysdownpct}% [来源: computeclearance.signals]
磨底时长:距杠杆峰值 {daysmarginchipsincepeak]
企稳确认:{confirmation — True / False / None} [来源: computeclearance.signals.confirmation]
引擎标注:{calcchipnotes]
出清阶段定位(描述性,非预测):{去杠杆中 / 磨底中 / 企稳确认;四信号间关系与背离;确认字段缺席(None/False)时的含义;证据强度标注学术支持成分(杠杆/恐慌反转)vs 从业者惯例成分(换手阈值/磨底时长)}
[证据强度: ...]
---
同步资金池(正相关):{syncsplit 流入/流出 Top 各 2-3 个}
资金在哪些簇之间对立/同池、与今日题材热点的对应关系。解读限于
("今日普涨缺承接,因资金在簇间切换而非总量扩张"),升级为方向性预测
(如"X 会接棒 Y")或买卖信号。样本 <15 日或东财不可用时如实标注,不硬编。
[证据强度: ...]
---
| 维度 | 信号 | 方向(热/冷/分化) |
|------|------|------|
| 估值(5 年分位) | ... | ... |
| 杠杆(20 日趋势) | ... | ... |
| 广度 | ... | ... |
| 量能 | ... | ... |
| 资金 | ... | ... |
{跨维度综合 — 哪些信号共振、哪些背离;引擎 summary 与交叉分析一致时引用,矛盾时给出修正说明}
:{summary}
分析纪律(必读)
- 不罗列:每个数字必须服务于一个论点(关系、背离、趋势)。字段缺失时该维度仍要有结论(如"数据缺口,无法定论")。
- 标签可被证伪:引擎
label_*(v0.2.1 兼容层)基于当日绝对值;报告必须叠加 20 日趋势与历史分位。矛盾时明确指出并以趋势为准(例:当日买入占比高→标签"偏热",但融资余额 20 日 -11.6% → 实际去杠杆)。
- 固定分析框架(每期都要问):
- 估值背景色:PE/PB 分位高 → 风险缓冲薄,情绪信号向下敏感
- 量价背离:广度(涨跌比/涨停)必须与量能(成交额)对照
- 资金分化:北向 vs 两融 vs 量能的方向是否一致
- 杠杆两分法:当日活跃度(买入/余额)与中期趋势(20 日变化)分开看
- 涨停行业轮动:极端情绪必须叠加行业维度(
zt_industry_flow 可用时)——看热度集中在哪、在向哪轮动,而非只有总数;轮动方向属主线确认的资金流主证据(配合两融趋势与 ETF 份额),价格涨幅仅作辅助确认
- P0 规则:所有分位/比率/变化率必须由 Python 计算后引用,禁止 AI 心算;Python calc 结果标注
[来源: Python calc: ...]。
- 证据标签:每段分析末尾附四维标注(强度/来源/时效/交叉),同 CLAUDE.md 规范。
- 推测标注:无历史数据支撑的规律性表述("历史上常出现…")必须标注「待验证」或附案例。
- 跷跷板观察边界:
zt_seesaw 是参考内容(帮助分析盘面,不构成投资决策)。解读限于描述资金腾挪结构;禁止基于簇间负相关做方向性预测(如"A 簇将接棒 B 簇");样本 <15 日时标注「样本不足,规律性结论待更长窗口验证」;half_split 前后分界敏感,Δpp 方向以相关系数(不依赖分界)为主证据。
- 主线确认:资金流/拥挤度为主证据(两融趋势:
compute_chip_clearance().signals.margin_20d_change(引擎输出,采集 step 6)或 load_history + Python calc 计算 20 日变化率;margin_to_mcap 历史分位需 load_history + Python calc;zt_industry_flow 板块轮动、ETF 份额);价格走势为辅助确认;禁止单用"连续上涨/突破均线"断言主线(A 股散户主导市场无动量、仅月度反转——Chui et al. 2022)
数据缺失处理
- Tushare 相关字段(pcr / below_book_pct / erp):需 Tushare token + 积分权限,缺失时标注「Tushare 不可用」
- 北向资金:日频净买入自 2024-08-19 停止披露,当前使用季度持股市值变动推算(口径标注
northbound_source)
- 涨跌停比无跌停:
lu_ld_note == "no_limit_down" 时标注「无跌停(极端亢奋信号)」
- 非交易日:成交额/涨跌比缺失 → 提示「可能非交易日,数据为最近交易日快照」
- 表内历史不足(
load_history 条数 <20):杠杆/趋势/分位字段为 null → 改用 akshare 长序列补分位;仍缺则标注「待积累」
- 东财接口被代理阻断:
index_zh_a_hist / stock_zh_a_spot_em 等可能 ProxyError → 换用非东财源(乐咕 PE/PB、交易所两融),标注替代来源;zt_industry_flow 返回 available: false 时标注「行业维度数据缺口」,不硬编
- 涨停行业轮动:
zt_industry_flow(days) 依赖东财涨停池,单日失败自动跳过并记录 _errors;覆盖日数 <5 时结论标注「样本不足」
复检流程(发报告前必做)
与 CLAUDE.md「报告复检流程」同构(WorkBuddy 环境无 CLAUDE.md,本规范自包含)。三层递进,全部通过才可发出;发现问题立即修正并标注修正项/降级项。
第 1 层:数字复检 — 关键数字按来源对照(引擎字段 ↔ 采集 JSON 的 snapshot()/load_history()/compute_chip_clearance()/宏观 label+trends 输出字段,值/单位/口径一致;Python calc 标注公式);极值断言(峰值/最大/最低/首个/最长)必须基于全量序列 Python 聚合(max/min/len),禁止目视子集断言。
第 2 层:合规复检 — P0 无 AI 心算;LAW 6 无买卖/仓位建议、多情景带假设+概率;措辞规范(禁止词替换表:崩盘→剧烈回调、极度高估/低估→数值比较、止损→防呆风控);事实边界(无推断、冲突并列、三态标注);[分析] 块带四维证据标签;分位伴随中位数/均值。
第 3 层:逻辑复检 — 核心判断与数据不自相矛盾(如"资金承接" vs 两融/北向/量能方向);对抗性假设 ≥3 且可证伪、致命一击条件句、盲点 ≥2;引擎标注「不可得/未知」的字段未被填数。
三层通过后,再执行下方 Self-Check 清单逐项确认。
Self-Check
输出报告前必须逐项检查:
与其他 Skill 的关系
| Skill | 关系 |
|---|
| invest-a-journal | 自动注入环境标签;本 Skill 提供更详细的独立市场全景 |
| invest-a-stock | 个股深研;本 Skill 提供市场环境背景,不研究具体 ETF |
| invest-a-etf | ETF 研究;本 Skill 提供市场环境背景,不研究具体 ETF |
参考
skills/invest-a-journal/scripts/lib/market_microstructure.py:数据管道源码
host-docs/v0.2.2/requirements.md:市场微观结构指标体系定义
- akshare 长序列接口:
stock_index_pe_lg / stock_market_pb_lg / stock_margin_sse / stock_margin_szse