投资组合 MPT 体检 (Modern Portfolio Theory Health Check)
把"我觉得还行"的模糊判断,变成可量化的组合健康指标。输入持仓,输出一份带评分、总结与改进建议的体检报告。
何时使用
- 用户给出一组持仓(代码或名称 + 权重)并想评估健康度、风险、分散化效果。
- 触发词示例:「组合体检」「用 MPT 评估我的持仓」「这个组合风险高不高」「帮我看看我的投资组合」「分散化效果怎么样」。
- 适用标的:A股 / 港股 / 美股(含 ADR)。支持等权或自定义权重。
理论依据(本报告背后的金融学基础)
1. 均值-方差框架 (Markowitz, 1952)
现代投资组合理论的核心命题:理性投资者在"收益"与"风险"两维空间里做选择,收益用预期收益率 E(R),风险用方差/标准差 σ。资产之间的联动用协方差 Cov(i,j) 或相关系数 ρ_ij 刻画。
2. 组合收益与风险(本工具的核心公式)
- 组合收益:
E(R_p) = Σ wᵢ · E(Rᵢ)—— 各资产预期收益的加权平均(线性)。 - 组合风险(重点,非线性):
σ_p² = Σᵢ Σⱼ wᵢ wⱼ · Cov(i,j) = Σ wᵢ²σᵢ² + Σᵢ≠ⱼ 2 wᵢ wⱼ ρᵢⱼ σᵢ σⱼ
第二项交叉项正是分散化的全部秘密:当 ρᵢⱼ 小于 1 时,交叉项相互抵消,组合总风险被压低。
若 ρ=1(完全同涨同跌),分散化收益归零;若 ρ=0 或不相关,分散化收益最大。 - 分散化比率 = 朴素加权波动率 / 组合真实波动率(协方差法),大于1 表示分散化在起作用。
- 本工具对日收益取协方差矩阵,年化时乘以 √252,与上式严格一致。
3. 夏普比率 (Sharpe, 1966)
Sharpe = (E(R_p) − R_f) / σ_p,其中 R_f 为无风险利率(本工具取约 2.5%,对应 10Y 国债)。
衡量"每承担一单位总风险换来的超额收益"。大于1 优秀、0.5~1 良好、小于0 说明风险未获补偿。
4. 最大回撤 (Max Drawdown)
净值曲线从峰值到谷值的最大跌幅 min((Cum−CumMax)/CumMax),刻画极端最坏亏损,是风险约束最直观的指标。
5. Beta 与 Alpha(CAPM 资产定价模型,Sharpe 1964)
引入无风险资产后,"切点组合=市场组合",单只/组合收益可拆为:
E(R) − R_f = α + β · (E(R_m) − R_f)
- Beta = Cov(R_p, R_m) / Var(R_m),度量组合对市场的系统性敏感度(大于1 高弹性、小于1 防御)。
- Alpha = 截距项,承担 Beta 风险之外的超额收益;负 Alpha 表示"承担了市场风险却跑输市场"。
本工具以恒生指数(HSI)或沪深300为基准回归求得 Beta/Alpha。
6. HHI 集中度指数 (Herfindahl-Hirschman Index)
HHI = Σ wᵢ²,衡量持仓集中程度。等权 5 只 = 0.20;越接近 1 越集中。大于0.20 视为偏集中。
注意:HHI 按"持股数量"计算,若多只标的同时暴露于同一行业/因子,因子层面的真实集中度会高于 HHI 显示值。
7. 有效前沿与分散化边界(理论延伸)
给定风险下收益最高(或给定收益下风险最低)的所有组合构成"有效前沿";引入无风险资产后最优解落在资本市场线(CML)与前沿的切点(市场组合)。实证上:从 1 只加到 10~15 只,非系统性风险快速下降;之后逼近系统性风险"地板"不再改善——免费的风险消除主要发生在前 10~15 只,且相关性比数量更重要。
8. 理论的局限(本工具已在建议中提示)
- 用历史协方差估计未来,危机时相关性会"塌缩"至 1,分散化在最需要时失效。
- 假设收益近似正态、投资者风险厌恶、可无成本做空——现实不完全成立。
- 改进方向:后现代投资组合理论(PMPT,用下行风险)、风险平价(Risk Parity)、Black-Litterman 等。
使用方法
调用 scripts/portfolio_eval.py,传入一个逗号分隔的持仓字符串。市场自动识别:6 位数字=A股、5 位数字=港股、纯字母=美股、中文名走内置映射表(腾讯控股/拼多多/贵州茅台/宁德时代/阿里巴巴/小米集团/美团 等常见标的)。
# 等权 5 只(省略权重即等权)
python portfolio_eval.py "腾讯控股,拼多多,阿里巴巴,小米集团,美团"
# 指定权重(冒号或等号,支持百分比)
python portfolio_eval.py "腾讯控股:0.2,拼多多:0.2,阿里巴巴:0.2,小米集团:0.2,美团:0.2"
python portfolio_eval.py "600519:30%,00700:30%,PDD:40%"
# 直接给代码
python portfolio_eval.py "00700:0.4,PDD:0.3,09988:0.3"
建议在用户工作区目录运行(报告输出到当前目录 portfolio_health_report.html)。脚本会自动安装所需依赖(akshare/pandas/numpy/scipy/statsmodels/plotly)。
输出(交互式 HTML 报告,含六部分)
- 综合评分卡:健康评分(0-100, 含评级)、年化收益、年化波动、夏普、最大回撤、平均相关性、HHI。
- 一、综合总结:对组合整体健康度的文字结论(含 Beta/Alpha 解读)。
- 二、净值走势:个股与组合归一化净值曲线。
- 三、资产相关性矩阵:热力图,直观展示分散化基础。
- 四、风险-收益分布:个股与组合在(波动,收益)平面的散点。
- 五、个股指标明细 + 六、改进建议:基于指标的数据驱动建议(相关性偏高/集中度过高/高Beta/负夏普/回撤过大/单一市场暴露/方法论提醒)。
依赖
- akshare(行情)、pandas / numpy(计算)、scipy / statsmodels(统计)、plotly(交互图表)。
- 行情源:港股
stock_hk_hist(东方财富) +stock_hk_daily(新浪) 双源重试;美股stock_us_daily;A股stock_zh_a_hist(东方财富) +stock_zh_a_daily(新浪) 兜底。基准指数优先 HSI,其次沪深300。
注意
- 回测期约一年(近 420 个自然日),不含交易成本;Beta/Alpha 以可得基准指数近似,非 A股组合时基准为代理值。
- 报告仅供研究参考,不构成投资建议。