基金定投助手:为什么你的基金定投总在追涨杀跌?价值平均法定投引擎 + 综合估值模型+动态再平衡仓位管理,一个单文件 HTML 的免费定投工具-CSDN博客
https://download.csdn.net/download/weitingfu/93339607?spm=1011.2124.3001.6210
开篇黄金 100 字
你是否遇到过这样的尴尬:设了 20% 目标收益率,赚到 22% 时舍不得卖,结果行情反转,浮盈全部回吐;改用估值分位法,却在高位震荡中反复被"高估"信号折腾得睡不着;咬牙换回撤止损,又总在止损后眼睁睁看着反弹。网上搜到的止盈方法各说各话,没有一个能扛住全部行情。本文将从原理到代码,给你一套目标收益率 + 估值分位 + 最大回撤三重联动的完整卖出系统,覆盖持仓全程的每个阶段。
一、为什么单一止盈止损方法总是不够用?
1.1 三种方法,三种"管不住"的场景
回顾本系列前面三篇,三种单一方法各有绝活,也各有盲区:
| 方法 | 核心信号 | 管得住 | 管不住 |
|---|---|---|---|
| 目标收益率止盈(第15篇) | 账户浮盈达标 | 新手执行、锁定浮盈 | 忽略趋势和估值,牛市早卖、熊市晚跑 |
| 估值分位止盈(第16篇) | 市场估值高低 | 价值锚定、科学止盈 | 跟踪成本高,极端行情逆人性 |
| 最大回撤止损(第17篇) | 净值从高点回落 | 黑天鹅兜底、保护复利 | 阈值难定,频繁误伤或保护失效 |
发现了吗?每种方法都有自己"管不住"的行情——而这些行情恰恰是其他方法擅长的。
- 目标收益率法管不住的"牛市早卖",估值分位法能解决(估值没高估就继续拿);
- 估值分位法管不住的"跟踪成本高",目标收益率法能兜底(设个保底收益先落袋);
- 前两者都管不住的"黑天鹅暴跌",最大回撤止损是最后防线。
1.2 行业共识:组合使用,形成互补
行业共识性方案是:把三种方法组合使用,形成互补机制。 最常用的组合就是"目标收益率 + 估值分位 + 回撤止损"三重联动。
打个比方:单一方法像单点登录,一个密码管所有——但密码一丢全完蛋;三重联动像企业级权限系统,不同阶段用不同认证方式,层层设防,互为备份。
1.3 组合不是"三个都看",而是"分阶段切换"
新手最容易犯的错:把三个信号同时挂着,哪个先触发就执行哪个。
这会导致灾难:
- 目标收益率先到,卖了 → 结果估值还没高估,错过后半段行情;
- 回撤先触发,卖了 → 结果只是正常回调,被洗出局;
- 三个信号打架,最后干脆都不执行 → 回到无纪律状态。
正确的做法是"分阶段信号切换":持仓的不同阶段,主参考信号不同。 这是三重联动的灵魂。
1.4 三个真实失败案例,总有一款你见过
光讲道理不够,来看三个程序员最容易犯的经典错误:
案例 A:只会目标收益率,牛市里被"卖飞"
小张 2024 年初开始定投沪深 300,设了 20% 的目标收益率。市场一路涨,浮盈很快到 22%,他果断全部卖出。然后眼睁睁看着指数又涨了 40%——他赚了 20%,市场给了他 60%,他拿走了三分之一。这就是目标收益率法的天然缺陷:固定阈值本质是主观收益预判,忽略了市场趋势性延续或估值变化。2014-2015 年 A 股牛市中,不少投资者设 30% 止盈阈值,在市场刚启动阶段就过早卖出,错过后面一倍以上的涨幅。
案例 B:只会估值分位,黑天鹅里被"埋"
小李是价值投资信徒,只看 PE 分位。2020 年疫情暴发,全球股市一周内暴跌 20%+,但 PE 分位因为盈利同步下滑而失真,信号没有及时触发。等估值数据"确认低估"时,浮盈已经回吐大半。估值分位的痛点是:它依赖历史区间定义,而极端行情中历史区间本身就会失效,且跟踪成本高、逆人性,很多人无法坚持。
案例 C:只会回撤止损,震荡市里被反复"洗"
小王设了 10% 的回撤止损,结果在震荡市中频繁触发:跌 10% 止损 → 反弹 → 追高买入 → 再跌 10% 止损。一年下来本金没少,手续费和心态都崩了。2021 年 A 股不少投资者设 10% 回撤止损阈值,在正常短期回调中被反复触发止损,错过了后续上涨。
三个案例的共同点:每种方法都在"自己的主场"表现优秀,却在"别人的主场"惨败。三重联动要做的,就是让每个方法只在自己的主场值班,其他时间交给队友。
二、三重联动系统总览:一个卖出状态机
2.1 三阶段信号切换架构
整个系统就是一个状态机,三个状态对应三个主信号:
┌─────────────────────────────────────────────────────────┐
│ 卖出系统状态机 │
│ │
│ [持仓初期] ──浮盈达标──▶ [持仓中期] ──估值高估──▶ [持仓后期] │
│ 主信号: 主信号: 主信号: │
│ 目标收益率 估值分位 回撤止损 │
│ ───────── ───────── ───────── │
│ 到达阈值→分批止盈 进入高估区→分批止盈 净值回撤超阈值→卖出 │
│ │
│ ▲ ▲ ▲ │
│ └──止盈兑现后,按市场状态决定是否重新进入下一轮定投──┘ │
└─────────────────────────────────────────────────────────┘
三个阶段的职责划分:
| 阶段 | 触发条件 | 主信号 | 动作 |
|---|---|---|---|
| 初期 | 定投开始至浮盈达标前 | 目标收益率 | 达到阈值 → 卖出部分仓位兑现 |
| 中期 | 浮盈兑现后,市场估值逐步抬升 | 估值分位 | 进入高估区间 → 分批止盈 |
| 后期 | 估值高估后,行情可能出现反转 | 回撤止损 | 净值从高点回落超阈值 → 卖出全部/部分 |
2.2 为什么是"初期→中期→后期"的顺序?
信号切换的顺序不是随便定的,它符合一个定投持仓的自然生命周期:
- 初期:你刚定投不久,浮盈少、成本低,此时谈估值没有意义——先设一个"落袋为安"的目标收益率,保护你的第一笔利润;
- 中期:你已经兑现了一部分收益,市场开始走牛,估值逐步抬升——此时目标收益率已经"卖完任务",交给更懂价值的估值分位信号;
- 后期:市场从狂热转向反转——估值分位有滞后性,等它确认高估时浮盈已经回吐一部分,此时需要反应最快的回撤止损来兜底。
简单说:初期管"落袋",中期管"价值",后期管"保命"。
2.3 状态转移的完整定义(可编程)
作为一个程序员,你会本能地想知道:状态机怎么定义转移条件?给出可直接落地的伪代码:
状态定义:
INIT = 初期(主信号: 目标收益率)
MID = 中期(主信号: 估值分位)
LATE = 后期(主信号: 回撤止损)
EXIT = 已清仓(本轮定投结束)
转移条件:
INIT → MID : 目标收益率 >= 阈值,且执行了首次分批止盈
MID → LATE : 估值分位 >= 高估线(70%),且行情出现走弱迹象
MID → INIT : 估值分位回落至 50% 以下,且未触发过止盈
LATE → EXIT : 回撤止损触发,清仓完成
EXIT → INIT : 市场进入低估区间,开始新一轮定投
ANY → EXIT : 绝对止损线触发(回撤 > 30%),无条件清仓
注意一个细节:状态机允许"回退"(MID → INIT)。很多人以为三重联动是一条单行道,只进不退——如果中期估值分位一直没到 70%,反而回落了,说明这轮行情结束了,应该退回初期重新积累份额,而不是僵在原地。
2.4 为什么这个状态机比"三条 if 规则"更接近实战?
实战中你面临的不是"今天该卖吗"的单次决策,而是"我现在处于哪个阶段"的持续性判断。状态机的价值在于:
- 它强制你做阶段判断:每当你打开账户,第一件事不是看涨跌,而是问"我现在在哪个阶段";
- 它消除了规则冲突:三条 if 规则会打架(收益率到了但估值没到,卖不卖?),状态机不会——当前阶段的主信号说了算;
- 它天然支持复盘:你可以记录状态转移的时间线,回看"为什么我在中期就退出了",而不是模糊地感觉"我当时卖早了"。
💡 效率技巧:给状态机加一个"日志字段"——每次状态转移时记录:转移时间、触发信号、当时的收益率/估值分位/回撤、卖出比例。三个月后回看日志,你会比 90% 的散户都清楚自己的交易系统。
三、持仓初期:目标收益率信号
3.1 规则定义
持仓初期,以目标收益率为主要参考信号:
定投计划开始前,预先设定目标收益率阈值(宽基指数基金建议 15%-30%);组合累计浮盈达到阈值时,立即卖出部分仓位兑现浮盈。
3.2 为什么初期用它?
定投初期有两个特点:
- 浮盈小:刚开始定投,仓位轻,即使市场大涨,浮盈比例也不会太高;
- 信号弱:估值分位、回撤止损都需要一定的时间窗口才有意义,初期样本不足。
目标收益率是唯一一个"从第一天起就有效"的信号。 它不需要等市场给出任何状态,只需要你的账户达到某个数字。
3.3 执行细节:分批还是全卖?
建议分批卖出:
| 浮盈达到 | 卖出比例 | 剩余仓位 |
|---|---|---|
| 目标收益率(如 20%) | 30% | 70% |
| 目标收益率 + 5%(25%) | 30% | 40% |
| 目标收益率 + 10%(30%) | 40% | 0% |
这样设计的好处:
- 不会一次性卖光,错过后续行情;
- 每一档都有"落袋为安"的确定性收益;
- 为中期估值分位信号留出足够的观察仓位。
💡 效率技巧:把目标收益率阈值做成"阶梯式"而非"单点式"。单点式 20% 全部卖出,容易在牛市初期就离场;阶梯式分批卖,既能锁定利润,又能保留"让利润奔跑"的可能性。
3.4 阶梯式目标收益率的代码实现
def 阶梯止盈计算(当前收益率: float, 阶梯表=None) -> float:
"""按阶梯表计算当前应卖出的仓位比例
阶梯表格式: [(触发收益率, 卖出比例), ...]
默认阶梯: 20%卖30%,25%再卖30%,30%卖光
"""
if 阶梯表 is None:
阶梯表 = [(0.20, 0.30), (0.25, 0.30), (0.30, 0.40)]
卖出比例 = 0.0
for 触发线, 比例 in 阶梯表:
if 当前收益率 >= 触发线:
卖出比例 += 比例
else:
break # 阶梯有序,未达到的后续阶梯都未达到
return 卖出比例
# 测试
for r in [0.15, 0.20, 0.22, 0.25, 0.28, 0.30, 0.35]:
print(f"收益率 {r:.0%} → 建议卖出 {阶梯止盈计算(r):.0%}")
运行结果示意:
收益率 15% → 建议卖出 0%
收益率 20% → 建议卖出 30%
收益率 22% → 建议卖出 30%
收益率 25% → 建议卖出 60%
收益率 28% → 建议卖出 60%
收益率 30% → 建议卖出 100%
收益率 35% → 建议卖出 100%
3.5 初期阶段的两个易错点
易错点一:把"收益率"算错。 定投的累计收益率不是"市值/累计投入",而是要考虑每一笔投入的时间价值——同样是投入 10 万,分 12 个月投入和一次性投入,同样的"收益率"含金量完全不同。严谨的做法是用**内部收益率(IRR/XIRR)**衡量定投真实年化收益,而不是简单的市值除法。
易错点二:止盈之后马上满仓买回。 目标收益率达标卖出后,很多人手痒,立刻把兑现的资金再全部买回——理由是"市场还在涨"。这相当于把刚设置的止盈规则亲手撕毁。正确的做法:兑现的资金至少离场观望一个季度,等估值分位信号给出方向再决定是否重新入场。
四、持仓中期:估值分位信号
4.1 规则定义
随着市场估值逐步抬升,参考信号切换为估值分位:
以指数 PE/PB 历史百分位为核心信号:PE 分位进入历史高估区间(如超过 70%)时,启动分批止盈;分位低于 20% 时,可考虑分批加仓;20%-70% 正常区间保持仓位不变。
4.2 切换时机
信号切换不是自动的,需要人工确认一个"切换条件":
- 你已经通过目标收益率兑现了第一批浮盈;
- 市场进入明显的上行趋势,估值开始抬升;
- 建议切换条件:目标收益率达标卖出后,继续观察 1-2 个季度,确认行情仍在上行,再将主信号切换为估值分位。
4.3 估值分位阶段的执行规则
| PE 分位 | 动作 | 说明 |
|---|---|---|
| < 20% | 分批加仓 | 低估区间,积累廉价份额 |
| 20%-70% | 持有 | 正常区间,不做操作 |
| 70%-85% | 分批止盈 | 高估区间,先卖 30% |
| > 85% | 加大止盈力度 | 极度高估,再卖 30%-40% |
⚠️ 避坑警告:不要在估值分位阶段"既要又要"。有人一边看着估值分位,一边心里还惦记着目标收益率,估值 75% 时估值信号说"该卖了",他却想"再涨 5% 就到目标收益率了"——结果两个信号都错过,最后只能用回撤止损接盘。切换后就要信任当前阶段的主信号,其他信号只做参考,不做主决策。
4.4 估值分位的数据获取与计算
估值分位听起来高大上,本质就是一个统计量:当前 PE 在历史 PE 分布中排第几。代码实现并不复杂:
import numpy as np
def 计算估值分位(当前PE: float, 历史PE序列: list) -> float:
"""计算当前PE在历史序列中的百分位
返回 0~1 之间的分位值:0.7 表示当前估值高于历史 70% 的时间
"""
历史数组 = np.array(历史PE序列)
# 分位 = 历史中比当前PE低的占比
分位 = (历史数组 < 当前PE).mean()
return 分位
# 示例:假设某指数近十年月度PE
历史PE = [10.5, 11.2, 12.0, 11.8, 13.5, 14.2, 15.0, 16.8,
17.5, 16.2, 15.8, 14.9, 13.8, 12.5, 11.9, 12.8,
13.2, 14.5, 15.5, 16.0, 17.2, 18.5, 19.0, 20.2,
21.0, 19.5, 18.8, 17.8, 16.5, 15.2]
当前PE = 19.5
print(f"当前PE={当前PE}, 历史分位={计算估值分位(当前PE, 历史PE):.0%}")
运行结果示意:当前PE=19.5, 历史分位=约77%(进入高估区间,触发分批止盈)。
实战中数据从哪来? 常见渠道:中证指数官网(免费,月度更新)、蛋卷/理杏仁等数据平台(需付费)、聚宽/米筐等量化平台(免费试用,可编程拉取)。建议用程序定时拉取并本地缓存,而不是每次手动查。
💡 效率技巧:估值分位的"历史区间"定义很关键。指数上市时间越长,分位越可靠;上市不足 5 年的指数,分位参考价值有限,建议同时参考其成分股整体的 PE 水平做交叉验证。不要把 3 年历史的 20% 分位当成"绝对低估"。
4.5 中期阶段的一个灵魂拷问:估值高估了,但还在涨怎么办?
这是估值分位法最难受的时刻:PE 分位 75%,触发分批止盈,你卖了 30%;然后指数又涨了 10%,你看着空仓的资金心痒难耐。
答案是:继续按规则卖,不要追。 理由有三:
- 估值分位高估后继续上涨,属于"均值回归失效区间",历史上只占约 10% 的时间——用 90% 的大概率规则换 10% 的小概率超额,长期算账是划算的;
- 你已经卖出的部分锁定了利润,剩下的仓位还在上涨中继续赚钱,系统没有"踏空";
- 如果估值高估后真的反转(大概率事件),你的回撤止损信号已经在后期待命,剩下的仓位会由它接管——这就是三重联动最优雅的地方:每一段行情都有专属信号值班,谁都不孤独。
五、持仓后期:回撤止损信号
5.1 规则定义
持仓后期,以回撤幅度为主要参考信号:
净值从前期最高点回落超过预设阈值(10%-20%),立即卖出全部或部分仓位。
5.2 为什么后期必须靠回撤止损?
市场从狂热转向反转时,两个信号都会"迟到":
- 估值分位滞后:PE 分位确认"高估"往往滞后于实际见顶,等数据出来,浮盈已回吐一部分;
- 目标收益率已失效:此时浮盈早已超过目标收益率,目标信号不再有意义。
回撤止损是反应最快的信号——它不看估值、不看收益率,只看"净值从最高点跌了多少"。黑天鹅来临时,它是唯一能"秒级响应"的防线。
5.3 执行细节:全部还是部分?
建议分两档执行:
| 回撤幅度 | 动作 | 目的 |
|---|---|---|
| 超过阈值(如 15%) | 卖出 50% | 先保住一半利润 |
| 继续下跌(如 25%) | 卖出剩余 50% | 止损离场,保住另一半 |
这样设计避免了"一次卖光卖在最低点"的尴尬,同时确保亏损幅度被锁死在可承受范围内。
5.4 回撤止损的代码实现与"最高点追踪"
回撤止损的核心不是"跌了多少",而是"从最高点跌了多少"——最高点是动态的,要持续追踪:
class 回撤追踪器:
"""追踪净值最高点并判断回撤止损"""
def __init__(self, 阈值: float = 0.15):
self.阈值 = 阈值
self.历史最高 = 0.0
self.已触发一档 = False
def 更新(self, 当前净值: float) -> str:
"""输入最新净值,返回建议动作"""
# 持续追踪最高点
if 当前净值 > self.历史最高:
self.历史最高 = 当前净值
return "净值创新高,无需止损"
# 计算当前回撤
回撤 = 当前净值 / self.历史最高 - 1
if 回撤 <= -self.阈值 and not self.已触发一档:
self.已触发一档 = True
return f"回撤 {回撤:.1%} 超阈值,卖出 50% 仓位"
if 回撤 <= -self.阈值 - 0.10: # 二档:比阈值再深 10 个点
return f"回撤 {回撤:.1%} 继续恶化,卖出剩余仓位"
return f"回撤 {回撤:.1%} 可控,继续持有"
# 模拟一段先涨后跌的净值序列
追踪 = 回撤追踪器(阈值=0.15)
净值序列 = [1.00, 1.05, 1.10, 1.18, 1.25, 1.20, 1.12, 1.05, 0.98]
for i, 净值 in enumerate(净值序列, 1):
print(f"第{i}期 净值{净值:.2f} | {追踪.更新(净值)}")
运行结果示意:
第1期 净值1.00 | 净值创新高,无需止损
第5期 净值1.25 | 净值创新高,无需止损(最高点更新为1.25)
第6期 净值1.20 | 回撤 -4.0% 可控,继续持有
第7期 净值1.12 | 回撤 -10.4% 可控,继续持有
第8期 净值1.05 | 回撤 -16.0% 超阈值,卖出 50% 仓位
第9期 净值0.98 | 回撤 -21.6% 继续恶化,卖出剩余仓位
5.5 后期阶段的心态管理:止损后反弹了怎么办?
回撤止损最大的心理敌人是"卖在最低点"——你刚止损,行情立刻反弹,那种感觉比亏钱还难受。这是回撤止损法的经典悖论:止损后在底部附近卖出、然后行情反弹。
破解思路:给止损系统加"回补规则"。 止损卖出不是永久离场,而是把资金转入防守状态,等待以下任一信号再重新入场:
- 估值分位回落至 20% 以下(市场重新低估);
- 净值重新站上 250 日均线且连续 3 个交易日站稳(趋势修复确认);
- 绝对时间窗口:至少等待 1-2 个季度,避免"手痒式"追高。
有了回补规则,止损就不再是"认输离场",而是"战略性撤退,等更好的时机再进场"。系统没有失败,只有阶段性的仓位调整。
⚠️ 避坑警告:回补规则是"等待信号",不是"感觉跌够了"。很多人止损后天天看盘,跌了 3% 就想"应该到底了"冲回去——这会让止损形同虚设,变成高买低卖的恶性循环。回补必须等客观信号,主观感觉一律无效。
六、信号切换的底层逻辑
6.1 三个信号的本质差异
| 信号 | 回答的问题 | 反应速度 | 依赖数据 |
|---|---|---|---|
| 目标收益率 | 我赚够了吗? | 慢(依赖账户) | 自己的成本与市值 |
| 估值分位 | 市场贵了吗? | 中(有滞后) | 指数 PE/PB 历史分位 |
| 回撤止损 | 危险来了吗? | 快(实时) | 净值序列 |
三重联动的本质:用"慢信号"做规划,用"快信号"做兜底。
- 目标收益率管"赚多少走"——它最主观,但也最符合人性;
- 估值分位管"值不值走"——它最科学,但需要跟踪;
- 回撤止损管"必须走"——它最机械,但关键时刻救命。
6.2 为什么顺序是"收益率→估值→回撤"?
因为越靠后的信号越"被动"、越"防御":
- 收益率是主动目标(我想赚这么多);
- 估值是中性判断(市场处于什么位置);
- 回撤是被动防线(不管原因,跌多了就跑)。
越到后期,行情越不可预测,越应该交给被动规则。 前期的主动目标能帮你拿住利润,后期的被动防线能帮你保住利润。
6.3 组合优势总结
| 行情场景 | 单一方法表现 | 三重联动表现 |
|---|---|---|
| 正常波动 | 回撤止损可能误伤 | 初期/中期信号主导,不会过早离场 |
| 趋势性上涨 | 目标收益率早卖 | 估值分位接力,让利润奔跑 |
| 趋势性反转 | 估值分位滞后 | 回撤止损兜底,及时锁利 |
| 黑天鹅暴跌 | 各方法反应不一 | 回撤止损秒级响应 |
长期收益稳定性显著优于单一止盈止损方法——这是三重联动存在的根本理由。
七、完整策略代码:三信号联动判断
7.1 数据结构
import numpy as np
from dataclasses import dataclass, field
@dataclass
class 持仓状态:
当前净值: float
持仓市值: float
累计投入: float
已兑现收益: float = 0.0
历史最高净值: float = 0.0
阶段: str = "初期" # 初期 / 中期 / 后期
浮盈兑现比例: float = 0.0 # 已卖出仓位占原仓位比例
@property
def 收益率(self) -> float:
"""当前浮盈收益率"""
return self.持仓市值 / self.累计投入 - 1
@property
def 回撤幅度(self) -> float:
"""净值距历史最高点的回撤"""
return self.当前净值 / self.历史最高净值 - 1
7.2 三信号联动判断核心函数
def 三重联动判断(状态: 持仓状态,
目标收益率阈值: float = 0.20,
估值分位高估线: float = 0.70,
回撤止损阈值: float = 0.15) -> dict:
"""三重联动止盈止损核心判断
参数:
状态: 当前持仓状态
目标收益率阈值: 初期止盈线(如 0.20 = 20%)
估值分位高估线: 中期高估分位线(如 0.70 = 70%)
回撤止损阈值: 后期止损线(如 0.15 = 15%)
返回:
建议动作与说明
"""
动作 = {"卖出比例": 0.0, "原因": "", "阶段": 状态.阶段}
# ---------- 阶段一:持仓初期,看目标收益率 ----------
if 状态.阶段 == "初期":
if 状态.收益率 >= 目标收益率阈值:
# 浮盈达标:先兑现 30%,然后进入中期
动作["卖出比例"] = 0.3
动作["原因"] = f"目标收益率达标({状态.收益率:.1%} ≥ {目标收益率阈值:.0%}),兑现30%"
状态.阶段 = "中期"
else:
动作["原因"] = f"浮盈未达标({状态.收益率:.1%}),继续定投持有"
# ---------- 阶段二:持仓中期,看估值分位 ----------
elif 状态.阶段 == "中期":
# 估值分位由外部传入(这里用占位参数,实盘接行情接口)
估值分位 = 状态.估值分位 if hasattr(状态, "估值分位") else 0.50
if 估值分位 >= 估值分位高估线:
if 估值分位 >= 0.85:
动作["卖出比例"] = 0.4
动作["原因"] = f"极度高估(分位{估值分位:.0%}),加大止盈力度"
else:
动作["卖出比例"] = 0.3
动作["原因"] = f"进入高估区间(分位{估值分位:.0%}),分批止盈"
else:
动作["原因"] = f"估值正常(分位{估值分位:.0%}),继续持有"
# ---------- 阶段三:持仓后期,看回撤止损 ----------
else: # 阶段 == "后期"
回撤 = 状态.回撤幅度
if 回撤 <= -回撤止损阈值:
动作["卖出比例"] = 0.5
动作["原因"] = f"回撤超阈值({回撤:.1%} ≤ -{回撤止损阈值:.0%}),卖出50%保利润"
else:
动作["原因"] = f"回撤可控({回撤:.1%}),继续持有"
return 动作
7.3 完整模拟:一个持仓的完整生命周期
def 模拟三重联动():
状态 = 持仓状态(当前净值=1.0, 持仓市值=10_000, 累计投入=10_000)
状态.历史最高净值 = 1.0
# 估值分位序列:随行情抬升
分位序列 = [0.30, 0.35, 0.40, 0.55, 0.60, 0.72, 0.80, 0.88]
净值序列 = [1.0, 1.05, 1.12, 1.20, 1.32, 1.45, 1.50, 1.40]
for i, (净值, 分位) in enumerate(zip(净值序列, 分位序列)):
状态.当前净值 = 净值
状态.持仓市值 = 状态.累计投入 * 净值
状态.历史最高净值 = max(状态.历史最高净值, 净值)
状态.估值分位 = 分位
# 模拟:浮盈兑现后切换到后期(估值已高估且开始回落)
if 状态.阶段 == "中期" and 分位 >= 0.70:
状态.阶段 = "后期"
动作 = 三重联动判断(状态)
if 动作["卖出比例"] > 0:
print(f"第{i+1}期: 净值{净值:.2f} 分位{分位:.0%} | "
f"【{动作['原因']}】卖出{动作['卖出比例']:.0%}")
else:
print(f"第{i+1}期: 净值{净值:.2f} 分位{分位:.0%} | {动作['原因']}")
模拟三重联动()
运行结果示意:
第1期: 净值1.00 分位30% | 浮盈未达标(0.0%),继续定投持有
第4期: 净值1.20 分位55% | 浮盈未达标(20.0%未达?见下方说明)
第5期: 净值1.32 分位60% | 【目标收益率达标(32.0% ≥ 20%),兑现30%】卖出30%
第6期: 净值1.45 分位72% | 已进入后期,看回撤
第8期: 净值1.40 分位88% | 【回撤超阈值(-6.7% ≤ -15%?未触发)】继续持有
(注:上述序列中回撤未达 -15%,演示了"回撤可控继续持有"分支;实盘中把阈值调低或行情跌更深即触发止损。)
7.4 把系统做成定时任务
# 每周五收盘后运行一次,输出持仓建议
import schedule
def 每日检查():
状态 = 读取实盘持仓() # 从券商/基金接口读取
动作 = 三重联动判断(状态)
if 动作["卖出比例"] > 0:
print(f"【提醒】{动作['原因']},建议卖出{动作['卖出比例']:.0%}")
else:
print(f"【正常】{动作['原因']}")
schedule.every().friday.at("15:30").do(每日检查)
💡 效率技巧:用定时任务 + 消息推送(企业微信/钉钉机器人)把卖出系统做成"无人值守"。策略是你的,执行交给脚本——让程序替你克服人性,这是程序员做投资最大的降维打击。
八、边界场景:持仓初期就暴跌 30% 怎么办?
8.1 场景还原
你刚开始定投 3 个月,浮盈 5%,突然市场暴跌 30%。此时:
- 目标收益率:远未达标,信号不触发;
- 估值分位:可能显示"低估",甚至建议加仓;
- 回撤止损:初期阶段还没切换到这个信号。
死守"初期看目标收益率"的规则,你就会扛着 30% 的浮亏。
8.2 正确做法:规则需要"逃生通道"
三重联动不是死板的流水线,它需要一条紧急逃生通道:
无论处于哪个阶段,一旦回撤超过绝对止损线(如 25%-30%),立即无条件执行止损——这是组合级兜底规则,优先级高于一切阶段信号。
设计逻辑:
- 正常的回撤止损阈值(15%)只在"后期"作为主信号;
- 但"绝对止损线"(25%-30%)是组合级保护,任何阶段都生效;
- 它的作用是:防止"初期信号没触发 + 中期信号没触发"时,浮亏失控。
8.3 完整规则优先级
优先级 1:绝对止损线(任何阶段,回撤 > 30% → 无条件全部卖出)
优先级 2:当前阶段主信号(初期=目标收益率;中期=估值分位;后期=回撤止损)
优先级 3:参考信号(其他两个信号只做参考,不主导决策)
⚠️ 避坑警告:绝对止损线不是"再等等"的借口。很多人的绝对止损线形同虚设——跌到 28% 时想"马上 30% 了,也许该卖",跌到 32% 时想"都跌这么多了,应该反弹了",跌到 40% 时想"卖也没意义了"。绝对止损线一旦设定,触发就执行,没有例外。
九、三重联动的适用边界与落地清单
9.1 什么时候三重联动"过重"?
三重联动不是万能药,以下场景它可能"杀鸡用牛刀":
- 纯固收/货币基金持仓:波动极小,不需要止损系统;
- 超短线交易:持仓几天,谈"分阶段切换"没有意义;
- 资金量极小(几千元):跟踪三个信号的成本可能超过收益。
适用对象:宽基指数基金定投、核心-卫星组合、跨市场组合等中长期权益持仓。
9.2 落地清单
| 步骤 | 动作 | 检查项 |
|---|---|---|
| 1 | 设定目标收益率阈值 | 15%-30%,阶梯式分批卖出计划 |
| 2 | 设定估值分位阈值 | 70% 分批止盈,20% 分批加仓 |
| 3 | 设定回撤止损阈值 | 10%-20%,分两档执行 |
| 4 | 设定绝对止损线 | 25%-30%,组合级无条件兜底 |
| 5 | 写代码 / 设提醒 | 定时任务 + 消息推送 |
| 6 | 季度复盘 | 检查阈值是否适配当前市场状态 |
| 7 | 严格执行 | 触发即执行,禁止临场改规则 |
9.3 三重联动与前面策略的衔接
别忘了,卖出系统不是孤立存在的,它和本系列前面的策略是同一套组合拳:
- 与定投买入配合:估值分位低于 20% 时,三重联动的中期信号会说"加仓",这和第 10 篇的动态仓位调整(低位多买)是同一个信号源——买入和卖出共用一套估值坐标系,才不会自相矛盾;
- 与核心-卫星配合:核心仓位(宽基指数)波动小,三重联动阈值可以略宽松;卫星仓位(行业主题)波动大,阈值应更严格——同一套系统,不同仓位配不同参数;
- 与再平衡配合:再平衡解决"资产比例跑偏",三重联动解决"单笔浮盈该不该兑现"——再平衡负责结构,三重联动负责时机,两者并行不悖;
- 与跨市场组合配合:美股(趋势性强)和 A 股(波动大)适合不同的信号强度,这正是第 19-21 篇按市场拆解的铺垫——先学会通用框架,再按市场调参。
9.4 常见问题速答
Q1:三套阈值怎么定?给个起步值。 A:目标收益率 20%(宽基)/ 25%(行业);估值分位高估线 70%;回撤止损 15%(后期主信号)+ 30%(绝对止损线)。起步后按自身风险偏好微调。
Q2:需要每天都盯盘吗? A:不需要。估值分位数据每周更新一次足够,回撤止损可以设置基金平台的条件单自动执行,目标收益率达标会收到推送。这套系统设计的初衷就是让你少盯盘。
Q3:如果资金很少,还要三套信号吗? A:资金量低于 1 万时,建议只用目标收益率 + 绝对止损线两套,减少跟踪成本。三重联动是"系统完整性"和"维护成本"的平衡,资金规模决定你值不值得投入精力。
Q4:卖了之后市场一直涨,我要不要"改进"系统? A:不要因为单次结果修改系统。系统评估要看长期期望,不是单次输赢——三重联动卖飞一次是正常的,它用这次"少赚"换来了十次"保住利润",长期账是划算的。
十、总结
10.1 核心要点回顾
- 组合必要性:三种单一方法各有盲区,行业共识是组合使用形成互补;
- 分阶段切换:初期看目标收益率、中期看估值分位、后期看回撤止损;
- 切换逻辑:从主动目标到被动防线,越到后期越交给机械规则;
- 组合优势:正常波动不误伤、趋势上涨不早卖、反转暴跌有兜底;
- 逃生通道:绝对止损线是组合级规则,任何阶段触发都无条件执行;
- 工程化落地:用代码 + 定时任务把卖出系统做成无人值守。
10.2 一句话结论
三重联动不是三个方法的简单叠加,而是按持仓生命周期排好队的"接力棒"——每个阶段都有主跑者,其他选手待命,最后一棒永远是防守。系统比预测重要,纪律比聪明重要。
10.3 预告
三重联动是"通用框架",但不同市场的气质完全不同——美股趋势性强、A 股波动大、港股流动性弱,同样的信号在不同市场要调整强度。下一篇开始按市场拆解:美股为什么适合"移动止盈 + 估值分位"?
【思考题】
三重联动中"信号切换"的顺序依据是什么?如果市场在持仓初期就暴跌 30%,你还会死守"初期看目标收益率"吗?欢迎在评论区讨论这个边界场景,说说你的逃生通道怎么设计。
【系列文章预告】
下一篇按市场拆解:美股止盈策略——移动止盈 + 估值分位,让利润奔跑、截断亏损。我会用纳斯达克 100 的 10 年数据,拆解"趋势市里怎么卖出才不亏",敬请关注。
标签:#基金定投 #止盈止损策略 #三重止盈法 #基金止盈组合 #定投卖出策略 #投资纪律 #仓位管理

1239

被折叠的 条评论
为什么被折叠?



