skfolio.optimization.NestedClustersOptimization#

class skfolio.optimization.NestedClustersOptimization(inner_estimator=None, outer_estimator=None, distance_estimator=None, clustering_estimator=None, cv=None, quantile=0.5, quantile_measure=Sharpe Ratio, n_jobs=None, verbose=0, portfolio_params=None)[来源]#

嵌套聚类优化估计器。

嵌套集群优化(NCO)是一种由Marcos Lopez de Prado开发的投资组合优化方法。

它使用距离矩阵通过聚类算法(层次树聚类、KMeans等)计算聚类。对于每个聚类,内部聚类权重是通过使用整个训练数据在每个聚类上拟合内部估计器计算的。然后通过使用内部估计器的交叉验证的样本外估计训练外部估计器来计算外部聚类权重。最后,最终的资产权重是内部权重和外部权重的点积。

注意

原始论文使用 KMeans 作为聚类算法,最小方差作为内估计器,等权重作为外估计器。在这里,我们将其推广到所有 sklearnskfolio 聚类算法(HierarchicalClustering, KMeans 等),所有投资组合优化(均值-方差,HRP 等)和风险度量(方差,CVaR 等)。为了避免外估计器的数据泄露,我们使用样本外估计来拟合外部估计器。

Parameters:
inner_estimatorBaseOptimization, optional

优化估计器用于估计内权重(也称为内部权重),即每个集群内的资产权重。默认 None 是使用 MeanRisk

outer_estimatorBaseOptimization, optional

优化估计器 用于估计外部权重(也称为内部权重),这些权重应用于每个聚类。 默认 None 是使用 MeanRisk

distance_estimatorBaseDistance, optional

距离估计器。 距离估计器用于估计代码依赖性和计算连接矩阵所需的距离矩阵。 默认 (None) 是使用 PearsonDistance

clustering_estimatorBaseEstimator, optional

聚类估计器。在拟合后必须公开一个 labels_ 属性。聚类估计器用于基于距离矩阵计算资产的聚类。默认值 (None) 是使用 HierarchicalClustering

注意

来自 sklearn 的聚类估计器也受到支持。例如: sklearn.cluster.KMeans.

cvBaseCrossValidator | BaseCombinatorialCV | int | “ignore”, optional

确定交叉验证分割策略。默认(None)是使用5折交叉验证KFold()。它应用于内部估计器。它的样本外输出用于训练外部估计器。cv的可能输入为:

  • “ignore”: 不使用交叉验证(请注意,这可能会导致数据泄漏,风险很高,容易过拟合)

  • 整数,指定在 sklearn.model_selection.KFold 中的折叠数量

  • 一个用于交叉验证生成器的对象

  • 生成训练和测试数据集的可迭代对象

  • A CombinatorialPurgedCV

如果使用 CombinatorialCV 交叉验证器,则每个集群的样本外输出将变成多个路径的集合,而不是单一路径。在这个路径集合中选择的样本外路径是根据 quantilequantile_measure 参数来选择的。

n_jobsint, optional

并行运行所有 estimatorsfit 的作业数量。值 -1 表示使用所有处理器。默认值 (None) 在 joblib.parallel_backend 上下文中表示 1。

quantilefloat, default=0.5

对于给定度量的分位数 (quantile_measure),当 cv 参数为 CombinatorialPurgedCV交叉验证器时,超出样本内估计器路径的分位数。 默认值为 0.5,对应于具有中位数度量的路径。 (见 cv

quantile_measurePerfMeasure or RatioMeasure or RiskMeasure or ExtraRiskMeasure, default=RatioMeasure.SHARPE_RATIO

用于分位数路径选择的度量(见 quantilecv)。默认值是 RatioMeasure.SHARPE_RATIO

verboseint, default=0

详细程度。默认值是 0

portfolio_paramsdict, optional

传递给通过 predictscore 方法评估的投资组合的投资组合参数。如果未提供,name 会从优化模型中复制并系统地传递给投资组合。

Attributes:
weights_ndarray of shape (n_assets,)

资产的权重。

distance_estimator_BaseDistance

拟合的 distance_estimator

inner_estimators_list[BaseOptimization]

拟合的 inner_estimator 列表。每个集群一个,适用于包含多个资产的集群。

outer_estimator_BaseOptimization

拟合的 outer_estimator.

clustering_estimator_BaseEstimator

拟合的 clustering_estimator

n_features_in_int

fit期间看到的资产数量。

feature_names_in_ndarray of shape (n_features_in_,)

fit期间看到的资产名称。只有当X具有所有为字符串的资产名称时才定义。

参考文献

[1]

“建立超越样本外的多元化投资组合”, 投资组合管理期刊, 马尔科斯·洛佩斯·德·普拉多 (2016)

[2]

“有效前沿的稳健估计器”, SSRN电子期刊, Marcos López de Prado (2019)

[3]

“资产管理的机器学习”, 定量金融中的元素。剑桥大学出版社, 马尔科斯·洛佩斯·德·普拉多(2020)

方法

fit(X[, y])

拟合嵌套集群优化估计器。

fit_predict(X)

X 执行 fit 操作,并返回基于拟合的 weightsPortfolioPopulation 的预测结果。

get_metadata_routing()

获取此对象的元数据路由。

get_params([deep])

获取此估计器的参数。

predict(X)

根据拟合的权重预测PortfolioPopulationX上的Portfolio

score(X[, y])

预测分数。

set_params(**params)

设置此估计器的参数。

fit(X, y=None, **fit_params)[来源]#

拟合嵌套聚类优化估计器。

Parameters:
Xarray-like of shape (n_observations, n_assets)

资产的价格收益。

yarray-like of shape (n_observations, n_targets), optional

因子或目标基准的价格回报。 默认值是 None

**fit_paramsdict

传递给基础估计器的参数。只有在 enable_metadata_routing=True 的情况下可用,您可以通过使用 sklearn.set_config(enable_metadata_routing=True) 来设置。详情请参见 元数据路由用户指南

Returns:
selfNestedClustersOptimization

拟合的估计器。

fit_predict(X)#

X执行fit并根据拟合的weights返回预测的PortfolioPopulationPortfolioX上的值。对于因子模型,分别使用fit(X, y)然后predict(X)

Parameters:
Xarray-like of shape (n_observations, n_assets)

资产的价格收益。

Returns:
predictionPortfolio | Population

基于拟合的 weights 估计的 PortfolioPopulationPortfolioX 上。

get_metadata_routing()[来源]#

获取这个对象的元数据路由。

请查看 用户指南 了解路由机制是如何工作的。

Returns:
routingMetadataRequest

一个 MetadataRequest 封装路由信息。

get_params(deep=True)#

获取此估计器的参数。

Parameters:
deepbool, default=True

如果为真,将返回此估计器及其包含的子对象的参数,这些子对象也是估计器。

Returns:
paramsdict

参数名称映射到它们的值。

predict(X)#

根据拟合的权重预测PortfolioPopulationX上的Portfolio

优化估计器可以返回一个一维或二维数组的 weights。对于一维数组,预测返回一个 Portfolio。对于二维数组,预测返回一个 PopulationPortfolio

如果 name 在投资组合参数中没有提供,我们将使用估计器名称的前 500 个字符。

Parameters:
Xarray-like of shape (n_observations, n_assets)

资产的价格收益。

Returns:
predictionPortfolio | Population

基于拟合的 weights 估计的 PortfolioPopulationPortfolioX 上。

score(X, y=None)#

预测分数。 如果预测是单个 Portfolio,则分数是夏普比率。 如果预测是一组 PopulationPortfolio,则分数是该组中所有投资组合夏普比率的平均值。

Parameters:
Xarray-like of shape (n_observations, n_assets)

资产的价格收益。

yIgnored

未使用,仅为了遵循API一致性而存在。

Returns:
scorefloat

如果预测是单个 Portfolio,则投资组合的夏普比率为;如果预测是 PortfolioPopulation 的所有投资组合夏普比率的平均值。

set_params(**params)#

设置该估计器的参数。

该方法适用于简单估计器以及嵌套对象(如 Pipeline)。后者具有 <component>__<parameter> 形式的参数,因此可以更新嵌套对象的每个组件。

Parameters:
**paramsdict

估计器参数。

Returns:
selfestimator instance

估计器实例。