FinRobot 数据源与密钥 / AI4Finance-Foundation

FinRobot 数据源与 API Key:7 个数据提供方与市场边界

V2 的数据层是 7 个 provider 共用一套接口,带健康状态与自动故障切换:yfinance、SEC EDGAR、FMP、Finnhub、Adanos(零售情绪)、新闻聚合、FX;V1 只强依赖 FMP + OpenAI。本页把三代的密钥清单、市场覆盖与「钥匙该放哪儿」写清楚,并给出一条实测结论:代码层接受 600519.SS、0700.HK 这类代码,但那不等于数据层真的能取到 A 股数据。

V2:7 providers + failoverA 股:代码层接受、数据层自接密钥存进系统钥匙串
行情与公开数据yfinance / FX
财报与申报FMP / SEC EDGAR / Finnhub
情绪与新闻Adanos / 新闻聚合
共同契约健康状态 + failover
V2 数据提供方分组示意图;本机实测的边界结论见本页「市场覆盖」一节。
V2 providers7 个,带故障切换
V1 依赖FMP + OpenAI
密钥去向系统钥匙串(Settings 页)
核验基准commit 2717499
七个提供方

FinRobot V2 的 7 个数据提供方分别提供什么?

它们共用一套接口,每个都带健康状态(可用 / 已保存 / 可选 / 冷却中),一个源停止应答时按状态切换到下一个;数据进入计算层之前还有一层响应校验,畸形载荷会被拒掉。下表把「提供什么、缺了会怎样、本机能不能实测」逐行写清——本机没有配任何数据源 key,所以只有不依赖私有 key 的两项能做源码级核验。

提供方提供什么要 key 吗缺了会怎样本机核验到什么程度
yfinance公开行情与历史价格通常不需要价格与技术面类指标缺失,行情区降级源码核验;未联网取数
edgar(SEC EDGAR)美股申报文件:10-K / 10-Q / 8-K、Form 4 内部人交易、13F 等通过公开接口访问(仓库用 edgartools)申报与治理类章节失去来源源码核验;仓库自带针对 AAPL / MSFT / NVDA / TSLA / JPM / BRK-B 的解析 fixtures
fmp三大报表与倍数相关字段需要 FMP key(可选启用)财务字段缺失,对应估值方法行被降级隐藏并留警告未实测(本机无 key)
finnhub公司新闻与部分财务/行情字段需要 Finnhub key新闻与情绪类输入缺失未实测(本机无 key)
adanos零售情绪:Reddit / X.com / Polymarket 的结构化快照需要 Adanos key(可选)情绪层不出现,不影响估值主干未实测(本机无 key)
news_aggregator新闻聚合视来源而定新闻章节缺内容未实测
fx汇率,用于跨币种归一视来源而定跨币种标的的估值口径可能无法归一到报价币种(例如报 TWD 或 EUR 的标的)源码核验(含 fx_normalize 算子与币种字段)
数据层还带了这些配套件:响应缓存、标的索引、报价批处理、SEC 持仓同步,以及一个在数据进入计算引擎之前拒绝畸形载荷的校验器。行业惯例是把「取数失败」做成静默空表,这里是把它变成显式警告 + 少一行结果——两者的排查体验差别很大。
三代对照

FinRobot 的 V0、V1、V2 分别用什么数据源?

「FinRobot 支持哪些数据源」这个问题的答案同样取决于版本,而且三代存放密钥的位置也完全不同:V0 是一堆独立的 utils 模块,V1 只强依赖两个服务,V2 才把它做成带故障切换的数据层。混用两代的配置文件是常见错配来源。

版本数据源代码位置密钥配置位置注意点
V0(教学/论文)Finnhub(finnhub_utils.py)、FMP(fmp_utils.py)、SEC 申报(sec_utils.py + filings_src/ + marker_sec_src/ 的 PDF→Markdown)、yfinance(yfinance_utils.py)、Reddit(reddit_utils.py)、FinNLP(finnlp_utils.py)、财报电话会议(earnings_calls_src/)finrobot_autogen/finrobot/data_source/finrobot_autogen/config_api_keys(字段含 FINNHUB_API_KEY / FMP_API_KEY / SEC_API_KEY / REDDIT_CLIENT_ID / REDDIT_CLIENT_SECRET / TWITTER_BEARER_TOKEN)FinNLP 是 git submodule,目录空时要 git submodule update --init --recursive;官方明说这一代没有确定性计算层与溯源跟踪
V1(自托管 Web 应用)强依赖 FMP(财报、市场指标、同业比较)+ OpenAI(叙述生成);可选 Adanos(零售情绪)finrobot_equity/core/src/modules/market_data_api.py、retail_sentiment_client.pyfinrobot_equity/core/config/config.ini(fmp_api_key / openai_api_key / adanos_api_key)8 个 section writer 以已算好的数字为上下文;填 Adanos 才会多出一层零售情绪
V2(生产)上表 7 个 provider,带健康状态与自动故障切换finrobot_desktop/finrobot/engine/data/providers/桌面/浏览器界面的 Settings 页,写入系统钥匙串只有这一代有响应校验与「缺数据就留警告」的降级行为
一个具体坑:PyPI 上的 pip install finrobot 装到的是 2024 年的 V0,而且一条依赖都没带,所以连 finnhub 模块都 import 不到。V0 要用源码路径(仓库根 pip install -e .),V2 要走 uv sync。这条错配的完整实测记录在安装页。
市场边界

A 股、港股、美股:FinRobot 官方支持到哪一步?

这一节是本页最需要看清的部分。官方数据链路与全部示例都偏美股;中文圈常见的误解是「代码能接受 A 股代码」= 「能分析 A 股」。下面先给矩阵,再给本站实测到的边界证据。

市场官方链路支持程度本机实测到的边界要自己补什么主要风险
美股覆盖较完整:FMP / Finnhub / SEC EDGAR / yfinance,官方示例与仓库测试 fixtures 都是美股标的校验层接受常规美股代码基本只需配 key 与确认档位数据源额度上限与限流
港股官方未把港股列为主场景validate_ticker('0700.HK') 原样通过确认所选 provider 是否真的返回港股字段;核对财报币种与报告期数据覆盖与字段口径不确定,容易「有数字但口径不对」
A 股官方未内置 A 股数据源validate_ticker('600519.SS') 与 ('123456.SZ') 都原样通过自行接入 A 股数据源,并处理代码后缀与交易所映射、中文财报与公告解析、人民币/美元币种与单位、季度与年度口径、交易日历与停牌、复权方式、涨跌停与 T+1 制度把美股链路直接套到 A 股上,会得到看起来正常但口径错误的结果
本机实测输入实际输出说明
validate_ticker('AAPL') / ('MSFT')原样返回常规美股代码通过
validate_ticker('aapl')'AAPL'小写会被归一化成大写
validate_ticker('600519.SS') / ('123456.SZ') / ('0700.HK')均原样通过代码层不拦 A 股与港股后缀,这不代表数据层能取到
validate_ticker('')ValueError: Invalid ticker ''. Use A-Z/0-9/./- up to 12 chars, e.g. AAPL or BRK.B校验层只做格式检查,不做市场可用性检查
怎么用这条结论:校验器管的是「格式像不像代码」,不管「数据源有没有这只标的的数据」。所以看到 A 股代码能通过校验,不要据此判断支持 A 股。判断标准只有一个:你接入的数据源能否真的返回该标的的行情与财报字段,且口径与你后续计算一致。
密钥存放

FinRobot 的密钥该放哪儿?三代三种存法

「key 填了却没生效」多数时候不是 key 的问题,而是填错了地方。这三代的存放位置完全不同,放在一起看能少走很多弯路。

属于哪一代放哪里具体位置是否进版本控制注意点
V2(桌面与 CLI)系统钥匙串桌面 App 或浏览器界面的 Settings 页填写,不落 .env 文件不进浏览器模式下本地 API 无鉴权,见下方风险提示
V1(Web 应用)配置文件finrobot_equity/core/config/config.ini只有 config.ini.example 进;config.ini 被忽略要从 example 复制,不要直接改 example 文件
V0(LLM 端点)配置文件finrobot_autogen/OAI_CONFIG_LIST只有 OAI_CONFIG_LIST_sample 进它是 AutoGen 配置列表,可以放多组端点,按模型名选用
V0(数据源)配置文件finrobot_autogen/config_api_keys只有 config_api_keys_sample 进用 finrobot.utils.register_keys_from_json("config_api_keys") 载入环境;只填你要用的源
V1(服务参数)环境变量WEB_HOST / WEB_PORT / DATABASE_URL / GITHUB_CLIENT_ID / GITHUB_CLIENT_SECRET / FINROBOT_ADMIN_EMAIL(S) / FINROBOT_ADMIN_PASSWORD / ADANOS_*不进初始管理员密码未设置时,首次启动会打印一个随机值
风险提示(官方子目录文档写到,但很容易被忽略):V2 的浏览器模式下,本地后端把鉴权中间件降级成空操作——桌面壳有每次启动的能力令牌,纯浏览器读不到,于是任何本机进程都能访问 :8321,其中包含持有你密钥的 /api/settings。它仍然只绑定本地回环地址,但在共享机器上请优先用桌面 App。
三条纪律:①不要提交进仓库;②不要贴进截图、日志或 issue;③排查时只打印「是否存在与长度」,不打印内容。
成本结构

这些数据源要花多少钱?哪些能免费起步

官方 README 只列 provider 名,不告诉你哪些能免费用、免费档会卡在哪里。下表把「要不要钱、免费档能做什么、低成本怎么起步」摊开;具体价格与额度一律以各家官方定价页为准,本站不转述数字。

项目是否必须免费档情况计费形态免费档的典型卡点低成本起步建议
库本体必须开源免费(Apache-2.0)不按调用计费无按官方安装说明装好即可
LLM API必须(除纯算子实验)是否有试用额度以官方定价页为准按用量计费额度用尽时推理环节直接失败先用小样本、短链路跑通再放量;纯算子实验不需要 LLM
yfinance可选通常无需 key无 key 计费公开接口的限流与可用性不受这个库控制拿它做链路验证,正式研报再换稳定源
SEC EDGAR按需属公开申报数据,访问要求以 SEC 官方说明为准通常不按调用收费高频访问可能被要求降速只在需要申报原文时调用,并做本地缓存
FMP做财报与估值时必填通常提供免费档,字段范围以官方为准免费档 + 付费档部分报表字段或较长历史区间在免费档不可用只取研报真正用到的那几张表
Finnhub做新闻/行情时必填通常提供免费档,额度以官方为准免费档 + 付费档免费档容易在调用频率上受限,超限时可能返回空结果先用免费档验证「能不能取到」,再决定是否升级
Adanos可选以官方为准以官方为准属情绪类补充数据,不影响估值主干等主干链路稳定后再评估
商业版产品(finrobot.ai)不需要——本机无法验证其条款与价格开源链路够用时不必考虑;如需使用,条款以官方为准
一句话结论:软件本身免费,真正的成本在「LLM 调用量 + 需要付费档的数据源」。如果只是想先验证「这套东西到底怎么算数」,可以直接跑官方确定性算子——那一步不需要任何 key、不需要联网、也不花 API 钱,实测输出见首次运行页。
配置步骤

FinRobot 的密钥怎么配到位?五步与每步的预期输出

每步都写清「做什么、为什么、预期看到什么」。做完这五步,你应该能明确回答:哪个源真的通、哪个源虽然配了但没生效。

  1. 先选版本,再建环境

    V2 用 uv(cd finrobot_desktop && uv sync);V1 用 venv 并 pip install -r finrobot_equity/requirements.txt;V0 用 conda 建 Python 3.10 或 3.11 环境后在仓库根 pip install -e .。
    预期输出:命令提示符出现环境名(或 .venv 生效)、python -V 落在允许区间内。若 V2 提示找不到 uv,先装 uv——这是本机实测最先撞到的卡点。

  2. 按版本把密钥填到正确位置

    对照上表:V2 在 Settings 页填写(写入系统钥匙串);V1 复制 config.ini.example 为 config.ini 填两个必填 key;V0 把两个 *_sample 文件复制成正式文件并放在 finrobot_autogen/。
    预期输出:配置文件里没有占位串、没有首尾空格;config.ini 与 config_api_keys 处于被忽略状态(不会出现在 git 待提交列表里)。

  3. 逐个源做最小验证

    用一个官方示例里的美股标的,每次只调用一个 provider,打印返回行数与列名,而不是直接跑完整研报。
    预期输出:非空结果 + 你认识的列名。若为空,先按下面的排查表走,再去怀疑标的本身。

  4. 确认「实际读到的是哪一个 key」

    在代码里打印每个源是否读到 key(只打印是否存在与长度,不要打印 key 本身),并记录这次跑通的组合。
    预期输出:每个源都能明确回答「有 / 没有」;两处配置冲突时,这一步会立刻暴露。

  5. 最后才接回完整链路

    单源验证通过后再跑端到端流程(例如 finrobot research <ticker> 或 V1 的 deploy.sh start)。
    预期输出:输出里出现估值方法行与数值,且缺少数据的地方带警告而不是静默缺失。看不到警告通道时,说明你走的不是 V2 的降级路径。

顺序的意义:先单源、再链路。反过来做会把「源的问题」和「编排的问题」混在一起,排查成本明显更高。这条经验在任何多数据源系统里都成立。
排查表

密钥填了却没生效?九类原因与确认方法

这类问题最费时间的地方在于「它不报错」。下面按排查顺序排列,从「密钥本身」到「环境与档位」,每类都给出确认方法与判断标准。

现象怎么确认处理注意点
配置里还是占位符或空串打开配置文件,看是否残留示例占位串或空值换成真实 key,去掉首尾引号与空格复制 key 时最容易带上空格,肉眼很难发现
填到了另一份配置文件确认运行时代码实际读取的是哪一份文件只保留一处配置;notebook 里注意当前工作目录notebook 的工作目录常与项目根不一致
环境变量与配置文件冲突在代码里打印「实际读到的值是否存在」(不打印内容)固定一种配置来源,避免两处并存排查时要防止把 key 打到日志里
key 有效、接口也连得上,但返回空表先用该 provider 的官方文档示例参数单独调一次,再用你自己的参数调一次,比对差异多半是「字段不在当前档位」或「该市场不在覆盖范围」,而不是 key 错「能连通」不等于「字段都能拿到」;空表不会报错
key 有效但被限流隔一段时间或降低调用频率后重试同一请求加本地缓存、减少重复调用限流常表现为「返回空」而不是报错
该源需要更高档位才有你要的数据用该源的最小样例单独调一次,看返回字段是否齐全确认字段与历史区间是否属于更高档位档位差异以各家官方定价页为准
标的市场不匹配换一个官方示例里的美股标的再试同一路径先确认标的是否属于该源覆盖的市场官方数据源以美股为主,A 股要自行适配
本地后端没有起来(V2 浏览器模式)看 :8321 是否有响应;浏览器模式要先跑 ./dev.sh,它会先释放 :8321 与 :5173 两个端口按官方说明先起后端、再开前端;被占端口先腾出来桌面 App 开着时也会占用 :8321,需要先退出
环境和包的问题(密钥其实没问题)确认当前解释器或 notebook 内核能导入项目包重新激活环境或修正内核命令行能跑、notebook 不能跑,通常是内核不同
顺序建议:先证明单个源能取到数,再把它接回智能体链路。另外记住「返回空」和「报错」是两类不同问题:报错能定位到组件,返回空只能靠逐层比对参数,所以更要保留每一步的输入输出记录。
任务矩阵

按任务配源:六类研究任务要配哪些数据源

与其把所有 key 都申请一遍,不如按任务配最小集合。下表给的是「至少」而不是「最多」,并附上对应的 V2 入口。

想做的分析至少要配的源V2 入口可选的补充源注意点
三大报表与财务比率FMP随研究流水线取数SEC EDGAR(核对申报原文)免费档字段范围以官方为准
行情与技术面yfinance 或 Finnhub随研究流水线取数另一个源做交叉验证yfinance 通常无需 key,但稳定性不受这个库控制
申报文件与公司治理SEC EDGAR随研究流水线取数FMP主要覆盖美股申报,非美股市场需自行适配
新闻与情绪新闻聚合 / Finnhub随研究流水线取数Adanos(零售情绪)情绪类结论建议人工复核后再用
估值(DCF / DDM / LBO / WACC 等)FMP(财务)finrobot dcf <ticker> / finrobot lboSEC EDGAR估值数字由纯 Python 算子计算,模型只负责叙述
完整研报LLM + FMP + 行情源finrobot research <ticker>SEC EDGAR / Adanos缺数据时方法行会被降级隐藏并留警告,产出仍会生成
FAQ

FinRobot 数据源与密钥常见问题

FinRobot 支持 A 股数据吗?

官方数据链路与全部示例都偏美股,没有内置 A 股数据源;要在 A 股上复用这条链路,需要自己接数据源并处理复权、币种、季度口径、停牌与涨跌停等差异。注意一处容易误判的地方:本站实测 validate_ticker 对 600519.SS、123456.SZ 都原样放行,但那只是格式校验通过,不代表数据层取得到数据。判断标准以你接入的数据源实际返回为准。

代码层接受 600519.SS,是不是说明支持 A 股?

不是。校验器只检查「字符是否符合 A-Z/0-9/./- 且不超过 12 位」,不做市场可用性检查;空串才会报错。真正决定能不能分析 A 股的是数据提供方能否返回该标的的行情与财报字段,以及口径是否与你后续的计算一致。V2 的 7 个 provider 里没有 A 股数据源。

yfinance 需要 key 吗?

通常不需要,但它走公开接口,限流与可用性不受这个库控制,适合做链路验证,不适合作为单一数据依赖。它也被列在 V2 的 7 个 provider 之内,带健康状态与故障切换,但切换能力来自框架层,不改变 yfinance 自身的不确定性。以官方仓库的实现为准。

密钥放在哪里最安全?

优先用 V2 的 Settings 页,它写入系统钥匙串而不是 .env。如果用 V0,注意两个 *_sample 文件才在版本控制里,填好的副本应当保持被忽略状态。任何一代都不要把 key 提交进仓库、贴进截图或日志;排查时只打印「是否存在与长度」。

浏览器模式的密钥安全吗?

需要注意。浏览器模式下本地后端的鉴权被降级为空操作(桌面壳有每次启动的能力令牌,纯浏览器读不到),任何本机进程都能访问 :8321,其中包含持有密钥的 /api/settings。它只绑定回环地址,但共享机器上优先用桌面 App。这是官方子目录文档写明的行为。

数据源返回空怎么办?

先分清两类:接口连不上(会报错)与接口连上但返回空(不报错)。后者按「占位符 → 配置文件位置 → 环境变量冲突 → 档位是否覆盖该字段 → 是否被限流 → 标的是否属于该源覆盖市场」的顺序排查。本站实测里最容易被忽略的是倒数第二类:限流常常表现为返回空。

能只配一个数据源吗?

可以,但能力会随之收窄:只有行情源就没有财报字段,只有财报源就缺价格与技术面。V2 的做法是缺哪个就降级隐藏对应方法行并留下警告,所以你拿到的东西会变少,而不是拿到一个错数字。各源覆盖范围以官方 README 与实现为准。

这些数据源要花钱吗?

项目本体是 Apache-2.0 开源、免费;成本来自 LLM 调用与部分 provider 的付费档。免费档的字段范围与调用额度各家不同,本站不转述具体数字,一律以各家官方定价页为准。如果只是想先验证这套系统怎么算数,可以直接跑官方确定性算子,那一步无需任何 key。

数据源清楚了,下一步看什么?

FinRobot 的估值是「代码确定性计算」,不靠模型编数字,看估值页理解 DCF/DDM/LBO/WACC 是怎么算的;也可以先按配置步骤把一次取数跑通。