这是一个 FastAPI + 单页前端的美股估值分析服务。当前版本统一使用 FMP 作为数据源,避免不同来源之间口径不一致。
- 抓取公司基础资料、最新价格、估值倍数和历史价格
- 抓取 FMP 季度财报、分析师预期、历史财报事件和 EPS surprise
- 展示历史 P/E、Forward P/E、P/S、EV/EBITDA 曲线与分位
- 基于 FMP peers 生成同行候选,并按行业、板块、市值排序
- 用价格模拟和财报达成率辅助输出估值结论
- 提供网页仪表盘、普通 JSON API 和流式日志 API
providers/: FMP 数据抓取层services/: 估值、同行比较、财报达成率和价格模拟逻辑api.py: FastAPI 接口与 token 校验web/: 单页前端仪表盘
服务默认只读取进程环境变量,不会自动读取 .env。如果要从文件读取配置,请显式使用 --env-file。
可用配置:
APP_NAME=US Equity Valuation Analyzer
APP_ENV=local
HOST=127.0.0.1
PORT=8000
FMP_API_KEY=your_fmp_api_key
FMP_BASE_URL=https://financialmodelingprep.com/stable
FMP_MAX_WORKERS=4
APP_ACCESS_TOKEN=FMP_API_KEY 是获取财务和估值数据所需的 key。APP_ACCESS_TOKEN 为空时不启用访问控制;如果要放到公网,建议设置一个足够长的随机 token。
所有 FMP 数据都会实时查询,不再保留本地 API 缓存。
FMP_MAX_WORKERS 控制单次分析中核心 FMP 请求的最大并发数,默认 4;如果遇到 FMP 限流,可以调低到 2。
python -m venv .venv
source .venv/bin/activate
pip install -e .
export FMP_API_KEY=your_fmp_api_key
valuation-analysis --reload如果想用配置文件:
cp env.example .env
valuation-analysis --env-file .env --reload也可以继续直接使用 uvicorn,但这种方式只读取系统环境变量:
uvicorn --app-dir src valuation_analysis.api:app --reload启动后访问:
GET /GET /healthGET /analyze/AAPLGET /analyze-stream/AAPLGET /analyze/MSFT?peer_count=6
/analyze-stream/{symbol} 会返回 Server-Sent Events,前端的运行日志就是通过这个接口显示的。
默认从宿主机环境变量读取配置:
export FMP_API_KEY=your_fmp_api_key
export APP_ACCESS_TOKEN=change_me_to_a_long_random_token
docker compose up --build -d如果要使用环境变量文件,请用 Docker Compose 的 --env-file 参数:
cp env.example .env
docker compose --env-file .env up --build -d如果 token 包含 $ 这类 shell/Compose 会解释的字符,请在 .env 里用单引号包住,例如:
APP_ACCESS_TOKEN='abc$xyz'不用 Compose 时:
docker build -t valuation-analysis .
docker run \
--env-file .env \
-p 8000:8000 \
valuation-analysis容器内服务监听 0.0.0.0:8000,访问地址为:
http://localhost:8000设置 APP_ACCESS_TOKEN 后,/analyze/{symbol} 和 /analyze-stream/{symbol} 都需要 token。
后端支持两种传参方式:
Authorization: Bearer <token>?access_token=<token>
网页仪表盘的“访问 Token”输入框会自动把 token 传给后端。
网页仪表盘当前展示:
- 公司画像:名称、行业、板块、市值
- 价格模拟:上次、近 1 年、近 2 年、近 5 年、历史中位估值对应目标价
- 估值评分:估值 / 执行 / 成长三个维度
- 市场快照:价格、5 日均价、30 日均价、P/E、PEG、P/S、EV/EBITDA、52 周区间
- 历史估值曲线:Trailing P/E、Forward P/E、P/S、EV/EBITDA
- 未来预期:本年/明年 EPS 与收入、增长率
- 财报达成率:beat rate、平均 surprise、近期财报事件
- 同行估值横截面与季度财务摘要
当前版本只使用 FMP stock-peers 返回的候选,不再依赖本地股票池或离线索引。
同行筛选流程:
- 先拉取 FMP peers 候选代码
- 再逐个获取候选公司的 FMP 公司画像
- 优先保留行业完全匹配的公司
- 行业不足时使用同板块公司补足
- 最终按市值从大到小展示
同行估值仍然只是参考信号。对于 AAPL、TSM、ASML 这类业务边界很特殊的公司,后续更适合增加“自定义可比公司篮子”。
当前版本统一使用 FMP:
income-statement: 历史季度财报earnings: 历史财报事件与 EPS surpriseanalyst-estimates: 未来 EPS 与收入预期historical-price-eod/full: 历史价格与均价ratios-ttm/key-metrics-ttm: 估值倍数补充
EPS surprise 轨迹默认追踪最近 10 次有 estimate 和 actual 的财报事件。
估值维度主要参考价格模拟:
- 上次、近 1 年、近 2 年、近 5 年、历史中位估值对应目标价
- 若 4 个或以上目标价高于当前价格 20% 以上,判为极度低估
- 若 3 个目标价高于当前价格 20% 以上,判为低估
- 若 1 个或 0 个目标价高于当前价格,判为高估
成长维度主要参考未来 EPS 增速和收入增速;执行维度主要参考历史 EPS beat rate 与平均 surprise。
- 增加自定义可比公司篮子,解决特殊行业或垄断型公司的同行不准问题
- 增加 DCF、分部估值和 Bull/Base/Bear 情景分析
- 增加历史分析结果存储,用来追踪模型判断变化
- 增加任务调度,定时刷新重点股票