我已经开始使用 skfolio,使用 skfolio.datasets (sp500) 中给出的投资组合。我的想法是使用 sp500 作为我的宇宙来运行一个由同等权重的股票组成的投资组合。为此,我执行以下操作:
import skfolio
from skfolio.datasets import load_sp500_dataset
from skfolio.preprocessing import prices_to_returns
prices=load_sp500_dataset()
X=prices_to_returns(prices)
X_train, X_test = train_test_split(X, test_size=0.33, shuffle=False)
model = skfolio.optimization.naive.EqualWeighted()
model.fit(X_train)
portfolio = model.predict(X_test)
print(portfolio.annualized_sharpe_ratio)
print(portfolio.summary())
所以这里我使用 SP500 指数的数据并应用等权重投资组合模型。它返回投资组合的各种统计数据(偏度、峰度……),我可以用
绘制累积收益portfolio.plot_cumulative_returns()
我对上述内容有一些疑问/问题,因为似乎很多参数已“默认”定义。我相信它们都可能与某种 set_parameters 函数相关(?)。特别是:
我是 Skfolio 的核心开发人员之一。
您的资产数量和开始周期与您的输入相关联
X
,这是您的资产回报时间序列。
在您的示例中,您使用 EqualWeighted 分配模型。该模型将 1/20 的权重分配给您输入回报中的 20 种资产
X
。要更改它,您需要通过删除列(资产)或行(日期)来修改输入。
当使用其他模型时,例如MeanRisk,由于这些模型支持权重和基数约束,因此您可以通过模型参数控制投资资产的数量:MeanRisk Cardinality Constraints。
另一种选择是通过 预选变压器:预选变压器。
要使用复合回报进行投资组合评估(例如,绘图、风险统计等),您需要设置
compounded=True
:
from skfolio.optimization import EqualWeighted
from skfolio.datasets import load_sp500_dataset
from skfolio.preprocessing import prices_to_returns
prices = load_sp500_dataset()
X = prices_to_returns(prices)
# Without compounded returns
model = EqualWeighted()
ptf = model.fit_predict(X)
ptf.cumulative_returns_df.tail()
# With compounded returns
model = EqualWeighted(portfolio_params=dict(compounded=True))
ptf = model.fit_predict(X)
ptf.cumulative_returns_df.tail()
就再平衡而言,有两个不同的概念,有时都称为“再平衡”:
模型改装
这会改变目标权重,例如,每月重新拟合 MVO(均值方差优化)模型。
使用交叉验证器执行模型重新拟合:交叉验证器示例。
重新平衡目标权重
这是指在两次重新安装之间进行重新平衡,以避免随着资产价格差异而出现权重漂移。
第二种类型的重新平衡以与输入数据相同的频率发生,因此在您的示例中每天都会发生。
原因是 Skfolio 中的投资组合模型和交叉验证器用于模型验证、选择和参数调整。因此,模型评估对于优化过程必须是“同质的”。例如,如果您使用具有 10% 波动性约束的 MeanRisk 模型 调用
model.fit_predict(X)
,则同一训练集 X
上的预测投资组合也必须具有 10% 的波动性。否则,你以后在模型选择、评估和比较方面都会产生问题。从数学上讲,这意味着在重新拟合之间,投资组合收益计算为收益和权重的点积。
更多详细信息请参见此处:
投资组合模型补充说明如果您还有其他问题,请告诉我!