mirror of
https://github.com/robertmartin8/PyPortfolioOpt.git
synced 2022-11-27 18:02:41 +03:00
improves risk_free_rate usability #238
This commit is contained in:
@@ -45,6 +45,7 @@ class BaseOptimizer:
|
||||
self.tickers = list(range(n_assets))
|
||||
else:
|
||||
self.tickers = tickers
|
||||
self._risk_free_rate = None
|
||||
# Outputs
|
||||
self.weights = None
|
||||
|
||||
@@ -358,8 +359,8 @@ class BaseConvexOptimizer(BaseOptimizer):
|
||||
):
|
||||
"""
|
||||
Optimise some objective function using the scipy backend. This can
|
||||
support nonconvex objectives and nonlinear constraints, but often gets stuck
|
||||
at local minima. This method is not recommended – caveat emptor. Example::
|
||||
support nonconvex objectives and nonlinear constraints, but may get stuck
|
||||
at local minima. Example::
|
||||
|
||||
# Market-neutral efficient risk
|
||||
constraints = [
|
||||
|
||||
@@ -191,6 +191,7 @@ class EfficientFrontier(base_optimizer.BaseConvexOptimizer):
|
||||
"""
|
||||
if not isinstance(risk_free_rate, (int, float)):
|
||||
raise ValueError("risk_free_rate should be numeric")
|
||||
self._risk_free_rate = risk_free_rate
|
||||
|
||||
# max_sharpe requires us to make a variable transformation.
|
||||
# Here we treat w as the transformed variable.
|
||||
@@ -379,6 +380,9 @@ class EfficientFrontier(base_optimizer.BaseConvexOptimizer):
|
||||
:return: expected return, volatility, Sharpe ratio.
|
||||
:rtype: (float, float, float)
|
||||
"""
|
||||
if self._risk_free_rate is not None:
|
||||
risk_free_rate = self._risk_free_rate
|
||||
|
||||
return base_optimizer.portfolio_performance(
|
||||
self.weights,
|
||||
self.expected_returns,
|
||||
|
||||
@@ -502,6 +502,16 @@ def test_max_sharpe_risk_free_rate():
|
||||
assert new_sharpe >= initial_sharpe
|
||||
|
||||
|
||||
def test_max_sharpe_risk_free_portfolio_performance():
|
||||
# Issue #238 - portfolio perf should use the same rf as
|
||||
# max_sharpe
|
||||
ef = setup_efficient_frontier()
|
||||
ef.max_sharpe(risk_free_rate=0.05)
|
||||
res = ef.portfolio_performance()
|
||||
res2 = ef.portfolio_performance(risk_free_rate=0.05)
|
||||
np.testing.assert_allclose(res, res2)
|
||||
|
||||
|
||||
def test_min_vol_pair_constraint():
|
||||
ef = setup_efficient_frontier()
|
||||
ef.min_volatility()
|
||||
|
||||
Reference in New Issue
Block a user