CommunityResearch & Data Analysisgithub.com

TrueHOOHA/shanxi-securities-tushare-skill

山西证券Tushare Skill

What is shanxi-securities-tushare-skill?

shanxi-securities-tushare-skill is a Claude Code agent skill that 山西证券Tushare Skill.

Works withClaude Code~Codex CLI~Cursor
npx skills add TrueHOOHA/shanxi-securities-tushare-skill

Installed? Explore more Research & Data Analysis skills: obra/superpowers, affaan-m/quarkus-verification, affaan-m/uspto-database · View all 6 →

Ask in your favorite AI

Open a new chat with this agent skill pre-loaded.

Documentation

山西证券 Tushare 综合分析技能

本 skill 配合 shanxi-securities-tushare 数据 skill 使用,在后者提供的数据接口之上增加多维度交叉分析层,将分散的指标整合为结构化分析报告。

工作原理

把"帮我分析 XX"转化为可执行的标的识别 → 维度加载 → 取数 → 计算 → 解读 → 报告流程。

重要:本 skill 不封装取数逻辑。取数时引用 shanxi-securities-tushare/SKILL.md 的流程规范:

  1. 先运行 python shanxi-securities-tushare/scripts/check_env.py 校验环境,token 缺失时停下,先提示用户配置。
  2. 调用接口前必须查 shanxi-securities-tushare/references/API接口对应表.md禁止凭记忆写接口
  3. 取数参考 shanxi-securities-tushare/scripts/ 下 demo 模板,按环境校验结果选择 SDK 或 HTTP 方式。

快速入口(默认调用)

本 skill 已封装统一 Runner,Agent 识别标的类型后直接调用对应入口,无需再从原始接口逐条取数:

标的类型模块默认入口示例
股票analysis_runner.pystock_report(ts_code, end_date=None, dimensions=None)stock_report("600519.SH")
基金(场外 .OF / 场内 ETF .SH/.SZ)fund_analysis_runner.pyfund_report(ts_code, end_date=None, dimensions=None)fund_report("110011.OF")
指数index_analysis_runner.pyindex_report(ts_code, end_date=None, dimensions=None)index_report("000300.SH")
期货(主力连续合约)fut_analysis_runner.pyfut_report(ts_code, end_date=None, dimensions=None)fut_report("SR.ZCE")
  • dimensions 为可选维度白名单,默认使用 Runner 内置维度;用户明确"只看估值/技术面"时再传入裁剪。
  • *_report() 返回 HTML 字符串(含 ECharts 图表,内联在对应维度章节),Agent 将其写入 <ts_code>_report.html 落盘;浏览器直接打开。
  • 旧入口 stock_analyzer.py 仍保留为兼容包装,新代码优先使用 analysis_runner.stock_report
  • 各 Runner 内部已实现维度级并行取数,无需 Agent 手动并发。

核心工作流

每次分析按此顺序:

  1. 环境校验 — 运行 python shanxi-securities-tushare/scripts/check_env.py,确认 token 可用,确定 mode(sdk/http)。
  2. 标的识别 — 解析用户表述,确定标的类型 + ts_code。根据代码格式或名称搜索确定。
  3. 维度加载 — 默认加载该标的类型的摘要维度;用户明确指定(如"只看技术面""只看估值")时仅加载指定维度,避免权限/配额不足与超长输出。"全套固定"为默认上限,可裁剪。
  4. 调用 Runner 分析 — 直接调用对应 Runner 的 *_report() / *_analyze() 入口;Runner 内部按默认维度并行取数、计算并生成结构化结果。如需自定义维度,通过 dimensions 参数裁剪。
  5. 综合报告 — 按结构化模板输出 HTML 报告(时间序列图表内联在各维度章节)。

报告必须落盘(强制):每份分析报告必须以 HTML 文件保存到当前项目目录,文件名 <ts_code>_report.html(如 600519.SH_report.html)。CLI 已默认自动保存到当前工作目录并打印保存路径;若通过 Python 接口调用 *_report() 返回 HTML 字符串,则必须由 Agent 将该字符串写入项目目录下的 <ts_code>_report.html 文件。禁止只打印到终端不落盘。报告为独立 HTML(ECharts CDN 渲染,需联网打开),时间序列维度自动生成图表并内联在对应维度章节(如 K线在"行情趋势"、PE/PB 在"估值分析"),其余维度为表格。

标的识别规则

用户表述标的类型说明
600519.SH / 000001.SZ / 920575.BJ股票已标准格式,直接识别。.BJ 为北交所
600519 / 000001股票补全为 .SH/.SZ/.BJ(沪市 600/601/603/605/688,深市 000/001/002/003/300/301,北交所 8 开头)
"茅台"/"贵州茅台"/"平安"股票stock_basic 按名称模糊匹配,取上市状态 L 的股票
000300.SH / 399001.SZ指数标准指数代码,后缀 .SH/.SZ/.SI
"沪深300"/"上证50"指数index_basic 按名称匹配
000001.OF / 110011.OF基金标准基金代码,后缀 .OF 场外/.SZ 场内
"易方达蓝筹"/"招商白酒"基金fund_basic 按名称匹配
RB2501.SHF / CU2403.SHF期货标准期货合约代码
"螺纹钢"/"沪铜"/"原油"期货fut_basic 按名称匹配,获取主力合约

多义性消歧:名称匹配返回多个结果时(如"平安"= 平安银行 000001.SZ / 中国平安 601318.SH),优先按市值排序取最大标的,但必须在报告中注明"匹配到 N 个结果,默认分析市值最大的 XX,如需分析其他请指定代码"。

基金名称匹配的宽匹配陷阱(fund_basic 为子串模糊匹配):名称会命中所有含该词的基金,分析单一标的时必须收敛口径,否则误拉一堆同类基金:

用户表述陷阱正确处理
"创业板ETF""创业板" 会命中 87 只主题 ETF/混合基金用精确代码或名称含"创业板ETF"筛选,且仅取场内 ETF(排除 LOF/联接基金)
"科创50"Tushare 全称"上证科创板50成份ETF",名称含"科创50"的可能是其他产品用名称含"科创板50"或直接按代码识别
"黄金ETF"会误匹配"黄金产业股票ETF"等主题产品名称精确含"黄金ETF"
"沪深300"名称含该词的基金几十只(场内 ETF + 场外联接 + 多只跟踪基金)先定目标类型(场内/场外),再按基金类型字段收敛

名称匹配结果 > 1 时:先按基金类型(场内/场外/联接)与上市状态收敛,仍不唯一再按上述"多义性消歧"规则处理,并在报告中注明匹配数与最终口径。

分析维度(默认全套,按需裁剪)

一、股票(默认 11 维)

每个维度均输出:描述句 → 数据表 → 分析评价

#维度数据接口关键分析指标
1概况stock_basicstock_company公司全称、行业(申万)、上市日期、注册地、员工数、主营业务简介
2行情趋势dailyweeklymonthlydaily_basicadj_factorindex_daily(沪深300+行业指数)近 20/60/250 日涨跌幅(基于复权价)、MA5/MA20/MA60、MACD/RSI/KDJ/布林带、换手率、振幅、波动率、阶段最高/最低;基准对比:对沪深300及所属行业指数计算相同口径的涨跌幅、年化波动率、最大回撤、夏普比率,与标的并列对比(判断超额收益与相对风险)
3估值分析daily_basicindex_dailybasic(行业)、index_member(行业成分股)PE(TTM)、PB、PS(TTM)、股息率、总市值、流通市值;与行业均值对比(取 index_classify 获取行业指数代码 → index_member 取成分股 → 各取 daily_basic PE/PB,先 winsorize_cross_section 截面去极值再求均值/中位数,避免单只异常股拉偏);PE/PB 双口径分位valuation_percentiles:近 5 年历史分位 + 当日同行业截面分位,双口径背离时需找原因)
4财务质量fina_indicatorincomebalancesheetcashflowforecastROE、毛利率、净利率、营收/利润增速(YoY)、资产负债率、经营现金流;业绩预告类型及变动幅度;Piotroski F-Score(9 项量化打分,≥7 强/≤2 弱)
5资金面moneyflowmoneyflow_hsgtblock_trade近 5-20 日主力净流入(注意:net_mf_amount 为全口径净流入,buy_elg_amount - sell_elg_amount 为超大单口径,两者方向可能相反,需按分析目标选择口径)、北向持股变化、大宗交易折溢价/机构买卖方向
6股东/筹码top10_holderstop10_floatholdersstk_holdernumberstk_holdertrade前十大股东/流通股东集中度、股东户数时间序列分析(筹码集中度指标)、大股东增减持方向与比例

筹码集中度分析(股东户数时间序列)

股东户数的时间序列变化是判断筹码集中/分散的核心指标,比单点数值更有意义:

  • 股东户数减少(与筹码集中方向一致):人均持股数增加。这通常是筹码趋于集中的信号,但户数变化仅为相关性,不能直接断言主力吸筹;需结合成交、股价走势与股东结构交叉验证。
  • 股东户数增加(与筹码分散方向一致):人均持股数减少。通常与筹码趋于分散一致,但同样不能直接断言主力派发;需结合量价验证。
  • 分析要点
    • 对比近 4 个季度股东户数变化率,判断趋势方向
    • 结合股价走势交叉验证(均为相关性观察,非因果结论):户数持续下降 + 股价上涨 = 可能筹码锁定(健康上涨特征之一);户数持续下降 + 股价下跌 = 可能主力被套(阶段见底信号之一);户数持续上升 + 股价上涨 = 可能散户接盘(警惕见顶)
    • 使用 stk_holdernumber 接口获取历史数据,按 end_date 排序后计算环比变化率 | 7 | 两融/杠杆情绪 | margin_detail | 融资余额及变化率、融券余额、近5日融资余额变化 | | 8 | 市场异动 | limit_list_dtop_listtop_inst | 近期涨停/跌停记录、龙虎榜上榜次数、机构净买卖 | | 9 | 解禁压力 | share_float | 未来 3 个月即将解禁股份数量及占比 | | 10 | 宏观/市场环境 | index_daily(沪深300)、cn_cpicn_ppishibor_lprcn_gdp | 大盘近期走势、CPI/PPI 走势与方向、LPR 利率水平、GDP 同比 | | 11 | 风险提示 | 汇总以上维度 | 综合风险分级:高/中/低,列出具体风险信号 |

二、指数(默认 8 维)

#维度数据接口关键分析指标
1概况index_basic发布方、基期、基点、类别、上市日期
2行情趋势index_daily近 20/60/250 日涨跌幅、MA 排列、年化波动率、最大回撤、夏普比率;基准对比:对沪深300计算相同口径指标并列对比
3估值index_dailybasicPE(TTM)、PB 历史分位数。注意:index_dailybasic 不覆盖科创板指数(如科创50 000688.SH),此类指数估值降级为用成分股 daily_basic 聚合估算(截面中位数 + 历史分位),并标注数据源
4成分权重index_weight前十大权重股及权重占比,补充股票名称(stock_basic 批量查询)
5行业分布index_weight 获取成分股 + stock_basic 查行业成分股按申万行业归类,统计各行业数量及占比(前三行业占比)
6两融/市场杠杆margin(全市场两融汇总)两市融资余额合计、近一年(250 交易日)变化方向、杠杆情绪判断
7对比index_global与同类指数/国际指数近期表现对比。index_globalts_code 无点前缀(如 DJI/SPX/IXIC/N225/HSI,非 .DJI),代码格式需查 references/国际指数.md 文档。注意:index_global 返回数据为降序(最新在前),计算前必须 .sort_values('trade_date'),否则 iloc 索引取到的日期方向相反,导致涨跌幅方向错误
8风险提示汇总以上维度波动偏高/回撤较深/估值偏高等风险信号

三、公募基金(默认 9 维)

#维度数据接口关键分析指标
1概况fund_basic基金类型、成立日期、上市日期、基金简称
2净值走势fund_navfund_adjfund_daily(场内ETF)近 1/3/6 月、近 1/3 年收益率(基于复权净值);场内 ETF 必须用 fund_daily + apply_etf_adj 复权daily 接口对 ETF 返回空,且不复权价在份额拆分时严重失真)
3业绩指标基于 fund_nav/fund_daily 计算年化波动率、夏普比率、最大回撤
4同类对比fund_basic(筛同类型)、fund_daily/fund_nav(逐只)同类排名(近 20/60/120/250 日分位);ETF 优先选同后缀场内基金对比,按成立日期排序优先选上市早的
5基金经理fund_manager任职起始日、任职年限
6持仓分析fund_portfolio前十大重仓股及占比(stk_mkv_ratio)、补充股票名称;字段为 symbol/mkv/stk_mkv_ratio(非 name/ratio/market_val)
7规模变化fund_share按季度采样(groupby 季度末),近4季份额变化趋势
8分红fund_div累计分红次数、分红金额;字段为 ex_date/div_cash(非 div_date)
9风险提示汇总以上维度回撤较深/波动偏高/份额缩水等风险信号

份额口径声明(规模变化/同类对比维度的评价句必写)fund_share.fd_share单只基金份额。同一指数常有场内 ETF + 场外联接 + 多只跟踪基金并存(如名称含"沪深300"的基金几十只),份额/规模数据均为单只口径,不得表述为"该指数全部基金合计"。评价句必须注明是"XX基金单只份额"还是"场内外合计",避免用户误读为指数整体规模。

四、期货(默认 7 维)

#维度数据接口关键分析指标
1概况fut_basic合约标的、交易所、合约乘数、最小变动价位、交易单位、保证金率
2行情趋势fut_daily(主力连续合约如 JM.DCE/RB.SHF,非具体合约)近 20/60 日涨跌幅、结算价走势、日内振幅、波动率
3持仓分析fut_holding持仓量变化、成交量/持仓量比、前 20 会员持仓多空比
4主力合约fut_mapping主力合约代码、换月日期、基差(现货 vs 期货)
5仓单库存fut_wsr注册仓单量变化、库存/消费比
6结算参数fut_settle当日结算价、交割结算价、保证金调整
7风险提示汇总以上维度波动偏高/换月跳空/持仓异常等风险信号

报告结构

每份分析报告输出为独立 HTML 文件(浏览器直接打开,时间序列图表内联在各维度章节内)。内容结构如下,每个维度按 描述句 → 数据表 → 分析评价 的格式,最后附整体分析评价:

# 标的名称 全景研究报告

> 数据日期:YYYY-MM-DD(Tushare 数据为 T-1 日)

## 1. 概况
描述句(如:银行ETF,华宝基金发行,跟踪中证银行指数,规模居同类前列)
- 关键指标汇总表

## 2. 行情趋势
描述句(近20日涨跌幅、波动率、回撤等核心指标概述)
- 涨跌幅对比表(标的 vs 沪深300并列)
- 风控指标对比表(波动率/回撤/夏普 vs 基准)
- 技术指标表(MACD/RSI/KDJ/布林带合并一张表)
- 进阶量化指标(Beta/Alpha/Sortino/滚动Beta/RS/VaR等)
- **分析评价**:对本维度数据的解读,包含明确的投资参考含义

## 3. 估值分析
描述句(PE/PB/历史分位等概述)
- 估值指标表
- 行业截面估值对比表(如适用)
- **分析评价**:(如"PE历史分位23.7%偏低,PB低于行业中位数,估值需结合业绩增速判断")

## N. 风险提示
- 风险信号 1
- 风险信号 2
- 数据缺失说明(如有维度失败)

## N+1. 整体分析评价
**综合判断**:一句话定位标的特征标签(如"低估值、防御型、高股息")
- 分维度要点列表(趋势/估值/财务/资金/筹码/杠杆/宏观各一行)
**风格定位**:标的属于什么风格型资产
**结论**:综合各维度给出投资参考含义和适用场景

---
*本报告由AI基于山西证券Tushare平台数据自动生成,基于 T-1 日历史数据,仅供技术交流与学习参考,不构成任何投资建议或财务指导。*

每维度分析评价必须包含对投资者的明确参考含义(如"估值处于历史低位,但需结合行业景气度判断"),而非罗列数据。

本报告由AI基于山西证券Tushare平台数据自动生成,基于 T-1 日历史数据,仅供技术交流与学习参考,不构成任何投资建议或财务指导。


多列数据示例(列数必须对齐,如份额一栏拆成两列):

| 标的 | 最新份额 | 份额变化 |
|------|---------|---------|
| 沪深300ETF | 248亿份 | -0.1% |

每维度分析评价必须包含对投资者的明确参考含义(如"估值处于历史低位,但需结合行业景气度判断"),而非罗列数据。

**报告表格约束**:每个 markdown 表格的表头行与数据行的列数必须一致。如果一列有多项数据(如"份额 + 变化率"),要么拆成两列分别填入,要么合并到一列中并调整表头,避免出现空列。
**表格合并建议**:同一维度内的数据优先合并为一张表(如涨跌幅 + 风控指标 + 技术指标合并),避免拆成多个独立表格造成视觉割裂。若列数过多导致横向过长,可分组但需紧邻排列。

## 关键默认值

| 模糊中文 | 默认口径 |
|---------|---------|
| "最近"/"近期" | 近 20 个交易日 |
| "最近三个月" | 近 60 个交易日 |
| "今年" | 当年 1 月 1 日至今 |
| "历史"(股票/指数) | 近 3 年 |
| "历史"(基金) | 成立以来 |
| 证券代码 | 标准 `600519.SH` 格式 |
| 基金代码 | 场外 `.OF`,场内 `.SZ`/`.SH` |
| 期货代码 | 标准 `RB2501.SHF` 格式 |
| 行业分类 | 申万 2021 版 |
| 对比基准(股票) | 所属申万一级行业均值 |
| 对比基准(基金) | 同类基金(同类型+同投资方向) |
| 对比基准(指数) | 沪深 300(000300.SH) |

> **数据充分性**:取数时按最大周期(如"近 250 日")再往前多取 30 个交易日,确保有足够数据计算。寒武纪从 20250801 到 20260812 仅 249 个交易日,不足以计算近 250 日涨跌幅,此时应前移起始日期(如 `start_date = '20250601'`)获取更多数据,或降级为"近 120 日"并标注"数据不足"。
> **数据不足时的报告处理**:若某标的上市不足请求周期(如具体期货合约仅 197 日不足 250 日),则:
> 1. **优先改用主力连续合约**(期货场景)或前移 start_date(股票场景)补充数据
> 2. 若仍不足,计算自上市以来的全长收益率,标注为"数据不足(仅 N 日,自上市 X%)"
> 3. 不可直接显示 N/A——用户无法判断是数据问题还是计算结果问题

## 量化分析方法

### 纵向对比(单标的时间序列)

单标的历史走势分析必须消除除权除息(送股/转增/分红/配股)导致的价格跳变,否则区间收益率和技术指标会失真。

- **股票复权**:`daily` 返回的是**未复权**数据(含除权除息跳变),趋势/收益率/技术指标计算前**必须复权**,否则除权日会产生虚假跳空。取 `adj_factor` 自行计算:
  - 后复权价 = 原始价 × 当日复权因子(`apply_adj_factor` 一并复权 open/high/low/close/pre_close,`*_post` 列同 scale,可安全用于 OHLC 类指标如 KDJ/布林带)
  - 前复权价 = 原始价 × 当日复权因子 / 最新复权因子
  - 长期收益率、定投收益、回撤、技术指标均应基于复权价;⚠️ 切勿用 `close_post` 配合未复权的 `high/low`——scale 不一致会令 KDJ 等指标失真
- **基金复权**:`fund_nav` 返回单位净值和累计净值。计算区间收益率时用 `fund_adj` 复权因子构建复权净值序列,消除分红除权影响:
  - 复权净值 = 单位净值 × 当日复权因子 / 最新复权因子
  - 夏普、最大回撤、Calmar 等指标均基于复权净值序列计算
- **ETF 复权**:`fund_daily` 返回的是不复权价,`apply_etf_adj`(`fund_adj` 因子)产出 `close_post`。**ETF 的 `fund_adj` 因子口径与股票 `adj_factor` 不同(实测方向/量级不统一,如 510500 ~0.34、512100 ~0.373、510300 ~1.27),`close_post` 绝对值非后复权价,仅供收益/夏普/回撤等 scale-invariant 计算(全程同列 pct_change 与因子绝对值无关);展示价用未复权 `close`。** 股票 `adj_factor` 则是标准后复权因子(单调递增,`后复权价=原始价×adj_factor`,可展示)。`apply_*_adj` 返回 trade_date/nav_date 索引的 df,可直接喂给 `rebase_series`/`compare_returns`(二者校验日期索引,传整数索引会抛 TypeError)。
  - **函数选型**:`apply_etf_adj` **只复权 close**(产出 close_post,供收益/夏普/回撤);KDJ/布林带等需 high/low/close 同 scale 的 OHLC 类指标,**改用 `apply_adj_factor`**(它复权全部 open/high/low/close/pre_close,`*_post` 列同 scale,fund_daily 同样适用)。误用 `apply_etf_adj` 喂 KDJ 会因 high_post/low_post 不存在而 KeyError。
- **基金规模取数**:`fund_nav.total_netasset` 是季报口径(稀疏,多为 NaN),仅作季度规模快照;需连续日度规模时用 `fund_share.fd_share`(万份)× `fund_nav.unit_nav` 计算:`规模亿元 = fd_share × unit_nav / 1e4`(先按 trade_date 对齐)。`fund_nav` 同 nav_date 可能有重复行,使用前按 nav_date 去重。
- **期货连续合约**:期货存在换月跳空,纵向分析时用 `fut_mapping` 识别主力合约区间,跨主力合约的连续走势需拼接或用 `fut_daily` 按合约分段分析,不得简单拼接。

### 横向对比(多标的归一化)

多标的横向对比时,不同标的价格量纲不同(如茅台 1500 元 vs 农业银行 4 元),直接比较价格序列无意义,必须归一化。

- **序列归一化(rebase)**:将各标的复权价格序列统一缩放到基准日 = 100,公式:`归一化净值 = 当日复权价 / 基准日复权价 × 100`。基准日取对比区间起点,使得所有标的从同一起跑线出发。
- **收益率对比**:计算各标的同期收益率(近 1 月/3 月/6 月/1 年/YTD),放同一张表横向排序。
- **估值分位数对比**:不同标的 PE/PB 不可直接比绝对值(行业属性不同),应转换为各自近 5 年历史分位数,再横排对比。跨标的截面均值/分位计算前,对截面值先 `winsorize_cross_section` 去极值(MAD 3σ)或直接取截面中位数,避免单只异常股拉偏;估值优先给"历史分位 + 同业截面分位"双口径(`valuation_percentiles`)。
- **财务指标对比**:ROE、毛利率等已是比率指标,可直接横排;营收/利润等绝对值指标应转换为增速(YoY/QoQ)或人均值后再对比。
- **波动率/回撤对比**:年化波动率、最大回撤本身量纲统一,可直接横排;但夏普比率等需确认无风险利率口径一致。

### 进阶量化指标

在基础指标之上,以下方法用于提升分析的深度与科学性:

- **技术指标**:MACD(趋势动能/金叉死叉)、RSI(超买>70/超卖<30)、KDJ(随机指标)、布林带(波动区间/触及上下轨)。MA 单独不足以判断买卖时机,技术指标组合可提供更丰富的信号。
- **历史分位数**:当前 PE/PB 等估值指标在近 5 年历史序列中的百分位排名(`percentile_rank`)。85 分位 = 当前估值高于历史 85% 的时间 → 偏高。
- **Sortino 比率**:夏普的改进版,分母仅用下行波动(仅亏损日的波动率),对不对称收益分布更合理。适合评估基金下行风险控制能力。
- **信息比率(IR)**:超额收益年化 / 跟踪误差年化。衡量基金经理主动选股能力,IR > 0.5 为优秀。
- **Piotroski F-Score**:9 项财务健康量化打分——盈利能力(ROA>0、经营现金流>0、ΔROA>0、经营现金流>净利润)、杠杆/流动/融资(Δ资产负债率≤0、Δ流动比率>0、未新增股本)、运营效率(Δ毛利率>0、Δ总资产周转率>0),总分 0-9,≥7 为强,≤2 为弱。按年报(end_date 1231)去重后取最近 2 期同比,数据来自 `fina_indicator`/`income`/`cashflow`/`balancesheet`(可选)。
- **量价分析**:OBV(能量潮,价升量增=趋势健康)、量比(当日量/近 5 日均量,>2 放量/<0.5 缩量)、量价背离(价升量缩=顶部信号/价跌量缩=底部信号)。
- **Beta/Alpha 归因**:CAPM 回归分解,Beta = 个股对市场的敏感度(>1.2 高弹性/<0.8 防御型),Alpha = 扣除市场收益后的超额收益年化。需取个股与沪深 300 同期日收益率对齐回归。

### 风险建模与分布分析

- **VaR/CVaR(在险价值)**:历史法计算 95%/99% 置信水平的最大日亏损。VaR = 损失分位数,CVaR = 超过 VaR 的平均损失(更保守)。是风险管理的国际标准指标。
- **尾部风险(偏度/峰度)**:偏度 < 0 = 左偏(亏损侧尾部更长,崩盘风险大);峰度 > 0(超额)= 厚尾(极端事件概率高于正态假设)。两者结合可判断收益分布是否偏离正态。
- **回撤深度分析**:在最大回撤之外,补充回撤持续期(水下天数)、痛苦指数(平均回撤深度),衡量"被套牢"的实际体感。
- **Amihud 非流动性**:|日收益率| / 日成交额,衡量单位资金引起的价格变动。值大 = 流动性差,大资金进出成本高。

### 滚动分析与动态监控

- **滚动 Beta**:60 日滚动窗口计算 Beta 变化趋势,展示市场敏感度随时间演变(上升 = 波动加大或防御减弱)。
- **滚动夏普**:60 日滚动窗口的风险调整收益趋势,比单点夏普更能反映稳定性。
- **相对强度(RS)**:标的累计收益 / 基准累计收益,RS > 1 跑赢、< 1 跑输,趋势走强 = 相对优势扩大。

### 统计检验方法

- **Z-Score 标准化**:将指标转为与群体均值的标准差倍数。|Z| > 1.96 = 在 5% 显著性水平下显著偏离。用于跨标的估值/财务指标对比。
- **事件研究法**:估计窗口(事件前 30 日)用市场模型回归估算正常收益,事件窗口(后 10 日)计算异常收益 AR 与累计异常收益 CAR。CAR > 2% = 事件正向显著。适用于财报发布、解禁、增减持等事件冲击分析。
- **CAGR(复合年化增长率)**:基于持有天数精确年化,比简单区间收益率更适合跨周期对比。

## 分析原则

1. **结论先行**:每个维度先写结论句,再给数据,不要只列数据让用户自己判断。
2. **交叉验证**:单一维度信号不充分时,结合多个维度交叉判断(如"资金面流入但估值已高")。
3. **数据时效**:Tushare 数据为 T-1 日,报告顶部注明数据日期。
4. **风险汇总独立成节**:**风险提示必须在报告末尾单独一节**,清晰列出。"前置"指分析过程中随时收集风险信号、最终在末尾汇总呈现,二者不矛盾。
5. **不替用户决策**:分析结论用"表明""反映""风险信号"等描述性语言,不用"建议买入/卖出"。
6. **空结果处理**:空结果不一定是失败——可能是非交易日/标未上市/参数错误/权限不足。区分清楚再下结论。

## 维度状态与部分失败策略

每个维度执行后必须标注以下四态之一,并在报告中体现:

| 状态 | 含义 | 处理 |
|------|------|------|
| `success` | 取数 + 计算均成功 | 正常输出结论与数据表 |
| `empty` | 接口返回空(非交易日/标的未覆盖/无业务) | 该维度标注"无数据(原因)"并跳过,不阻断报告 |
| `permission_denied` | 接口提示无权限/配额不足 | 该维度标注"权限不足",跳过并提示用户,不伪造数据,不终止整份报告 |
| `insufficient_history` | 历史数据不足请求周期 | 降级为可用区间(如近 120 日)并标注"数据不足(仅 N 日)",不直接显示 N/A |

**部分失败原则**:单个维度失败不终止整份报告——已成功的维度照常输出,失败维度按上表降级或跳过,并在"整体分析评价"中说明哪些维度缺失及对结论可信度的影响。仅当核心维度(行情趋势/估值)全部失败时才终止并提示用户。

## 分析反模式(禁止)

- **前视偏差(look-ahead bias)**:计算任何时点指标时,只能用该时点及之前的数据;禁止用未来期财报/未来价格反推当前结论。
- **幸存者偏差**:回看历史表现时,不得只统计仍上市标的,忽略已退市/停牌标的;对比同类时需说明样本是否含退市。
- **报告发布日期泄露**:财报有 `ann_date`(公告日)与 `end_date`(报告期)之别;时点对齐必须用 `ann_date`(公告后才可用),禁止用 `end_date` 当作可用日,否则会"提前"看到未公布的财报。
- **过期业绩预告当最新**:`forecast` 返回该公司**所有历史预告**(按 `ann_date` 窗口筛选),若此后未再发新预告,最新一条可能已很旧。展示必须标注**报告期 + 公告日**;距公告日超 150 天未更新须标注"可能已过期",且不得用它驱动当前的风险/结论信号。
- **基准选择偏差**:对比基准须与标的口径匹配(股票对所属申万一级、指数对沪深 300、基金对同类),不得随意选有利基准美化结论。
- **相关性当因果**:户数变化、资金流向、技术信号与涨跌仅为相关性,禁止表述为"主力在吸筹/派发""必然上涨/下跌"等因果结论。


## 接口调用规则

- 每次调用前必须查 `shanxi-securities-tushare/references/API接口对应表.md` 确认接口名和文档路径。
- 环境校验走 `python shanxi-securities-tushare/scripts/check_env.py`。
- 取数统一走 `sxsc-tushare-analysis/scripts/data_api.py` 的 `DataAPI` 类(SDK/HTTP 双模式自动选择,内置 T-0 占位行过滤、安全调用)。
  - 各 Runner 通过 `DataAPI` 实例调用接口,如 `api.get_daily(ts_code, start, end)`。
  - 日期推算用 `data_api.shift_date(end_date, -n_days)` 回溯交易日。
- 分析计算参考 `sxsc-tushare-analysis/scripts/` 下按方法分模块的参考模板:
  - `basic_metrics.py` — 收益率/MA/波动率/回撤/夏普/Sortino/IR/财务趋势/风险信号
  - `adjustment.py` — 复权处理/序列归一化/收益率对比/历史分位数/Z-Score/`clean_panel`(清洗)/`winsorize_cross_section`(截面去极值)/`valuation_percentiles`(双口径分位)
  - `technical_indicators.py` — MACD/RSI/KDJ/布林带/OBV/量比
  - `risk_modeling.py` — VaR/CVaR/尾部风险/回撤深度/Amihud/滚动Beta/滚动夏普/RS
  - `attribution.py` — CAPM Beta-Alpha/Piotroski F-Score/事件研究法
  - `composite.py` — 跨维度组合分析:技术共振/量价模式/多因子综合评分/三维定位/业绩拐点/配对相对价值/风险预算/筹码-股价交叉
- **字段单位注意**:各接口字段单位不同,取数后必须确认字段含义与单位再计算。常见单位差异:
  - `moneyflow` 的 `*_amount` 字段单位为**万元**,换算亿元需 `/1e4`
  - `daily` 的 `amount` 字段单位为**千元**(即元×1000),换算亿元需 `/1e5`
  - `daily_basic` 的 `total_mv` 字段单位为**万元**,换算亿元需 `/1e4`
  - `margin_detail` 的 `rzye` 字段单位为**元**,换算亿元需 `/1e8`
  - `fund_share` 的 `fd_share` 字段单位为**万份**,换算亿份需 `/1e4`
  - 其他接口以对应接口文档标注为准,不得猜单位
- **场内基金(ETF)特殊处理**:
  - 取数必须用 `fund_daily` 接口(`daily` 对 ETF 返回空)
  - 价格必须用 `apply_etf_adj` 复权(`fund_adj` 复权因子校正),否则份额拆分/分红会导致不复权价严重失真
  - 基金接口字段名与股票不同,**必须查文档确认**(如 `fund_manager` 字段是 `name` 非 `manager_name`,`fund_div` 字段是 `div_cash` 非 `div_amount`)
- **指数成分权重注意**:
  - `index_weight` 的入参是 `index_code`(非 ts_code),输出字段为 `trade_date`/`con_code`/`weight`,无 `con_name` 字段——需用 `con_code` 调 `stock_basic` 获取名称
  - `index_weight` 为**月度数据**(月末发布):取数需用**整月范围**(`start_date`=月初、`end_date`=月末),半月范围或未发布月份返回空;取最新一期权重:先按 `trade_date` 降序取最大日期,再按 `weight` 降序取前 N 行
- **期货接口注意**:
  - 上期所交易所代码是 `SHFE`(非 SHF),大商所是 `DCE`,郑商所 `CZCE`,中金所 `CFFEX`
  - **期货分析必须用主力连续合约**(`fut_basic` 的 `fut_type='2'`,合约代码如 `JM.DCE`/`RB.SHF`),而非具体合约(如 `JM2610.DCE`)。具体合约仅上市约 10 个月(~200 日),不足 250 个交易日;主力连续合约拼接了各时期主力合约,有足够历史数据,且消除换月跳空。
  - 主力合约查询:`fut_mapping` 可能返回空,需用 `fut_basic(exchange=..., fut_type='2')` 获取连续合约代码
  - `fut_holding` 仅覆盖大商所(DCE)合约,SHFE 螺纹钢等无持仓排名数据,需在报告中注明接口覆盖限制
- **北交所股票特殊处理**:
  - 代码后缀为 `.BJ`(如 `920575.BJ`),区别于沪深主板
  - `moneyflow`(个股资金流向)接口不覆盖北交所,资金面维度不可用,需在报告中注明
  - `margin_detail`(融资融券明细)接口对北交所股票通常无数据,两融维度不可用
  - 北交所股票流动性通常低于沪深主板,分析评价中需提示流动性风险
  - 其他接口(`daily`/`daily_basic`/`fina_indicator`/`stk_holdernumber` 等)正常可用
  - `fut_wsr` 用 `trade_date` + `symbol`(产品代码如 `JM`/`RB`),返回各仓库明细须按 `symbol` 汇总 `vol`;`ts_code` 参数无效
  - `fut_settle` 返回降序数据(最新在前),取最新行需 `iloc[0]`;最新交易日结算中时 settle/保证金率为 NaN,需 `dropna(subset=['settle'])` 取最近有值行
- **宏观/市场接口参数注意**(参数风格不统一,易错):
  - `cn_cpi`/`cn_ppi` 用 `start_m`/`end_m`(**月份 YYYYMM,非 start_date/end_date**);CPI 同比字段是 `nt_yoy`(非 nt_m),PPI 同比字段是 `ppi_yoy`(非 ppi)
  - `shibor_lpr` 用标准 `start_date`/`end_date`(与 cn_cpi/cn_ppi 不同,勿混用)
  - `margin`(全市场两融汇总)的交易所参数/字段是 `exchange_id`(非 `exchange`),`rzye` 单位为元
- **指数成分权重参数注意**:`index_weight` 的入参是 `index_code`(**非 ts_code**,传 ts_code 会报 "index_code required");输出字段为 `trade_date`/`con_code`/`weight`
- 日期格式统一 `YYYYMMDD`。
- 未来日期自动裁剪到最近可用日期并提示用户。
- **T-0 占位行处理**:Tushare 数据为 T-1,`end_date` 传当天时行情接口(`daily`/`fund_daily`/`index_daily` 等)会返回当天行但全字段为 NaN(T-0 数据未出)。取数后必须 `dropna(subset=['close'])` 去掉占位行,否则 `iloc[-1]` 取到 NaN 导致后续计算全错。
- **交易日计数**:"近 N 个交易日"需调 `trade_cal` 获取交易日历,按实际交易日回溯,不得按自然日估算。
- **数据排序规范**:所有 `pro.*` 接口均返回**降序**数据(最新在前),包括 `index_daily`、`daily`、`index_global`、`fut_settle` 等。**任何涉及 `iloc[-1]`(取最新)或区间涨跌幅的计算前,必须先 `.sort_values('trade_date')` 确认升序**,否则取到的日期方向相反,导致结论方向错误。取数函数(如 `get_daily_for_period`)已内置排序,但直接调用 `pro.*` 时必须自行处理。

## 边缘情况处理

- **ST/*ST 股票**:2026-07-06 起 ST 股涨跌停幅度已调整为 10%(与普通股一致),此前为 5%;分析涨跌停维度时需注意日期界限,`stk_limit` 返回的涨停价会体现对应时期的幅度。
- **次新股/上市不足 1 年**:历史数据不足 250 个交易日时,MA250、年化波动率等指标不可用或不稳定,应标注"数据不足"并降级为可用区间(如近 60 日)。
- **停复牌**:停牌期间价格序列出现断裂,`suspend_d` 接口可查停复牌记录;计算收益率/MA 时需跳过停牌日,不得用停牌前价格填充。
- **数据质量异常**:如 `fund_portfolio` 返回 ratio 全为 0(IPO 打新微量持仓等场景),应标注"数据异常"而非当作正常持仓分析。

## What this skill is NOT for

- 买卖建议、替代投资顾问
- 自动下单或交易执行
- 实时行情(仅 T-1 日数据)
- 回测引擎、组合优化系统的实现
- 公告/新闻/研报直连数据(应告知限制,建议改查价格异动、资金流等替代)
- 无 token / 无权限时伪造数据

## 依赖

- `shanxi-securities-tushare` 数据 skill(必须在本项目同级目录下)
- 环境变量 `SXSC_TUSHARE_TOKEN` 已配置
- `sxsc_tushare` 库或 HTTP 协议通道(按环境校验结果自动选择)

Related Skills