跳转至

绘图

作者:Robert Andrew Martin

译者:片刻小哥哥

项目地址:https://www.dafeiyang.cn/finance/stock/tools/PyPortfolioOpt/Plotting

原始地址:https://pyportfolioopt.readthedocs.io/en/latest/Plotting.html

所有的优化函数都在 EfficientFrontier 产生单一的最优投资组合。 但是,您可能想要绘制整个有效边界。这个有效边界可以被认为是以几种不同的方式:

  1. 全部的集合 efficient_risk() 一系列目标风险的投资组合
  2. 全部的集合 efficient_return() 一系列目标回报的投资组合
  3. 全部的集合 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() 传递。

pypfopt.plotting._plot_io(**kwargs) [来源]

可选择将图形保存到文件的辅助方法。

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

显示权重的条形图



回到顶部