@@ -245,7 +245,8 @@ def build_macro_risk_governor_signal(
245245 benchmark_drawdown_watch : float = - 0.10 ,
246246 benchmark_drawdown_crisis : float = - 0.18 ,
247247 realized_vol_window : int = 10 ,
248- realized_vol_threshold : float = 0.35 ,
248+ realized_vol_threshold : float = 0.30 ,
249+ realized_vol_requires_confirmation : bool = True ,
249250 vix_watch_level : float = 28.0 ,
250251 vix_crisis_level : float = 35.0 ,
251252 vix_spike_lookback_days : int = 5 ,
@@ -261,7 +262,7 @@ def build_macro_risk_governor_signal(
261262 delever_score_threshold : float = 5.0 ,
262263 crisis_score_threshold : float = 7.0 ,
263264 delever_leverage_scalar : float = 0.0 ,
264- delever_risk_asset_scalar : float = 1 .0 ,
265+ delever_risk_asset_scalar : float = 0 .0 ,
265266 crisis_leverage_scalar : float = 0.0 ,
266267 crisis_risk_asset_scalar : float = 0.0 ,
267268) -> dict [str , Any ]:
@@ -447,12 +448,36 @@ def build_macro_risk_governor_signal(
447448 threshold = float (pizza_index_watch_level ),
448449 actionable = False ,
449450 )
451+ realized_vol_confirmed_for_action = None
452+ realized_vol_check = checks .get ("benchmark_realized_volatility_high" )
453+ if realized_vol_check is not None :
454+ volatility_active = bool (realized_vol_check .get ("active" , False ))
455+ if volatility_active :
456+ confirmation_checks = (
457+ "vix_watch_level" ,
458+ "vix_crisis_level" ,
459+ "vix_spike" ,
460+ "credit_pair_stress" ,
461+ "hy_oas_watch_level" ,
462+ "hy_oas_widening" ,
463+ "financial_stress_index_high" ,
464+ )
465+ realized_vol_confirmed_for_action = any (
466+ bool (checks .get (name , {}).get ("active" , False )) for name in confirmation_checks
467+ )
468+ if bool (realized_vol_requires_confirmation ) and not realized_vol_confirmed_for_action :
469+ realized_vol_check ["actionable" ] = False
470+ realized_vol_check ["suppression_reason" ] = "missing_volatility_stress_confirmation"
471+ realized_vol_check ["confirmation_required" ] = bool (realized_vol_requires_confirmation )
472+ realized_vol_check ["confirmed_for_action" ] = realized_vol_confirmed_for_action
450473 evidence ["metrics" ].update (
451474 {
452475 "hy_oas" : hy_oas ,
453476 "hy_oas_delta_63d" : hy_oas_delta ,
454477 "financial_stress" : financial_stress ,
455478 "pentagon_pizza_index" : pizza_index ,
479+ "benchmark_realized_volatility_requires_confirmation" : bool (realized_vol_requires_confirmation ),
480+ "benchmark_realized_volatility_confirmed_for_action" : realized_vol_confirmed_for_action ,
456481 }
457482 )
458483
@@ -626,11 +651,18 @@ def build_parser() -> argparse.ArgumentParser:
626651 )
627652 parser .add_argument ("--max-price-age-days" , type = int , default = DEFAULT_MAX_PRICE_AGE_DAYS )
628653 parser .add_argument ("--max-external-context-age-days" , type = int , default = DEFAULT_MAX_EXTERNAL_CONTEXT_AGE_DAYS )
654+ parser .add_argument ("--realized-vol-threshold" , type = float , default = 0.30 )
655+ parser .add_argument (
656+ "--realized-vol-requires-confirmation" ,
657+ action = argparse .BooleanOptionalAction ,
658+ default = True ,
659+ help = "Require VIX, credit, or financial-stress confirmation before realized volatility contributes to actionable score." ,
660+ )
629661 parser .add_argument ("--watch-score-threshold" , type = float , default = 3.0 )
630662 parser .add_argument ("--delever-score-threshold" , type = float , default = 5.0 )
631663 parser .add_argument ("--crisis-score-threshold" , type = float , default = 7.0 )
632664 parser .add_argument ("--delever-leverage-scalar" , type = float , default = 0.0 )
633- parser .add_argument ("--delever-risk-asset-scalar" , type = float , default = 1 .0 )
665+ parser .add_argument ("--delever-risk-asset-scalar" , type = float , default = 0 .0 )
634666 parser .add_argument ("--output-dir" , default = DEFAULT_OUTPUT_DIR )
635667 return parser
636668
@@ -663,6 +695,8 @@ def main(argv: list[str] | None = None) -> int:
663695 credit_pairs = credit_pairs ,
664696 max_price_age_days = args .max_price_age_days ,
665697 max_external_context_age_days = args .max_external_context_age_days ,
698+ realized_vol_threshold = args .realized_vol_threshold ,
699+ realized_vol_requires_confirmation = args .realized_vol_requires_confirmation ,
666700 watch_score_threshold = args .watch_score_threshold ,
667701 delever_score_threshold = args .delever_score_threshold ,
668702 crisis_score_threshold = args .crisis_score_threshold ,
0 commit comments