绘图 ¶
作者:Robert Andrew Martin
译者:片刻小哥哥
项目地址:https://www.dafeiyang.cn/finance/stock/tools/PyPortfolioOpt/Plotting
原始地址:https://pyportfolioopt.readthedocs.io/en/latest/Plotting.html
所有的优化函数都在 EfficientFrontier
产生单一的最优投资组合。 但是,您可能想要绘制整个有效边界。这个有效边界可以被认为是以几种不同的方式:
- 全部的集合
efficient_risk()
一系列目标风险的投资组合 - 全部的集合
efficient_return()
一系列目标回报的投资组合 - 全部的集合
max_quadratic_utility()
一系列风险规避的投资组合。
plotting
模块为所有这三种方法提供支持。 要生成有效边界图,您应该实例化您的 EfficientFrontier
对象并像平常一样添加约束,但在调用优化函数(例如使用 ef.max_sharpe()
)之前,您应该将实例化的对象传递给 plot.plot_efficient_frontier()
:
ef = EfficientFrontier(mu, S, weight_bounds=(None, None))
ef.add_constraint(lambda w: w[0] >= 0.2)
ef.add_constraint(lambda w: w[2] == 0.15)
ef.add_constraint(lambda w: w[3] + w[4] <= 0.10)
fig, ax = plt.subplots()
plotting.plot_efficient_frontier(ef, ax=ax, show_assets=True)
plt.show()
这会产生以下图:
您可以显式传递一系列参数(风险、效用或回报)来生成边界:
# 100 portfolios with risks between 0.10 and 0.30
risk_range = np.linspace(0.10, 0.40, 100)
plotting.plot_efficient_frontier(ef, ef_param="risk", ef_param_range=risk_range,
show_assets=True, showfig=True)
我们可以轻松生成更复杂的绘图。以下脚本绘制了有效边界和 随机生成的(次优)投资组合,按 夏普比率 着色:
fig, ax = plt.subplots()
ef_max_sharpe = ef.deepcopy()
plotting.plot_efficient_frontier(ef, ax=ax, show_assets=False)
# Find the tangency portfolio
ef_max_sharpe.max_sharpe()
ret_tangent, std_tangent, _ = ef_max_sharpe.portfolio_performance()
ax.scatter(std_tangent, ret_tangent, marker="\*", s=100, c="r", label="Max Sharpe")
# Generate random portfolios
n_samples = 10000
w = np.random.dirichlet(np.ones(ef.n_assets), n_samples)
rets = w.dot(ef.expected_returns)
stds = np.sqrt(np.diag(w @ ef.cov_matrix @ w.T))
sharpes = rets / stds
ax.scatter(stds, rets, marker=".", c=sharpes, cmap="viridis_r")
# Output
ax.set_title("Efficient Frontier with random portfolios")
ax.legend()
plt.tight_layout()
plt.savefig("ef_scatter.png", dpi=200)
plt.show()
这是结果:
文档参考 ¶
绘图模块包含生成各种绘图的所有功能。
目前实施:
plot_covariance
- 绘制相关矩阵plot_dendrogram
- 绘制投资组合中的层次聚类plot_efficient_frontier
– 绘制 EfficientFrontier 或 CLA 对象的有效边界绘图_weights
- 权重条形图
提示
要保存绘图,请将 filename="somefile.png"
作为关键字参数传递给任何绘图函数。 这个(以及其他一些 kwargs)在返回之前通过 _plot_io()
传递。
可选择将图形保存到文件的辅助方法。
Parameters:
- filename ( str, optional ) – 要保存到的文件的名称,默认为 None (不保存)
- dpi ( int(50-500之间)* ) – 要保存或绘制的图形的 dpi,默认为 300
- showfig ( bool, optional ) – 是否 plt.show() 图形,默认为 False
pypfopt.plotting.plot_covariance(cov_matrix, plot_correlation=False, show_tickers=True, **kwargs)
[来源] ¶
生成协方差(或相关)矩阵的基本图,给定协方差矩阵。
Parameters:
- cov_matrix ( pd.DataFrame 或者 np.ndarray ) – 协方差矩阵
- plot_correlation ( bool, optional ) – 是否绘制相关矩阵,默认为 False。
- show_tickers ( bool, optional ) – 是否使用股票代码作为标签(不建议用于大型投资组合),默认为 True
Returns: matplotlib 轴
Return type: matplotlib.axes 对象
pypfopt.plotting.plot_dendrogram(hrp, ax=None, show_tickers=True, **kwargs)
[来源] ¶
以树状图的形式绘制簇。
Parameters:
- hrp ( object ) – 已优化的 HRPpt 对象。
- show_tickers ( bool, optional ) – 是否使用股票代码作为标签(不建议用于大型投资组合),默认为 True
- filename ( str, optional ) – 要保存到的文件的名称,默认为 None (不保存)
- showfig ( bool, optional ) – 是否 plt.show() 图形,默认为 False
Returns: matplotlib 轴
Return type: matplotlib.axes 对象
pypfopt.plotting.plot_efficient_frontier(opt, ef_param='return', ef_param_range=None, points=100, ax=None, show_assets=True, show_tickers=False, **kwargs)
[来源] ¶
基于 CLA 或 EfficientFrontier 对象绘制有效边界。
Parameters:
- opt( EfficientFrontier 或者 CLA ) – 在优化目标之前实例化的优化器对象
- ef_param ( str, {"utility", "risk", "return"} 其中之一) – [EfficientFrontier] 是否使用效用、风险或回报范围。默认为 “return”。
- ef_param_range ( np.array 或者 list(推荐使用 np.arange 或者 np.linspace)* ) – ef_param 的参数值范围。如果没有,自动计算从最小到最大返回的范围。
- points ( int, optional ) – 要绘制的点数,默认为 100。如果显式提供 ef_param_range,则会覆盖该值。
- show_assets ( bool, optional ) – 我们是否也应该绘制资产风险/回报,默认为 True
- show_tickers ( bool, optional ) – 是否应该用其股票代码注释每个资产,默认为 False
- filename ( str, optional ) – 要保存到的文件的名称,默认为 None (不保存)
- showfig ( bool, optional ) – 是否 plt.show() 图形,默认为 False
Returns: matplotlib 轴
Return type: matplotlib.axes 对象
pypfopt.plotting.plot_weights(weights, ax=None, **kwargs)
[来源] ¶
将投资组合权重绘制为水平条形图
Parameters:
- weights ( {ticker: weight} dict ) – 任何 PyPortfolioOpt 优化器输出的权重
- ax ( matplotlib.axes ) – 绘制到的轴,可选
Returns: matplotlib 轴
Return type: matplotlib.axes