投资组合#

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_predictWalkForward 将返回一个 MultiPeriodPortfolio,由多个测试 Portfolio 组成, 每个对应于一个训练/测试折叠。

from skfolio import MultiPeriodPortfolio

portfolio = MultiPeriodPortfolio(portfolios=[ptf1, ptf2, ptf3])