首页 > 解决方案 > 使用二进制权重 (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)

标签: pythonpandasstatisticsfinancequantitative-finance

解决方案


然后你应该用它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%。但是,您应该从上面得到这个想法。


推荐阅读