import sys, os
sys.path.insert(0, os.path.abspath('.'))
import warnings; warnings.filterwarnings('ignore')
import numpy as np, pandas as pd
import matplotlib.pyplot as plt
import invest_data as D
FONT = D.setup_matplotlib()
np.random.seed(D.SEED)
print('中文字体:', FONT, '| 数据目录:', D.DATA_DIR)
中文字体: Noto Sans CJK SC | 数据目录: /data/docs/investing/long-term-investing/data
6.1 为什么要分散:别把鸡蛋放一个篮子¶
大白话:把全部身家压在一只股票上,一旦它暴雷(财务造假、行业崩塌),你可能血本无归。分散到多只走势不完全同步的资产,单只出事对整体伤害有限,而长期收益不一定低多少。
类比:开一家只卖雨伞的店,晴天就饿肚子;同时卖雨伞和墨镜,晴天雨天都有生意——这就是分散。
关键不是「买得多」,而是买得「不一样」:资产之间相关性越低,分散效果越好。先把几只股票的真实净值曲线放一起看:
# 载入5个标的的真实收盘价,对齐时间、归一化
assets = {
"贵州茅台": D.load_a_price("600519")["close"],
"宁德时代": D.load_a_price("300750")["close"],
"苹果AAPL": D.load_us_price("AAPL")["close"],
"英伟达NVDA": D.load_us_price("NVDA")["close"],
"沪深300": D.load_index("000300")["close"],
}
prices = pd.DataFrame(assets).dropna()
# 取最近约4年共同区间
prices = prices.iloc[-252*4:]
norm = prices / prices.iloc[0] * 100
fig, ax = plt.subplots(figsize=(11, 5.5))
for col in norm.columns:
ax.plot(norm.index, norm[col], lw=1.4, label=col)
ax.axhline(100, color="gray", ls="--", lw=0.8)
ax.set_title("五个标的 真实净值走势(期初归一化=100,近4年)")
ax.set_xlabel("日期"); ax.set_ylabel("相对净值"); ax.legend()
plt.tight_layout(); plt.show()
print("共同区间:", prices.index[0].date(), "→", prices.index[-1].date())
共同区间: 2022-02-24 → 2026-06-18
这张图在说什么:五条线各走各的——有的猛涨(如成长性强的科技股),有的平稳,有的中途大起大落。正因为它们不同步,把它们组合起来,整体波动会比单押一只小。注意这里只是把真实走势叠在一起看「同不同步」,下面用相关性量化它。
6.2 相关性:组合里资产「同不同步」的尺子¶
相关系数衡量两只资产涨跌的同步程度:
- +1:完全同涨同跌(分散无效,等于买了同一个东西)
- 0:互不相关(分散效果好)
- −1:完全反向(一涨一跌,对冲)
我们算这五个标的日收益率的相关性矩阵:
rets = prices.pct_change().dropna()
corr = rets.corr()
fig, ax = plt.subplots(figsize=(7, 6))
im = ax.imshow(corr.values, cmap="RdYlGn_r", vmin=-1, vmax=1)
ax.set_xticks(range(len(corr))); ax.set_xticklabels(corr.columns, rotation=45, ha="right")
ax.set_yticks(range(len(corr))); ax.set_yticklabels(corr.columns)
for i in range(len(corr)):
for j in range(len(corr)):
ax.text(j, i, f"{corr.values[i,j]:.2f}", ha="center", va="center", fontsize=10)
ax.set_title("日收益率 相关性矩阵")
fig.colorbar(im, ax=ax, fraction=0.046)
plt.tight_layout(); plt.show()
这张图在说什么:对角线全是 1(自己和自己完全相关)。颜色越偏红、数字越接近 1,说明两者越同步,放一起分散效果差(典型如同一市场同板块的股票);数字越小(接近 0 甚至负),分散价值越大。一般来说,跨市场(A股 vs 美股)、跨行业的资产相关性更低,是更好的分散组合。这就是为什么全球配置、行业分散有意义。
6.3 构造一个简单组合:等权 vs 单押¶
我们构造一个等权重组合(5 个标的各 20%),和单押任意一只对比,算两个长期投资者最该看的指标:
- 年化收益(CAGR):长期平均每年涨多少。
- 最大回撤(MDD):从最高点到最低点最多亏过多少——衡量「最难熬时有多难熬」。
w = pd.Series(0.2, index=prices.columns) # 等权
port_norm = (norm * w).sum(axis=1) # 等权组合净值(期初=100)
def stats(series):
return D.cagr(series), D.max_drawdown(series)
rows = []
for col in norm.columns:
c, m = stats(norm[col]); rows.append((col, c*100, m*100))
c, m = stats(port_norm); rows.append(("★等权组合", c*100, m*100))
tbl = pd.DataFrame(rows, columns=["标的", "年化收益%", "最大回撤%"]).set_index("标的").round(1)
print(tbl.to_string())
fig, ax = plt.subplots(figsize=(11, 5.5))
for col in norm.columns:
ax.plot(norm.index, norm[col], lw=1, alpha=0.45, label=col)
ax.plot(port_norm.index, port_norm.values, lw=2.6, color="black", label="★等权组合")
ax.axhline(100, color="gray", ls="--", lw=0.8)
ax.set_title("等权组合 vs 单一标的(粗黑线为组合)")
ax.set_xlabel("日期"); ax.set_ylabel("相对净值"); ax.legend(fontsize=8)
plt.tight_layout(); plt.show()
年化收益% 最大回撤% 标的 贵州茅台 -5.6 -34.5 宁德时代 9.8 -54.7 苹果AAPL 15.8 -33.5 英伟达NVDA 66.5 -61.6 沪深300 2.0 -31.6 ★等权组合 27.5 -27.3
这张表/图在说什么:
- 组合(粗黑线)走得比最猛的那只温和——它放弃了押中大牛股的极致收益,但也避开了押错的惨烈下跌。
- 看表格:组合的最大回撤通常比波动最大的单只小,而年化收益是各标的的某种「平均」。这就是分散的本质:用一点点收益,换显著更平滑的曲线和更小的回撤。
- 对长期投资者,能否拿得住往往比理论收益更重要——回撤小,才不容易在恐慌中割肉离场。
6.4 再平衡:自动「低买高卖」的纪律¶
大白话:组合刚建时各 20%,涨跌之后比例会跑偏(涨得猛的占比变大,等于「越涨越重仓」)。再平衡就是定期把比例拉回目标——卖掉涨多的、补回跌多的。
为什么有用:它强制你在高位减仓、在低位加仓,是一种自带纪律的「低买高卖」,还能控制风险不让单一资产占比失控。
我们对比「买入后不动」 vs 「每年再平衡一次」:
rets_p = prices.pct_change().fillna(0)
target = np.array([0.2]*5)
# 1) 买入持有:期初等权,之后随市值漂移
bh_val = (1 + rets_p).cumprod()
bh_port = (bh_val * target).sum(axis=1)
# 2) 每年再平衡:每年第一个交易日重置回等权
val = target.copy().astype(float)
reb_series = []
year_seen = set()
for d, r in rets_p.iterrows():
val = val * (1 + r.values) # 当日按各自收益增长
if d.year not in year_seen and len(year_seen) > 0:
total = val.sum(); val = total * target # 再平衡回等权
year_seen.add(d.year)
reb_series.append((d, val.sum()))
reb_port = pd.Series(dict(reb_series))
fig, ax = plt.subplots(figsize=(11, 5))
ax.plot(bh_port.index, bh_port.values, label="买入持有(不再平衡)", color="#c0392b", lw=1.8)
ax.plot(reb_port.index, reb_port.values, label="每年再平衡", color="#16a085", lw=1.8)
ax.set_title("再平衡 vs 买入持有(等权组合,期初=1)")
ax.set_xlabel("日期"); ax.set_ylabel("净值"); ax.legend()
plt.tight_layout(); plt.show()
print(f"买入持有 最终净值 {bh_port.iloc[-1]:.2f}, 最大回撤 {D.max_drawdown(bh_port)*100:.1f}%")
print(f"每年再平衡 最终净值 {reb_port.iloc[-1]:.2f}, 最大回撤 {D.max_drawdown(reb_port)*100:.1f}%")
买入持有 最终净值 2.85, 最大回撤 -27.3% 每年再平衡 最终净值 2.46, 最大回撤 -27.2%
这张图在说什么:两条线分别是「不管不顾持有」和「每年拉回等权」。再平衡的效果取决于行情:在震荡/轮动的市场里,它通过「卖强补弱」往往能降低回撤、平滑曲线;在单边大牛市里,它可能略微拖累收益(因为提前卖掉了最强的资产)。它的核心价值不是更高收益,而是风险控制和纪律——避免某只资产涨太多后占比过高、把组合变成单押。
6.5 仓位管理:你能承受多大波动¶
最后一块拼图是仓位——多少钱投股票、多少留现金/债券。没有标准答案,取决于你的:
- 风险承受力:能眼睁睁看着账户回撤 30% 还睡得着吗?睡不着就降低股票仓位。
- 投资期限:钱 3 年内要用 → 别重仓股票;20 年后才用 → 可以承受更高股票仓位。
- 一条经验法则(仅供参考):股票仓位 ≈
(100 − 年龄)%,年纪越大越保守。
仓位的意义在于:让你在最难熬的下跌里也不被迫离场。再好的策略,如果让你扛不住而中途割肉,都等于零。活下来、拿得住,才能等到复利兑现。
本章小结¶
- 分散用一点收益换显著更小的回撤,关键是选相关性低的资产(跨市场、跨行业);
- 等权组合的曲线比单押更平滑、回撤更小,长期投资者更拿得住;
- 再平衡是自带纪律的「低买高卖」,核心价值是风险控制;
- 仓位管理让你在大跌中不被迫离场——活下来才能等到复利。
下一章 07:实战——把前六章全部串起来,完整分析茅台 + 苹果,给出「该不该长期持有」的分析框架。
免责声明:本教程为投资教育内容,所有分析与示例仅为方法演示,不构成任何投资建议。文中涉及的公司与数据仅用于教学举例,不代表推荐。市场有风险,决策需自负。