skfolio.optimization.最大多样化#
- class skfolio.optimization.MaximumDiversification(prior_estimator=None, min_weights=0.0, max_weights=1.0, budget=1.0, min_budget=None, max_budget=None, max_short=None, max_long=None, transaction_costs=0.0, management_fees=0.0, previous_weights=None, groups=None, linear_constraints=None, left_inequality=None, right_inequality=None, l1_coef=0.0, l2_coef=0.0, risk_free_rate=0.0, min_return=None, max_tracking_error=None, max_turnover=None, solver='CLARABEL', solver_params=None, scale_objective=None, scale_constraints=None, save_problem=False, raise_on_failure=True, add_objective=None, add_constraints=None, portfolio_params=None)[来源]#
最大化分散化优化估计器。
最大化多样化比率,即加权波动率与总波动率的比率。
这是
MeanRisk估计量的一个特例,其中目标函数的预期收益被加权波动性替代。- Parameters:
- prior_estimatorBasePrior, optional
先验估计器. 先验估计器用于估计
PriorModel包含资产预期收益、协方差矩阵、收益和协方差的Cholesky分解的估计。 默认值(None)是使用EmpiricalPrior。- min_weightsfloat | dict[str, float] | array-like of shape (n_assets, ) | None, default=0.0
最小资产权重(权重下限)。 如果提供了浮动值,则应用于每个资产。
None等价于-np.Inf(没有下限)。 如果提供了字典,其(键/值)对必须是 (资产名称/资产最小权重),输入X的fit方法必须是一个包含资产名称的 DataFrame。 当使用字典时,未提供的资产值将被分配最小权重0.0。 默认值是0.0(不允许做空)。示例:
min_weights = 0–> 仅限于多头投资组合(不进行卖空)。min_weights = None–> 没有下界(与-np.Inf相同)。min_weights = -2–> 每个权重必须高于 -200%。min_weights = {"SX5E": 0, "SPX": -2}min_weights = [0, -2]
- max_weightsfloat | dict[str, float] | array-like of shape (n_assets, ) | None, default=1.0
最大资产权重(权重上限)。
如果提供一个浮点数,它会应用于每个资产。None相当于+np.Inf(没有上限)。
如果提供一个字典,它的(键/值)对必须是(资产名称/资产最大权重),而输入X的fit方法必须是一个包含资产名称的列的 DataFrame。
当使用字典时,未提供的资产值被分配最小权重1.0。
默认值是1.0(每个资产低于 100%。)示例:
max_weights = 0–> 不持有多头头寸(仅空头投资组合)。max_weights = None–> 没有上限。max_weights = 2–> 每个权重必须低于200%。max_weights = {"SX5E": 1, "SPX": 2}max_weights = [1, 2]
- budgetfloat | None, default=1.0
投资预算。它是多头和空头头寸的总和(所有权重的总和)。
None意味着没有预算限制。 默认值是1.0(完全投资的投资组合)。示例:
budget = 1–> 完全投资组合。budget = 0–> 市场中性投资组合。budget = None–> 对权重之和没有限制。
- min_budgetfloat, optional
最低预算。它是多头和空头头寸总和的下限 (所有权重的总和)。如果提供,您必须设置
budget=None。 默认值 (None) 意味着没有最低预算限制。- max_budgetfloat, optional
最大预算。它是多头和空头头寸之和的上限(所有权重之和)。如果提供,您必须设置
budget=None。默认值 (None) 意味着没有最大预算约束。- max_shortfloat, optional
最大空头头寸。空头头寸定义为负权重的总和(按绝对值计算)。 默认值(
None)表示没有最大空头头寸。- max_longfloat, optional
最大多头头寸。多头头寸被定义为正权重的总和。 默认值(
None)表示没有最大多头头寸。- transaction_costsfloat | dict[str, float] | array-like of shape (n_assets, ), default=0.0
资产的交易成本。它用于在优化问题中添加线性交易成本:
\[total\_cost = \sum_{i=1}^{N} c_{i} \times |w_{i} - w\_prev_{i}|\]其中 \(c_{i}\) 是资产 i 的交易成本, \(w_{i}\) 是它的权重, \(w\_prev_{i}\) 是它的前一个权重(在
previous_weights中定义)。浮动 \(total\_cost\) 影响着投资组合的期望回报率优化:\[expected\_return = \mu^{T} \cdot w - total\_cost\]其中 \(\mu\) 是资产预期收益的向量,而 \(w\) 是资产权重的向量。
如果提供了一个浮动值,它将应用于每个资产。 如果提供了一个字典,它的(键/值)对必须是 (资产名称/资产成本),输入
X的fit方法必须是一个包含资产名称的DataFrame。 默认值为0.0。警告
根据上述公式,交易成本的周期性需要与\(\mu\)的周期性一致。例如,如果输入
X由每日收益组成,则transaction_costs需要以每日成本表示。 (请参见交易成本)- management_feesfloat | dict[str, float] | array-like of shape (n_assets, ), default=0.0
资产的管理费用。它用于将线性管理费用添加到优化问题中:
\[total\_fee = \sum_{i=1}^{N} f_{i} \times w_{i}\]其中 \(f_{i}\) 是资产 i 的管理费用,\(w_{i}\) 是其权重。浮动 \(total\_fee\) 在优化中影响投资组合的预期收益:
\[expected\_return = \mu^{T} \cdot w - total\_fee\]其中 \(\mu\) 是资产预期收益的向量,\(w\) 是资产权重的向量。
如果提供了浮点数,它将应用于每个资产。 如果提供了字典,则其(键/值)对必须是 (资产名称/资产费用),并且输入
X的fit方法必须是包含资产名称的列的 DataFrame。 默认值为0.0。警告
根据上述公式,管理费用的周期性需要与\(\mu\)的周期性一致。例如,如果输入的
X由日常收益组成,则management_fees需要以日常费用的形式表示。注意
另一种方法是直接对输入
X影响管理费用,以表示扣除费用后的回报。然而,当使用例如收缩估计量来估计 \(\mu\) 参数时,这种方法会将一个确定值与一个不确定值混合,从而导致管理费用中的不必要偏差。- previous_weightsfloat | dict[str, float] | array-like of shape (n_assets, ), optional
资产的先前权重。先前权重用于计算投资组合成本和投资组合周转率。如果提供一个浮动值,它将应用于每个资产。如果提供一个字典,它的(键/值)对必须是(资产名称/资产先前权重),并且输入
X的fit方法必须是一个包含资产名称的 DataFrame 列。默认值 (None) 意味着没有先前权重。- l1_coeffloat, default=0.0
L1 正则化系数。 它用于通过 L1 范数惩罚目标函数:
\[l1\_coef \times \Vert w \Vert_{1} = l1\_coef \times \sum_{i=1}^{N} |w_{i}|\]增加这个系数将减少非零权重的数量(基数)。这倾向于增加鲁棒性(样本外稳定性),但会减少多样化。默认值是
0.0。- l2_coeffloat, default=0.0
L2正则化系数。 它用于通过L2范数对目标函数进行惩罚:
\[l2\_coef \times \Vert w \Vert_{2}^{2} = l2\_coef \times \sum_{i=1}^{N} w_{i}^2\]它倾向于增加稳健性(样本外稳定性)。
默认值是0.0。- linear_constraintsarray-like of shape (n_constraints,), optional
线性约束。 线性约束必须符合以下任意模式:
“2.5 * ref1 + 0.10 * ref2 + 0.0013 <= 2.5 * ref3”
“ref1 >= 2.9 * ref2”
“ref1 == ref2”
“ref1 >= ref1”
通过“ref1”、“ref2”……在参数
groups中提供的资产名称或组名称。 如果输入X的fit方法是一个具有这些资产名称的列的 DataFrame,则可以不需要groups来引用资产名称。示例:
“SPX >= 0.10” –> SPX 权重必须大于 10% (请注意,您也可以使用
min_weights)“SX5E + TLT >= 0.2” –> SX5E和TLT权重的总和必须大于20%
“US == 0.7” –> 所有美国权重的总和必须等于70%
“股权 == 3 * 债券” –> 所有股权权重的总和必须等于所有债券权重的总和的3倍。
“2*SPX + 3*Europe <= Bond + 0.05” –> 混合资产和组约束
- groupsdict[str, list[str]] or array-like of shape (n_groups, n_assets), optional
在
linear_constraints中引用的资产组。如果提供了字典,则其(键/值)对必须是(资产名称/资产组),并且fit方法的输入X必须是一个数据框,其中列包含资产名称。示例:
groups = {“SX5E”: [“股票”, “欧洲”], “SPX”: [“股票”, “美国”], “TLT”: [“债券”, “美国”]}
groups = [[“股权”, “股权”, “债券”], [“欧洲”, “美国”, “美国”]]
- left_inequalityarray-like of shape (n_constraints, n_assets), optional
线性约束的左侧不等式矩阵 \(A\) \(A \cdot w \leq b\)。
- right_inequalityarray-like of shape (n_constraints, ), optional
线性约束的右侧不等式向量 \(b\) \(A \cdot w \leq b\)。
- risk_free_ratefloat, default=0.0
无风险利率。 默认值为
0.0。- max_tracking_errorfloat, optional
跟踪误差的上限约束。跟踪误差被定义为投资组合回报与目标回报的RMSE(均方根误差)。如果
max_tracking_error被提供,目标回报y必须在fit方法中提供。- max_turnoverfloat, optional
周转率的上限约束。 周转率被定义为投资组合权重与
previous_weights之间的绝对差。请注意,控制周转率的另一种方法是使用transaction_costs参数。- min_returnfloat | array-like of shape (n_optimization), optional
期望回报的下界约束。
- min_returnfloat | array-like of shape (n_optimization), optional
期望回报的下界约束。
- add_objectiveCallable[[cp.Variable], cp.Expression], optional
向现有目标表达式添加自定义目标。 它是一个必须以权重
w作为参数并返回 CVXPY 表达式的函数。- add_constraintsCallable[[cp.Variable], cp.Expression|list[cp.Expression]], optional
向现有约束添加自定义约束或约束列表。 它是一个必须以权重
w作为参数的函数,并返回一个 CVPXY 表达式或一个 CVPXY 表达式的列表。- solverstr, default=”CLARABEL”
要使用的求解器。默认是“CLARABEL”,它是用Rust编写的,具有比ECOS和SCS更好的数值稳定性和性能。Cvxpy将在未来版本中将其默认求解器“ECOS”替换为“CLARABEL”。有关可用求解器的更多详细信息,请查阅CVXPY文档:https://www.cvxpy.org/tutorial/advanced/index.html#choosing-a-solver
- solver_paramsdict, optional
求解器参数。例如,
solver_params=dict(verbose=True)。默认值(None) 是使用{"tol_gap_abs": 1e-9, "tol_gap_rel": 1e-9}作为求解器“CLARABEL”的参数,其他情况使用CVXPY的默认值。有关求解器参数的更多详细信息,请查看CVXPY文档:https://www.cvxpy.org/tutorial/advanced/index.html#setting-solver-options- scale_objectivefloat, optional
通过此值缩放每个目标元素。
它可以用于在特定情况下提高优化精度。
默认值(None)根据问题设置。- scale_constraintsfloat, optional
通过此值缩放每个约束元素。 它可以在特定情况下用于提高优化精度。 默认值(
None)根据问题设置。- save_problembool, default=False
如果将此设置为 True,CVXPY 问题将保存在
problem_中。 默认值为False。- raise_on_failurebool, default=True
如果将此设置为 True,当优化失败时会引发错误,否则会以警告形式通过。
- portfolio_paramsdict, optional
传递给通过
predict和score方法评估的投资组合的投资组合参数。如果未提供,name、transaction_costs、management_fees、previous_weights和risk_free_rate将从优化模型中复制并传递给投资组合。
- Attributes:
- weights_ndarray of shape (n_assets,) or (n_optimizations, n_assets)
资产的权重。
- problem_values_dict[str, float] | list[dict[str, float]] of size n_optimizations
从CVXPY问题中检索的表达式值。
- prior_estimator_BasePrior
调整过的
prior_estimator.- problem_: cvxpy.Problem
用于优化的CVXPY问题。只有当
save_problem被设置为True时。- n_features_in_int
在
fit期间看到的资产数量。- feature_names_in_ndarray of shape (
n_features_in_,) 在
fit期间看到的资产名称。只有当X具有所有为字符串的资产名称时才定义。
方法
fit(X[, y])拟合最大多样性优化估计器。
fit_predict(X)对
X执行fit操作,并返回基于拟合的weights的Portfolio或Population的预测结果。获取此对象的元数据路由。
get_params([deep])获取此估计器的参数。
predict(X)根据拟合的权重预测
Portfolio或Population在X上的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:
- selfMaximumDiversification
拟合的估计器。
- fit_predict(X)#
对
X执行fit并根据拟合的weights返回预测的Portfolio或Population的Portfolio在X上的值。对于因子模型,分别使用fit(X, y)然后predict(X)。- Parameters:
- Xarray-like of shape (n_observations, n_assets)
资产的价格收益。
- Returns:
- predictionPortfolio | Population
基于拟合的
weights估计的Portfolio或Population的Portfolio在X上。
- get_metadata_routing()#
获取这个对象的元数据路由。
请查看 用户指南 了解路由机制是如何工作的。
- Returns:
- routingMetadataRequest
一个
MetadataRequest封装路由信息。
- get_params(deep=True)#
获取此估计器的参数。
- Parameters:
- deepbool, default=True
如果为真,将返回此估计器及其包含的子对象的参数,这些子对象也是估计器。
- Returns:
- paramsdict
参数名称映射到它们的值。
- predict(X)#
根据拟合的权重预测
Portfolio或Population在X上的Portfolio。优化估计器可以返回一个一维或二维数组的
weights。对于一维数组,预测返回一个Portfolio。对于二维数组,预测返回一个Population的Portfolio。如果
name在投资组合参数中没有提供,我们将使用估计器名称的前 500 个字符。- Parameters:
- Xarray-like of shape (n_observations, n_assets)
资产的价格收益。
- Returns:
- predictionPortfolio | Population
基于拟合的
weights估计的Portfolio或Population的Portfolio在X上。
- score(X, y=None)#
预测分数。 如果预测是单个
Portfolio,则分数是夏普比率。 如果预测是一组Population的Portfolio,则分数是该组中所有投资组合夏普比率的平均值。- Parameters:
- Xarray-like of shape (n_observations, n_assets)
资产的价格收益。
- yIgnored
未使用,仅为了遵循API一致性而存在。
- Returns:
- scorefloat
如果预测是单个
Portfolio,则投资组合的夏普比率为;如果预测是Portfolio的Population的所有投资组合夏普比率的平均值。
- set_params(**params)#
设置该估计器的参数。
该方法适用于简单估计器以及嵌套对象(如
Pipeline)。后者具有<component>__<parameter>形式的参数,因此可以更新嵌套对象的每个组件。- Parameters:
- **paramsdict
估计器参数。
- Returns:
- selfestimator instance
估计器实例。