python - 使用二进制权重 (0,1) 和权重总和 (w =10) 约束的 pyportfolioopt python 库进行夏普比率优化
问题描述
import pandas as pd
from pypfopt.efficient_frontier import EfficientFrontier
from pypfopt import risk_models
from pypfopt import expected_returns
# Read in price data
df = pd.read_csv("tests/resources/stock_prices.csv", parse_dates=True, index_col="date")
# Calculate expected returns and sample covariance
mu = expected_returns.mean_historical_return(df)
S = risk_models.sample_cov(df)
# Optimise for maximal Sharpe ratio
ef = EfficientFrontier(mu, S)
weights = ef.max_sharpe()
ef.portfolio_performance(verbose=True)
我想将权重仅二进制(0,1)和权重总和约束添加到任何变量(比如=10)
解决方案
然后你应该用它objective_functions
来替换其余的:
# Optimize for maximal Sharpe ratio
ef = EfficientFrontier(mu, S)
weights = ef.nonconvex_objective(objective_functions.sharpe_ratio,
objective_args=(ef.expected_returns, ef.cov_matrix), constraints=[
{"type": "eq", "fun": lambda w: np.sum(w) - 10}, # weight sum to 10
]
)
权重只会是 (0,1) 之间的一个数字,但权重总和限制为 10 通常是个坏主意,因为这仅意味着您将权重投资到 1000%。但是,您应该从上面得到这个想法。
推荐阅读
- c++ - 如何防止 libserial 吞噬来自串行设备的 0x0A、0x0D 或 0x0F 等字符?
- docker - 使用 docker 中的桥接网络将服务绑定到特定接口时连接被拒绝
- r - 在 R 中使用 tidyverse 添加新列?
- django - Django:TypeError at / context 必须是字典而不是元组
- android - 使用 Textview 和 Spinner 和斜线进行布局
- r - R 数据框单元格包含数据框/小标题 - 如何访问或可视化?
- javascript - 检测用户是否验证了他们的电子邮件?
- windows - Windows 10 的 MFT 中如何处理 DOS 文件名?
- elasticsearch - 如何使用 ApolloQuery Vue 组件查询 Elasticsearch 端点?
- amazon-web-services - 我何时需要将 Kinesis Data Streams 与 Kinesis Firehose 结合使用?