FinRobot 首次运行 / AI4Finance-Foundation
FinRobot 首次运行:三条路线的最小可复现实验
每个版本都有自己的起步动作:V2 是 finrobot research AAPL 或浏览器里的 dev.sh,V1 是两步 CLI 管线,V0 是 tutorial notebook。本页给每条路线一份「前置 → 最小命令 → 预期输出 → 实际输出 → 失败怎么办 → 结果怎么审计」的完整记录,并额外给一条不需要 API key、不需要联网的路径:直接调用官方确定性算子。
FinRobot 三条路线的起步命令分别是什么?
同一个项目的三条上手路线,前置条件与产物都不一样。下表按「前置 / 最小命令 / 最终产物 / 本机实测到哪一步 / 钱花在哪」列清;本机实测的完整记录在安装页,本页只保留「跑起来的最小动作」。
| 路线 | 前置条件 | 最小命令 | 最终产物 | 本机实测到哪一步 | 钱花在哪 |
|---|---|---|---|---|---|
| V2 · 命令行 | uv + 一个 LLM key(DeepSeek / OpenAI / Anthropic) | cd finrobot_desktop → uv sync → finrobot research AAPL | 13 章研报制品,落进本地 SQLite 制品库 | 未实测:本机未安装 uv,且需要 LLM key | 模型调用按量计费;数据源可选 |
| V2 · 浏览器模式 | uv + Node 20 及以上(本机 Node v24.18.0 已满足) | uv sync → (cd desktop && npm install) → ./dev.sh → 打开 http://localhost:5173 | 浏览器里的研究界面,底层是同一套引擎 | 未实测:卡在缺 uv 这一步 | 同上 |
| V1 · 自托管 Web 服务 | FMP key + OpenAI key(可选再配零售情绪 key) | cp finrobot_equity/core/config/config.ini.example finrobot_equity/core/config/config.ini 填 key → ./finrobot_equity/deploy.sh start | 可分享的多页 HTML 研报(PDF 为可选第三步) | 未实测:缺 FMP 与 OpenAI 两个必填 key;容器路径还要 Docker(本机未装) | FMP + OpenAI 两条计费线 |
| V0 · 教学版 notebook | conda + Python 3.10 或 3.11 | 在仓库根 pip install -e . → 在 finrobot_autogen/ 下 cp OAI_CONFIG_LIST_sample OAI_CONFIG_LIST 与 cp config_api_keys_sample config_api_keys → 到 tutorials_beginner/ 里打开 notebook | notebook 内的分析输出与 PDF | 部分实测:包安装与目录结构已核验;notebook 未跑,缺 key | 模型调用 + 数据源 key(FinnHub / FMP / SEC 等) |
dev.sh 会先释放 8321 与 5173 两个端口——如果桌面 App 开着,它自带的本地后端也会被一起结束,所以先退出 App 再跑脚本;dev.sh 用 Vite 的 :5173 代理到 FastAPI 的 :8321,它会等后端 /openapi.json 有响应之后才启动前端。其二,V0 的两个配置文件必须放在
finrobot_autogen/ 目录下——notebook 是按 ../OAI_CONFIG_LIST 这样的相对路径去找的,所以也得在 notebook 自己所在的目录里运行它,否则读不到配置。不用 API key、不用联网,能跑到哪一步?
能跑到估值结果。V2 的确定性算子是纯 Python——不调用模型、不取数据,给一组假设就算出一组可复核的数字。这是判断「这个项目到底算不算」最省成本的一条路,也是本页里由本站真跑并留下输出的部分。
| 调用的算子 | 输入要点 | 本站实测输出 | 它在做什么 | 注意点 |
|---|---|---|---|---|
calculate_wacc | 无风险利率 4.2%、β 1.20、股权风险溢价 5.5%、债务成本 5.5%、税率 21%、D/(D+E) 20% | 股权成本 0.108;WACC 0.09509 | CAPM 算股权成本,再与税后债务成本按权重合成 | 折现率一变,估值结果会成倍变化,先确认这些输入 |
adjust_beta_blume | 原始 β 1.20 | 1.1333 | 把 β 向 1 收缩的调整方法 | 用与不用会得到不同折现率,本页实测用的是未调整口径 |
calculate_dcf | 营收基数 1000、增速 10%/8%/7%/6%/5%、EBITDA 利润率 25%、capex 6%、ΔNWC 2%、D&A 4%、终值增速 2.5%、股数 100、净负债 200、币种 USD | 隐含价 23.0774 USD/股(企业价值 2507.74 → 股本价值 2307.74 → ÷100 股) | 逐年投影现金流、按年折现、Gordon 永续算终值,再减去净负债 | 数字全部来自这一步的算术,模型不参与 |
| 五年自由现金流序列 | 同上 | 138.49 / 149.57 / 160.04 / 169.64 / 178.12 | 营收 × 利润率,再扣资本开支与营运资本变动 | 任一假设改动,序列与最终价一起变 |
| 终值部分 | 同上 | 稳态自由现金流 205.0;终值 2998.0;终值现值 1903.63;五年现值合计 604.11 | 永续增长把末年的现金流资本化 | 终值常常占估值大头,别忽略增长率假设 |
calculate_dcf(mid_year=True) | 同上,改用年中折现口径 | 隐含价 24.2427(比年末口径高 5.05%) | 假设现金流在年中陆续到账而非年末一次性到账 | 投行常用口径;换口径前后不要混着比 |
calculate_sensitivity | WACC 取 [8%, 9%, 10%] × 终值增速取 [2%, 2.5%] | 隐含价矩阵 [[28.05, 30.30], [23.57, 25.14], [20.21, 21.36]] | 两组假设交叉出六种情形 | 先看矩阵的跨度,再决定单点估值是否值得讨论 |
run_monte_carlo | 2000 条模拟、随机种子 42、参考现价 20 | 中位 23.11;5% 分位 15.97;95% 分位 34.21;均值 23.84;标准差 5.59;现价所处分位 26.7;有效路径 1996 / 2000 | 扰动增长率、利润率、折现率与终值增速,看结果分布 | 分位数来自有效路径子集;无效路径被丢弃 |
怎么自己复现这组数字(四步)
2717499 取出 finrobot_desktop/finrobot/engine/compute/operators/ 与 finrobot_desktop/finrobot/engine/models/ 两个目录。pydantic;蒙特卡洛那一条还需要 numpy。不需要额外的智能体框架,也不需要模型 key。calculate_dcf / calculate_sensitivity / run_monte_carlo。反过来看,这条路径的价值在于——你可以在不花一分钱、不填任何 key 的情况下,先验证「这套数字到底是不是代码算的」。
每跑完一步该看到什么?看不到时先查哪里?
「跑完了」不等于「跑对了」。下表把每一步的正常表现与对应的排查入口并排放,出问题时就地定位,不用从头再来。
| 这一步 | 正常该看到 | 看不到时先查什么 | 属于 |
|---|---|---|---|
| 确认命令行可用 | finrobot --help 打印出命令列表(research / dcf / comps / ic-memo / ask 等) | 确认 uv sync 已经成功,且命令是在 finrobot_desktop/ 目录下执行的 | V2 |
| 跑一条估值流水线 | 输出里出现折现率、逐年现金流与隐含价 | 确认跑的是估值类流水线;若标的被判为金融业,现金流类方法会被整体撤下并留下警告,那是正常行为 | V2 |
| 打开浏览器界面 | Vite 的 :5173 能加载,后端 :8321 的接口有响应 | 看 dev.sh 打印出的后端日志路径;确认 8321 与 5173 没被别的程序占用 | V2 |
| 启动 V1 服务 | 脚本提示服务已启动,127.0.0.1:8001 可访问 | 确认 config.ini 里 FMP 与 OpenAI 两个 key 都填了——只填一个通常会在取数或叙述阶段失败 | V1 |
| V0 的导入步骤 | 导入无报错 | 若报 ModuleNotFoundError: No module named 'finnhub' 一类,说明依赖没装上——用 pip install finrobot 装出来的包不带任何依赖,改用仓库根的 pip install -e . | V0 |
| V0 的取数步骤 | 返回的行数大于 0 | 先确认两个配置文件在 finrobot_autogen/ 下、且是从 sample 复制出来的(不是直接改 sample),再从 notebook 自己所在目录运行 | V0 |
| V0 的成文步骤 | 产出报告文件,并写明币种与财年口径 | 确认模型 key 有效、额度未耗尽;若报告生成了但没有口径说明,先别把其中的数字当结论 | V0 |
| 零依赖算子调用 | 打印出折现率、现金流序列与隐含价 | 确认 import 的是仓库里的 finrobot.engine.compute.operators,而不是 PyPI 上那个 2024 年的旧包 | 全部 |
哪些情况不报错,但结论已经不对了?
跑通不难,难的是判断结果能不能用。下面每一行都对应 FinRobot 的一条真实机制——不是泛泛提醒,而是你在输出里能看到的痕迹。
| 你可能以为 | 实际发生 | 怎么验证 | 注意点 |
|---|---|---|---|
| 跑通就等于结果可信 | 数字由 26 个估值算子在本地算出,模型只负责推理与叙述 | 把报告里的关键数字与算子输出逐项对上 | 叙述不能当计算结果读 |
| 缺数据会被拦住 | 缺同业数据、历史估值带或前瞻指标时,对应方法行会被降级隐藏,并留下一条说明原因的警告 | 读输出里的警告通道,而不是只看有没有报错 | 「少一行结果 + 一条警告」远好过一个填充出来的数字 |
| 给出的估值区间就是统计分布 | 方法只有一种时,区间是占位带;源码里自己标注了它不是真实分布 | 看方法数量与区间的来源说明 | 别拿占位带当置信区间算 |
| 币种与报告期不用管 | 估值结果带独立的币种字段(跟随行情报价币种),报告期有 TTM 口径判断 | 核对报告里是否写明币种与期间 | 口径没写明时,这个数字不适合直接引用 |
| 银行股也能用现金流估值 | 标的被识别为金融业时,现金流类方法会被整体撤下并给出理由 | 看是否出现「方法已撤下」的警告 | 撤下不是失败,而是类别判断生效 |
| 换个模型结果应该差不多 | 模型影响的是叙述,但换模型或改采样参数会改变表述口径 | 固定模型与参数之后,再比较两次运行 | 可复现来自固定配置,不来自跑通本身 |
| notebook 与命令行是同一个环境 | notebook 内核可能指向另一个 Python | 两处分别打印解释器路径比对 | 不一致时先换内核,别急着改代码 |
| 输出可以直接当投资建议 | 官方在许可与 README 里明确写了不构成投资建议 | 以官方 README 与许可文件的表述为准 | 结果仅供研究 |
拿到输出后,怎么判断哪个数字能信?
把输出里的每一项扔进四个桶,再对每个桶用不同的信任策略。这是本页最省时间的一节:做完这一步,你至少知道自己在相信什么。
| 桶 | 怎么识别 | 信任策略 | FinRobot 里的对应物 |
|---|---|---|---|
| 代码算出来的 | 能对应到具体函数与入参;改一个假设,数字按确定规则变化 | 可以复核:同输入重算应得同样结果 | 26 个估值算子(现金流折现 / 股利折现 / 杠杆收购 / 倍数 / 蒙特卡洛 / 分部估值 / 剩余收益等) |
| 模型写出来的 | 段落、观点、定性与因果解释,无法回溯到函数 | 当线索,不当结论 | 研报叙述、催化剂与风险条目、章节小结 |
| 两者混合 | 数字来自算子、判断来自模型(例如「隐含价 23.1,较现价有上行空间」) | 拆开读:数字复核,判断打折 | 投资论点、评级与目标价值表述 |
| 审计产生的 | 警告、降级标记、撤回决策 | 优先读:它直接告诉你哪部分不可信 | 6 个审计算子(币种口径 / 企业价值桥 / 叙述分歧 / 数字绑定性 / 行业符号 / 期间口径) |
2717499)③ 模型与数据源(模型名、数据来自哪个提供方、有无额度限制)④ 命令与输入(完整命令 + 输入参数;合成数据要标明是合成的)⑤ 输出与耗时(原始输出片段 + 单次运行时长)。本站自己的记录是:环境 Windows 10 / Python 3.11.9;版本 commit 2717499;模型 未使用(纯算子);输入 本站构造的合成标的;输出 WACC 9.509%、隐含价 23.0774、蒙特卡洛中位 23.11。有了这五行,别人才可能复核你。
空结果、报错、跑得慢,分别按什么顺序查?
三种现象的原因往往不在同一层。按这个顺序走,能避免「一路往下猜」。
:8321)里;V1 是部署好的 Web 服务;V0 是 notebook。三者的日志位置与失败表现不一样,先确认自己在哪一代上排查。8321 与 5173 是否被占;dev.sh 会先释放这两个端口,但仍可能被系统策略挡住绑定。首次运行常见报错怎么排查?
前三条是本站实测真实遇到的(环境层),后面几条来自各代的常见失败点。每条都给了「怎么确认修好了」,避免改完仍不知道是否生效。
| 现象 | 可能原因 | 处理 | 怎么确认修好了 |
|---|---|---|---|
uv sync 报找不到 uv 命令 | 本机没有安装 uv,而 V2 的命令行与浏览器模式都以它开头 | 先安装 uv,或改用 V0 / V1 路线作为起步 | uv --version 能打印版本 |
端口 8321 或 5173 被占用 | 上一次运行的进程没退干净,或者桌面 App 自带的后端还开着 | 退出 App 与历史进程后重跑 dev.sh(它会先释放这两个端口) | dev.sh 能同时拉起后端与前端,界面可访问 |
| 装完能 import,一调用就报缺第三方包 | 用 pip install finrobot 装到的是 2024 年的旧包,且没有任何依赖 | V0 走仓库根 pip install -e .;要 V2 就走 uv sync | 能成功导入智能体模块,或跑通 finrobot --help |
| 模型调用报鉴权错误 | 模型 key 未填、无效,或配置里仍带示例注释(V0) | V2 在设置页重填;V0 检查配置文件并删净注释 | 再跑一次最小模型调用能返回内容 |
| 取数返回空 | 数据源 key 缺失、权限不足或触发限流 | 先补齐或更换数据源,再用不需要 key 的公开行情源交叉验证 | 打印返回行数大于 0 |
| 依赖导入失败 | 环境未激活,或包不在当前解释器里 | 激活对应环境后重装(V0 用 pip install -e .) | 在同一个终端里导入不再报错 |
| 配置文件解析失败 | 示例注释没删干净,内容不是合法配置 | 删掉注释,保持合法结构 | 能成功读出配置条目 |
| notebook 报导入错但命令行正常 | notebook 内核指向另一个环境 | 把内核切到正确的环境 | 两处打印的解释器路径一致 |
| 浏览器界面打不开 | 只启动了后端没启前端(后端单独运行时不提供界面),或代理未配置 | 用 dev.sh 一起启动前后端;不要指望 npm run preview 的静态构建能连通接口 | 打开 :5173 能看到界面,接口调用有返回 |
| 桌面版无法启动(macOS) | 首次运行被系统安全策略拦下(发行版在做 Apple notarize 之前) | 按官方发布说明里的命令清除隔离标记后再打开 | App 正常打开并能在设置里配置 key |
| 公司网络下全部超时 | 出网受限或需要代理 | 换网络,或按运维要求配置代理后重试 | 最小用例(取一个标的的公开行情)能跑通 |
有哪些现成示例?按需要的 key 挑一个上手
两代各有一组教程:V0 是 13 个 notebook(入门 7 个 + 进阶 6 个),V2 有 4 个 notebook,覆盖与命令行相同的能力。先挑依赖最少的那个跑通。
| 示例 | 属于 | 作用 | 需要的 key | 注意点 |
|---|---|---|---|---|
agent_annual_report.ipynb | V0 · 入门 | 读年报并产出格式化报告 | 模型 key + FMP(SEC 视输入而定) | 耗时较长,先确认额度;这是依赖较多的一个,别拿它作为起步实验 |
agent_rag_qa.ipynb / agent_rag_qa_up.ipynb | V0 · 入门 | 对自有文档做检索问答 | 模型 key | 依赖较少的一类,适合作为起步实验 |
agent_rag_earnings_call_sec_filings.ipynb | V0 · 入门 | 在电话会议记录与申报文件上做检索问答 | 模型 key + 数据源 | 输入材料决定耗时,先缩小范围 |
ollama function call.ipynb / ollama stock chart.ipynb | V0 · 入门 | 用本地模型跑同样的工具调用与图表 | 本地模型(不需要云端 key) | 本地模型的工具调用能力差异较大,失败时先换模型判断 |
agent_trade_strategist.ipynb | V0 · 进阶 | 策略研究与回测 | 模型 key + FinnHub | 输出是研究材料,不构成交易建议 |
lmm_agent_mplfinance.ipynb / lmm_agent_opt_smacross.ipynb | V0 · 进阶 | 多模态:看图做分析与参数搜索 | 模型 key(需支持视觉) | 需要在配置里指定具备视觉能力的模型 |
agent_openbb.ipynb | V0 · 进阶 | 把 OpenBB 当作工具提供方接入 | 模型 key + OpenBB | 需要额外的第三方依赖,环境准备时间更长 |
01_equity_research.ipynb / 02_dcf_valuation.ipynb | V2 | 与命令行同源的研报与估值流程 | 模型 key(数据源可选) | 需要用 V2 的环境打开,别和 V0 的环境混用 |
03_backtest.ipynb / 04_rag_qa.ipynb | V2 | 回测适配与检索问答 | 回测那条需要额外的可选依赖 | 回测能力属于可选扩展,不是这套引擎的主职 |
哪些地方要花钱?按代看清单
库本身是 Apache-2.0 许可、不收费;持续支出来自模型调用与部分数据源。下表按代列出「必须有 / 可选 / 不要钱」三类,具体价格与免费额度一律以各家官方定价页为准。
| 路线 | 必须有 | 可选 / 按需 | 不花钱的部分 | 怎么控制成本 |
|---|---|---|---|---|
| V2 | 一个 LLM key(写入系统钥匙串) | FMP / Finnhub 等数据源(公开源也在可用清单里) | 26 个确定性算子可直接调用,不需要模型与网络 | 先用单一标的跑窄任务,再决定要不要跑完整研报流水线 |
| V1 | FMP key + OpenAI key | 零售情绪数据(如配置) | 库本体与仓库里已入库的示例报告 | 固定少量标的做验证,不要一上手就批量生成 |
| V0 | 模型 key | FinnHub / FMP / SEC / Reddit / 社交媒体等数据源 key | 公开行情源不需要 key;检索问答类 notebook 只用模型 | 先跑只用模型的 notebook;数据源按任务逐个加,不要一次全配 |
| 任意 | — | — | 库本体、示例资源、确定性算子 | 把「验证链路」与「跑真实任务」分开,前者尽量用免费路径 |
跑通之后,接下来该补哪一块?
同一个「跑通了」的起点,后面的路完全不同。先确认要哪一种,再决定补什么。
| 你想做的事 | 往哪走 | 要补什么 | 注意点 |
|---|---|---|---|
| 拿到可追溯的估值与研报 | V2 的估值流水线与研报制品(13 章) | LLM key;需要相对估值时再补数据源 | 数字由算子计算,模型只写叙述 |
| 把多个角色编排成一条流水线 | V2 的 Lead Agent 与 7 条类型化流水线 | 理解流水线与步骤校验,而不是自己写会话拓扑 | README 里那套论文期的调度器设计在当前仓库没有实现,别按它去找模块 |
| 接自己的数据源 | 数据层的统一提供方接口 | 自己数据源的取数与字段映射,并接上健康状态与故障切换 | 字段口径要与上游对齐,否则后面每一步都偏 |
| 换模型 | V2 在设置页选模型(多数命令也支持指定模型参数) | 对应模型服务的 key | 换模型会改叙述口径;比较结果前先固定配置 |
| 批量处理多只标的 | 命令行循环调用,或写脚本用程序接口 | 数据源额度与运行时长预算 | 先把单只标的的流程与耗时摸清,再谈批量 |
| 做规则回测与组合优化 | 交给专门的回测框架 | 历史行情与回测引擎 | 这套引擎的定位是研究流程编排,不是回测引擎,也不是下单系统 |
| 只想快速拿到行情、技术面或选股结果 | 免部署的技能路线 | 安装客户端即可,无需环境与多份 key | 两条路线互相独立,FinRobot 与 EasyClaw 无已证实集成 |
FinRobot 首次运行常见问题
没有任何 API key,能不能先做点什么?
可以,而且建议先做这一步:V2 的 26 个确定性算子是纯 Python,不调用模型也不取数据,构造一组假设就能算出折现率、现金流序列、隐含价与敏感性矩阵。本站就是在不填任何 key 的情况下跑出 WACC 9.509%、隐含价 23.0774 这组数字的(输入是合成标的,仅供观察行为)。这么做的好处是先把「数字是代码算的」验证掉,再花钱。
V2 一定要装 uv 吗?
官方给出的 V2 上手路径里,命令行与浏览器模式都以 uv sync 开头,桌面 App 则是下载发行版(省掉这一步但只有 macOS Apple Silicon)。本机实测的卡点就是没装 uv。想绕开这条依赖,可以先用 V0 的 conda 路线起步,或者只做零依赖算子实验。具体要求以官方子目录文档为准。
首次运行通常要多久?
分三档看:跑单个确定性算子是秒级的;跑一条需要取数与模型推理的窄任务通常在分钟级;完整研报流水线更久,取决于数据源响应与模型速度。耗时要按你的环境与额度实测,本页不给具体秒数——给了也不准。
一定要用 conda 吗?
V0 的官方说明写的是 conda 建独立环境(Python 3.10 或 3.11)。用别的隔离方式并非不可以,但官方没有展开这条流程,遇到依赖问题时不在官方文档覆盖范围内——以官方 README 为准。无论用哪种方式,「解释器与包必须在同一个环境里」这条不能破。
可以换成别的模型吗?
可以。V2 在设置页里配置模型,多数命令也支持指定模型;V0 则在配置文件里声明多个模型条目。换模型之后叙述口径会变,做结果对比前先把模型与参数固定下来。支持哪些模型以官方配置说明为准。
报告里的数字我能直接引用吗?
先分清桶:由算子算出来的可以复核(同输入应得同结果),模型写出来的当观点,混合表述要拆开看。另外注意缺数据时方法行会被撤下并留警告——那种情况下报告里不会出现对应数字,而不是出现一个替代值。任何时候都别把输出当投资建议。
V2 的浏览器模式安全吗?
需要留意一点:官方文档写明浏览器模式下本地接口没有鉴权(桌面壳有一次性令牌,纯浏览器读不到),因此同一台机器上的其它进程可以访问本地接口,其中包含保存密钥的设置接口。它仍然只绑定本机回环地址,但在共用机器上更建议用桌面版。这条是官方文档写明的行为,不是本站的推测。
跑不通怎么办?
按「空结果排查」那一节的顺序走一遍,再用排查表按现象对号入座,重点先看前三条(缺 uv、端口占用、装到零依赖的旧包)——本站实测的坑就在这三条里。如果仍不通,带上完整报错、版本与复现步骤去看官方仓库的 issue 与讨论区。