基金定投助手:为什么你的基金定投总在追涨杀跌?价值平均法定投引擎 + 综合估值模型+动态再平衡仓位管理,一个单文件 HTML 的免费定投工具-CSDN博客
https://download.csdn.net/download/weitingfu/93339607?spm=1011.2124.3001.6210
你是否遇到过这种场景:定投已经坚持了两三年,打开账户一看,持仓成本比市场平均成本还高,明明一直在"定投",却感觉像"高位接盘侠"?网上搜到的方案要么让你"无脑定投、闭眼买",要么让你"跌了加仓、涨了减仓",可到底跌多少算跌、涨多少算涨,没有一个人给出可量化的标准。本文将从估值分位这个核心指标出发,给出一个生产级解决方案:包含 PE/PB 历史分位的完整计算代码、20%/70% 分位阈值下的加减仓规则、以及一组 10 年回测的真实数据,帮你给定投装上"价值温度计"。
一、先看结论:动态仓位调整到底在干什么
上一篇我们讲了定期再平衡:每季度或每年校准一次,把偏离的仓位拉回目标比例。它像什么呢?像闹钟——时间一到就响,不管外面是牛市还是熊市。
动态仓位调整则是另一个物种:它不看日历,看温度计。
- 再平衡管的是"结构":核心仓位和卫星仓位的比例不能跑偏;
- 动态调整管的是"价格":市场便宜的时候多买点,市场贵的时候少买点。
两者不冲突,反而互补。本篇的主角——估值分位,就是那个被行业内公认"判断市场相对位置最优"的温度计。
一句话结论:当指数的 PE 分位低于 20% 时,把权益类资产配置比例上调 10%-15%,去积累廉价份额;当 PE 分位高于 70% 时,把配置比例下调 10%-15%,锁定部分浮盈、降低回调风险。
记住这组数字:20% 加仓、70% 减仓、幅度 10%-15%。这是全篇的核心规则,后面所有内容都在解释它为什么成立、怎么落地。
二、为什么固定金额定投还不够?——从"被动平滑"到"主动择价"
2.1 定投解决了什么
先说句公道话:定投本身已经是个好东西。固定金额定期买入,天然实现了"价格低的时候买得多、价格高的时候买得少"——这在前面的文章里叫成本平滑或波动率收割。
举个例子,你每月投 1000 元:
| 月份 | 净值 | 买入份额 |
|---|---|---|
| 1月 | 1.0 | 1000 |
| 2月 | 0.8 | 1250 |
| 3月 | 0.5 | 2000 |
| 4月 | 1.2 | 833 |
四个月平均价格是 0.875,而你的平均成本只有 0.787(总投入 4000 ÷ 总份额 5083)。这就是定投的底层数学:你天然比市场平均买得更便宜。
2.2 定投没解决什么:越买越贵的问题
但定投有个隐藏盲区——它不区分"便宜"和"贵"。它只是机械地按月买,于是会出现一个尴尬场景:
指数在 4000 点的时候你每个月买 1000 块,指数涨到 6000 点你还是每个月买 1000 块。表面上"定投"了,实际上你的新增资金正在以越来越高的价格入场。等到牛市顶部区域,你甚至可能因为"涨得这么好、肯定还能涨"的心态,追加投入——越涨越买,成本越买越高。
这就是为什么很多人在牛市里定投,最终收益却平平:份额累积的节奏没有和价格高低挂钩。
2.3 再平衡 vs 动态调整:一个管结构,一个管价格
再平衡和动态调整的区别,可以用厨房来类比:
- 再平衡:冰箱里食材的比例偏了(肉太多、菜太少),定期整理一下,把比例拉回 7:3;
- 动态调整:菜市场打折的时候多囤点肉,菜价暴涨的时候少买点菜——根据价格信号决定采购量。
再平衡是"被动纠偏",动态调整是"主动择价"。两者叠加,才是完整的仓位管理体系。
这里要划个重点:动态调整不是让你放弃定投、改成"择时"。恰恰相反,它是在定投纪律的基础上,用客观指标替代主观情绪去微调每期买入金额。你依然定期投,只是"投多少"由估值分位说了算。
2.4 从被动到主动:仓位管理的三个层级
把整个仓位管理体系拆开看,其实有三个递进的层级,很多新手容易把它们混为一谈:
| 层级 | 工具 | 频率 | 管什么 | 例子 |
|---|---|---|---|---|
| 第一层 | 固定金额定投 | 每月 | 入场节奏 | 每月 1000 元无脑买 |
| 第二层 | 定期再平衡 | 每季度/年度 | 组合结构 | 70:30 漂移到 75:25,调回来 |
| 第三层 | 动态仓位调整 | 随市场信号 | 买入价格 | 估值低多买、估值高少买 |
第一层解决"要不要坚持投"的问题,第二层解决"比例别跑偏"的问题,第三层解决"买得贵不贵"的问题。越往后越进阶,但每一层都建立在前面一层已经做好的基础上——如果你连定投都坚持不了,谈再平衡和动态调整都是空中楼阁。
换句话说,动态仓位调整不是要取代定投,而是给已经养成的定投习惯加一层"智能调温":平时按部就班地投,极端便宜时多买一点,极端昂贵时少买一点。这层微调看似幅度不大,但在 10 年尺度上,积累的份额成本差异相当可观。
举个例子直观感受一下:假设沪深 300 净值在 1.0-1.6 之间波动,你每月固定投 1000 元,10 年下来平均成本大约落在区间中值附近;但如果每次分位低于 20% 时你多投 15%、高于 70% 时少投 15%,低位买到的份额明显增多,高位买的份额减少,平均成本可能比固定定投低 3%-5%——别小看这几个百分点,它是在同样的市场行情下、不需要任何预测能力就能白拿的。
三、估值分位:判断市场贵不贵的"温度计"
3.1 PE 和 PB 是什么
两个指标,先解释清楚为什么"要用它们":
- PE(市盈率)= 股价 ÷ 每股收益 = 你买这家公司,多少年能靠利润回本。PE 高,说明市场愿意为每一块钱利润付更多钱,情绪更热;
- PB(市净率)= 股价 ÷ 每股净资产 = 你买这家公司,为它的账面资产付了几倍溢价。PB 高,说明市场更愿意为"预期"而不是"净资产"买单。
对指数来说,PE/PB 就是整个市场"贵不贵"的浓缩表达。
3.2 分位的定义与计算
但注意:PE 的绝对数值没有意义。科技股的 PE 常年 30 倍,银行股的 PE 常年 5 倍——你不能说科技股一定比银行股贵,因为盈利结构、行业属性完全不同。
所以行业内用历史分位(percentile)来判断:当前 PE 在过去 N 年的历史区间里,排在第百分之几的位置。
公式很直白:
分位 = (历史区间内 ≤ 当前PE 的交易日数量) ÷ 历史区间总交易日数量 × 100%举个例子:沪深 300 过去 10 年共有约 2400 个交易日,当前 PE 比其中 2160 天的 PE 都低,那它的 PE 分位就是 2160 ÷ 2400 =90%——市场处于历史极贵区域。反之,如果当前 PE 只比 480 天高,分位就是 20%——历史极便宜区域。
graph LR A[获取指数历史PE/PB序列] --> B[确定历史区间<br/>过去5-10年] B --> C[统计区间内交易日总数 N] C --> D[统计当前PE高于历史的天数 M] D --> E[分位 = M ÷ N × 100%] E --> F{分位 < 20%?} F -->|是| G[低估区:加仓10%-15%] F -->|否| H{分位 > 70%?} H -->|是| I[高估区:减仓10%-15%] H -->|否| J[合理区:维持基准定投]这张图就是全篇的方法论主干:数据 → 区间 → 计数 → 分位 → 决策,五步闭环,任何一步都不需要主观判断。
3.3 为什么分位比绝对估值更可靠
三个理由,缺一不可:
- 消掉了"贵贱标准"的主观争议:不同行业、不同市场的 PE 合理区间不同,但"历史分位 90%“在哪个市场都意味着"比过去十年绝大多数时候都贵”;
- 自带均值回归假设:统计数据表明,指数估值在 90% 以上的时间内都在历史均值的一个标准差区间内波动。分位越高,后续回归均值(下跌)的概率越大;
- 计算透明、可复现:任何一个程序员拿到历史 PE 序列,都能在 10 行代码内算出分位,不依赖任何"专家感觉"。
💡效率技巧:写代码时直接用
numpy的percentileofscore或scipy.stats.percentileofscore,一行就能算出分位,不需要自己手写排序循环。后文代码部分会给出完整实现。
四、核心规则:20% 加仓、70% 减仓
4.1 三档区间划分
基于估值分位,把市场切成三个区间:
| 估值区间 | PE/PB 分位 | 市场状态 | 动作 |
|---|---|---|---|
| 低估区 | 低于 20% | 历史便宜,恐慌情绪蔓延 | 加仓:权益配置比例上调 10%-15% |
| 合理区 | 20%-70% | 价格正常,无需干预 | 按兵不动:维持既定定投节奏 |
| 高估区 | 高于 70% | 历史昂贵,情绪亢奋 | 减仓:权益配置比例下调 10%-15% |
这套规则的设计逻辑很朴素:在恐慌时贪婪,在亢奋时克制。但"贪婪"和"克制"不是拍脑袋,而是由分位数这个客观信号触发。
4.2 调整幅度:为什么是 10%-15% 而不是 50%
你可能想问:既然判断出了便宜和贵,为什么不干脆满仓干/清仓跑?答案是——你判断的是概率,不是确定性。
- 分位 10% 说明"过去 90% 的时间都比现在贵",但这不意味着市场明天就涨;
- 均值回归可能在 1 个月后发生,也可能在 2 年后才发生,中间你可能继续浮亏 30%;
- 所以调整幅度必须克制:10%-15% 既能表达态度,又不至于让一次性判断错误造成致命伤害。
这也是动态仓位调整和"满仓抄底/清仓逃顶"的根本区别:前者是概率加权下的仓位微调,后者是赌方向。
4.3 完整规则表(可直接抄作业)
假设你的权益类目标配置比例是 60%(核心 50% + 卫星 10%):
| 触发条件 | 动作 | 调整后权益比例 |
|---|---|---|
| PE 分位 < 10%(极低估) | 权益比例上调 15% | 69% |
| PE 分位 10%-20%(低估) | 权益比例上调 10% | 66% |
| PE 分位 20%-70%(合理) | 不调整 | 60% |
| PE 分位 70%-90%(高估) | 权益比例下调 10% | 54% |
| PE 分位 > 90%(极高估) | 权益比例下调 15% | 51% |
⚠️避坑警告:分位阈值是"区间判断"而不是"点位判断"。千万不要因为分位从 69.9% 跳到 70.1% 就立刻大幅调仓——先确认分位数连续站在阈值外(比如连续 5 个交易日)再动手,可以滤掉大量假信号。后文代码里会教你怎么加这个缓冲。
graph TD Start[每月定投日] --> Check[查询当月 PE/PB 历史分位] Check --> Low{分位 < 20%?} Low -->|是| Up[权益配置比例上调 10%-15%<br/>低估区:积累廉价份额] Low -->|否| High{分位 > 70%?} High -->|是| Down[权益配置比例下调 10%-15%<br/>高估区:锁定浮盈、降低回撤风险] High -->|否| Keep[合理区:维持既定定投节奏<br/>不加不减] Up --> Log[记录当月分位与调仓日志] Down --> Log Keep --> Log Log --> Next[下个月继续重复]这张图把整套执行规则压缩成了一次循环判断:每次定投日只做一次"问号判断",不需要任何盘感,不需要任何新闻解读,照着流程走即可。规则的可执行性,就体现在这种"流程化"里。
4.5 PE 和 PB 到底该看哪个?——双指标交叉验证
很多读者到这里会问:规则里一会儿说 PE 分位、一会儿说 PB 分位,到底以哪个为准?答案是:两个都看,取更保守的那个。
原因在于 PE 和 PB 各自有盲区:
- PE 的盲区:盈利周期的影响。经济衰退期企业利润大幅下滑,PE = 股价 ÷ 利润,分母变小导致 PE 被动抬高——此时 PE 分位可能显示"很贵",但实际市场可能已经很便宜了(这叫"戴维斯双杀"的错位阶段);
- PB 的盲区:资产结构的变化。科技公司、平台型公司的核心资产是人才、数据、品牌,这些不体现在净资产里,PB 会系统性高估它们的"贵"。
实操中推荐这样用:
- 分别计算 PE 分位和 PB 分位;
- 取两者中更接近极端的信号:只要其中一个分位 < 20% 且另一个也不高(比如 < 40%),触发低估加仓;只要其中一个分位 > 70% 且另一个也不低(比如 > 50%),触发高估减仓;
- 如果两个指标指向矛盾(一个说便宜、一个说贵),按兵不动,等待信号收敛。
这套"双指标交叉验证"能大幅过滤单一指标的结构性误判,代价只是每个月多查一个数字,几乎为零。
4.6 一个完整的月度决策流程示例
把上面所有规则串起来,你每个月的操作其实只有五步:
- 拉数据:查当月指数 PE 分位、PB 分位(10 秒,用小程序或 akshare);
- 判区间:分位落在低估区(<20%)、合理区(20%-70%)还是高估区(>70%);
- 定乘数:低估区乘数 1.10-1.15,合理区 1.0,高估区 0.85-0.90;
- 算金额:本月定投金额 = 基准金额 × 乘数,权益与固收按调整后比例分配;
- 记日志:把当月的分位、乘数、买入金额记下来——半年后回看,你会惊讶于自己当时为什么敢在某个位置重仓。
最后一步尤其重要。投资决策日志是最好的"事后复盘"工具:它能把"当时怕得要死但按规则买了"和"当时头脑发热乱买了"区分开,帮你逐步建立对规则的信任——而信任,恰恰是长期执行的唯一燃料。
4.4 动态调整的"钱"从哪里来
低位上调权益比例,钱从哪来?两个来源:
- 新增定投资金:把当月定投金额的一部分从固收类转向权益类——比如原本"每月 7000 定投权益 + 3000 定投固收",低估区改为"8000 权益 + 2000 固收";
- 存量调仓:把固收类持仓的一部分(比如 5%)卖出,转入权益类基金。
高估区则完全反过来:新增资金多买固收,存量仓位部分止盈,把权益比例降下来。整个过程没有一次是"追涨杀跌",全部由分位数这个客观信号驱动。
五、案例回测:全天候组合的动态调整实战
5.1 组合构成
空谈规则没有说服力,直接上数据。这里用的组合是"本土化全天候被动组合",配置如下:
- 50% 沪深 300(A 股宽基,提供基础收益)
- 50% 中债指数(国内债券,提供低相关性保护)
- 12% 黄金指数(注意:这是额外叠加的卫星仓位,总仓位 112% 是研究报告中给出的原始口径,代表在 100% 组合之上的增强配置)
在这个组合上加入估值分位动态调整:沪深 300 的 PE 分位低于 20% 时,把沪深 300 权重上调 10%-15%(对应资金来自债券部分);高于 70% 时下调 10%-15%。
pie title 本土化全天候被动组合构成(基准状态) "沪深300 权益" : 50 "中债指数 固收" : 50 "黄金指数 卫星" : 12graph LR A[组合净值] --> B[估值分位监控] B --> C{沪深300 PE分位} C -->|低于20%| D[权益权重 +10%~15%<br/>卖出部分债券转投权益] C -->|20%-70%| E[维持 50:50 基准比例] C -->|高于70%| F[权益权重 -10%~15%<br/>卖出部分权益转投债券] D --> G[调整后组合] E --> G F --> G上面两张图分别回答两个问题:第一张告诉你"底仓长什么样",第二张告诉你"估值信号怎么改变底仓"——合在一起,就是 5.2 节那组回测数据的完整运行逻辑。
5.2 回测结果(2016-2026,10 年)
| 指标 | 动态调整全天候组合 | 纯标普 500 |
|---|---|---|
| 年化收益 | 7.83% | ~11%(隐含推算) |
| 年化波动率 | 9.6% | 显著更高 |
| 最大回撤 | -16.2% | -33.7% |
关键数字翻译成人话:
- 动态调整组合的最大回撤只有-16.2%,同期纯标普 500 的最大回撤高达-33.7%;
- 极端回撤被压缩了51.9%(16.2 ÷ 33.7 ≈ 0.48,即回撤不到标普的一半);
- 代价仅仅是年化收益牺牲3.19 个百分点(7.83% vs 约 11%)。
5.3 这笔"交易"划算吗
拿 3.19 个百分点的年化收益,换"回撤减半、晚上睡得着觉",划算吗?答案取决于你是谁:
- 如果你是刚定投 1 年的新手,-33.7% 的回撤大概率让你割肉离场、永久退出定投——浮亏变成实亏,复利链条断裂;
- 如果你已经定投 10 年、本金庞大,回撤 33.7% 意味着几十万甚至上百万的浮盈蒸发——心理冲击远超想象;
- 而-16.2% 的回撤,大多数人都能扛住,定投计划不中断,复利继续运转。
回撤控制是"可持续性"的数学保障:你能扛住的回撤,决定了你能坚持多久;你能坚持多久,决定了复利能滚多大。这正是动态仓位调整的核心价值——不是帮你多赚钱,而是帮你少亏钱、扛得住、活得久。
这一点值得反复强调:在长期定投里,"不死"比"暴富"重要得多。跌 50% 需要涨 100% 才能回本;而回撤控制在 10% 以内,后续只需要涨约 11% 就能修复。控制回撤,就是保护你的复利。
5.4 回测的另一面:动态调整在 A 股震荡市的价值
有人会说:标普 500 是美股,估值分位在美国那种长期牛市中意义有限——这话有道理,但也只说对了一半。动态调整的真正价值战场,恰恰是高波动的 A 股震荡市。
逻辑很直白:
- 美股长期趋势向上,估值长期偏高,你经常等不到"分位 < 20%"的加仓机会,大部分时间只能按基准节奏投;
- A 股牛短熊长、波动剧烈,每隔几年就会来一轮"恐慌探底 → 情绪修复 → 亢奋冲高"的完整循环,分位信号被反复触发;
- 每一次"低估加仓"都意味着你在大跌的废墟里多捡了一批便宜筹码,每一次"高估减仓"都意味着你在情绪最亢奋时少买了一批高价筹码。
换句话说:波动越大,估值分位越值钱。A 股投资者骂归骂,但恰恰是这种大起大落,让估值分位有了用武之地——这就像钓鱼,水越浑、鱼越多,越需要你手里的温度计看得准。
5.5 为什么不直接"满仓抄底":回撤压缩背后的数学
回到那组回测数据:动态调整组合最大回撤 -16.2%,比纯标普 500 的 -33.7% 压缩了 51.9%。为什么加入估值分位后回撤能降这么多?拆开看有三层原因:
- 高位少买 = 少接高价筹码:70% 分位以上你减仓 10%-15%,意味着牛市顶部你买入的份额更少,市场反转时你手里的"高价库存"更轻,浮亏自然更小;
- 低位多买 = 摊薄整体成本:20% 分位以下你加仓 10%-15%,相当于在市场底部把平均成本往下拽了一截——同样的下跌,你的亏损比例更低;
- 股债联动 = 风险对冲:减下来的钱没有离场,而是转入了中债等低相关性资产,市场大跌时债券往往相对坚挺,组合整体被"兜住"。
这三层机制叠加,就是回撤从 33.7% 压缩到 16.2% 的完整逻辑。它不是靠预测涨跌,而是靠"在贵的地方少买、在便宜的地方多买"这种结构性操作自然实现的。
也正因为如此,动态调整从来不是"择时博弈",而是把仓位管理与市场定价有机结合的工程化方案——这恰恰是程序员思维最擅长的事情。
六、为什么估值分位有效?——均值回归的底层逻辑
6.1 数据事实:估值是个"橡皮筋"
统计数据显示:指数估值在 90% 以上的时间里,都在历史均值的一个标准差区间内波动。翻译成人话:
- 估值不是随机游走的,它像一根被拉伸的橡皮筋;
- 拉得越远(分位越高),回归均值(下跌)的弹力越大;
- 压得越狠(分位越低),反弹(上涨)的弹力越大。
所以"PE 分位 20% 加仓、70% 减仓"的底层逻辑是:你在橡皮筋最松弛的位置买入,在最紧绷的位置卖出——这本质是概率加权后的正向决策。
graph LR subgraph 估值橡皮筋示意 A[历史极低分位<br/>分位 < 20%<br/>橡皮筋松弛] -->|弹力小| M[历史均值<br/>约 50% 分位] B[历史极高分位<br/>分位 > 70%<br/>橡皮筋紧绷] -->|弹力大| M end M -->|90%以上的时间<br/>估值在均值1个标准差内波动| C[均值回归是常态] C --> D[低估区加仓 → 赚回归的钱] C --> E[高估区减仓 → 躲回归的刀]别把这张图当玩笑:它形象地刻画了估值分位的全部底层逻辑——估值是"有弹性的",偏离越远,回归的力量越大。你要做的不是预测回归何时发生,而是确保自己站在橡皮筋恢复原状时的有利一侧。
6.2 概率优势:你不是赌方向,你是压概率
有人说:估值低不代表马上涨,万一"便宜了还能更便宜"呢?说得对。但注意规则的设计——它从来不赌"马上":
- 低估区加仓 10%-15%,而不是梭哈:就算继续跌,你的仓位上限只多了 15%,定投节奏还在,成本继续被平滑;
- 高估区减仓 10%-15%,而不是清仓:就算继续涨,你还有 85% 的仓位在车上,不会完全踏空;
- 真正的胜负手是时间:估值分位低的时候你买得便宜,长期均值回归兑现时,你的份额成本天然低于追高的人。
你不是赌"明天涨",而是赌"长期看,便宜买比贵买好"——这个概率在 10 年尺度上几乎是确定的。
七、缺陷与边界:分位不是万能的
任何指标都有失效的场景,估值分位也不例外。提前说清楚,免得你盲目相信:
7.1 历史区间依赖(本篇思考题核心)
分位的计算依赖"历史区间"的定义。问题来了:
- 沪深 300 有 20 年历史,分位相对可靠;
- 一只上市只有 3 年的指数(比如某新行业指数),它的 20% 分位意味着什么?样本太少,可能只是"过去 3 年恰好最低",不代表真的便宜;
- 更极端的:科创板 50 指数上市以来整体处于估值下行通道,"历史低分位"可能是常态,而不是买点。
应对思路:①加长历史窗口(至少 5-8 年);②对上市时间短的指数,用可比指数或行业 PE 中位数做参考;③把分位当作"参考信号"而非"唯一信号"。
7.2 结构性变化
指数成份股调整、会计准则变化、行业权重迁移,都会让历史 PE 序列"失真"。比如某指数从"金融股为主"变成"科技股为主",整体 PE 中枢抬升——拿过去的 PE 区间衡量当下,会系统性误判。
7.3 极端行情失效
均值回归在 90% 的时间里成立,意味着10% 的时间里它严重失效。典型的例子是 2020 年的科技股行情:估值一路新高,越"贵"越涨,提前减仓的人踏空了大半段。估值分位管不了"情绪泡沫可以吹多久"——这正是下一篇要讲的均线趋势指标需要登场的原因。
7.4 组合使用原则(行业共识)
正因为单一指标有局限,行业内通常的做法是多指标联合:
- 估值分位(本篇):管"贵不贵",均值回归逻辑;
- 均线趋势(下一篇):管"强不强",趋势延续逻辑;
- 波动率指标(下一篇):管"风险大不大",动态平衡风险敞口。
三个指标各有分工、互相校验,只有当它们指向同一方向时,才加大调整幅度;指向矛盾时,维持基准仓位。这样既不会被单一指标的假信号骗,也不会错过真正的极端机会。
graph TD A[市场状态] --> B[估值分位指标<br/>管:贵不贵<br/>逻辑:均值回归] A --> C[均线趋势指标<br/>管:强不强<br/>逻辑:趋势延续] A --> D[波动率指标<br/>管:风险大不大<br/>逻辑:风险平价] B --> E{信号是否一致?} C --> E D --> E E -->|全部同向| F[加大调整幅度<br/>权益 ±15%] E -->|部分同向| G[小幅调整<br/>权益 ±10%] E -->|互相矛盾| H[维持基准仓位<br/>等待信号收敛] F --> I[动态仓位最终配置] G --> I H --> I这张图是动态仓位管理的完整版拼图:本篇只用了"估值分位"一块,剩下两块在下一篇登场。记住这个框架,你就理解了整个动态仓位体系的进化方向——从单指标到多指标,从"看温度"到"看温度 + 看风向 + 看浪高"。
7.5 不同市场的适配参数
估值分位的"20%/70%"阈值是宽基指数基金的通用水准,但落地到不同市场,参数要微调:
| 市场 | 分位阈值建议 | 说明 |
|---|---|---|
| A 股(沪深 300 等) | 20% / 70% | 波动大、周期明显,标准规则适用 |
| 美股(标普 500、纳指 100) | 25% / 75% | 长期中枢抬升,阈值略微放宽,避免频繁误触发 |
| 港股(恒生指数) | 15% / 65% | 长期低估、流动性主导,低估阈值更低(更便宜才买)、高估阈值更敏感(有修复就跑) |
| 行业主题基金 | 不单独用 | 单一行业 PE 受盈利周期干扰大,必须叠加均线趋势确认 |
这个表是经验值,不是精确值。重点不是阈值具体取多少,而是你要意识到:不同的市场有不同的估值中枢和波动特征,参数必须按市场属性适配——拿美股参数直接套港股,大概率会错过信号或频繁误触发。
7.6 估值分位解决不了的"人性问题"
最后说一个技术指标永远解决不了的问题:执行纪律。
估值分位最大的优势是客观,最大的敌人是"你不信它":
- 分位跌到 10% 时,市场通常正处于最恐慌的阶段,新闻标题全是"危机"“崩盘”,你的本能是"再等等"——这时候敢按规则加仓的人,十个里不到两个;
- 分位涨到 90% 时,市场通常正在最亢奋的阶段,周围人都在晒收益,你的本能是"再加一把"——这时候肯按规则减仓的人,同样寥寥无几。
规则设计得再好,执行不了等于零。这也是为什么建议程序员用工程手段约束自己:自动定投、条件单、脚本提醒、把规则写进代码——让纪律从"意志力"变成"程序逻辑"。人斗不过情绪,但代码可以。
八、代码实战:写一个估值分位计算器
理论讲完,上代码。下面是完整的 Python 实现:先模拟一个 PE 序列并计算历史分位,再实现"20% 加仓 / 70% 减仓"的动态定投,并与固定金额定投对比。
import numpy as np import pandas as pd from scipy.stats import percentileofscore # ---------- 第一步:模拟 10 年 PE 序列(2400 个交易日) ---------- # 真实场景请替换为实际指数 PE 历史数据(如中证指数官网、Wind、聚宽等) rng = np.random.default_rng(42) # 用均值回归模型模拟 PE:围绕中枢 15 波动,波动幅度随"情绪"放大 pe = np.zeros(2400) pe[0] = 15.0 for i in range(1, 2400): # 均值回归 + 噪声 pe[i] = 15 + 0.92 * (pe[i-1] - 15) + rng.normal(0, 1.2) # 人为注入一轮牛熊,让分位能覆盖低/高两个极端 pe[600:900] += 6 # 牛市段,PE 冲高 pe[1500:1800] -= 5 # 熊市段,PE 探底 pe = np.clip(pe, 6, 40) df = pd.DataFrame({"pe": pe}) df["date"] = pd.date_range("2016-01-01", periods=2400, freq="B") # ---------- 第二步:计算 PE 历史分位 ---------- # 用滚动 5 年窗口(约 1250 个交易日)计算分位,避免使用"未来数据" df["pe_percentile"] = df["pe"].rolling(1250).apply( lambda x: percentileofscore(x, x.iloc[-1], kind="rank") ) / 100.0 print("===== 估值分位示例 =====") print(df[["date", "pe", "pe_percentile"]].dropna().head(3).to_string(index=False)) print(df[["date", "pe", "pe_percentile"]].dropna().tail(3).to_string(index=False)) print(f"PE 分位 < 20% 的交易日占比: {((df['pe_percentile'] < 0.2).sum() / df['pe_percentile'].notna().sum()):.1%}") print(f"PE 分位 > 70% 的交易日占比: {((df['pe_percentile'] > 0.7).sum() / df['pe_percentile'].notna().sum()):.1%}") # ---------- 第三步:动态仓位调整规则 ---------- def get_multiplier(pct: float, base: float = 1.0) -> float: """ 返回定投金额乘数: PE 分位 < 20% -> 上调 10%-15% (乘数 1.10-1.15) PE 分位 > 70% -> 下调 10%-15% (乘数 0.85-0.90) 其余区间 -> 维持基准 (乘数 1.0) """ if pct < 0.10: return 1.15 # 极低估,多买 15% if pct < 0.20: return 1.10 # 低估,多买 10% if pct > 0.90: return 0.85 # 极高估,少买 15% if pct > 0.70: return 0.90 # 高估,少买 10% return base # ---------- 第四步:动态定投 vs 固定定投 对比 ---------- # 简化模拟:每月定投 1000 元,指数净值与 PE 正相关(估值高时价格高), # 同时叠加缓慢上行趋势,模拟真实市场长期向上的特征。 monthly = df.resample("ME", on="date").last().dropna() pe_norm = (monthly["pe"] - monthly["pe"].min()) / (monthly["pe"].max() - monthly["pe"].min()) monthly["price"] = 10 + 5 * pe_norm + np.linspace(0, 4, len(monthly)) monthly["mult"] = monthly["pe_percentile"].apply(get_multiplier) fixed_shares, dyn_shares = [], [] fixed_cost, dyn_cost = 0.0, 0.0 for _, row in monthly.iterrows(): # 固定定投:每月 1000 元 fixed_shares.append(1000 / row["price"]); fixed_cost += 1000 # 动态定投:1000 元 × 估值乘数 invest = 1000 * row["mult"] dyn_shares.append(invest / row["price"]); dyn_cost += invest total_fixed = sum(fixed_shares) * monthly["price"].iloc[-1] total_dyn = sum(dyn_shares) * monthly["price"].iloc[-1] print("\n===== 定投结果对比(10年)=====") print(f"固定定投:累计投入 {fixed_cost:,.0f} 元,期末市值 {total_fixed:,.0f} 元,收益率 {(total_fixed/fixed_cost-1)*100:.1f}%") print(f"动态定投:累计投入 {dyn_cost:,.0f} 元,期末市值 {total_dyn:,.0f} 元,收益率 {(total_dyn/dyn_cost-1)*100:.1f}%") print(f"动态策略多赚 {(total_dyn-total_fixed):,.0f} 元(收益率提升 {(total_dyn/dyn_cost - total_fixed/fixed_cost)*100:.1f} 个百分点)")代码要点说明:
- 滚动窗口防未来函数:用
rolling(1250)计算滚动分位,保证每个交易日的分位只依赖过去 5 年数据——回测时不能"偷看未来"; - 阈值分层:10% 以下/10%-20%、70%-90%/90% 以上,两档幅度 10%/15%,符合研究报告规则;
- 金额乘数法:动态定投 = 基准金额 × 乘数,低估区乘数 > 1(多买),高估区乘数 < 1(少买),逻辑清晰、易落地。
九、落地指南:数据从哪来,执行怎么做
9.1 数据来源(免费 + 半自动)
| 数据 | 获取方式 | 说明 |
|---|---|---|
| 沪深 300 PE/PB 历史分位 | 中证指数官网、蛋卷基金、韭圈儿 | 网页直接看当日分位 |
| 指数估值小程序/公众号 | "指数估值"类小程序 | 每日自动更新,省心 |
| 自己算 | akshare/tushare拉历史 PE | 进阶玩家,可接代码 |
💡效率技巧:不想天天盯盘的话,用
akshare写个定时任务(Windows 计划任务或 GitHub Actions),每周五收盘后自动拉取分位数据并推送提醒——当周分位 < 20% 或 > 70% 才通知你,平时不用管。这套"自动化监控"比盯盘高效得多。
9.2 执行节奏建议
- 以月为粒度:每月定投日先查一眼当月分位,再决定本月定投金额(±10%-15%);
- 用缓冲滤掉假信号:连续 5 个交易日分位在阈值外才确认调仓;
- 与再平衡配合:季度末照常做再平衡(结构校准),估值分位只在月定投时做金额微调(价格择价),两者互不干扰;
- 新资金为主,存量调仓为辅:优先调整新增定投的钱,减少频繁买卖的摩擦成本。
9.3 常见坑位自查
| 坑 | 表现 | 解法 |
|---|---|---|
| 用未来数据算分位 | 回测结果漂亮到不真实 | 必须用滚动窗口,禁止全历史分位 |
| 分位天天变,追着调仓 | 手续费吃光收益 | 加 5 日确认缓冲 + 月度粒度 |
| 只看 PE 不看 PB | 盈利周期底部误判 | PE + PB 双指标同时看,取更保守的 |
| 低估区无限加仓 | 子弹打光,越跌越慌 | 设加仓上限(权益总仓位封顶),留足现金流 |
十、总结:给你的定投装一个价值温度计
回顾全文,核心就四件事:
graph LR A[1. 定位] --> B[动态调整 = 再平衡的价格版<br/>一个管结构、一个管价格] B --> C[2. 指标] C --> D[PE/PB 历史分位<br/>客观 · 可复现 · 均值回归] D --> E[3. 规则] E --> F[分位 <20% 加仓 10%-15%<br/>分位 >70% 减仓 10%-15%<br/>其余不动] F --> G[4. 数据] G --> H[全天候组合 10 年回测<br/>年化 7.83% · 回撤 -16.2%<br/>极端回撤压缩 51.9%]- 动态仓位调整 = 再平衡的"价格版":再平衡管结构,动态调整管价格,两者互补;
- 估值分位是最优的"贵贱温度计":PE/PB 历史百分位,客观、可复现、自带均值回归逻辑;
- 规则简单到可以抄:分位 < 20% 权益上调 10%-15%,分位 > 70% 下调 10%-15%,其余不动;
- 回测数据站得住:全天候组合加入动态调整后,10 年年化 7.83%、波动率 9.6%、最大回撤 -16.2%,极端回撤比纯标普 500 压缩 51.9%,只牺牲 3.19 个百分点年化。
估值分位不是圣杯,它有自己的失效场景,需要和均线趋势、波动率指标配合使用。但作为一个客观、可编程、可回测的信号,它足以让你的定投从"无脑买入"升级为"有温度地买入"。
下次打开账户前,先看一眼温度计——便宜就多买,贵了就少买,剩下的交给时间和纪律。
【思考题】
估值分位依赖"历史区间"的定义——如果一只指数上市只有 3 年,它的 20% 分位还可靠吗?你会怎么处理样本不足的问题?(提示:可以从"加长历史窗口 / 用可比指数替代 / 降低信号权重"三个方向思考)欢迎在评论区给出你的方案。
【系列文章预告】
下一篇继续动态仓位调整的下半场:250 日均线与波动率自适应,双指标联动的进阶玩法。当估值分位说"便宜"、均线趋势却说"还在跌"时,谁说了算?敬请关注。
标签:基金定投、估值分位、动态仓位管理、PE百分位、基金定投加仓、低估值定投、仓位管理