A股老唐价值投资选股与回测
Overview
本 skill 把"老唐价值投资法"机械化为一套可复用的 A股选股 + 回测流水线。全部引擎代码、抓取客户端、报告生成器与方法论文档已随 skill 打包在 scripts/ashare-value-screener/(含 README.md 详述)。本文件提供方法论、阈值、公式、回测口径与运行命令,使 WorkBuddy 能在新会话或新环境直接重建并运行该策略,无需从零回忆流程。
策略目标:从 沪深300 / 中证500 / 中证1000 / 科创板 四个池中,筛出"已过质量关 + 老唐适用 + 已到/接近买点"的标的,并给出买点、卖点与回测验证。
When To Use
- 用户想用老唐估值法筛选 A股("用老唐法选股""价值投资选股")
- 用户要"找便宜的好公司""已到买点的股票""折价深的标的"
- 用户要做 A股选股策略回测(vs 沪深300)或质疑回测口径
- 用户要复现、扩展或审计这套"去劣 → 漏斗 → 老唐 → 分层"流水线
- 用户提及 laotang_engine / quality_metrics / backtest_v2 等本 skill 组件
核心流水线(四步)
完整实现见 scripts/ashare-value-screener/ 下的 screener.py(主流程)、quality_metrics.py(去劣)、laotang_engine.py(估值引擎)。
第 1 步 · 去劣(quality_metrics.py)
用近 10 年年报剔除"非一流公司"。七项硬指标任一触发即排除,除非命中豁免。具体阈值与豁免规则见 references/thresholds_and_pitfalls.md 的"去劣七项"。
关键:财务困境一律不豁免(利息覆盖 < 2 或 OCF/净利 < 0.7 直接排除)。
第 2 步 · 漏斗(screener.py)
对幸存者按 ROE、PE、OCF/净利、负债率打分(满分 4 分),靠前者进入估值环节。
第 3 步 · 老唐估值(laotang_engine.py,核心)
三大前提必须全过,否则判"不适用":
1. 利润为真:OCF/净利润 > 0.5 且 非经常性损益/净利 < 10%
2. 利润可持续:定性判断(护城河、周期属性)
3. 少资本投入:资本开支/净利 < 50%
估值公式:
第3年净利 = 机构一致预期(neodata→东财F10),缺失则近3年CAGR外推(限幅 -20%~+40%)
合理市值 = 第3年净利 × [25,30] 倍PE
买点市值 = 合理市值 × 50%
卖点(一年内) = min(当年净利 × 50倍PE, 合理市值下限 × 150%)
有息负债率 ≥ 70% 时,第3年自由现金流打 7 折。
信号:当前市值 ≤ 保守买点 → 已到买点;≤ 乐观买点 → 接近买点;否则 → 等待。
其他排除:强周期行业(采矿/有色/钢铁/建材/航运)直接不适用;周期敏感行业用近 5 年利润波动兜底;银行/地产/高资本投入科技不适用。
第 4 步 · 分层输出(screener.py)
- 最终候选:过四步 + 老唐适用 + 信号为"已到/接近买点"
- 观察池:过四步 + 老唐适用,但当前"等待"
- 质量达标·老唐不适用:过重资本/周期,不给买卖点(如胜宏科技)
回测口径(backtest_v2.py)
- 每年 4/30 用当时可得年报重算,等权持有 12 个月
- 不复权月线对齐,空仓按 0%
- 宇宙:全池 + 逐年重放去劣七项
- 严禁幸存者偏差:绝不能用"今天通过质量筛选的标的"当历史宇宙(会提前剔除暴雷/退市股,虚高收益)
- 结果(2019→2026,7 期):修正口径累计 +32.2% 跑赢沪深300 的 +22.8%(年化超额约 1pct,回撤 -21.5% vs -29.6%),优势有限但抗跌性仍在
- 另有
backtest_top3.py:每期从合格标的挑 3 只等权(折价最深 / ROE最高 / PE最低 三种排序),样本太小不显著
运行命令
在 scripts/ashare-value-screener/ 目录下执行:
python3 run_universe.py # 完整选股(四宇宙,耗时较长)
python3 run_backtest_rebuild.py # 补算历史价格分位并重建看板
python3 backtest_v2.py # 回测(修正口径,全池+逐年重放去劣)
python3 build_bt_v2_html.py # 生成回测报告 HTML
报告产物:reports/<板块>_value_<日期>.html(自包含,双击即开)。
数据源与已知坑
详见 references/thresholds_and_pitfalls.md。执行前务必注意:
- 行情/月线:腾讯
ifzq.gtimg.cn(绝不用web.前缀,会被 WAF 拦截返回 HTML) - 指数源三级兜底:腾讯 → 东财
push2his.eastmoney.com→ 新浪日线聚月线,落盘data/bt_cache/idx_*.json - 宇宙规范去重
_canon():科创板裸码688xxx与带前缀sh688xxx会重复导致双倍加权,必须统一 sh/sz/bj 前缀 - 首跑需重建数据缓存(约 35 分钟),
data/未随 skill 打包(可再生成);reports/产物也未打包 - 抓取失败要有退避重试 + 限流(
_throttle),避免被反爬
局限
退市/暂停上市未计入(仍高估收益)、用今天指数成分而非每年成分、历史缺逐年 capex(所有者收益口径退化为单看企业 FCF)、样本仅 7 期统计意义弱、未扣交易成本。解释结论时需主动声明这些偏差。
Resources
scripts/ashare-value-screener/— 完整 Python 引擎、抓取客户端、报告生成器与README.md方法论references/thresholds_and_pitfalls.md— 去劣七项阈值表、老唐三大前提、数据源清单、已知坑与修复记录