乐于分享
好东西不私藏

AI 不是荐股工具,而是投研工作台:我的 WSL + MCP 实践

AI 不是荐股工具,而是投研工作台:我的 WSL + MCP 实践

> AI 辅助声明:本文由作者基于个人实践整理,并使用 AI 工具辅助结构化、润色和校对。  

> 风险提示:本文仅记录个人投研系统的技术搭建方法,不构成任何投资建议、收益承诺、荐股服务或金融产品推荐。市场有风险,投资决策需独立判断。  

> 数据提示:文中涉及的 akshare、yfinance 等免费数据源可能存在延迟、缺失、限流或口径差异,重要结论必须交叉验证公告、年报、交易所和权威数据源。

为什么要搭一个个人投研工作台

过去做投资研究,常见流程是:打开行情软件,看几份研报,翻年报,手工记录估值和财务指标,最后在 Excel 或笔记里写结论。

这个流程的问题不在于“不能用”,而在于很难稳定复用:

每次分析都要重复找数据。

- 宏观、估值、财务、风险、仓位分散在不同工具里。

- 很多判断靠临场感觉,复盘时说不清当时依据。

- AI 可以帮忙总结,但如果没有数据接口和固定流程,很容易变成泛泛而谈。

所以我想搭一个更工程化的个人投研环境:

-用 WSL2 提供稳定的 Linux 开发环境。

-用 Python 管理数据和量化计算。

-用 MCP 把行情、财务、宏观数据接入 AI 助手。

-用 Claude Code 作为交互入口。

-用 Skills 固化价值投资、宏观配置、风险检查等研究框架。

目标不是做一个“自动赚钱机器”,而是做一个可复用、可审计、可扩展的个人研究工作台

整体构架

系统运行在 Windows + WSL2 环境中,核心目录大致如下:

~/investment-system/├── .mcp.json                 # Claude Code 项目级 MCP 配置├── .claude/│   └── skills/               # 投资分析框架├── mcp-servers/│   └── data_server.py        # MCP 数据服务├── engines/│   ├── run.py                # 统一命令入口│   ├── risk_engine.py        # 风险评分│   ├── screener.py           # 多因子选股│   ├── valuation_tracker.py  # 估值追踪│   ├── macro_signal.py       # 宏观信号│   ├── backtest.py           # 回测│   └── optimizer.py          # 仓位优化├── portfolio/│   ├── holdings.json         # 实际持仓│   └── candidates.json       # 候选股池├── output/                   # 报告输出└── CLAUDE.md                 # Claude Code 主控文件

数据流可以简化理解为两条线:

Claude Code ←→ MCP ←→ data_server.py ←→ akshare / yfinanceClaude Code ←→ CLI ←→ engines/run.py ←→ 量化引擎

第一条线解决“AI 如何拿到实时数据”的问题。  

第二条线解决“固定计算逻辑如何复用”的问题。

基础环境选择

我选择 WSL2 + Ubuntu,是因为它比直接在 Windows 上跑 Python 金融环境更省心:

-Python 依赖安装更接近服务器环境。

-Shell 脚本、虚拟环境、进程管理更自然。

-Claude Code、Node.js、MCP 服务都适合在类 Unix 环境运行。

后续如果迁移到云服务器,改动较小。

基础依赖包括:

-Node.js 18+:运行 Claude Code。

-Python 3 + venv:隔离投研环境。

-akshare:获取 A 股、宏观等数据。

-yfinance:获取美股、港股和部分行情财务数据。

-mcp:实现 MCP 数据服务。

发布版不展开每条安装命令。实际搭建时,建议先确认本机 WSL 可安装的 Ubuntu 版本,再按自己的网络环境配置依赖源。

MCP数据服务:让AI能调用数据

MCP 的价值在于,它把“数据工具”包装成 AI 可以调用的标准工具。

我在 `data_server.py` 中定义了 13 个工具,覆盖个人投研中最常用的数据:

| 工具 | 作用 |`get_stock_quote` | 获取股票实时行情 |`get_price_history` | 获取历史价格 |`get_financial_ratios` | 获取核心财务比率 |`get_income_statement` | 获取利润表 |`get_balance_sheet` | 获取资产负债表 |`get_cashflow_statement` | 获取现金流量表 |`get_valuation_history` | 获取 A 股 PE/PB 历史分位 |`get_company_info` | 获取公司基本信息 |`get_macro_data` | 获取中国宏观数据 |`get_sector_comparison` | 获取行业对比信息 |`get_technical_indicators` | 计算 RSIMACD、布林带、KDJ |`get_a_share_financials` | 获取 A 股专项财务指标 |`get_shareholder_info` | 获取 A 股前十大股东 |

例如,一个 MCP 工具的结构大致是这样:

@mcp.tool()def get_stock_quote(symbol: str) -> str:    """    获取股票实时行情。    symbol: A股6位代码、港股如00700.HK、美股如AAPL    """    ticker = to_yf_ticker(symbol)    t = yf.Ticker(ticker)    info = t.fast_info    return json.dumps({        "symbol": symbol,        "price"float(info.last_price),        "market_cap": info.market_cap,        "source""yfinance"    }, ensure_ascii=False, indent=2)

项目级 MCP 配置放在 `.mcp.json`:

{  "mcpServers": {    "investment-data": {      "command""${HOME}/investment-system/venv/bin/python3",      "args": ["${HOME}/investment-system/mcp-servers/data_server.py"]    }  }}

这样在 Claude Code 中,就可以让 AI 调用 `investment-data` 里的工具,而不是只靠模型记忆回答。

量化引擎:把重复计算固定下来

AI 擅长解释、总结和生成报告,但固定计算逻辑不应该每次都让 AI 临场发挥。

所以我把常用计算拆成几个 Python 引擎:

`risk_engine.py`:单股风险、组合集中度、最大回撤。

- `screener.py`:多因子筛选。

- `valuation_tracker.py`:估值区间、PE 分位、FCF 收益率。

- `macro_signal.py`:宏观四象限、流动性评分。

- `backtest.py`:买入持有和估值择时回测。

- `optimizer.py`:仓位分配和再平衡建议。

统一入口是:

python3 engines/run.py selftestpython3 engines/run.py risk --symbol 600519python3 engines/run.py valuation --symbol 600519python3 engines/run.py macropython3 engines/run.py opt --symbols 600519,000333,600036

这里的股票代码只是接口示例,不代表任何投资建议。

引擎的意义是:  

数据由 MCP 获取,计算由 Python 固化,结论由 AI 组织,人来做最终判断。

Skills:把投研方法论写成流程

光有数据还不够。真正影响研究质量的是分析流程。

我把常用投研框架整理成 18 个 Skills:

.claude/skills/├── stock-analysis.md├── value-investing.md├── macro-allocation.md├── buffett/   ├── SKILL.md   ├── moat.md   ├── management.md   ├── valuation.md   └── circle-of-competence.md├── buffett-perspective/   ├── SKILL.md   ├── mr-market.md   ├── safety-margin.md   ├── punch-card.md   └── mental-models.md└── druckenmiller/    ├── SKILL.md    ├── liquidity.md    ├── trend-following.md    ├── asymmetric-risk.md    └── macro-indicators.md

这些 Skills 分成三类。

第一类是单股研究:

- 快速扫描:先判断是否值得深研。

- 价值投资分析:业务、护城河、财务、估值、风险。

- 巴菲特框架:能力圈、管理层、安全边际。

第二类是宏观配置:

- 宏观四象限。

流动性分析。

- A 股估值温度计。

- 资产配置权重。

第三类是决策复核:

市场先生。

- 20 次出手原则。

- 反向思维。

非对称赔率。

- 趋势与仓位管理。

每个 Skill 都尽量写清楚:

输入参数是什么。

- 可以调用哪些 MCP 工具。

- 可以调用哪些 Python 引擎。

- 哪些数据需要手工补充。

- 最终输出格式是什么。

这一步很重要。否则 AI 很容易输出一篇“看起来完整、实际上没有证据链”的分析。

一个典型使用流程

假设我要研究一家公司,理想流程是:

1. 先让 Claude Code 调用 `stock-analysis.md` 做快速扫描。

2. 如果通过,再进入 `value-investing.md` 做深度分析。

3. 用 MCP 获取行情、财务、现金流、估值分位、股东信息。

4. 用 Python 引擎跑风险评分、估值交叉验证和回测。

5. 用巴菲特框架检查能力圈、护城河、安全边际。

6. 用宏观框架判断当前仓位环境。

7. 最后输出一份结构化投研备忘录。

输出不应该只有“买入/卖出”,而应该包括:

核心判断。

- 关键数据。

- 主要假设。

反方证据。

- 风险清单。

- 重新评估触发条件。

- 数据缺口。

我更希望系统帮助我回答:

> 我为什么得出这个结论?  

> 这个结论依赖哪些数据?  

> 哪些事实出现后,我必须承认自己错了?

数据边界和风险边界

这个系统最需要警惕的不是“数据不够”,而是“看起来什么都有”。

当前 MCP 可以自动取到一部分数据,但有些关键内容仍然需要手工补充:

- 审计意见。

关联交易。

- 管理层诚信。

- 股权激励细节。

重要公告。

- 10 年国债收益率。

- DR007。

- 北向资金。

- DXY。

- VIX。

美联储资产负债表。

这些数据如果没有取到,就必须在报告里写“缺失”或“需手工补充”,不能让 AI 猜。

投资框架上也要避免极端表达:

- 不写“保证收益”。

- 不写“跟着买”。

不写“稳赚”。

- 不把单一指标当成买卖依据。

- 不把模型输出当成最终投资建议。

系统的定位是研究辅助,而不是投资顾问。

这套系统的价值

搭完之后,我觉得它最大的价值不是“更快得到答案”,而是让投研流程更稳定:

每次分析先走相同框架。

- 数据来源可追溯。

- 缺失数据会被标出来。

- 定性判断和定量计算分工清楚。

- 宏观、个股、估值、风险、仓位可以放在同一个工作台里。

它不会替你做判断,但能减少很多低质量重复劳动。

更重要的是,它迫使你把投资思考写成流程。

能写成流程的东西,才有机会被复盘、被改进、被自动化。

后续计划

后续我会继续完善几个方向:

- 增加更多数据源交叉验证。

把年报和公告解析纳入流程。

- 增加组合层面的回撤和相关性分析。

-给不同风险偏好设计不同仓位模板。

-把报告输出做成固定模板。

增加数据缓存,减少接口限流。

这个系统还只是个人投研工作台的 demo。

它不追求一步到位,核心是先把“研究过程”工程化。

结  语

AI 进入投研之后,真正的分水岭可能不是“谁会问问题”,而是谁能把数据、流程、判断和复盘放进一个稳定系统里。

如果只是让 AI 评价一家公司,它很容易说得头头是道。  

如果让 AI 在固定数据源、固定框架、固定风险约束下工作,它才更像一个可靠的研究助手。

这也是我搭这个工作台的原因。

再次提示:本文是技术实践记录,不构成任何投资建议。