基于万磊,小散逆袭:手把手教你做量化定投
万磊的《零售投资者逆袭》解决了中国散户投资者面临的最常见问题:如何在没有时间、专业知识或气质进行主动选股或交易的情况下持续且盈利地投资。万的答案是量化美元成本平均法(量化定投)投资指数基金——但不是大多数入门书中教的那种简单的"每月购买相同金额"的方法。
相反,万提出了一系列越来越复杂的定投算法,根据市场估值、价格水平和动量条件调整投资金额。这些"智能定投"策略已经针对中国市场数据进行了回测,显示显著优于简单的定投和大多数主动管理的基金。
中国散户投资者面临独特的挑战:
| 挑战 | 影响 |
|---|---|
| A股波动性 | 上证综指经历了多次50%以上的回撤 |
| 信息劣势 | 散户无法在研究上与机构竞争 |
| 时间限制 | 大多数散户有全职非投资工作 |
| 行为偏见 | 高买(兴奋时)、低卖(恐慌时) |
| 产品复杂性 | 成千上万的基金和股票可供选择 |
定投直接解决了所有五个挑战:通过时间分散减少波动影响,不需要信息优势,花费最少时间,自动化投资决策以消除行为偏见,可以用少量指数基金实施。
本书的核心论点:实施纪律严明的量化定投策略投资中国指数基金的普通散户投资者将在5年以上的视野中超越80%的主动股票基金经理。这只需每月不到1小时的努力即可实现。
定投之所以有效是因为一个数学特性:当您定期投资固定金额时,您自动在价格低时购买更多份额,价格高时购买更少份额。这产生了一个平均每份成本,低于同期算术平均价格。
伪代码:定投 vs 一次性投资示例
──────────────────────────────────────────
// 示例:4个月每月投资1000元
// 价格序列:10、5、5、10(算术平均 = 7.5)
第1月:以10元买入100份
第2月:以5元买入200份
第3月:以5元买入200份
第4月:以10元买入100份
总投资 = 4000元
总份额 = 600
平均成本 = 4000 / 600 = 6.67元/份
// 平均成本(6.67)< 算术平均价格(7.5)
// 当价格回到10时,利润 = (10 - 6.67) × 600 = 2000元(50%回报)
市场波动越大,定投优势越大。A股市场作为世界上波动最大的主要市场之一,因此是定投投资的最佳环境之一。万提供的数据显示,定投沪深300在风险调整基础上优于定投标普500,正是因为A股更高的波动性。
万承认,在持续上涨的市场中,一次性投资优于定投。然而,A股市场并非持续上涨——它剧烈震荡。在震荡市场中,定投在低迷时期积累廉价份额的能力给了它显著优势。
一致性:无论市场条件、新闻或个人感受,按计划投资。系统必须自动运行。
量化:每个参数——投资金额、时机、基金选择、止盈水平——都由客观规则定义,而非主观判断。
耐心:定投需要至少3年的承诺才能显示结果。在熊市中,系统廉价积累份额。回报在随后牛市中到来。
纪律:即使——尤其是——当规则感觉反直觉时也要遵守规则。在市场崩溃时投入更多资金感觉错误,但数学上是最优的。
万根据多个标准评估中国指数基金并推荐:
核心持仓:
卫星持仓:
| 标准 | 寻找什么 |
|---|---|
| 跟踪误差 | 相对于指数年化 < 0.2% |
| 费用率 | 总计 < 0.5%(管理费+托管费) |
| 基金规模 | > 10亿元以确保流动性 |
| 基金年限 | > 2年跟踪记录 |
| 复制方法 | 全复制优于抽样 |
| ETF vs 指数基金 | ETF用于一次性调整;指数基金用于自动化定投 |
万推荐简单的两或三基金组合:
保守型:70% 沪深300 + 30% 红利指数 平衡型:50% 沪深300 + 30% 中证500 + 20% 红利指数 进取型:40% 沪深300 + 40% 中证500 + 20% 创业板
最简单的策略:在固定日期(例如每月15日)将固定金额(例如2000元)投入选定的指数基金。
优势:简单实施和自动化。无需决策。 劣势:不适应市场条件。无论市场昂贵还是便宜都投入相同金额。
万的回测显示,对于3年以上期间,每周和每月定投差异微乎其微。由于简单性和与工资周期对齐,推荐每月一次。
月中具体时间几乎不影响长期回报。万揭穿了某些日子对定投入场系统更好的常见神话。
一个常见担忧:"如果我在市场顶部开始定投怎么办?"万的回测显示,即使在2007年或2015年牛市顶部开始定投沪深300,在18-24个月内恢复并盈利。起始点远不如一致性和耐心重要。
根据当前价格与移动平均线的关系调整投资金额:
伪代码:基于均线的智能定投
───────────────────────────────
base_amount = 2000 // 基本月投资
ma_250 = moving_average(index_price, 250) // 250日(1年)均线
current_price = index_current_price
ratio = current_price / ma_250
如果 ratio > 1.2: // 价格高于均线20%+ — 市场昂贵
invest_amount = base_amount * 0.5
否则如果 ratio > 1.0: // 价格高于均线 — 略贵
invest_amount = base_amount * 0.8
否则如果 ratio > 0.8: // 价格低于均线 — 略便宜
invest_amount = base_amount * 1.2
否则: // 价格低于均线20%+ — 非常便宜
invest_amount = base_amount * 1.5
不是投资固定金额,而是每个周期瞄准固定价值增长:
伪代码:价值平均策略
───────────────────────────
target_monthly_growth = 2000 // 希望投资组合每月增长2000
month_number = current_month - start_month
target_value = target_monthly_growth * month_number
current_value = shares_held * current_price
investment_needed = target_value - current_value
// 在便宜市场:投入更多以达到目标
// 在昂贵市场:投入更少(或甚至卖出)以保持在目标
invest_amount = max(investment_needed, 0) // 为简单起见最低为0
invest_amount = min(invest_amount, base_amount * 3) // 上限为基本金额的3倍
当当前指数价格低于您的平均成本时,投入额外资金以更快降低平均成本:
伪代码:成本平均法增强
───────────────────────────────────────
avg_cost = total_invested / total_shares
current_price = index_current_price
如果 current_price < avg_cost * 0.9: // 价格低于成本10%+
invest_amount = base_amount * 2.0
否则如果 current_price < avg_cost: // 价格低于成本
invest_amount = base_amount * 1.5
否则: // 价格高于成本
invest_amount = base_amount * 1.0
万最先进的定投算法使用指数市盈率的历史百分位来确定投资金额:
伪代码:市盈率百分制定投
─────────────────────────────
pe_current = index_pe_ratio()
pe_percentile = historical_percentile(pe_current, lookback_years=10)
// pe_percentile = 0.2 意味着当前市盈率低于80%的历史值
如果 pe_percentile < 0.2: // 非常便宜(后20%)
invest_amount = base_amount * 2.0
action = "积极买入 — 市场严重低估"
否则如果 pe_percentile < 0.4: // 便宜(第20-40百分位)
invest_amount = base_amount * 1.5
action = "增加买入 — 市场低估"
否则如果 pe_percentile < 0.6: // 合理价值(第40-60百分位)
invest_amount = base_amount * 1.0
action = "正常定投 — 市场合理估值"
否则如果 pe_percentile < 0.8: // 昂贵(第60-80百分位)
invest_amount = base_amount * 0.5
action = "减少买入 — 市场高估"
否则: // 非常昂贵(前20%)
invest_amount = 0
action = "停止买入 — 考虑获利了结"
使用简化的格雷厄姆估值:当指数的盈利收益率(1/市盈率)超过10年期政府债券收益率的两倍时,增加定投配置。当盈利收益率跌破债券收益率时,减少配置。
结合多个估值指标以获得更稳健的信号:
| 指标 | 权重 | 便宜阈值 | 昂贵阈值 |
|---|---|---|---|
| 市盈率百分位(10年) | 40% | < 30百分位 | > 70百分位 |
| 市净率百分位(10年) | 30% | < 30百分位 | > 70百分位 |
| 股息率 | 20% | > 3% | < 1.5% |
| 巴菲特指标(市值/GDP) | 10% | < 60% | > 100% |
与西方"永远不卖"的定投建议不同,万在A股市场中强力主张止盈规则。A股市场剧烈震荡——在2007年或2015年不平仓将会在几个月内抹去多年积累的收益。
最简单的方法:当定投组合达到目标回报时卖出:
伪代码:目标回报止盈
──────────────────────────────────────
target_return = 0.30 // 30% 总回报目标
current_return = (current_value - total_invested) / total_invested
如果 current_return >= target_return:
sell_all()
restart_dca() // 从头开始新的定投周期
更复杂:瞄准年化回报率而非绝对回报:
伪代码:年化回报止盈
─────────────────────────────────────────
target_annual_return = 0.15 // 15% 年化
years_invested = months_invested / 12
target_return = (1 + target_annual_return)^years_invested - 1
current_return = (current_value - total_invested) / total_invested
如果 current_return >= target_return:
execute_take_profit()
当市场按估值指标变得昂贵时卖出:
万推荐结合元素的推荐方法:
万展示了跨越多个A股牛熊周期的广泛回测:
测试期间:2005-2020(包括两个完整牛熊周期)
| 策略 | 年化回报 | 最大回撤 | 夏普比率 |
|---|---|---|---|
| 买入持有沪深300 | 8.2% | -65% | 0.32 |
| 简单月度定投 | 9.5% | -38% | 0.48 |
| 基于均线的智能定投 | 12.1% | -28% | 0.65 |
| 市盈率百分制定投 | 13.4% | -25% | 0.72 |
| 市盈率百分制定投+止盈 | 15.8% | -18% | 0.91 |
万在2005-2015年数据上开发的市盈率百分位策略对2016-2020年样本外数据进行了测试。该策略保持了优势,尽管幅度较小(任何回测的预期)。
对于多基金组合,每年进行再平衡:
伪代码:年度再平衡
───────────────────────────────
target_allocation = {csi300: 0.50, csi500: 0.30, dividend: 0.20}
current_values = get_current_values(portfolio)
total_value = sum(current_values)
对于 portfolio 中的每个基金:
target_value = total_value * target_allocation[基金]
current_value = current_values[基金]
difference = target_value - current_value
如果 abs(difference / target_value) > 0.05: // >5% 偏差
如果 difference > 0:
buy(基金, difference)
否则:
sell(基金, abs(difference))
保持相当于6-12个月定投贡献的现金储备。这有两个目的:
随着投资者年龄或情况变化:
罪1:在熊市中停止 — 最常见且最代价高昂的错误。熊市正是定投廉价积累份额的时候。在熊市中停止定投消除了定投的主要优势。
罪2:没有止盈计划 — 多年积累然后因为没有退出策略在崩盘中眼睁睁看着收益蒸发。
罪3:投入需要的钱 — 定投需要3-5年最低期限。投入1-2年内需要的钱会在最糟糕时期被迫卖出。
罪4:追逐热门基金 — 从计划的指数基金切换到近期表现最好的行业基金。这与定投逻辑恰恰相反。
罪5:过度分散 — 持有10+基金产生复杂性而不增加额外的多元化效益。2-3个指数基金足够了。
罪6:忽视费用 — 0.5%费用率基金和1.5%基金之间的差异在10-20年内会剧烈复合。
罪7:过于频繁检查 — 每日监控定投组合会引入情绪干扰。每月回顾足够;每季是理想的。
添加动量过滤器:当指数高于其20个月移动平均线(牛市确认)时增加定投金额,低于时(熊市)减少:
伪代码:动量增强定投
─────────────────────────────────
ma_20m = moving_average(monthly_close, 20)
如果 current_price > ma_20m:
// 牛市状态:正常或增加投资
invest_amount = base_amount * valuation_multiplier
否则如果 current_price < ma_20m 且 pe_percentile < 0.4:
// 熊市但便宜:积极买入
invest_amount = base_amount * 2.0
否则如果 current_price < ma_20m 且 pe_percentile > 0.6:
// 熊市且仍然昂贵:最少买入
invest_amount = base_amount * 0.3
在低波动期间投入更多(平静积累),在高波动期间减少(不确定、高风险):
伪代码:波动率调整定投
────────────────────────────────────
current_vol = rolling_std(daily_returns, 20) * sqrt(252) // 年化波动率
median_vol = median(historical_vol, 3_years)
vol_ratio = current_vol / median_vol
如果 vol_ratio < 0.8: // 低波动
invest_amount = base_amount * 1.2
否则如果 vol_ratio > 1.5: // 高波动
invest_amount = base_amount * 0.7
否则:
invest_amount = base_amount
在大回撤后,基于A股均值回归的统计倾向积极增加投资:
万为定投投资者重新定义熊市:熊市不是灾难而是打折销售。每个月在熊市投入的资金都是在以折扣价购买份额。熊市持续越长,您积累的廉价份额越多,随后牛市中的回报就越爆炸。
定投投资者必须对以下方面培养情绪超脱:
万建议将定投像水电费一样对待:自动、定期、不经商议。在固定日期设置自动转账,除了每季回顾外不要看账户。
为保持动力,万建议追踪持有的基金份额累积数量而非账户余额。份额数量在积累期间只会增加,在账户余额可能下降的熊市中也提供正强化。
伪代码:完整量化定投系统
────────────────────────────────────────────
类 QuantitativeDCA:
配置:
base_monthly_amount = 3000
funds = {csi300: 0.50, csi500: 0.30, dividend: 0.20}
take_profit_target = 0.30
take_profit_annual = 0.15
pe_expensive_threshold = 0.80
pe_cheap_threshold = 0.30
cash_reserve_months = 6
函数 monthly_investment():
// 第1步:计算估值调整
pe_pctl = pe_percentile(csi300, lookback=10_years)
如果 pe_pctl < 0.20:
valuation_mult = 2.0
否则如果 pe_pctl < 0.40:
valuation_mult = 1.5
否则如果 pe_pctl < 0.60:
valuation_mult = 1.0
否则如果 pe_pctl < 0.80:
valuation_mult = 0.5
否则:
valuation_mult = 0 // 停止买入
// 第2步:计算均线调整
ma_250 = moving_average(csi300_price, 250)
price_to_ma = current_price / ma_250
ma_mult = max(0.5, min(1.5, 2.0 - price_to_ma))
// 第3步:综合调整
final_multiplier = (valuation_mult * 0.6) + (ma_mult * 0.4)
total_amount = base_monthly_amount * final_multiplier
// 第4步:在基金间分配
对于 fund, weight in funds:
fund_amount = total_amount * weight
如果 fund_amount > 0:
execute_purchase(fund, fund_amount)
log(f"买入 {fund} {fund_amount}")
函数 check_take_profit():
total_invested = sum(all_investments)
current_value = portfolio_market_value()
total_return = (current_value - total_invested) / total_invested
years = months_since_start / 12
annualized = (1 + total_return)^(1/years) - 1 如果 years > 0 否则 0
pe_pctl = pe_percentile(csi300, lookback=10_years)
// 第一阶段:部分获利了结
如果 total_return >= 0.20 且 not stage_1_done:
sell_percentage(0.30)
stage_1_done = True
log("第一阶段止盈:卖出30%")
// 第二阶段:进一步获利了结
如果 total_return >= 0.40 且 not stage_2_done:
sell_percentage(0.30)
stage_2_done = True
log("第二阶段止盈:卖出30%")
// 第三阶段:基于估值的退出
如果 pe_pctl >= 0.80:
如果 pe_pctl >= 0.90:
sell_all()
log("全退:市盈率百分位 > 90th")
reset_cycle()
否则:
sell_percentage(0.50)
log("部分退出:市盈率百分位 > 80th")
函数 quarterly_review():
// 检查配置漂移
对于 portfolio 中的每个基金:
current_weight = 基金.value / total_value
target_weight = funds[基金.name]
drift = abs(current_weight - target_weight)
如果 drift > 0.10: // >10% 漂移
rebalance(基金, target_weight)
// 检查现金储备
如果 cash_reserve < base_monthly_amount * cash_reserve_months:
alert("现金储备低于目标 — 优先重建")
// 绩效总结
report = generate_performance_report()
log(report)
函数 annual_review():
quarterly_review()
// 审查策略参数
// 根据收入变化调整基本金额
// 考虑人生阶段调整
// 审查基金选择(跟踪误差、费用)
"散户最大的武器不是智力或信息——是耐心。定投将耐心转化为回报。"
"在熊市中,每次定投贡献都是在肥沃土壤中播种的种子。你不会立即看到收获,但当春天来临时,你的花园将茁壮成长。"
"对大多数人来说,最重要的投资决策不是买哪只股票,而是是否开始投资。定投消除了不开始的每一个借口。"
"智能定投不是择时市场。而是根据患者状况调整药物剂量。市场生病(便宜)时多用药,健康时少用药。"
"在熊市中停止定投的投资者就像在雨季停止播种的农民。雨才是使庄稼生长的。"
"止盈纪律是将盈利定投与希望定投区分开来的关键。在A股市场,如果你在兴奋时不平仓,兴奋会在恐慌时平你的仓。"
"每日检查定投组合就像每隔五分钟打开烤箱看蛋糕是否熟了。你所做的只是阻止它正常烘焙。"
"量化定投的力量在于它用一套计算机可以遵循的规则取代了投资中最困难的事情——在不确定性下做决策。而且与人类不同,规则不会恐慌。"