summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormontezdesousa <79287829+montezdesousa@users.noreply.github.com>2022-11-29 15:12:00 +0000
committerGitHub <noreply@github.com>2022-11-29 10:12:00 -0500
commit72aac683a128beb29d8139ab98a99a9818d05645 (patch)
treeae263c2730e7388384d5a6c2ae5b91e295445ee7
parent58fb984b70c814075c2f22717b40e447dbb757aa (diff)
Fix risk measure choices in SDK (#3630)
* remove hcp * add check for risk measure * linting
-rw-r--r--openbb_terminal/portfolio/portfolio_optimization/optimizer_helper.py23
-rw-r--r--openbb_terminal/portfolio/portfolio_optimization/optimizer_model.py6
-rw-r--r--openbb_terminal/portfolio/portfolio_optimization/po_model.py3
3 files changed, 30 insertions, 2 deletions
diff --git a/openbb_terminal/portfolio/portfolio_optimization/optimizer_helper.py b/openbb_terminal/portfolio/portfolio_optimization/optimizer_helper.py
index 9f5a502ed41..c97832ce3fb 100644
--- a/openbb_terminal/portfolio/portfolio_optimization/optimizer_helper.py
+++ b/openbb_terminal/portfolio/portfolio_optimization/optimizer_helper.py
@@ -4,6 +4,9 @@ __docformat__ = "numpy"
import argparse
import pandas as pd
+from openbb_terminal.portfolio.portfolio_optimization import statics
+from openbb_terminal.rich_config import console
+
# These are all the possible yfinance properties
valid_property_infos = [
"previousClose",
@@ -128,3 +131,23 @@ def dict_to_df(d: dict) -> pd.DataFrame:
df = pd.DataFrame.from_dict(data=d, orient="index", columns=["value"])
return df
+
+
+def validate_risk_measure(risk_measure: str, warning: bool = True) -> str:
+ """Check that the risk measure selected is valid
+
+ Parameters
+ ----------
+ risk_measure : str
+ Risk measure to check
+
+ Returns
+ -------
+ str
+ Validated risk measure
+ """
+ if risk_measure.lower() in statics.RISK_CHOICES:
+ return statics.RISK_CHOICES[risk_measure.lower()]
+ if warning:
+ console.print("[yellow]Risk measure not found. Using 'MV'.[/yellow]")
+ return "MV"
diff --git a/openbb_terminal/portfolio/portfolio_optimization/optimizer_model.py b/openbb_terminal/portfolio/portfolio_optimization/optimizer_model.py
index 282d267238d..f4a1ec0675d 100644
--- a/openbb_terminal/portfolio/portfolio_optimization/optimizer_model.py
+++ b/openbb_terminal/portfolio/portfolio_optimization/optimizer_model.py
@@ -449,7 +449,7 @@ def get_mean_risk_portfolio(
covariance = kwargs.get("covariance", "hist")
d_ewma = kwargs.get("d_ewma", 0.94)
- risk_measure = risk_measure.upper()
+ risk_measure = optimizer_helper.validate_risk_measure(risk_measure)
stock_prices = yahoo_finance_model.process_stocks(
symbols, interval, start_date, end_date
@@ -1496,6 +1496,7 @@ def get_ef(
seed = kwargs.get("seed", 123)
risk_free_rate = risk_free_rate / time_factor[freq.upper()]
+ risk_measure = optimizer_helper.validate_risk_measure(risk_measure)
stock_prices = yahoo_finance_model.process_stocks(
symbols, interval, start_date, end_date
@@ -1715,6 +1716,7 @@ def get_risk_parity_portfolio(
)
risk_free_rate = risk_free_rate / time_factor[freq.upper()]
+ risk_measure = optimizer_helper.validate_risk_measure(risk_measure)
# Building the portfolio object
port = rp.Portfolio(returns=stock_returns, alpha=alpha)
@@ -2113,7 +2115,7 @@ def get_hcp_portfolio(
alpha_tail = kwargs.get("alpha_tail", 0.05)
leaf_order = kwargs.get("leaf_order", True)
- risk_measure = risk_measure.upper()
+ risk_measure = optimizer_helper.validate_risk_measure(risk_measure)
stock_prices = yahoo_finance_model.process_stocks(
symbols, interval, start_date, end_date
diff --git a/openbb_terminal/portfolio/portfolio_optimization/po_model.py b/openbb_terminal/portfolio/portfolio_optimization/po_model.py
index 531ce966706..9b545f1944d 100644
--- a/openbb_terminal/portfolio/portfolio_optimization/po_model.py
+++ b/openbb_terminal/portfolio/portfolio_optimization/po_model.py
@@ -15,6 +15,7 @@ from riskfolio import rp
from openbb_terminal.decorators import log_start_end
from openbb_terminal.portfolio.portfolio_optimization import (
+ optimizer_helper,
optimizer_model,
)
from openbb_terminal.portfolio.portfolio_optimization.statics import (
@@ -250,6 +251,8 @@ def get_portfolio_performance(weights: Dict, data: pd.DataFrame, **kwargs) -> Di
"Sharpe ratio": sharpe,
}
+ risk_measure = optimizer_helper.validate_risk_measure(risk_measure, warning=False)
+
if risk_measure != "MV":
risk = rp.Sharpe_Risk(
weights,