个人投资的组合分析工具。目标市场:美股 + 加密货币。
⚠️ 仅供个人研究,不构成投资建议。所有结果为历史回看,不含手续费、滑点与税。
| ✅ 做 | 算你已有组合的风险收益结构:年化、波动、夏普、索提诺、最大回撤、卡玛、相关性矩阵、权重漂移、收益贡献归因 |
| ❌ 不做 | 不预测、不给买卖信号、不读新闻财报宏观。它只看历史价格 |
它的定位是体检报告,不是决策工具。 想知道「现在该不该买」,这个脚本给不了答案——那需要接入新闻、财报、宏观数据的工具(见下方 Roadmap)。
它真正有用的地方是看结构性结论(例如「BTC 与美股相关性只有 0.32,是组合里唯一的分散化来源」),而不是看具体数字(年化多少百分比对未来没有预测意义)。
需要 Python 3.10+。
pip install pandas yfinance quantstats PyPortfolioOpt数据源为 Yahoo Finance,免费、无需 API key。
Windows 双击: run-portfolio.bat(跑完会停住,不会闪退)
命令行:
python portfolio.py # 用脚本内 HOLDINGS 默认权重
python portfolio.py --holdings "SPY:0.6,BTC-USD:0.4" # 指定权重
python portfolio.py --start 2020-01-01 --rf 0.04 # 指定起点和无风险利率
python portfolio.py --html # 额外生成 quantstats 网页报告代码写法:美股直接写 AAPL / SPY;比特币 BTC-USD;以太坊 ETH-USD。
美股一周 5 个交易日,加密 7 天都有价。 直接把两者的收益率序列拼在一起,组合收益会被虚增。
本脚本以股票交易日为准对齐,周末的加密行情折叠进下一个交易日。如果持仓全是加密货币,则退回全日历。
| 指标 | 算法 |
|---|---|
| 年化收益 CAGR | 累计净值 ^ (252 / 交易日数) - 1 |
| 年化波动 | 日收益标准差 × √252 |
| 夏普 | (日超额收益均值 / 日收益标准差) × √252 |
| 索提诺 | 同夏普,但分母只用下跌日标准差 |
| 最大回撤 | min(净值 / 历史最高净值 - 1) |
| 卡玛 | CAGR / |最大回撤| |
| 组合净值 | Σ(权重 × 各资产累计净值),买入持有,权重自然漂移 |
| 收益贡献 | 初始权重 × 该资产累计收益 |
价格使用后复权(auto_adjust=True),即分红再投资。
| 局限 | 影响 |
|---|---|
| 幸存者偏差 | 你填进去的标的是你今天知道的赢家。回看好看是必然的 |
| 不含费税滑点 | 实际收益低于显示值 |
| 假设不再平衡 | 与真实操作有偏差 |
| 无风险利率固定 | 跨越加息周期时夏普失真 |
| 仅日频 | 看不见盘中波动 |
| 数据源免费档 | Yahoo Finance 偶发缺数据或延迟 |
-
holdings.json接入脚本——填一次真实持仓(股数 + 成本价),以后直接出结果,不用每次手打。模板见holdings.example.json,目前尚未接入代码 - 实际盈亏计算(基于成本价)
- 再平衡回测:定期再平衡 vs 放着不动,含手续费
- 定投模拟:每月定额 vs 一次性买入
- 接入新闻 / 财报 / 宏观数据——这是当前最大的缺口
参考方向:TradingAgents(多智能体 LLM 交易研究框架)、TradingAgents-CN(中文增强版,偏 A 股)。
holdings.json(真实持仓)已写入 .gitignore,不会被提交。仓库里只有 holdings.example.json 模板,其中数据均为虚构。