拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

AI投研Skill实战:从Prompt翻车到流程化分析

AI投研Skill实战:从Prompt翻车到流程化分析

先说一个我自己踩过的坑。前阵子把同一家公司的财报丢给不同的AI对话窗口,让它们各自写一份投资分析,结果十个窗口给了我十套完全不同的框架:有的只看利润增速,有的偏重现金流,有的干脆把资产负债表整个漏掉了。更麻烦的是,个别AI还一本正经地给我编了几个关键财务数字——要不是我手头刚好有原始报表可以核对,差点就被带偏了。所以我现在特别强调一个观点:让AI做投研,问题通常不是模型不够聪明,而是你给它的工作方式不对。

后来我把整套研究流程封装成了一个AI投研skill,简单说就是在Claude、ChatGPT、Cursor这些AI工具里安装一个专门做投资研究的能力包。装了它之后,AI不再凭借记忆自由发挥,而是按照固定的数据抓取、财务体检、估值测算、风险排查流程去干活,最后输出一份结构统一的报告。这篇文章就把我这套skill的目录结构、设计原理、落地步骤和踩过的坑完整分享出来,适合自己平时用AI做研究分析、想给AI装“专业技能”的读者,也适合对Agent Skills机制好奇、想搞懂skill到底怎么设计的朋友。

1. 为什么直接让AI聊投研总是翻车:Prompt式问法的三个硬伤

很多人在用AI做投研的时候,习惯把问题写成一段很长的Prompt,比如“请分析一下某公司的基本面,包括财务数据、成长性、估值和风险”。看起来要求提得很全面了,但实测下来,这种方式至少有三个绕不过去的硬伤。

第一个是数据幻觉。大模型的训练数据存在截止日期,它对一家公司“最新财报”的认知很可能停留在一年多以前。你问它某只股票的市盈率是多少,它会很自信地从记忆里翻出一个数字告诉你,但这个数字对应的可能是完全不同的报告期。我见过最离谱的一次,AI把某公司三年前的净利润当成最新的,还煞有介事地分析了半天增长趋势。在投研场景里,这种错误是致命的,因为所有结论都建立在底层数据之上,数据错了,分析框架再漂亮也没用。

第二个是分析框架漂移。同样一句话问十次,AI给出来的分析维度可能每次都不一样。这次它重点讲盈利能力,下次它重点讲行业格局,再下次又变成讲管理层。不是说这些角度不对,而是它们没有对齐,导致你没法横向比较不同公司的报告。投研最忌讳的就是没有稳定尺子,今天用A标准量,明天用B标准量,最后你根本判断不了哪家公司更优质。

第三个是缺少验证链路。Prompt式问法产出的是一段流畅的文本,文本里不会告诉你每个数字的来源是哪里、统计口径是什么、截至哪个时点。你想复核都不知道从哪下手。如果你用这些内容去做投资决策,等于把身家性命交给一个无法溯源的黑箱。

Skill要解决的,正是这三件事。它不改变模型本身的推理能力,而是改变模型的工作环境:把数据获取从“AI记忆”切换成“脚本实时拉取”,把分析结构从“每次随机生成”锚定成“固定模板”,把输出内容从“纯文本自由发挥”改造成“带来源、带口径、带基准日期的结构化报告”。本质上,skill就是让AI从一个“什么都敢说”的聊天对象,变成一个“按流程办事”的分析员。

这里放一张我在实践里常用的对比表,方便你看清楚差距:

环节纯Prompt直问Skill方式
底层数据模型记忆,有时过时甚至编造脚本调用公开数据接口,实时获取
分析维度每次随机,逻辑不统一模板锚定,所有报告结构一致
输出格式散文式文本,难以核对Markdown表格+固定字段,可追溯
异常处理AI会圆场,不会承认不知道脚本失败时明确报错,宁缺毋滥
复盘能力前后分析互不关联历史报告归档,可对比迭代

看到差距之后,你大概能理解为什么我强烈建议把投研流程做成skill,而不是每次手写Prompt。接下来我就把这套skill的具体设计拆开讲。

2. 一套能落地的AI投研Skill:目录结构、SKILL.md与数据流设计

要做一个能真正跑起来的AI投研skill,首先要理解skill在AI工具里的基本存在形式。以目前主流方案为例,一个skill通常就是一个文件夹,文件夹里有说明文件、脚本、模板和参考文档。模型通过读取说明文件来理解“什么时候该用这个技能”和“这个技能具体怎么执行”。我的这套skill目录结构长这样:

ai-investment-skill/ ├── SKILL.md # 技能说明入口,模型先读这个 ├── scripts/ │ ├── fetch_quotes.py # 拉取实时行情 │ ├── fetch_financials.py # 拉取三大财务报表 │ └── fetch_news.py # 拉取近期新闻用于舆情分析 ├── templates/ │ ├── company_health.md # 财务体检报告模板 │ ├── valuation_report.md # 估值分析模板 │ └── risk_checklist.md # 风险排查清单 └── references/ └── methodology.md # 分析框架说明,权重和判断标准

这个结构里最重要的文件是SKILL.md,它相当于技能的“使用说明书”。模型每次决定要不要调用这个skill,或者调用之后按什么步骤执行,都是先读这个文件。我的SKILL.md开头长这样:

--- name: investment_research description: 投资研究助手。当用户要求分析某家公司的基本面、查看财务数据、 估算估值、排查投资风险或撰写投研报告时,优先使用本技能。 input_schema: type: object properties: symbol: type: string description: 公司股票代码或公司名称 depth: type: string enum: [quick, standard, full] default: standard --- # 投资研究技能说明 1. 收到用户请求后,先确认需要分析的股票代码和目标公司。 2. 调用 scripts/fetch_financials.py 获取最近三年的财务数据。 3. 调用 scripts/fetch_quotes.py 获取最新行情和历史估值数据。 4. 依次读取 templates/ 下的三个模板,按模板结构组织输出。 5. 报告中所有数字必须标注数据来源和统计口径,禁止凭记忆生成数值。 6. 如果脚本调用失败,必须明确报告失败原因,不允许用推测数据填充。

这段说明看起来简单,但里面每一句话都是我踩过坑之后提炼出来的。比如“禁止凭记忆生成数值”,这句话不加进去,模型很容易在脚本结果不够完整的时候自作主张补一个“约等于”的数字。再比如“必须标注数据来源和统计口径”,这一条确保输出不是无源之水,复核时一分钟就能追到根。

接着说数据流。一个有效的投研skill,数据流是这样的:用户触发请求之后,模型先读取SKILL.md理解流程,然后决定去调用哪个脚本、以什么参数调用。脚本拿到结构化数据之后返回给模型,模型把这些数据填进模板里,经过推理和分析,最终产出一份带数据锚点的报告。整个链路里,脚本是唯一的数据来源,模型只负责阅读和分析数据,不负责产生数据。这样做的好处是把“事实”和“观点”分开:事实来自接口,观点来自模型,两者互不污染。

数据源选型也是关键一环。我实测过几类公开接口,整理成表格给你参考:

数据源覆盖范围成本稳定性与注意事项
AKShare以A股为主,含基金、债券、宏观数据免费开源社区维护,接口偶尔变动,需要关注更新
TushareA股数据较全积分制,部分接口要积分稳定但高级接口有权限门槛
Alpha Vantage美股和全球主要市场免费额度有限有每日请求次数限制
Yahoo Finance全球市场免费非官方接口,字段可能调整

我自己的主力方案是AKShare加Alpha Vantage的组合:A股分析用AKShare,美股分析用Alpha Vantage。选型逻辑很朴素——先满足数据可得性,再考虑免费额度和维护活跃度。你要做自己的skill时,也建议先确认目标市场和数据源是否匹配,别辛辛苦苦写完脚本才发现接口权限不够。

3. 把分析拆成四个模块:财报体检、估值测算、舆情打分、风控清单的重活怎么干

SKILL.md和目录结构只是骨架,真正的血肉是脚本和模板。我把投研分析拆成四个模块,每个模块解决一个特定问题,模块之间互不干扰,组合起来就是一份完整报告。

3.1 财报体检模块:三张报表与一组硬指标

财报分析是所有投研的起点。我的fetch_financials.py负责拉取目标公司最近几年的利润表、资产负债表和现金流量表关键字段,然后在模板里按体检项逐一呈现。脚本的核心逻辑是这样:

import akshare as ak def fetch_financials(symbol: str): # 实际项目中把 <股票代码> 替换为目标公司代码 # 以获取资产负债表、利润表、现金流量表的关键数据为例 balance_sheet = ak.stock_balance_sheet_by_report_em(symbol=symbol) income_statement = ak.stock_profit_sheet_by_report_em(symbol=symbol) cash_flow = ak.stock_cash_flow_sheet_by_report_em(symbol=symbol) return { "balance_sheet": balance_sheet.head(10), "income_statement": income_statement.head(10), "cash_flow": cash_flow.head(10), }

代码只是示意,不同版本接口字段会变化,你实际写的时候以官方文档为准。重点是拉下来之后,模板里至少要覆盖这些体检项:

  • 成长性:营收同比增速、净利润同比增速,连续三年以上才有参考价值
  • 盈利质量:毛利率、净利率、ROE、ROIC,ROE要结合负债率一起看,高杠杆推高ROE不算真本事
  • 现金流质量:经营现金流净额与净利润的比值,长期小于1说明利润含金量存疑
  • 资产结构:资产负债率、流动比率、商誉占总资产比例,商誉过高是减值的雷
  • 营运效率:存货周转天数、应收账款周转天数,应收账款增速若显著高于营收增速要特别警惕

用体检思路做财报分析,最大的好处是防止漏项。普通Prompt方式下AI经常会“挑喜欢的讲”,但体检表逼着它对每一个项目都给结果,要么打勾要么打叉,不能回避。

3.2 估值测算模块:历史分位和简化模型

估值模块我分成两层:一层是相对估值的历史分位,另一层是简化版的绝对估值。

历史分位的意思是,把当前市盈率、市净率、市销率放到过去三到五年的分布里看,算出它处于什么百分位。这个指标比单纯看绝对值有意义得多,同样是20倍PE,放在一家常年30倍PE的成长股身上可能是低估,放在一家长期15倍PE的周期股身上可能就是高估。所以我让fetch_quotes.py不仅拉当前价格,还拉历史估值序列,然后让AI基于百分位做判断。

绝对估值我用的是简化DCF思路,但有个重要设置:我要求AI输出的是一个区间,不是精确数字。因为DCF模型的假设参数太敏感,折现率差一个百分点,估值结果能差出20%。AI没有能力精确预判未来现金流,硬给一个精确值反而是虚假精确。实操模板里我固定了假设条件:未来五年自由现金流增速、永续增长率、折现率区间,每个都给出可调整的范围,AI只能在范围内取值,并在报告里写明自己用了哪组假设。

3.3 舆情打分模块:不靠AI拍脑袋的情绪判断

舆情分析最容易翻车,因为让大模型直接评价“市场情绪怎么样”,它给出的常常是一段听起来很有道理但无法量化的话。我的做法是让脚本先做客观打分,模型再做综述。

fetch_news.py拉取目标公司近期新闻标题,然后用一个关键词权重字典对每一条做正负打分:出现“中标、增长、超预期、回购”这类词加一分,出现“处罚、下滑、诉讼、减持”这类词减一分,中性词记零分。最后汇总出一个区间在-1到1之间的情绪指数,并统计正负面新闻的数量占比。

这个打分结果只是原材料,模型拿到之后再做二次判断。比如某家公司虽然近期正面新闻占比高,但如果都是公告类资讯,参考意义就要打折。这样设计的好处是,舆情判断有了客观数据底座,不是说模型觉得“市场情绪好像还行”就这样写报告了。

3.4 风控清单模块:把风险排查变成打勾题

风险排查我直接做成清单式模板,模型按顺序逐项核对,每项都要给数据证据和判断结论。模板里的检查项一部分是通用的,一部分我会根据行业特征微调:

## 风控检查清单 - [ ] 经营现金流是否连续三年为正 - [ ] 资产负债率是否处于行业中位数以下 - [ ] 短期有息负债是否超过货币资金(偿债压力检查) - [ ] 应收账款增速是否显著高于营收增速 - [ ] 商誉占总资产比例是否超过预警线 - [ ] 大股东质押比例是否过高 - [ ] 存货周转天数是否连续上升 - [ ] 公司是否最近一年内有重大诉讼或行政处罚

每一项后面的判断都不能是“暂无风险”四个字就完事,必须给出数据支撑。比如“短期有息负债是否超过货币资金”,AI需要把财报里的数字列出来,自己做个减法再判断。这个过程把AI从“写文章的人”变成了“填检查单的人”,解释空间被大幅压缩,质量自然稳了。

3.5 模板结构:让AI填表,不让它写散文

四个模块都完成后,最终输出模板是把它们组合起来。我的company_health.md和valuation_report.md会规定报告必须包含的章节顺序和表格字段,比如:

  • 开头是“分析摘要”,包含目标公司、报告日期、数据基准日
  • 然后是财务体检表,每项指标一行,列分别是“指标名称、数值、行业参考、判断”
  • 接着是估值分析,给“当前PE历史分位、PB分位、简化DCF区间”等
  • 再往下是舆情与风控
  • 最后固定一个风险提示:本报告由AI自动生成,仅供研究参考,不构成投资建议

这个结构一旦固定,所有公司都用同一套语言体系呈现,横向对比变得非常高效。我后来看报告的时候,基本只看“分析摘要”和体检表就能快速定位问题,不需要再翻大段文字。

4. 从零装一个AI投研Skill:宿主环境、脚本调试和验收清单

光有设计还不够,关键是要能让它跑起来。下面是我自己从零安装到验证通过的完整路径。

4.1 先把skill放进宿主环境

不同AI工具的skill安装位置不一样,我实测过几种主流方案。Claude系工具一般会把skills放在~/.claude/skills/目录下(Windows对应%USERPROFILE%\.claude\skills\),你把整个ai-investment-skill文件夹放进去就行。Cursor这类编辑器项目级skill则习惯放在项目根目录的.cursor/skills/下,用户级skill放在主目录的.cursor/skills/下。

安装只有两步:第一步,把整个文件夹复制到对应目录;第二步,重启或刷新工具让它识别到新的skill。装完可以先问一句“你现在有哪些可用技能?”如果工具把investment_research列出来了,说明识别成功了。

4.2 调试脚本:先把数据链路打通

在让模型使用skill之前,我强烈建议先单独把脚本跑通。以AKShare为例:

cd ai-investment-skill/scripts pip install akshare pandas python -c "import akshare as ak; print(ak.__version__)"

然后写一个极其简单的最小验证,比如随便拉一个目标公司代码的日线数据,看能不能返回DataFrame。这一步过了,代表数据源链路是通的,接下来才把接口集成进fetch_financials.py。如果一开始就把复杂逻辑和异常处理全写完再调试,出问题时根本分不清是网络问题、接口变动还是代码逻辑问题。先跑通最小链路,再逐步加功能,这个顺序能省非常多时间。

4.3 写模板:质量的核心在约束

模板的写法直接影响最终报告长什么样。我写模板时遵循一个原则:能填表的地方绝不写自由文本。凡是可以用表格表达的维度,都先画好表格框架,留出变量位置,AI只需要把数字填进去。比如财务体检表,模板里会这样写:

| 体检项 | 数值 | 行业参考 | 判断 | | --- | --- | --- | --- | | 营收同比增速(近三年均值) | {{latest_revenue_growth}}% | {{industry_revenue_growth}}% | {{growth_judgment}} | | ROE(最新年度) | {{latest_roe}}% | {{industry_roe}}% | {{roe_judgment}} |

{{}}占位符让AI明确知道哪里填什么。它不需要考虑结构怎么组织,只需要读取脚本结果并填入对应位置就行。填完之后再加入一句简短判断,说明这个指标为什么好或者为什么差。这样写出来的报告,每家公司都是同一张表,逻辑完全可比。

4.4 验收清单:怎么判断skill是否真的有效

装完不是终点,验收才是。我会用同一个测试案例跑三遍以上,然后对照这份清单逐项打勾:

  • [ ] 模型是否主动调用了脚本,还是靠自己记忆编数据(观察输出里是否带数据来源即可判断)
  • [ ] 报告里出现的每个财务数字,能否在脚本返回数据里找到原始出处
  • [ ] 模板中的每个表格字段是否全部有值,有没有留空或“暂无”敷衍
  • [ ] 估值结果是否是区间,有没有给成精确目标价
  • [ ] 风控清单是否每一项都有数据和判断,还是只有结论没有证据
  • [ ] 报告末尾是否包含了风险提示语句

如果有一项没过,优先检查SKILL.md里的描述是不是不够强硬。如果模型依然跳过模板自由发挥,问题多半出在“description”字段没有把自己绑定到用户请求上。你可以在description里加一句“当用户提到分析、投研、估值、基本面等关键词时,必须使用本技能”,这样触发率会明显上升。

5. 跑了三个月踩过的坑:数据幻觉、模板被跳、接口波动怎么治

任何skill都不可能一次写对,我这套方案在实际使用中也踩了不少坑,挑几个最有代表性的分享给你。

5.1 数字幻觉:模型宁可编,也不说“不知道”

模型拿到一个不完整的数据表时,很容易自行脑补缺失字段。我遇到过最典型的一次:某脚本因为接口临时改动,没有返回现金流量表,结果AI在报告里把经营现金流写成“约等于净利润,波动不大”。这个结论错得离谱,因为那家公司当年的经营现金流和净利润差了将近两倍。

治疗方案分两层。第一层是SKILL.md里明确写“脚本返回的每个字段都要有对应输出,缺失字段必须标注为‘数据缺失’”;第二层是脚本侧做保护,如果某个关键数据为空,直接让脚本返回一个带data_missing标记的JSON对象,模型看到这个标记就只能如实汇报,没法自由发挥。从机制上堵住编数据的路,效率远高于口头叮嘱。

5.2 模型偷懒跳模板:输出变回散文

另一个高频问题是模型觉得模板太繁琐,于是自动降级成自由文本输出,看起来分析得挺好,但你要的东西它漏了一半。这个问题的根源在于模型不知道模板是“强制要求”还是“参考建议”,所以我把它分为“禁止项”来处理。现在我的SKILL.md里会这么写:

输出规范: 1. 必须依次使用 templates/company_health.md、templates/valuation_report.md、 templates/risk_checklist.md 三个模板。 2. 禁止使用模板之外的替代结构,禁止省略模板中的任何字段。 3. 模板字段缺失时,明确写“数据缺失”,不允许用形容词填充。

这套写法实测下来,模板执行率从最初的七成提到了接近百分之百。模型的逻辑很简单:你给了明确禁令,它就遵循禁令;你只给建议,它就当成耳旁风。

5.3 数据源接口波动:无预警故障怎么兜底

免费数据源最大的问题不是质量,而是不稳定。我遇到过AKShare某个接口突然改字段名,导致脚本报错,AI拿不到数据后场面一度很尴尬。后来我给每个脚本都加了异常处理和一个降级占位文件:如果接口调用失败,脚本会在指定目录生成一个data_error.json,记录失败原因和时间戳,模型读到这个文件后会在报告里明确写“本次分析因数据源异常无法获取xx数据,建议稍后重试”。

这个设计看起来很简单,但它救过我好几次。投研分析最怕的不是没数据,而是明明没数据还要硬分析。明确承认“数据拿不到”,比给一个带误导性的假结论要安全得多。

5.4 时间基准错乱:AI不知道“今天”是哪天

大模型的时钟感知很不可靠,它可能把训练数据里某一天的股价当成当前价。我在skill里做了一件事:让脚本每次运行时通过datetime.now()自动获取当前日期,并把这个日期注入到模板头部作为“分析基准日”。从此一切估值和行情数据都有明确锚点,不会再出现“用过去的价格判断现在的估值”这种低级错误。

5.5 触发失败:装了但模型根本不理

很多人问我为什么skill装了却没触发。多数原因是description写得不够明确,模型压根不知道这个技能该用在什么场景。我现在的写法是明确列出触发条件:“当用户要求分析公司基本面、查看财务数据、估算估值、排查投资风险或撰写投研报告时,必须使用本技能。”有时候我还会在用户对话里主动提一句“请用投资研究技能分析xx”,这样既方便测试也方便让模型形成调用习惯。

6. 让Skill越用越聪明:沉淀记忆、拆分协作与合规红线

一个能稳定运行的skill只是第一步,真正让它发挥长期价值的关键在于持续迭代。下面三个方向是我目前正在实践的,也是最推荐你尝试的。

6.1 把历史报告沉淀成知识库

每次生成的报告,我都按时间归档,比如按“公司/年份/月份”建目录。下一次分析同一家公司时,我让AI先把历史报告读一遍,再结合新数据做“变化分析”。这样做最大的好处是能明显看到一家公司的分析逻辑前后是否一致。如果上次判断某指标是风险点,这次不再提了,AI就需要解释为什么风险消失,而不是无意识回避。这个过程相当于给skill建立记忆,让它从一次性工具变成一个持续积累洞察的分析体系。

6.2 拆分成多个独立skill,组合协作

我一开始把采集、分析、报告写在一个skill里,后来发现这样有个问题:当数据采集环节出错时,整个报告功能都被拖垮,而且代码越写越长,维护成本很高。后来我把数据采集、财务分析、舆情监听拆成了三个独立skill,再用一个调度型skill把它们串起来。每个子skill专注做一件事,出错时定位问题特别快;调度型skill只负责根据用户请求编排流程,把前一个skill的输出传给下一个。这个多Agent协作的结构让整个系统稳定了不少,也让我意识到:skill不是越大越好,边界清晰才是关键。

6.3 合规红线:工具可以做研究,不能做“荐股”

最后说一下我给自己定的几条红线。第一,只用公开数据源,不接入任何内幕信息或非公开渠道数据,这是做投研工具的底线。第二,报告里确定性表述必须克制,AI的输出一律用区间、概率、参考区间来表达,不出现“目标价xx元”这种话,因为AI的判断本质上是辅助参考,一旦变成精确断言,误导读者的风险就大了。第三,所有报告末尾固定保留风险提示:本报告由AI生成,仅供研究参考,不构成投资建议。这三条不只是对读者的保护,也是对我自己的保护。做工具的人如果忽略了工具被误用的可能,那工具本身就会变成风险源。

如果你打算照着这篇文章的思路搭一个自己的AI投研skill,我最后再分享一个操作上的小细节:在SKILL.md的最后加一个自检清单区块,让AI在输出报告前自我检查一遍——所有数字是否都来自脚本、所有模板字段是否都已填写、所有结论是否都标注了数据依据。这个自检步骤看似多此一举,但实测下来能把低级错误发生率再降一个量级。整套skill迭代到现在,我最满意的不是省了多少时间,而是每次分析终于有了同一把尺子。同一个标准下的分析才能持续积累,这比任何一次“感觉很有洞见”的自由发挥都更有长期价值。

返回列表