pyportfolioopt
是一个用于投资组合优化的 Python 库,它提供了多种优化方法和工具,帮助投资者构建和优化投资组合。这个库基于现代投资组合理论,支持多种资产配置策略,包括均值-方差优化、风险平价、最小方差组合等。
主要功能
- 数据获取:从 Yahoo Finance 等数据源获取股票历史数据。
- 预期收益和协方差矩阵估计:计算资产的预期收益和协方差矩阵。
- 投资组合优化:实现多种优化方法,如均值-方差优化、最小方差组合、最大夏普比率组合等。
- 风险模型:支持多种风险模型,如单因素模型、多因素模型等。
- 绩效评估:提供绩效评估工具,如夏普比率、信息比率等。
安装
你可以使用 pip
安装 pyportfolioopt
:
pip install pyportfolioopt
示例代码
以下是一些常用的 pyportfolioopt
功能示例:
导入库
import pandas as pd
import yfinance as yf
from pypfopt import EfficientFrontier
from pypfopt import risk_models
from pypfopt import expected_returns
获取股票数据
# 定义股票代码列表
tickers = ["AAPL", "MSFT", "GOOGL", "AMZN", "FB"]
# 下载股票历史数据
data = yf.download(tickers, start="2020-01-01", end="2023-01-01")["Adj Close"]
# 计算日收益率
returns = data.pct_change().dropna()
计算预期收益和协方差矩阵
# 计算预期收益
mu = expected_returns.mean_historical_return(data)
# 计算协方差矩阵
S = risk_models.sample_cov(data)
构建有效前沿
# 创建有效前沿对象
ef = EfficientFrontier(mu, S)
# 最大化夏普比率
weights = ef.max_sharpe()
cleaned_weights = ef.clean_weights()
print(cleaned_weights)
# 获取投资组合绩效
ef.portfolio_performance(verbose=True)
绘制有效前沿
import matplotlib.pyplot as plt
# 生成有效前沿
ef = EfficientFrontier(mu, S)
ef.min_volatility()
min_vol = ef.portfolio_performance()[1]
ef.max_sharpe()
max_sharpe = ef.portfolio_performance()[1]
# 生成多个投资组合
n_points = 20
ef = EfficientFrontier(mu, S)
ef.efficient_frontier(n_points=n_points)
# 获取有效前沿数据
frontier_returns, frontier_vols, frontier_sharpes = zip(*ef.efficient_frontier(n_points=n_points))
# 绘制有效前沿
plt.figure(figsize=(12, 6))
plt.scatter(frontier_vols, frontier_returns, c=frontier_sharpes, cmap='viridis')
plt.colorbar(label='Sharpe Ratio')
plt.scatter(min_vol, ef.portfolio_performance()[0], c='red', marker='o', label='Min Volatility')
plt.scatter(max_sharpe, ef.portfolio_performance()[0], c='blue', marker='o', label='Max Sharpe')
plt.xlabel('Volatility')
plt.ylabel('Expected Return')
plt.title('Efficient Frontier')
plt.legend()
plt.show()
更多功能
pyportfolioopt
还提供了许多其他功能,如:
- 约束条件:添加投资组合权重的约束条件,如权重上限、下限等。
- 风险平价:实现风险平价投资组合。
- 黑-李特曼模型:结合市场观点进行投资组合优化。
官方文档
你可以访问 pyportfolioopt 的官方文档 获取更多详细信息和示例。
希望这些示例对你有所帮助!如果你有任何具体的问题或需要进一步的帮助,请随时告诉我。