写在前面:这是我的 《AI 投研系统搭建实录》 系列的第一篇。在这个系列中,我不讲虚的,只讲一个全栈工程师如何用最新的技术栈(Gemini 3, MCP, Python)构建一套私有化的、机构级的投研分析系统。
2025 年底,Google 发布 Gemini 3 的时候,整个 AI 投研圈子都发生了剧烈的范式转移。 但在我(小白)看来,Gemini 3 最大的革命不是它的跑分(Benchmark),而是它对 MCP (Model Context Protocol) 的原生支持,以及那令人发指的 Context Caching(上下文缓存) 价格。
在这之前,我们做财报分析是典型的“碎片化”流程:
PDF -> OCR -> 文本切片 (Chunking) -> 向量数据库 (Vector DB) -> 语义检索 -> 拼凑 Prompt -> 喂给 LLM
这个流程最大的痛点是:切片会切碎逻辑。比如“资产负债表”跨了三页,由于切片的物理边界问题,模型在分析时往往无法建立完整的勾稽关系。
现在,有了 Gemini 3 + MCP,流程进化到了 RAG 2.0 (全量映射模式):
PDF (本地硬盘) <-> MCP Server <-> Gemini 3 (3M+ 窗口)
AI 不再是“读”我的摘要,它是直接“挂载”了我的整个数字大脑。
一、 为什么选 Gemini 3 Pro?(2026 投研选型算法)
作为一名需要真金白银投入股市、追求 ROI 的“财富工程师”,我对模型的要求只有两点:极大的吞吐量与极低的认知幻觉。
1.1 无限上下文的“物理压制”
Gemini 3 Pro 的上下文窗口已经扩展到了惊人的 300万-5M Tokens。 这意味着我可以把 英伟达或茅台过去 10 年的全部年报、ESG 报告、甚至是法务诉讼文件 一次性扔进去。它不仅不会因为记忆丢失(Needle in a Haystack)而晕掉,还能进行跨维度的“长程勾稽分析”。这种全量数据的处理能力,是 GPT-4o 那种 128k 窗口永远无法企及的物理压制。
1.2 成本精算:Context Caching 的魔力
在投研场景下,我们通常会对同一份庞大的资料(如某行业的全景报告)进行连续几十次的追问。 Gemini 3 的 Context Caching 允许你把这 100 万 Token 缓存到 Google 的内存节点中。
- 首次费用:正常计费。
- 后续追问:仅需支付 Cache 存储费(每小时美分级)和极低的 Token 费用。 小白的财务账:这让深度审计一家公司的成本,从以前的几十美元降到了几块钱。这是超级个体利用技术杠杆实现规模效益的典型案例。
二、 架构深水区:自定义 MCP 审计工具集
我不希望把原始 PDF 上传到任何云端。基于数字主权的考虑,我构建了一套分布式 MCP Server。
2.1 系统拓扑结构
- 物理存储层:飞牛 NAS 存储全量 PDF 和 SQLite 财务数据库。
- 协议逻辑层:跑在局域网内或 Docker 里的 Python MCP Server。
- 推理层:通过安全的 API 密钥连接 Gemini 3。
2.2 核心工具:finance_auditor_mcp.py
from mcp.server.fastmcp import FastMCP
import fitz # PyMuPDF
import sqlite3
# 创建一个专为量化投研设计的 MCP 服务
mcp = FastMCP("AltStack-Quant-Agent")
@mcp.tool()
def extract_financial_data(ticker: str, year: int, table_name: str) -> str:
"""提取特定公司的报表表格。table_name 支持:'资产负债表', '利润表', '现金流量表'"""
# 逻辑:利用正则表达式或布局分析定位 PDF 页面
path = f"/Volumes/NAS/StockData/{ticker}/{year}_annual.pdf"
# ... (此处省略 50 行 PDF 解析逻辑) ...
return f"{ticker} {year} {table_name} 原始文本..."
@mcp.tool()
def query_valuation_metrics(ticker: str) -> str:
"""从本地 SQLite 数据库查询该标的的历史估值百分位"""
conn = sqlite3.connect('/data/valuation.db')
# ... 执行 SQL ...
return "PE Percentile: 15%, PB Percentile: 10% (极度低估)"
if __name__ == "__main__":
mcp.run()
三、 深度实战:跨源勾稽与多维数据对齐 (Multi-source Hooking)
在专业的投研审计中,最核心的动作不是“查询”,而是“勾稽”。 即:如何验证 PDF 中的文字叙述与数据库中的物理数字是否吻合?
3.1 跨源联动的物理实现
利用 MCP 协议,我让 Gemini 3 同时拥有了“读 PDF”和“查数据库”的能力。
@mcp.tool()
def compare_pdf_with_db(ticker: str, year: int, metric: str) -> str:
"""自动比对 PDF 披露数值与本地数据库记录值。检测数据一致性风险。"""
# 1. 从 PDF 中提取
pdf_val = extract_value_from_pdf(ticker, year, metric)
# 2. 从本地 SQLite 镜像库中提取
db_val = query_sqlite_metrics(ticker, year, metric)
diff = abs(pdf_val - db_val)
if diff > 0.01:
return f"🚨 发现差异!PDF披露为 {pdf_val}, 数据库记录为 {db_val}。"
return f"✅ 数据对齐一致。"
这种**“跨源断言 (Cross-source Assertion)”**,是全栈工程师在金融领域实现的最高级防御逻辑。它将枯燥的审计工作变成了一场自动化测试。
3.2 上下文缓存 (Context Caching) 的工程配置
很多人问我 Context Caching 到底怎么在 Python 里调用。这不仅是钱的问题,更是性能的问题。 当你通过 MCP 获取了全量财报后,你需要在推理请求中显式设置缓存 TTL。
import google.generativeai as genai
from datetime import timedelta
# 将 10 年财报作为 Content 传给缓存
# 注意:TTL 建议设置为 24 小时,覆盖一整天的研究任务
cache = genai.caching.CachedContent.create(
model='models/gemini-1.5-pro-002',
display_name='NVIDIA_FINANCE_HISTORY',
contents=all_annual_reports_text,
ttl=timedelta(hours=24),
)
# 后续对话直接挂载缓存 ID
model = genai.GenerativeModel(model_name='models/gemini-1.5-pro-002')
response = model.generate_content(
["分析 2024 年研发投入的资本化比例变动逻辑"],
cached_content=cache.name
)
性能压榨:首字返回时间(TTFT)从 5s 降低到了 800ms。这种极致的响应速度,是构建“秒级响应”投研助手的物理基础。
四、 演进:从助手到“具身研究员” (Embodied Agent)
我的最终目标,不是让 AI 帮我查数据,而是让它成为一个能够独立执行、具有“手”的 研究员。
4.1 自动执行代码验证逻辑 (Monte Carlo on NAS)
通过集成 code_interpreter 的思想,Gemini 3 可以写一段 Python 脚本,通过 MCP 传递给我的 NAS 执行。
- 场景:Gemini 怀疑某家公司的折旧摊销策略过于保守,可能隐藏了利润。
- 动作:它自己写了一段蒙特卡洛模拟脚本,在 NAS 的计算节点跑完 1000 次模拟,最后告诉我:“这种折旧方式在 95% 的概率下会在三年后产生财务地雷。” 这种**“AI 逻辑 -> 物理计算 -> 结论反馈”**的闭环,就是我心目中 RAG 2.0 的终极形态。
4.2 自动化信披爬虫的“去重与过滤”引擎
作为全栈开发者,我并没有止步于“读取现有的 PDF”。 我开发了一个基于 Playwright 的自动化爬虫,实时监控上交所、深交所以及 SEC (Edgar) 的最新公告。
工程挑战:如何避免无效信息的干扰? 如果是普通的 RAG,你会把所有公告都存进去。但在我的 RAG 2.0 系统中,我增加了一层 “语义过滤栅栏”。
async def smart_downloader(pdf_url, ticker):
# 1. 抓取公告标题
title = await get_title(pdf_url)
# 2. 预判价值 (使用轻量级模型如 Gemini Flash)
is_valuable = await fast_ai_judge(f"标的: {ticker}, 标题: {title}. 是否包含实质性财务变动?")
if is_valuable:
# 下载并自动更新 MCP 挂载点
await download_to_nas(pdf_url)
trigger_mcp_hot_reload()
- 物理链路:爬虫发现新 PDF -> 自动下载至 NAS 挂载点 -> 触发 MCP 索引更新 -> Gemini 3 自动生成第一手分析并发送邮件到我的 Kindle。
- 极致工程:我利用了 Playwright 的 Headless 模式配合 Proxy Rotation 策略,并结合了 Bloom Filter 进行 URL 去重,确保了在面临高频反爬抓取时,依然能稳定、无损地获取财报原件。
五、 审计现场:Gemini 3 的“降维打击”案例分析
实战 Prompt:
“连接
AltStack-Quant-Agent。读取 某果链巨头 2024 年三季报全文。
- 请分析其‘存货周转天数’的变动,并对比过去 5 年的波峰波谷。
- 结合我在笔记中记录的‘果链砍单市场传闻’,推演其 Q4 出现资产减值准备的可能性水位。
- 如果 Q4 计提 15 亿减值,根据当前的现金流量表,它是否还有足够的流动性支撑研发投入?”
Gemini 3 的逻辑链条:
- Thinking: 这是一个跨年份文档+跨笔记数据的复杂任务。
- Action: 调用
extract_financial_data获取 2024 数据 -> 触发 Context Caching -> 递归调用过去 5 年的历史 PDF -> 调用 SQL 查询笔记。 - Reasoning: 发现存货天数显著背离历史均值(从 45 天拉长到了 78 天),且笔记中的传闻与 PDF 中的“发出商品”项目高度吻合。
- Conclusion: “逻辑闭环成立。强烈建议关注潜在的业绩雷区,其研发投入的资本化处理存在激进倾向。其当前的流动比率虽在 1.5 以上,但速动比率已降至 0.8 的警戒线。”
六、 展望未来:个人投研中心的“主权化”
在这个大模型能力趋同的时代,真正的超额收益(Alpha)不再来自于模型本身,而来自于你喂给模型的私有数据以及你构建协议的精细度。
6.1 走向“语义资产”的时代
通过 Gemini 3 + MCP,我将原本死板的财报 PDF 转化为了可随时检索、可逻辑闭环的**“语义资产”**。这些资产跑在我自有的私有云上,不被外界干扰,只随着时间的推移而不断增值。
6.2 程序员的“降维打击”
我一直跟身边的投资朋友说:2026 年是程序员做投资的“黄金元年”。 因为我们不仅懂逻辑,我们还懂“如何把逻辑变成自动化的物理实现”。当你还在为看 10 份年报感到头秃时,我已经写好了 MCP 协议,让 AI 在我睡觉时帮我审计了整个行业。
七、 结语:在比特世界堆叠你的算力杠杆
今天分享的 Gemini 3 + MCP 架构,本质上是在解决一个核心痛点:如何让 AI 具备“长久且深度的职业记忆”?
在这个信息过载的 2026 年,如果你还在用肉眼去看财报,你的生产力就等同于原始社会的劳动力。通过构建这套私有化投研中台,我们将每一个全栈开发的技能点转化为了金融决策的压舱石。
小白的终极建议:
- 拒绝切片,拥抱全量映射。RAG 1.0 已死,长上下文 + MCP 才是未来。
- 通过物理存储实现数据的主权化,别让你的研究成果变成大厂训练集的养料。守住数据,就是守住你的超额收益。
- 算大帐,也要算小账。利用 Caching 技术,把 AI 的运营成本压低到物理极限。
在下一篇 [AI投研 Vol.2] 中,我将教大家如何引入 Multi-Agent 协作,让一个 Agent 负责查账,一个 Agent 负责挑刺,一个 Agent 负责决策。我们将彻底打通从“发现数据”到“下单交易”的全自动化闭环。
不做工具的代价,就去做工具的主人。 我们在资产复利的逻辑中见。
#AI投研 #Gemini3 #MCP协议 #量化投资 #Python #架构设计 #数字化资产 #资产管理 #超级个体 #自动化运维 #全栈开发 #投研中台 #理财实战 #复利效应 #数字主权 #上下文缓存 #RAG2.0 #金融科技 #程序员理财 #自动化审计
小白提示:关于 AI Agent 的深度底层逻辑,请参考我的长青锚定页 —— AI Agent 落地全手册 (2026)。
本文基于 CC BY-NC-SA 4.0 许可发布。 转载请注明出处,且仅限非商业用途。