stock-valuation-screener
A 股每日估值偏离捕捉器 v2.6:收盘后自动扫描全市场,筛选 6 类"估值偏离机会", 输出 Excel + Word + PPT + HTML 四件套报告,含 Z-score/EV-EBITDA/DDM 量化分析、 组合聚合分析、数据质量评估与轻量回测引擎。v2.6 新增语音交互(说一句话就能 扫描/查板块/查个股/出报告,零依赖自动降级)与性能优化(spot 缓存修复 + 样本记忆化 + 报告并行 + 阶段计时)。
⚠️ 重要限制(请先阅读)
| 限制 | 说明 |
|------|------|
| 🔴 DCF 是简化版 | 基于历史 PE 中位数法估算,不是专业 DCF 模型(不预测未来现金流),仅作辅助参考 |
| 🔴 公告检测基于关键词 | 通过关键词匹配判断"治理负面",存在误判可能 |
| 🔴 次新股/冷门股支持不足 | 历史数据不足 5 年时,历史分位策略无法触发;冷门股财务数据可能缺失 |
| 🟡 评分≠买入推荐 | 所有输出均为"机会提示",综合偏离度 70 分不代表一定会涨 |
| 🟡 依赖 akshare | 真实模式需 pip install akshare,未装时自动降级到 mock 数据 |
| 🟡 回测仅供参考 | v2.2 回测用历史市值变化代理收益,非实盘验证,不构成投资建议 |
💡 本工具定位:辅助研究分析的"估值偏离扫描器",帮您快速筛出值得关注的标的,不替代深度研究和专业判断。
30 秒上手
# 1. 安装依赖
pip install -r requirements.txt
# 2. Demo 模式(不连网,使用 sample/ 内置数据)
python scripts/daily_scan.py --demo
# 3. 真实模式(连 akshare 拉数据)
python scripts/daily_scan.py
# 4. v2.2 全家桶:四件套 + 并行 + JSON/CSV + 回测
python scripts/daily_scan.py --report-format all --html-report \
--workers 4 --save-json --save-csv --backtest
# 5. v2.6 语音交互(说/打字均可,无麦克风自动降级文本输入)
python scripts/daily_scan.py --voice --demo
python scripts/voice_interface.py --demo # 也可直接启动
# 6. v2.6 性能基准(打印各阶段耗时分解)
python scripts/daily_scan.py --demo --benchmark
🧹 上传前清理(v2.0.2)
skill 内不应包含二进制文件。运行后如产生 .pyc 缓存或临时图表,上传时会触发"禁止上传二进制文件"错误。
# 清理 .pyc 缓存(推荐每次打包前运行)
python scripts/clean_pyc.py
# 推荐:设置环境变量避免 .pyc 生成
# Windows CMD: set PYTHONDONTWRITEBYTECODE=1
# Windows PS: $env:PYTHONDONTWRITEBYTECODE=1
# Linux/Mac: export PYTHONDONTWRITEBYTECODE=1
图表 PNG 默认输出到 %TEMP%\stock-valuation-screener\charts\,不在 skill 包内,无需手动清理。
6 类筛选策略
| # | 策略 | 核心指标 | |---|---|---| | ① | 绝对估值低估 | DCF / PEG / DDM(含 v1.5 两阶段 Gordon)综合判断内在价值高于当前市值 | | ② | 相对估值低估 | 同板块内 PE/PB 百分位 < 20% 且 ROE > 10% | | ③ | 历史分位低估 | 当前 PE/PB/市值跌破近 5 年最低 10% 分位(+ v1.5 Z-score σ 偏离) | | ④ | 舆情事件机会 | 治理负面 + 业务面正常 + 近 N 日累计跌幅 > 10%(v1.5 修复跌幅逻辑) | | ⑤ | ETF 折溢价机会 | 折价率 < -1% 或 溢价率 > 1.5%(v1.5 接线,独立数据源 fund_etf_spot_em) | | ⑥ | 高股息红利机会 | 股息率>5% + ROE>8% + PB≤5 + 增长/稳定分红(v1.5 接线) |
关键能力
- ✅ 零密钥:akshare 公开数据,无需任何 API Key
- ✅ 可降级:无网络时用 sample/ 数据离线跑
- ✅ 可配置:所有阈值在
config.yaml中可调 - ✅ 可调度:v1.4 起通过
cmd /c+schtasks直接调用daily_scan.py(不依赖 .bat) - ✅ 可解释:每个股票都附自然语言触发理由
- ✅ 合规:仅"机会提示",无买卖建议,含免责声明
- ✅ 四件套报告(v2.2):Excel + Word + PPT + HTML Dashboard
- ✅ 组合视角(v2.2):HHI 行业集中度 + 加权偏离度/风险 + 组合健康度
- ✅ 数据质量(v2.2):完整性/时效性/一致性 → A/B/C/D 等级
- ✅ 回测验证(v2.2):策略历史命中率 / 前瞻收益 / 胜率 / 回撤
- ✅ 并行提速(v2.2):
--workers N线程池扫描 - ✅ 结构化输出(v2.2):
--save-json/--save-csv - ✅ 热门便宜股(v2.3):热门板块内估值洼地主动扫描(便宜度评分 0-100 + 追高风险惩罚)
- ✅ 净值便宜板块(v2.3):ETF 折价按板块聚合 + 热门×净值折价双重信号(
--strategies nav) - ✅ 语音交互(v2.6):
--voice进入会话;「扫描一下 / 热门板块 / 底部异动 / 资金监控 / 分析 600519 / 生成 word 报告」;TTS 三级降级(pyttsx3 → Windows SAPI 零依赖 → 终端打印),STT 三级降级(语音 → 听写 → 打字),中文数字读法自动转代码(「六零零五一九」→ 600519) - ✅ 性能优化(v2.6):修复每股重复拉取全市场快照的缺陷(spot 进程内缓存,N 次请求 → 1 次)+ sample JSON 记忆化 + 个股资金流/ETF 磁盘缓存 + 多格式报告并行生成 +
timings阶段耗时分解(--benchmark)
输出示例
每日估值偏离扫描汇总
扫描时间: 2026-08-09 15:30:00
全市场股票数: 35
命中股票数: 30
命中比率: 85.7%
策略分布:
①绝对低估 23 57.5%
②相对低估 2 5.0%
③历史分位 13 32.5%
④舆情机会 2 5.0%
组合摘要(v2.2):
行业集中度 HHI: 1291(分散)
加权综合偏离度: 65.3
组合健康度: 良(72.0)
数据质量(v2.2):
平均分: 80.0 等级: A 30 / B 0 / C 0 / D 0
每个股票展示:
| 字段 | 示例 | |---|---| | 代码 | 002230 | | 名称 | 科大讯飞 | | 行业 | 人工智能 | | 触发类型 | 3 历史分位低估 + 4 舆情事件机会 | | 评分 | 98 | | PE-TTM | 65.8 | | PB | 4.50 | | ROE | 8.5% | | 触发理由 | 历史分位低估:PE-TTM 65.8(百分位 10%,近 5 年最低 60.5)... |
目录结构
stock-valuation-screener/
├── SKILL.md # 主文档(agent 执行手册)
├── README.md # 本文件
├── requirements.txt # Python 依赖
├── pytest.ini # pytest 配置
├── config.yaml # 阈值/股票池/参数
├── (run_daily.bat 已删除) # v1.4 起通过 cmd /c + schtasks 直接调用
├── scripts/
│ ├── daily_scan.py # 主入口(v2.6:--voice / --benchmark / 报告并行)
│ ├── voice_interface.py # 🆕 v2.6 语音交互(口语解析 + TTS/STT 降级 + 会话)
│ ├── data_fetcher.py # 数据获取层(akshare + mock;v2.6 spot 缓存 + 记忆化)
│ ├── export_excel.py # Excel 导出(v1.x 兼容路径)
│ ├── strategies/
│ │ ├── absolute_value.py # 策略 ①
│ │ ├── relative_value.py # 策略 ②
│ │ ├── historical_low.py # 策略 ③
│ │ ├── event_drive.py # 策略 ④
│ │ ├── etf_discount.py # 策略 ⑤
│ │ ├── dividend_yield.py # 策略 ⑥
│ │ ├── hot_sector.py # v2.1 热门板块分析(v2.3 便宜股评分)
│ │ ├── backtest.py # v2.2 轻量回测引擎
│ │ ├── nav_discount.py # v2.3 净值便宜板块分析
│ │ └── undervalued_screener.py # v2.0 多倍数综合 + 多步DCF
│ ├── utils/
│ │ ├── valuation_analyzer.py # 综合偏离度(10 维度动态加权)
│ │ ├── risk_analyzer.py # 风险评分
│ │ ├── dcf_simplified.py # 简化 DCF / 两阶段 DDM
│ │ ├── data_validator.py # 数据校验
│ │ ├── quant_analyzer.py # v2.1 量化信号(资金流/动量/聪明钱)
│ │ ├── portfolio_aggregator.py # v2.2 组合聚合(HHI/健康度)
│ │ ├── data_quality.py # v2.2 数据质量(A/B/C/D)
│ │ ├── anomaly_monitor.py # v2.5 底部异动 + 资金监控
│ │ └── opportunity_confidence.py # 机会确定性
│ └── reports/
│ ├── base.py / chart_builder.py # 字体/图表基础
│ ├── excel_reporter.py # v2.0 Excel(v2.2 加组合/质量 sheet)
│ ├── word_reporter.py # v2.0 Word(v2.2 加组合/质量章节)
│ ├── ppt_reporter.py # v2.0 PPT(v2.2 加组合/质量页)
│ └── html_reporter.py # v2.2 HTML Dashboard
├── tests/ # 639 个测试用例(v1.0~v2.6 全量)
├── sample/ # 内置数据(无网络时可跑 demo;v2.3 新增 etf.json)
├── references/ # 参考文档
│ ├── valuation-methods.md # 估值方法详解
│ ├── data-sources.md # 数据源对比
│ ├── disclaimer.md # 免责声明
│ └── scheduling.md # 定时任务配置
└── outputs/ # 默认输出目录
定时任务
schtasks /create /tn "StockScreenerDaily" ^
/tr "cmd /c cd /d D:\claude 开发\skill of me\stock-valuation-screener && python scripts\daily_scan.py" ^
/sc weekly /d MON,TUE,WED,THU,FRI /st 15:30:00
❓ 常见问题与避坑指南
Q1: DCF 估值偏差很大?
A: 本工具的 DCF 是简化版(历史 PE 中位数法),不是专业 DCF 模型(不预测未来现金流)。它只是一种快速估算,用来判断当前估值是否偏离历史中枢。
Q2: 策略④舆情事件机会总是 0 条?
A: 舆情策略依赖公告关键词匹配"治理负面",如果近期没有负面公告,该策略不会触发。这是正常的。
Q3: 次新股分析结果为空?
A: 历史分位策略需要近 5 年数据,次新股历史不足会自动跳过。绝对估值和相对估值策略仍可触发。
Q4: 真实模式报错?
A: v1.2 起已自动降级到 mock 模式。如需真实数据:pip install akshare
Q5: 如何只跑某一个策略?
A: 使用 --strategies 参数:
python scripts/daily_scan.py --strategies etf,dividend # 只跑策略⑤⑥
python scripts/daily_scan.py --strategies absolute,relative # 只跑策略①②
Q6: 综合偏离度评分多少算"低估"?
A: 评分是相对值。一般:≥70 高度关注、50-70 适度关注、<50 暂时观望。但请结合风险评分和触发逻辑综合判断。
📖 术语解释
| 术语 | 含义 | |------|------| | DCF | 现金流折现估值法。本工具使用简化版(历史 PE 中位数法),非专业 DCF | | DDM | 股利折现模型。v1.5 新增两阶段 Gordon DDM | | PEG | 市盈率/盈利增长率。PEG<1 通常认为估值合理或偏低 | | PE-TTM | 滚动 12 个月市盈率 | | PB | 市净率。PB<1 表示股价低于每股净资产 | | ROE | 净资产收益率 | | Z-score | 标准分数,表示当前值偏离历史均值多少个标准差 | | EV/EBITDA | 企业价值/息税折旧摊销前利润 | | IOPV | ETF 的实时参考净值 | | 综合偏离度 | 10 维度加权评分(0-100),越高表示当前估值越低于合理水平 |
⚠️ 重要声明
本工具仅供研究分析使用,不构成任何投资建议。
详见 references/disclaimer.md。
更新日志
v2.6.0 (2026-08-22) — 语音交互 + 性能优化
- 新增语音交互(
scripts/voice_interface.py,--voice):六大口语指令(扫描/热门板块/底部异动/资金监控/单股分析/生成报告);中文数字读法转代码;代码提取不用\b词边界(Unicode 下汉字也是单词字符)改用数字守卫 - 零依赖语音引擎:TTS 三级降级(pyttsx3 → Windows SAPI → 终端打印);STT 三级降级(speech_recognition → SAPI 听写 → 文本输入);
config.yaml新增voice配置节;speak/listen/executor 全可注入便于测试 - 性能修复:旧版
fetch_financial_akshare每股重复拉一次全市场快照(ak.stock_zh_a_spot_em)算股息率,现为get_spot_price_map()进程内缓存(600s 内只拉 1 次) - 性能优化:sample JSON mtime 记忆化(深拷贝隔离)+ 个股资金流/ETF 磁盘缓存(TTL)+ 多格式报告线程池并行生成 +
timings阶段耗时分解 +--benchmark - 测试 582 → 639 passed(v2.6 新增 57)
v2.3.0 (2026-08-17) — 热门板块便宜股 + 净值便宜板块
- 新增热门板块估值便宜股分析:便宜度评分 0-100(PE/PB 折价 + 市值 + 追高惩罚),每板块 TOP N 补涨候选(
strategies/hot_sector.py) - 新增净值便宜板块分析:ETF 折价按板块聚合(关键词提取 + 同义词归一)+ 热门×净值折价双重信号(
strategies/nav_discount.py) - 新增 sample/etf.json(24 只 ETF),demo 模式 ETF/净值分析开箱即用;CLI 支持
--strategies nav - 四报告端全接线:Excel「⑭净值便宜板块」sheet + Word「五·六」章节 + PPT 新页 + HTML 双面板
- 质量固化:全项目编译零警告 + 禁止裸 except 烟囱测试
- 测试 465 → 507 passed
v2.2.0 (2026-08-17) — 组合分析 + 数据质量 + 回测 + HTML 四件套
- 新增组合聚合分析:HHI 行业集中度 + 市值加权偏离度/风险 + 组合健康度 + 警示(
utils/portfolio_aggregator.py) - 新增数据质量评估:完整性/时效性/一致性 → A/B/C/D 等级(
utils/data_quality.py) - 新增轻量回测引擎:策略 1/3/6 历史命中率 / 5·20·60 日前瞻收益 / 胜率 / 最大回撤 / Sharpe(
strategies/backtest.py,--backtest) - 新增 HTML 交互式 Dashboard(Chart.js 图表 + 可排序过滤表格,
reports/html_reporter.py) - 并行扫描
--workers N(线程池,与串行结果一致)+--save-json/--save-csv结构化落盘 - 修复 BUG-033:mock 市值单位(亿元)与 akshare(元)不一致导致 demo 壳股误判
- Excel 增「⑮组合摘要」「⑯数据质量」sheet;Word/PPT 增对应章节/页
- 测试 390 → 465 passed
v1.5.0 (2026-08-10) — 接线修复 + 量化分析增强
- 修复 4 类接线缺陷:ETF(⑤)/高股息(⑥) 策略此前从未真正执行、export_excel 忽略策略 5/6、event_drive 跌幅逻辑、DCF 股本计算
- 新增 3 个量化维度:Z-score 统计偏离(σ)、EV/EBITDA 相对估值、两阶段 Gordon DDM
- 综合偏离度从 7 维扩到 10 维动态加权(缺失维度权重自动分摊)
- 机会确定性评分接入 Excel(⑨机会确定性 sheet)
- 测试 223 → 267 passed
v1.2.0 (2026-08-09) — 健壮性 + 测试覆盖
- 修复 7 类真实缺陷(详见 SKILL.md BUG 列表)
- akshare 失败自动降级到 mock
- ROE 负数显示 N/A(保留亏损信号)
- 配置文件缺键回退默认值
- 日期生成用 PowerShell(跨区域稳健)
- 测试 47 → 86 passed
v1.0.0 (2026-08-09) — 首发
- 4 类筛选策略 + 6 sheet Excel + mock/akshare 双后端
微信扫一扫