用 Claude Custom Skill 构建财务报表比率分析器:从 SKILL.md 到可落地的财务分析引擎
【免费下载链接】claude-cookbooksA collection of notebooks/recipes showcasing some fun and effective ways of using Claude.项目地址: https://gitcode.com/GitHub_Trending/an/claude-cookbooks
Claude Skills 允许开发者以"目录 + SKILL.md + 可执行脚本"的形式,把特定领域的专业知识打包成可被 Claude 动态加载的能力。本篇文章以 claude-cookbooks 仓库中的 analyzing-financial-statements 自定义技能为完整范本,讲解如何设计一份财务比率计算技能——包括六大类财务比率的指标体系、输入输出约定、两条核心 Python 脚本的计算原理,以及如何在 Jupyter Notebook 中把它上传、测试并用于实际投资分析。读完本文,你将掌握自定义财务分析类 Skill 从目录结构、Frontmatter 编写到代码实现的完整方法论。
技能目录与 Frontmatter:Skill 的"身份证"
Custom Skill 的目录结构遵循统一约定,SKILL.md是唯一必需文件,其余脚本、资源均为可选。analyzing-financial-statements 目录下共包含三个文件:
skills/custom_skills/analyzing-financial-statements/ ├── SKILL.md # 技能说明(必需):Frontmatter + 指令正文 ├── calculate_ratios.py # 计算引擎:全部财务比率的计算实现 └── interpret_ratios.py # 解释模块:行业基准对比、趋势分析与报告生成SKILL.md开头是 YAML Frontmatter,定义了 Claude 在**加载阶段(Metadata Stage)**最先看到的两项信息,它们决定了技能何时被检索、被调用:
--- name: analyzing-financial-statements description: This skill calculates key financial ratios and metrics from financial statement data for investment analysis ---按仓库 Notebook 与 Skills 文档规范,name采用小写字母与连字符(本技能即analyzing-financial-statements),建议控制在 64 字符内;description用于能力描述与触发匹配,建议不超过 1024 字符。Frontmatter 之下才是指令阶段的正文:能力清单、使用步骤、输入输出格式、最佳实践与局限性——这些构成了 Claude 执行任务时的行为准则。
渐进式披露(Progressive Disclosure)机制贯穿始终:元数据阶段始终可见以触发匹配;指令阶段(
SKILL.md等所有.md文件)在主题相关时才加载;calculate_ratios.py、interpret_ratios.py等脚本属于资源阶段,仅在需要执行计算时才按需读取。这正是该技能把"知识"与"代码"分层放置的设计逻辑。
能力边界:技能覆盖的六大财务比率体系
SKILL.md的 Capabilities 一节给出了技能的完整计算域。技能的定位是"财务健康体检",覆盖公司经营分析的常见维度:
| 类别 | 包含比率 | 分析意义 |
|---|---|---|
| 盈利能力(Profitability) | ROE、ROA、毛利率、营业利润率、净利率 | 企业赚取利润的能力与股东回报水平 |
| 流动性(Liquidity) | 流动比率、速动比率、现金比率 | 短期偿债能力与营运资金充足度 |
| 杠杆/偿债(Leverage) | 资产负债率(Debt-to-Equity)、利息保障倍数、偿债覆盖率 | 资本结构与长期偿债风险 |
| 运营效率(Efficiency) | 资产周转率、存货周转率、应收账款周转率 | 资产使用效率与营运管理质量 |
| 估值(Valuation) | P/E、P/B、P/S、EV/EBITDA、PEG | 市场对公司的定价水平与相对贵贱 |
| 每股指标(Per-Share) | EPS、每股净资产、每股股息 | 普通股股东视角下的收益与权益 |
这些分类并非只停留在文档层面,而是完整映射到了 calculate_ratios.py 中FinancialRatioCalculator类的五个分组方法上:calculate_profitability_ratios()(L33)、calculate_liquidity_ratios()(L61)、calculate_leverage_ratios()(L82)、calculate_efficiency_ratios()(L106)与calculate_valuation_ratios()(L130)。因此,只要补充每股股息口径的数据字段,技能便可覆盖文档声明的全部指标。
三步使用流程与真实输入格式
SKILL.md把技能的交互收敛为三个步骤:输入报表数据 → 指定要计算的比率(或使用 "all")→ 获得计算结果与行业解读。典型触发语句包括:
"Calculate key financial ratios for this company based on the attached financial statements" "What's the P/E ratio if the stock price is $50 and annual earnings are $2.50 per share?" "Analyze the liquidity position using the balance sheet data"技能可接受的输入格式有四种:财务科目行的CSV、结构化报表的JSON、关键财务数据的文本描述,以及含财务报表的Excel 文件。其中 JSON 是底层引擎最直接的输入形态——calculate_ratios.py 的FinancialRatioCalculator.__init__(L13-L25)会把传入字典拆解为四个命名空间:
income_statement:利润表科目,含revenue、cost_of_goods_sold、operating_income、ebit、ebitda、interest_expense、net_income;balance_sheet:资产负债表科目,含total_assets、current_assets、cash_and_equivalents、accounts_receivable、inventory、current_liabilities、total_debt、current_portion_long_term_debt、shareholders_equity;cash_flow:现金流量表科目(operating_cash_flow等,为未来的现金流指标预留);market_data:市场数据,含share_price、shares_outstanding、earnings_growth_rate。
脚本文件末尾(L310 起)自带一份可直接运行的示例数据——收入 100 万美元、总资产 200 万美元、股本 150 万美元、股价 50 美元等——演示了文本/CSV 输入如何被结构化后喂给计算引擎。将SKILL.md中"文本描述财务数据"的能力与源码字典结构对照即可发现:Claude 的工作就是把非结构化输入翻译成上述四个字典字段再交给脚本。
输出格式与解读报告
依据SKILL.md,计算结果应包含:计算出的比率与数值、可用时的行业基准对比、多期数据时的趋势分析、解读与洞见,以及格式化的 Excel 报告。这一"输出规范"与 interpret_ratios.py 的实现一一呼应:
- 数值:
calculate_ratios.py中format_ratio()(L229-L240)按指标性质输出%(毛利率、ROE 等百分比型)、x(周转/保障倍数)、days(应收天数)或$(每股金额); - 行业基准对比与解读:
RatioInterpreter内置BENCHMARKS行业基准表(L13-L48),支持technology、retail、financial、manufacturing、healthcare五个行业及兜底的general基准,逐项给出 Excellent/Good/Acceptable/Poor 评级和行动建议; - 趋势分析:
analyze_trend()(L187-L227)对比首末两期数值计算变化幅度与方向,识别 Stable/Improving/Deteriorating 趋势(对杠杆类指标方向判定相反); - 综合洞见:
perform_comprehensive_analysis()(L261-L311)汇总"当期分析 + 趋势分析 + 整体健康度 + 优先级建议",_assess_overall_health()(L314-L350)将各比率评级折算为 4 分制得分并给出公司财务健康度的整体判定,generate_report()(L229-L258)则生成格式化的分析报告文本。
也就是说,interpret_ratios.py不只是简单翻译数值,而是通过基准分级、方向判定、评分汇总三层逻辑,把裸数值转化为可辅助决策的结论。这与文档中"Industry benchmark comparisons、Trend analysis、Interpretation and insights"的输出承诺完全对应。
计算引擎逐类拆解:六类比率的公式来源
下面结合calculate_ratios.py各方法,逐类核对指标公式,方便你在改造技能时增减字段口径。
盈利能力(L33-L59)
- ROE =
net_income / shareholders_equity; - ROA =
net_income / total_assets; - 毛利率 =
(revenue - cogs) / revenue(内部先计算gross_profit); - 营业利润率 =
operating_income / revenue; - 净利率 =
net_income / revenue。
流动性(L61-L80)
- 流动比率 =
current_assets / current_liabilities; - 速动比率(酸性测试)=
(current_assets - inventory) / current_liabilities,即剔除存货的流动资产口径; - 现金比率 =
cash_and_equivalents / current_liabilities,最严苛的短期偿付口径。
杠杆/偿债(L82-L104)
- 资产负债率 D/E =
total_debt / shareholders_equity; - 利息保障倍数 =
ebit / interest_expense; - 偿债覆盖率 DSCR =
operating_income / (interest_expense + current_portion_long_term_debt)——分母即当期需偿还的本息总和。
运营效率(L106-L128)
- 资产周转率 =
revenue / total_assets; - 存货周转率 =
cogs / inventory; - 应收账款周转率 =
revenue / accounts_receivable; - 顺带推导应收账款周转天数 DSO =
365 / receivables_turnover。
估值与每股指标(L130-L166)
- EPS =
net_income / shares_outstanding;P/E =share_price / EPS; - 每股净资产 BVPS =
shareholders_equity / shares_outstanding;P/B =share_price / BVPS; - P/S =
market_cap / revenue(市值 = 股价 × 总股本); - EV/EBITDA =
(market_cap + total_debt - cash) / ebitda(企业价值扣除现金后对 EBITDA 的倍数); - PEG 仅在
earnings_growth_rate > 0时计算,即PE / (growth_rate × 100),规避负增长导致的无意义结果。
关键工程细节:除零保护。所有除法都经由safe_divide()(L27-L31)——分母为零时返回默认值 0.0,而不是抛 ZeroDivisionError。这让脚本在遇到缺失科目或零值字段时仍能稳定运行,是财务数据常不完整场景下的必要健壮性设计。
在 Notebook 中创建、上传并实测该 Skill
在 skills/notebooks/03_skills_custom_development.ipynb 中,该技能被作为"自定义技能开发"第一个完整示例(L352 起)进行演示,完整链路为:
- 初始化客户端与目录(L113-L124):读取
ANTHROPIC_API_KEY,以anthropic-beta: skills-2025-10-02头创建Anthropic客户端,SKILLS_DIR = Path.cwd().parent / "custom_skills"; - 清理潜在同名冲突(L305-L345):调用
list_custom_skills(client)检查是否已存在名为 "Financial Ratio Analyzer" 的技能,存在时先delete_skill()删除旧版本,避免上传时报cannot reuse an existing display_title; - 上传技能目录(L380-L403):
create_skill(client, str(financial_skill_path), "Financial Ratio Analyzer")底层调用client.beta.skills.create(display_title=..., files=files_from_dir(skill_path)),把整个analyzing-financial-statements目录打包上传,成功后可取回skill_id与latest_version; - 实测技能(L421-L453):以文本形式输入一份迷你财务数据(收入 $1,000M、EBITDA $200M、净资产 $1,200M、股价 $50、股本 100M 等),调用
test_skill(client, financial_skill_id, test_prompt)触发一次包含该 custom skill 的 Messages API 请求,从响应中提取文本输出作为验证。
这套流程揭示了 Skill 的运行时机制:Claude 收到用户的分析请求后,依据元数据匹配到该技能,加载SKILL.md指令,再把计算逻辑"外包"给捆绑脚本执行——脚本负责确定性数值计算,Claude 负责字段映射、结果组织与自然语言表达。可配合参考仓库中 sample_data/financial_statements.csv 这类报表样例,快速构造更真实的测试输入。
解读引擎:行业基准、趋势与行动建议的落地细节
如果说calculate_ratios.py解决"算得准",interpret_ratios.py则解决"看得懂"。其内部采用评级取向分治的策略:
- 越高越好型(
current_ratio、roe、gross_margin):值达到excellent/good/acceptable基准线即依次评为 Excellent → Good → Acceptable,低于最差线则为 Poor; - 越低越好型(
debt_to_equity):反向比较,低于excellent阈值才是 Excellent("资本结构非常保守"); - 估值语境型(
pe_ratio):区分负盈利(PE ≤ 0)与正盈利区间,再按 undervalued/fair/growth/expensive 四档给出"潜在低估/合理/成长溢价/高估"评级。
每个评级还会通过_get_recommendation()(L153-L185)映射到一句可执行建议,例如流动比率 Poor 时建议"改善营运资金管理、降低短期债务或增加流动资产",ROE Poor 时建议"聚焦运营效率与盈利能力改善"。在_generate_key_recommendations()(L353 起)中,所有 Poor 评级会升级为 "Priority:" 前缀的最高优先级建议,配合趋势下滑的 "Monitor:" 条目,最终返回不超过 5 条的精炼行动清单。
最佳实践与已知局限
SKILL.md沉淀了此类技能在真实财务分析中的工程纪律,写作与扩展技能时应一并遵守:
- 计算前校验数据完整性:脚本对各字段用
.get(key, 0)兜底,缺字段返回 0,但零值本身可能就是异常信号(如股本为零导致 ROE=0); - 合理处理缺失值:用行业均值补全或剔除该指标,避免静默扭曲结论;
- 解释时必须考虑行业语境:同一 D/E 在金融业(基准可接受值 4.0)与科技业(可接受值 1.0)含义天差地别,务必选择匹配的行业基准;
- 提供多期数据做趋势对比:
analyze_trend()要求至少两个时期的数据,单期输入只能给出截面结论; - 标记异常/令人担忧的比率:生成报告时对 Poor 评级与恶化趋势做显式标注。
同时需要正视文档声明的局限:分析依赖准确完整的财务数据;BENCHMARKS基准表是简化的通用指导值(各行业实际阈值需随业务调整);部分比率并非适用所有行业(如银行报表中 D/E、存货指标口径特殊);历史数据不能保证未来表现,任何结论都不应替代专业财务意见。从实现看,interpret_ratios.py 注释也明确写明基准为 "simplified for demonstration"——扩展技能时建议把行业基准表升级为可外部配置的数据源,并结合 applying-brand-guidelines 等技能共同使用的组合式工作流,把财务分析结果直接落入品牌化报表。
小结
analyzing-financial-statements是一个"文档即接口、脚本即实现"的典型自定义 Skill 范本:SKILL.md定义了技能的触发方式、能力边界与行为准则,calculate_ratios.py以字段化字典与除零保护实现了六大类比率与每股指标的计算,interpret_ratios.py则通过行业基准分级、趋势方向判定与综合健康度评分把数值翻译为可执行建议。开发者可参照该结构,把任意分析领域(估值建模、SaaS 指标、成本分析)的知识沉淀为同样的三层架构——这也正是 Skills 机制区分于普通提示词的工程价值所在。
【免费下载链接】claude-cookbooksA collection of notebooks/recipes showcasing some fun and effective ways of using Claude.项目地址: https://gitcode.com/GitHub_Trending/an/claude-cookbooks
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考