投资组合#
Portfolio 类实现了一大套用于投资组合分析的属性和方法。它们由 predict 方法返回,属于 投资组合优化。
它们也是数据容器(调用
np.asarray(portfolio) 返回投资组合收益)使它们与
sklearn.model_selection 工具兼容。
他们使用 slots 来提高性能。
基础投资组合#
BasePortfolio 直接将投资组合收益数组作为输入,并实现了一组大量的属性和方法。
示例:
import datetime as dt
from skfolio import BasePortfolio
portfolio = BasePortfolio(
returns=[0.002, -0.001, 0.0015],
observations=[dt.date(2022, 1, 1), dt.date(2022, 1, 2), dt.date(2022, 1, 3)],
)
属性和方法#
提供了超过40个属性和方法,包括所有的
measures(均值、方差、夏普比率、条件在险价值、条件下行风险、回撤等)。只有在请求时计算属性,然后将其缓存到slots中,以提高性能。
示例:
from skfolio import RatioMeasure
# attributes
portfolio.mean
portfolio.variance
portfolio.sharpe_ratio
portfolio.sortino_ratio
portfolio.cdar
portfolio.max_drawdown
portfolio.cumulative_returns
portfolio.drawdowns
portfolio.returns_df
portfolio.cumulative_returns_df
# methods
portfolio.summary()
portfolio.dominates(other_portfolio)
portfolio.rolling_measure(measure=RatioMeasure.SHARPE_RATIO)
# plots
portfolio.plot_cumulative_returns()
portfolio.plot_rolling_measure(measure=RatioMeasure.SHARPE_RATIO)
它也是一个数组容器:
np.asarray(portfolio)
>>> array([ 0.002 , -0.001 , 0.0015])
最后,投资组合可以使用支配关系进行比较:
portfolio == other_portfolio
portfolio >= other_portfolio
portfolio > other_portfolio
主导中使用的度量通过 fitness_measures 进行控制。默认使用列表 [PerfMeasure.MEAN, RiskMeasure.VARIANCE]。
投资组合#
Portfolio 继承自 BasePortfolio。投资组合的收益是资产权重与资产收益的点积减去成本:
\[r_p = R \cdot w^{T} - c^{T} \cdot | w - w_{prev} | - f^{T} \cdot w\]
其中 \(r_p\) 是投资组合收益的向量, \(R\) 是资产收益的矩阵, \(w\) 是资产权重的向量, \(c\) 是资产交易成本的向量, \(f\) 是资产管理费用的向量, \(w_{prev}\) 是资产之前的权重。
警告
投资组合的Portfolio构造对于一致性分析的凸优化问题是同质的。重要的是要注意,由于资产价格变动,这种投资组合构造无法完全复制。唯一能够完全复制的情况是以零成本进行周期性再平衡。在实践中,投资组合的再平衡频率足够高,因此这类权重漂移在模型分析和选择中变得微不足道。在交易之前,应进行全面的可复制性分析,这是留给投资者的另一个主题。
示例:
from skfolio import Portfolio
X = [
[0.003, -0.001],
[-0.001, 0.002],
[0.0015, 0.004],
]
weights = [0.6, 0.4]
portfolio = Portfolio(X=X, weights=weights)
print(portfolio.returns)
>>> array([0.0014, 0.0002, 0.0025])
X 可以是任何数据容器,包括 numpy 数组和 pandas DataFrame:
import datetime as dt
import pandas as pd
X = pd.DataFrame(
data=[[0.003, -0.001], [-0.001, 0.002], [0.0015, 0.004]],
columns=["Asset A", "Asset B"],
index=[dt.date(2022, 1, 1), dt.date(2022, 1, 2), dt.date(2022, 1, 3)],
)
print(X)
>>>
Asset A Asset B
2022-01-01 0.0030 -0.001
2022-01-02 -0.0010 0.002
2022-01-03 0.0015 0.004
weights = [0.6, 0.4]
portfolio = Portfolio(X=X, weights=weights, name="my_portfolio")
print(portfolio.returns)
>>> array([0.0014, 0.0002, 0.0025])
属性和方法#
Portfolio 继承了所有来自 BasePortfolio 的属性和方法。除此之外,它还实现了与权重相关的方法:
from skfolio import RatioMeasure
portfolio.contribution(measure=RatioMeasure.ANNUALIZED_SHARPE_RATIO)
>>> array([-3.04203502, 3.04203503])
portfolio.composition
>>>
my_portfolio
asset
Asset A 0.6
Asset B 0.4
portfolio.get_weight("Asset A")
>>> 0.6
# Plots
portfolio.plot_contribution()
portfolio.plot_composition()
多期投资组合#
MultiPeriodPortfolio 继承自 BasePortfolio,由一个
Portfolio 列表组成。多期投资组合的收益是其所有基础
Portfolio 收益的总和。
一个 MultiPeriodPortfolio 是由 cross_val_predict 返回的。
例如,调用 cross_val_predict 与 WalkForward
将返回一个 MultiPeriodPortfolio,由多个测试 Portfolio 组成,
每个对应于一个训练/测试折叠。
from skfolio import MultiPeriodPortfolio
portfolio = MultiPeriodPortfolio(portfolios=[ptf1, ptf2, ptf3])