dsh-index-fund-guide
把《指数基金投资指南》(银行螺丝钉)的估值—定投—卖出体系做成一个能算、能核、能落地的工具箱,以 DSH 插件形态分发。
它不预测涨跌,也不替你做决定。它只做三件事:把书里的方法算清楚、把数据的来路摊开、把结论成立的前提写明。
你问:上证50 现在能不能买?
它答:盈利收益率 9.28% → 落在持有区(不是买入区)。
用的是 2026-10 校准口径,买入线 10%、卖出线 3%。
数据:自算 PE 10.87(逐只对账中位误差 0.012%),2026-10-19 收盘。
一、它能做什么
| 你的问题 | 它给你的东西 |
|---|---|
| 这只指数基金现在该买、该持、还是该卖? | 按「四类指数 → 四种方法」自动分派,给出信号 + 依据 + 用的是哪套阈值 |
| 书里 2017 年那条 6.4% 卖出线,现在还能用吗? | 用当期利率重算买卖线,并解释为什么两条线不同步下降 |
| 这个 PE 是真是假、是什么口径? | 不采信现成结论,取成分股+净利润+净资产自己除,逐只与公开值对账 |
| 每月 2000 块,该分给哪几只? | 按低估深度分配,带单只/同质组上限;一个都不低估时告诉你钱该去哪儿 |
| 这个月该投多少? | 按「越低估投越多」放大或缩小本月金额 |
| 我这笔定投的真实年化是多少? | IRR / XIRR(不是"总收益 ÷ 本金"那种假年化) |
| 我赚了多少?(含分红和手续费) | 持仓成本、浮动盈亏、已实现盈亏、累计分红、总收益、真实年化 |
| 从零开始,定投计划怎么落地? | 生成一张可打印填写的计划表(现金流 → 选基 → 渠道 → 记录表) |
| 这套规则真的有效吗? | 拿你自己的历史 PE 序列回测「估值定投 vs 无脑定投」 |
| 改了东西会不会算错? | 36 项保真断言,把书里可复现的数字钉成回归测试 |
二、九个核心功能
1. 判断信号 —— 先把品种分类,再谈买卖
同一个 PE,用对方法和用错方法会得出相反结论。所以第一步永远是分类:
| 品种类型 | 方法 | 判据 |
|---|---|---|
| 盈利稳定(上证50、沪深300、红利、恒生、H股) | 盈利收益率法 | 1/PE 对照买入线/卖出线 |
| 高速增长(创业板、中证500、纳指100) | 博格公式 | PE 历史分位 <30% 可投 |
| 周期但无长期亏损(证券、银行、能源) | PB 法 | PB 历史分位 <30% 可投 |
| 长期亏损(困境行业) | 放弃 | 任何估值都不买 |
python valuation.py signal --pe 9.01 --pe-type ttm --preset cal
品种方法 : 盈利收益率法(盈利稳定的价值指数)
盈利收益率 : 11.10%
信号 : 分批投资 (信号码 buy)
依据 : 盈利收益率 11.10% > 买入线 10.0%, 处于低估区, 按月坚持定投
阈值口径 : 当期校准-教材直译 2026-10-16
[!] 卖出线 3.0% 隐含 PE > 33 倍 … 本方法在当前环境几乎永远发不出"卖出"信号。
用错方法时会当场报警:
python valuation.py signal --method bog --pe 31.90 --percentile 18.2
信号 : 历史较低区域 (可开始/继续定投)
分位 18.2% < 30% → 便宜
交叉验证(盈利收益率): 3.13% -> 分批卖出
[!] 两种方法给出的信号不一致。这通常说明该品种被用错了方法。
创业板 PE 31.9 用盈利收益率法算出来是"卖出",按分位却是"最便宜的一档"——这就是分派的价值。
2. 阈值校准 —— 让阈值跟着利率走
python valuation.py calibrate --riskfree 1.65 --bond-avg 3.0 --as-of 2026-10
买入线 = max(10%, 2 × 无风险利率) = max(10%, 3.30%) = 10.00% -> PE < 10.00
卖出线 = 债基长期平均收益 + 风险溢价 = 3.00% -> PE > 33.33
对照书中 2017 口径: 买入线 10.0% (PE<10) 卖出线 6.4% (PE>15.62)
买入线锚定格雷厄姆的 10% 绝对安全边际,利率再低也不松;卖出线锚定"持有股票已不如持债",随债基收益一起下移。两条线不同步,于是持有区被拉宽到 PE 10~33——低利率下卖出条件事实上失效,卖出必须改用分位判断。这是本插件与原书最大的差异。
3. 自己算 PE/PB —— 不抄结论,逐只对账
python rawdata.py fetch --index 000300 # 成分股 + 行情 + 财报
python rawdata.py calc --index 000300 --verify --csv 000300.csv
指数 PE = Σ(成分股总市值) ÷ Σ(成分股净利润 TTM)
指数 PB = Σ(成分股总市值) ÷ Σ(成分股净资产)
TTM 净利润 = 本期累计 + 上年年报 − 上年同期
输出五种口径(中证口径 / 剔除亏损 / 自由流通 / 个股中位数 / PB)+逐只对账误差+可抽查的 CSV 明细。
2026-10-19 实测:沪深300 自算 PE 13.06 vs 公开 12.9964(偏差 +0.51%),279 只个股逐只对账中位误差 0.012%,97.5% 的个股误差 ≤1%。
4. 组合分配 —— 预算怎么分,以及"都不便宜时钱去哪"
python valuation.py portfolio --budget 2000 \
--candidates "000922:9.01:1:yield,510300:13.0:1:yield,399006:31.9:1:bog:18.2" \
--max-single 0.5
代码 方法 数值 盈利收益率 权重 金额
000922 yield 9.01 11.10% 50.00% 1000.00 元
399006 bog 31.90 -% 50.00% 1000.00 元
[!] 单只上限 50% 生效
提醒: 买到重复持仓不算分散 —— 上证50 / 基本面50 / H股 里有大量同一批银行股
- 候选格式
代码:估值[:折价[:方法[:分位]]] - 全市场都不低估 → 自动把预算指向债券基金(书里的规则)
- 预算 <1000 只留 1 只,<3000 最多 3 只
- 上限凑不满时明说"不可行",不假装满足
5. 定期不定额 —— 越低估投越多
python valuation.py amount --base 1000 --mode pe --first 10 --now 7.5 --n 1
# 本月金额 = 基准 × (首次PE / 当前PE)^n = 1000 × (10/7.5) = 1333.33 元
6. 定投年化 —— IRR / XIRR,不是"总收益 ÷ 本金"
python dingtou.py irr --invest 10000,10000,10000,10000,10000,10000,10000 --final 76518
# → 月均 2.2260%,年复 30.24%(书中案例)
7. 记账与真实收益 —— 成本法、分红、费用、已实现盈亏
python dingtou.py record --file 我的定投.csv --date 2026-10-20 --action 买 \
--code 510880 --amount 2000 --shares 700 --fee 0.4 --valuation 9.13 --valuation-type PE
python dingtou.py report --file 我的定投.csv --nav 510880:2.86
持仓成本 : 1544.91 元 当前市值 : 1598.81 元
浮动盈亏 : 53.90 元 已实现盈亏 : 43.61 元
累计分红 : 42.50 元 累计费用 : 1.30 元
总收益 : 140.01 元
真实年化 : 4.79% (XIRR: 按每笔资金的实际在场时间加权, 已含分红现金流)
卖出时按持仓均价结转成本,分红单独记账——不会把已实现盈亏混进成本。
8. 定投计划 —— 一张能填能贴的计划表
python dingtou.py plan --income 10000 --expense 6000 --age 35 --out 我的定投计划.md
四段式:梳理现金流 → 选低估品种 → 定渠道与定投日 → 附定投记录表。
9. 回测 —— 用你自己的历史序列验证规则
python valuation.py backtest --series pe_history.csv --amount 1000
# CSV 需含 date / pe / close,对比「估值定投 vs 无脑定投」
免费源拿不到历史 PE 序列,所以回测是 CSV 驱动:工具的价值在"让验证可重复",不在"替你取数"。
附:保真测试
python selftest.py # 36 项断言,离线可跑,全部来自书中可复现数字与 CLI 契约
三、判断模型(一屏看懂)
① 分类 ──→ 宽基还是行业?盈利稳不稳?→ 决定用哪套方法(错了结论会反转)
② 取数 ──→ 自己算 PE/PB(或第三方数据 + 数值/来源/时间三要素)
③ 定口径 ─→ book(2017 原文) / cal(2026 教材直译) / cal-rp(风险溢价平移)
④ 出信号 ─→ 分批买 / 坚定持有 / 分批卖
⑤ 落计划 ─→ 月投多少 → 分给谁 → 怎么写下来 → 怎么记账
卖出三层判据(按优先级)
- PE/PB 历史分位 >70% ← 校准后唯一稳定可用的判据
- 盈利收益率 < 卖出线 ← 理论正统,低利率下极少触发
- 有更便宜的同类品种 ← 同质组内估值倒挂时换仓
四、边界与风险
完整版见 DISCLAIMER.md,最要紧的四条:
- 低估不等于会涨,可以再低估 30%,也可以低估三年。
- 盈利收益率法在当前利率下几乎不会发出卖出信号,只依赖
signal可能在高位一直"持有"到回撤——必须叠加分位判断。 - 方法选错,结论反转。工具会提示"你可能选错方法了",但最终归你判断。
- 数据可能与现实有偏差:免费接口无 SLA、TTM 相减法在重组年份失真、分位 30%/70% 是工具自定的(书里只说"历史较低/较高区域")。
还有三条插件反复提醒但无法替你执行的硬约束:一年内要用的钱不进股市;不借钱不加杠杆不碰分级 B;单一行业不重仓、规模 <1 亿的基金不买。
五、安装
pnpm add https://github.com/LipingAn04/dsh-index-fund-guide.git
# 再把 dsh-index-fund-guide 加进 profile 的 package.json → dsh.profile.bundles
装好后 skill({ name: "index-fund-guide" }) 即可加载。三种安装方式、两个已知的安装坑、目录结构、数据来源与报告期规则,见 INSTALL.md。
脚本也可以脱离 DSH 单独使用:skills/index-fund-guide/scripts/ 下 4 个 Python 文件零第三方依赖。
六、许可
MIT。方法论来自原书《指数基金投资指南》(银行螺丝钉),本仓库只做工程化与 2026 年数据校准,与原书作者无关,未获其授权或背书;书中回测数字、案例、结论的版权归原作者。
No comments yet. Be the first to write one.