From 079bb16200e0b3f7ce92d21685a3fa574b618b63 Mon Sep 17 00:00:00 2001 From: todd <3578666+tgibson11@users.noreply.github.com> Date: Wed, 11 Oct 2023 10:07:06 -0700 Subject: [PATCH] Improve code for handling when risk overlay is not configured (cherry picked from commit 572512f338b8692555252ba082da596b62faf676) --- .../strategy_code/report_system_classic.py | 9 +++++---- systems/portfolio.py | 17 +++++++---------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/sysproduction/strategy_code/report_system_classic.py b/sysproduction/strategy_code/report_system_classic.py index c5d0497c8a..ab01f09db2 100644 --- a/sysproduction/strategy_code/report_system_classic.py +++ b/sysproduction/strategy_code/report_system_classic.py @@ -529,11 +529,12 @@ def risk_scaling_string(backtest) -> str: backtest_system_portfolio_stage.get_leverage_for_original_position().iloc[-1] ) percentage_vol_target = backtest_system_portfolio_stage.get_percentage_vol_target() - risk_scalar = backtest_system_portfolio_stage.get_risk_scalar() - if type(risk_scalar) is pd.Series: - risk_scalar_final = risk_scalar.iloc[-1] + try: + risk_scalar = backtest_system_portfolio_stage.get_risk_scalar() + except missingData: + risk_scalar_final = 1.0 else: - risk_scalar_final = risk_scalar + risk_scalar_final = risk_scalar.iloc[-1] risk_overlay_config = ( backtest_system_portfolio_stage.config.get_element_or_arg_not_supplied( "risk_overlay" diff --git a/systems/portfolio.py b/systems/portfolio.py index 219b2f410c..8b653a60e6 100644 --- a/systems/portfolio.py +++ b/systems/portfolio.py @@ -212,16 +212,18 @@ def get_notional_position(self, instrument_code: str) -> pd.Series: self.get_notional_position_before_risk_scaling(instrument_code) ) - risk_scalar = self.get_risk_scalar() - if type(risk_scalar) is pd.Series: + try: + risk_scalar = self.get_risk_scalar() + except missingData: + self.log.debug("No risk overlay in config: won't apply risk scaling") + notional_position = notional_position_without_risk_scalar + else: risk_scalar_reindex = risk_scalar.reindex( notional_position_without_risk_scalar.index ) notional_position = ( notional_position_without_risk_scalar * risk_scalar_reindex.ffill() ) - else: - notional_position = notional_position_without_risk_scalar return notional_position @@ -960,12 +962,7 @@ def capital_multiplier(self): @diagnostic() def get_risk_scalar(self) -> pd.Series: - risk_overlay_config = self.config.get_element_or_arg_not_supplied( - "risk_overlay" - ) - if risk_overlay_config is arg_not_supplied: - self.log.debug("No risk overlay in config: won't apply risk scaling") - return 1.0 + risk_overlay_config = self.config.get_element("risk_overlay") normal_risk = self.get_portfolio_risk_for_original_positions() shocked_vol_risk = (