FinRobot 首次运行 / AI4Finance-Foundation

FinRobot 首次运行:三条路线的最小可复现实验

每个版本都有自己的起步动作:V2 是 finrobot research AAPL 或浏览器里的 dev.sh,V1 是两步 CLI 管线,V0 是 tutorial notebook。本页给每条路线一份「前置 → 最小命令 → 预期输出 → 实际输出 → 失败怎么办 → 结果怎么审计」的完整记录,并额外给一条不需要 API key、不需要联网的路径:直接调用官方确定性算子。

V2 CLI:research / dcf / comps / ask零依赖实验:跑官方算子每步都有预期输出
选版本V2 / V1 / V0
配 KeySettings 或 config.ini
跑最小命令research / deploy.sh / notebook
审计结果哪些是代码算的
首次运行的四步示意:先选版本,再配密钥,跑最小命令,最后审计结果。
V2 CLIfinrobot research AAPL
V1deploy.sh start → :8001
V0tutorials notebook(需 key)
零依赖路径直接调用官方算子
三条路线

FinRobot 三条路线的起步命令分别是什么?

同一个项目的三条上手路线,前置条件与产物都不一样。下表按「前置 / 最小命令 / 最终产物 / 本机实测到哪一步 / 钱花在哪」列清;本机实测的完整记录在安装页,本页只保留「跑起来的最小动作」。

路线前置条件最小命令最终产物本机实测到哪一步钱花在哪
V2 · 命令行uv + 一个 LLM key(DeepSeek / OpenAI / Anthropic)cd finrobot_desktop → uv sync → finrobot research AAPL13 章研报制品,落进本地 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 · 教学版 notebookconda + 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/ 里打开 notebooknotebook 内的分析输出与 PDF部分实测:包安装与目录结构已核验;notebook 未跑,缺 key模型调用 + 数据源 key(FinnHub / FMP / SEC 等)
两条容易踩的坑:其一,V2 的浏览器模式里 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.09509CAPM 算股权成本,再与税后债务成本按权重合成折现率一变,估值结果会成倍变化,先确认这些输入
adjust_beta_blume原始 β 1.201.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_sensitivityWACC 取 [8%, 9%, 10%] × 终值增速取 [2%, 2.5%]隐含价矩阵 [[28.05, 30.30], [23.57, 25.14], [20.21, 21.36]]两组假设交叉出六种情形先看矩阵的跨度,再决定单点估值是否值得讨论
run_monte_carlo2000 条模拟、随机种子 42、参考现价 20中位 23.11;5% 分位 15.97;95% 分位 34.21;均值 23.84;标准差 5.59;现价所处分位 26.7;有效路径 1996 / 2000扰动增长率、利润率、折现率与终值增速,看结果分布分位数来自有效路径子集;无效路径被丢弃

怎么自己复现这组数字(四步)

  • 取代码:按固定 commit 2717499 取出 finrobot_desktop/finrobot/engine/compute/operators/ 与 finrobot_desktop/finrobot/engine/models/ 两个目录。
  • 备环境:只需要 Python 3.11 及以上加 pydantic;蒙特卡洛那一条还需要 numpy。不需要额外的智能体框架,也不需要模型 key。
  • 调算子:用上面这张表的输入构造参数,调用 calculate_dcf / calculate_sensitivity / run_monte_carlo。
  • 对数字:把输出与上表逐项对齐。对不上时先检查输入是否完全一致,而不是先怀疑代码。
  • 实测环境与边界(必须写清):环境为 Windows 10.0.26200 + Python 3.11.9 + pydantic 2.13.4 + numpy 2.4.6;输入是本站构造的合成标的,不是任何真实公司的行情或财报,这组数字只用于观察系统行为,不构成投资建议。之所以强调这一点:把合成输入的输出误当成真实结论,正是金融 AI 使用里最常出现的一类错。
    反过来看,这条路径的价值在于——你可以在不花一分钱、不填任何 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 年的旧包全部
    顺序上的一个小建议:这八步里最先值得做的是最后一行——它不需要 key、不需要网络,却能把「代码算数」这件事验证掉。之后再往上叠模型与数据源,出问题时你就知道问题出在哪一层。
    静默错误

    哪些情况不报错,但结论已经不对了?

    跑通不难,难的是判断结果能不能用。下面每一行都对应 FinRobot 的一条真实机制——不是泛泛提醒,而是你在输出里能看到的痕迹。

    你可能以为实际发生怎么验证注意点
    跑通就等于结果可信数字由 26 个估值算子在本地算出,模型只负责推理与叙述把报告里的关键数字与算子输出逐项对上叙述不能当计算结果读
    缺数据会被拦住缺同业数据、历史估值带或前瞻指标时,对应方法行会被降级隐藏,并留下一条说明原因的警告读输出里的警告通道,而不是只看有没有报错「少一行结果 + 一条警告」远好过一个填充出来的数字
    给出的估值区间就是统计分布方法只有一种时,区间是占位带;源码里自己标注了它不是真实分布看方法数量与区间的来源说明别拿占位带当置信区间算
    币种与报告期不用管估值结果带独立的币种字段(跟随行情报价币种),报告期有 TTM 口径判断核对报告里是否写明币种与期间口径没写明时,这个数字不适合直接引用
    银行股也能用现金流估值标的被识别为金融业时,现金流类方法会被整体撤下并给出理由看是否出现「方法已撤下」的警告撤下不是失败,而是类别判断生效
    换个模型结果应该差不多模型影响的是叙述,但换模型或改采样参数会改变表述口径固定模型与参数之后,再比较两次运行可复现来自固定配置,不来自跑通本身
    notebook 与命令行是同一个环境notebook 内核可能指向另一个 Python两处分别打印解释器路径比对不一致时先换内核,别急着改代码
    输出可以直接当投资建议官方在许可与 README 里明确写了不构成投资建议以官方 README 与许可文件的表述为准结果仅供研究
    结果审计

    拿到输出后,怎么判断哪个数字能信?

    把输出里的每一项扔进四个桶,再对每个桶用不同的信任策略。这是本页最省时间的一节:做完这一步,你至少知道自己在相信什么。

    桶怎么识别信任策略FinRobot 里的对应物
    代码算出来的能对应到具体函数与入参;改一个假设,数字按确定规则变化可以复核:同输入重算应得同样结果26 个估值算子(现金流折现 / 股利折现 / 杠杆收购 / 倍数 / 蒙特卡洛 / 分部估值 / 剩余收益等)
    模型写出来的段落、观点、定性与因果解释,无法回溯到函数当线索,不当结论研报叙述、催化剂与风险条目、章节小结
    两者混合数字来自算子、判断来自模型(例如「隐含价 23.1,较现价有上行空间」)拆开读:数字复核,判断打折投资论点、评级与目标价值表述
    审计产生的警告、降级标记、撤回决策优先读:它直接告诉你哪部分不可信6 个审计算子(币种口径 / 企业价值桥 / 叙述分歧 / 数字绑定性 / 行业符号 / 期间口径)
    可复现记录五要素(建议每次运行都记一行):① 环境(系统 + Python 版本 + 有没有装 uv / Node)② 版本与提交(release 号或 commit 号;本站用 2717499)③ 模型与数据源(模型名、数据来自哪个提供方、有无额度限制)④ 命令与输入(完整命令 + 输入参数;合成数据要标明是合成的)⑤ 输出与耗时(原始输出片段 + 单次运行时长)。
    本站自己的记录是:环境 Windows 10 / Python 3.11.9;版本 commit 2717499;模型 未使用(纯算子);输入 本站构造的合成标的;输出 WACC 9.509%、隐含价 23.0774、蒙特卡洛中位 23.11。有了这五行,别人才可能复核你。
    空结果排查

    空结果、报错、跑得慢,分别按什么顺序查?

    三种现象的原因往往不在同一层。按这个顺序走,能避免「一路往下猜」。

  • 先分清版本:V2 的取数与推理都在本地后端(:8321)里;V1 是部署好的 Web 服务;V0 是 notebook。三者的日志位置与失败表现不一样,先确认自己在哪一代上排查。
  • 再确认 key 是真 key:示例文件里的占位字符串没换掉、或注释没删干净,都会让配置解析或鉴权失败。V2 的 key 在设置页写入系统钥匙串,V0 的 key 在两个配置文件里,别混着找。
  • 看是不是「这一源本来就没权限」:同一数据源的免费档与付费档能取到的范围不同。先用不需要 key 的公开行情源验证链路是否通,再回头判断是权限问题还是代码问题。
  • 检查网络与服务可达性:确认能访问包源、模型服务与目标数据源接口;公司网络下这类超时最容易被误判成程序 bug。
  • 看限流与额度:连续几次成功之后开始失败,优先怀疑限流;模型侧则区分「鉴权失败」与「额度不足」——两者的报错文本不同,处理方式也不同。
  • 看端口占用(V2 浏览器模式):如果界面起不来,先确认 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.ipynbV0 · 入门读年报并产出格式化报告模型 key + FMP(SEC 视输入而定)耗时较长,先确认额度;这是依赖较多的一个,别拿它作为起步实验
    agent_rag_qa.ipynb / agent_rag_qa_up.ipynbV0 · 入门对自有文档做检索问答模型 key依赖较少的一类,适合作为起步实验
    agent_rag_earnings_call_sec_filings.ipynbV0 · 入门在电话会议记录与申报文件上做检索问答模型 key + 数据源输入材料决定耗时,先缩小范围
    ollama function call.ipynb / ollama stock chart.ipynbV0 · 入门用本地模型跑同样的工具调用与图表本地模型(不需要云端 key)本地模型的工具调用能力差异较大,失败时先换模型判断
    agent_trade_strategist.ipynbV0 · 进阶策略研究与回测模型 key + FinnHub输出是研究材料,不构成交易建议
    lmm_agent_mplfinance.ipynb / lmm_agent_opt_smacross.ipynbV0 · 进阶多模态:看图做分析与参数搜索模型 key(需支持视觉)需要在配置里指定具备视觉能力的模型
    agent_openbb.ipynbV0 · 进阶把 OpenBB 当作工具提供方接入模型 key + OpenBB需要额外的第三方依赖,环境准备时间更长
    01_equity_research.ipynb / 02_dcf_valuation.ipynbV2与命令行同源的研报与估值流程模型 key(数据源可选)需要用 V2 的环境打开,别和 V0 的环境混用
    03_backtest.ipynb / 04_rag_qa.ipynbV2回测适配与检索问答回测那条需要额外的可选依赖回测能力属于可选扩展,不是这套引擎的主职
    一个实际建议:如果你的目标是「先确认这套东西能不能用」,不要从年报分析那个 notebook 开始(它同时需要模型与财报数据源)。先跑零依赖算子实验,再跑一个只需要模型 key 的检索问答,最后才碰需要多源数据的那类。这样每一步失败时,你都知道是哪一层的问题。
    成本结构

    哪些地方要花钱?按代看清单

    库本身是 Apache-2.0 许可、不收费;持续支出来自模型调用与部分数据源。下表按代列出「必须有 / 可选 / 不要钱」三类,具体价格与免费额度一律以各家官方定价页为准。

    路线必须有可选 / 按需不花钱的部分怎么控制成本
    V2一个 LLM key(写入系统钥匙串)FMP / Finnhub 等数据源(公开源也在可用清单里)26 个确定性算子可直接调用,不需要模型与网络先用单一标的跑窄任务,再决定要不要跑完整研报流水线
    V1FMP key + OpenAI key零售情绪数据(如配置)库本体与仓库里已入库的示例报告固定少量标的做验证,不要一上手就批量生成
    V0模型 keyFinnHub / FMP / SEC / Reddit / 社交媒体等数据源 key公开行情源不需要 key;检索问答类 notebook 只用模型先跑只用模型的 notebook;数据源按任务逐个加,不要一次全配
    任意——库本体、示例资源、确定性算子把「验证链路」与「跑真实任务」分开,前者尽量用免费路径
    要不要 GPU:不需要。FinRobot 走的是云端模型 API 路线,本地 GPU 不是前置条件;想让模型完全跑在本机,才需要自备推理环境(V0 里有走本地模型的示例,属于可选方向)。各家的申请方式、免费额度与计费口径以官方页面为准,本页不列具体价格。
    下一步

    跑通之后,接下来该补哪一块?

    同一个「跑通了」的起点,后面的路完全不同。先确认要哪一种,再决定补什么。

    你想做的事往哪走要补什么注意点
    拿到可追溯的估值与研报V2 的估值流水线与研报制品(13 章)LLM key;需要相对估值时再补数据源数字由算子计算,模型只写叙述
    把多个角色编排成一条流水线V2 的 Lead Agent 与 7 条类型化流水线理解流水线与步骤校验,而不是自己写会话拓扑README 里那套论文期的调度器设计在当前仓库没有实现,别按它去找模块
    接自己的数据源数据层的统一提供方接口自己数据源的取数与字段映射,并接上健康状态与故障切换字段口径要与上游对齐,否则后面每一步都偏
    换模型V2 在设置页选模型(多数命令也支持指定模型参数)对应模型服务的 key换模型会改叙述口径;比较结果前先固定配置
    批量处理多只标的命令行循环调用,或写脚本用程序接口数据源额度与运行时长预算先把单只标的的流程与耗时摸清,再谈批量
    做规则回测与组合优化交给专门的回测框架历史行情与回测引擎这套引擎的定位是研究流程编排,不是回测引擎,也不是下单系统
    只想快速拿到行情、技术面或选股结果免部署的技能路线安装客户端即可,无需环境与多份 key两条路线互相独立,FinRobot 与 EasyClaw 无已证实集成
    FAQ

    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 与讨论区。

    跑通了,接下来看什么?估值与研报

    跑通 notebook 后,看 FinRobot 的确定性估值计算(DCF/DDM/LBO/WACC)与研报生成,这是它区别于普通聊天模型的卖点;也可以回到四层架构页,理解这些能力各自落在哪一层。