improves risk_free_rate usability #238

This commit is contained in:
robertmartin8
2021-01-22 14:38:57 +08:00
parent bd60134fa7
commit db9dd375b5
3 changed files with 17 additions and 2 deletions

View File

@@ -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 = [

View File

@@ -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,

View File

@@ -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()