
    pj                   	   U d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	Z
ddlZ ee      j                         j                  d   Z ee      ej$                  vr"ej$                  j'                  d ee             ddlmZ ddlmZmZ ddlmZmZ ed	z  d
z  dz  ZdZdZdZdZ dZ!edz  dz  Z"dddddZ#de$d<   ddddddddddddddZ%de$d <   d!d"dd#d$d%dd&ddddd'Z&de$d(<   d)d*dd+d,d-dd.dddddddd/Z'de$d0<   dd1d1d&d2dddddddd3Z(de$d4<   d5d6dd7ddd8Z)de$d9<   d:d;dddddddd<	Z*de$d=<   d>d?d@ddAdBddCZ+de$dD<   dEdFdGddHdIdddddJ
Z,de$dK<   dLd7dMddHdIdddd&ddNZ-de$dO<   dPdQdRdddSdTddUZ.de$dV<   dWdXdYdZdd[d\ddddd]Z/de$d^<   ed_z  Z0ed`z  Z1edaz  Z2edbz  Z3edcz  Z4ddZ5edez  Z6edfz  Z7edgz  Z8edhz  Z9ediz  Z:edjz  Z;edkz  Z<edlz  Z=edmz  Z>ednz  Z?edoz  Z@edpz  ZAedqz  ZBedrz  ZCedsz  ZDedtz  ZEeduz  ZFedvz  ZGedwz  ZHedxz  ZIdyZJdzZKd{ZLd|ZMed}z  ZNed~z  ZOdZPdZQddZRe5d	 	 	 	 	 	 	 ddZSe5d	 	 	 	 	 	 	 ddZTdd	 	 	 	 	 	 	 	 	 ddZU	 	 	 	 	 	 	 	 	 	 ddZV	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZWdd	 	 	 	 	 	 	 	 	 	 	 ddZX	 d	 	 	 	 	 	 	 ddZYddZZddZ[ddddZ\dd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ]	 	 	 	 	 	 	 	 	 	 ddZ^dddddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ_ddddddddddddddddddddddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ`dddddddddddddddddddddddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZadddddddddddddddddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZbddZc	 	 	 	 	 	 	 	 	 	 ddZddddddddddddddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZeddZfddd	 	 	 	 	 	 	 	 	 ddZgdd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZhddZiejdk(  r ei        yy)u
  
**Best Ideas** combined book — Approach B stack:

* **Dynamic VXX Regime Strategy Stack** (``pnl_stack``)
* **S055, S057, S059, S089** (literature Theta stack)
* **VRP** (4-regime daily ``pnl_vrp``)
* **Equity dip (split):** S&P 500 + Russell 3000 pct-drop sleeves on one **$100k** slot (``--with-equity-dip``; default **Sharpe weights** ~46% / ~54%)
* Optional **VXX long OTM call** tail hedge (``--with-vxx-long-call``; ``run_vxx_long_call_daily.py``)
* Optional **Macro AW options** (8 ETF sleeves, equal-weight; ``--with-macro-aw``; ``macro_aw_options_portfolio.py``)
* Optional **QS actionable ETF** (7-sleeve calendar/overnight/MR diversifiers; ``--with-qs-actionable-etf``; ``run_qs_actionable_etf_standard.py``)
* Optional **Sector momentum** (SPDR 12-1 rotation; ``--with-sector-momentum``; ``run_sector_momentum_standard.py``)
* Optional **Tactical All Weather** (SPY/TLT/IEF/GLD/DBC gates; ``--with-tactical-aw``; ``run_tactical_all_weather_standard.py``)
* Optional **Ride-rockets 50/50** (near_52w_high top25 + ten_rockets top10; ``--with-ride-rockets``; ``run_ride_rockets_5050_standard.py``)
* Optional **TSMOM / Managed Futures** (8-asset time-series momentum; ``--with-tsmom``; ``run_tsmom_managed_futures.py``)
* Optional **Johansen ETF triplets** (6-sleeve Chan stat-arb book; ``--with-johansen-etf``; ``run_johansen_triplet_etf_portfolio.py``)
* Optional **Zarattini 5m ORB** (Stocks in Play opening-range breakout; ``--with-orb-zarattini``; ``run_orb_zarattini.py``)
* Optional **MA slope S&P 500 top-N** (monthly dual-slope rotation + 2× ATR trail; ``--with-ma-slope-topn``)
* Optional **MA slope inverse SPY bear hedge** (SH, SPY regime gates; ``--with-ma-slope-inverse``)
* Shorthand ``--with-ma-slope`` enables both MA slope sleeves
* Optional **MA slope intraday** (Alpaca 5m confirm_entry_4b + top-5 + 20%% max weight; ``--with-ma-slope-intraday``; **on by default with** ``--stock-only``)

See ``BEST_IDEAS.md``.

Example (maintainer default — MTM + quarterly NAV rebase)::

    cd /Users/robzingale/trading_bot
    PYTHONUNBUFFERED=1 .venv/bin/python RenTech/strategy_stack/combine_best_ideas_stack.py \
        --start 2016-01-04 --end 2026-06-18 --capital 100000 \
        --mtm --nav-rebalance quarterly \
        --with-equity-dip --with-vxx-long-call \
        --out-prefix RenTech/data/logs/best_ideas_stack

Stock-only book (9 sleeves: vol edge, QS actionable-4, MA slope top-N + inverse SH + intraday — all default with ``--stock-only``)::

    cd /Users/robzingale/trading_bot
    PYTHONUNBUFFERED=1 .venv/bin/python RenTech/strategy_stack/combine_best_ideas_stack.py \
        --stock-only --start 2016-01-04 --end 2026-06-18 --capital 100000 \
        --fund-scale 1.5 --fund-nav-rebalance quarterly \
        --out-prefix RenTech/data/logs/stock_only_ma_slope
    )annotationsN)Path   )_metrics_block) apply_vix_dynamic_scale_to_panelvix_scale_tiers_for_base)build_sleeve_margin_mapbuild_combined_marginRenTechdatalogszBest Ideas Stackstack_full_pnlstack_nav_quarterly_rebasefund_nav_weighted_returnsfund_nav_quarterly_sizedz.cursorzdebug-e12856.logg?g      ?g?)	spy_theta
vxx_regime
equity_dipvxx_long_calldict[str, float]DEFAULT_FUND_WEIGHTSgQ?g
ףp=
?{Gz?皙?Q?g{Gz?)r   r   r   r   macro_awsector_momentumqs_actionable_etfjohansen_etforb_zarattinima_slope_topnma_slope_inversema_slope_intradayride_rocketsFUND_WEIGHT_TABLE_EXTENDEDg333333?g      ?g333333?g      ?gQ?gQ?)r   r   r   r   r   r   r   tactical_awr   r   r"   r#   FUND_WEIGHT_TABLE_TACTICALgQ?g?gp=
ף?g̴?gQ?g rh?)r   r   r   r   r   r   r   r%   r#   tsmomr   r   r    r!   r"    FUND_WEIGHT_TABLE_TACTICAL_TSMOMg{Gz?g
ףp=
?)r   r   r   r   r   r   r   r#   r'   r   r   r"   FUND_WEIGHT_TABLEgGz?g333333?gRQ?)r%   r   r#   r'   r   r   FUND_WEIGHT_TABLE_STOCK_ONLYgGz?gp=
ף?)	r%   r   r#   r'   r   r    r!   r"   r   %FUND_WEIGHT_TABLE_STOCK_ONLY_MA_SLOPEgGz?g      ?g?gףp=
׵?gffffff?)r%   vol_edger   r#   r'   r   r    FUND_WEIGHT_TABLE_STOCK_VOL_EDGEg?g)\(?g(\?g(\?gQ?)
r%   r,   r   r#   r'   r   r    r!   r"   r   )FUND_WEIGHT_TABLE_STOCK_VOL_EDGE_MA_SLOPEgzG?gףp=
?)r%   r,   r   r#   r'   r   r    r!   r"   spy_bear_callr   -FUND_WEIGHT_TABLE_STOCK_VOL_EDGE_MA_SLOPE_BCCg rh?g̼?g=
ףp=?gʡE?gA`"?)r%   r,   r   	ls_equityr#   r'   r   r   FUND_WEIGHT_TABLE_STOCK_VOL_LSgK7A`?gJ+?g|?5^?gʡE?gx&?g#~j?)r%   r,   r   r1   r#   r'   r   r    r!   r"   r   'FUND_WEIGHT_TABLE_STOCK_VOL_LS_MA_SLOPEz&volatility_edge_etn_evrp_boc_daily.csvz9ma_slope_intraday_confirm4b_top5_cap20_standard_daily.csvz'spy_bear_call_spread_standard_daily.csvz%ls_equity_momentum_standard_daily.csvz'macro_aw_options_portfolio_eq_daily.csvPORTFOLIO_EQUAL_WEIGHTz"sector_momentum_standard_daily.csvz$qs_actionable_etf_standard_daily.csvz"qs_actionable_4_standard_daily.csvztactical_aw_standard_daily.csvztsmom_managed_futures_daily.csvz$ride_rockets_5050_standard_daily.csvz'johansen_triplet_etf_standard_daily.csvz#orb_zarattini_5m_standard_daily.csvz?ma_slope_sp500_top10_top10_dual_product_monthly_atr2x_daily.csvz`ma_slope_inverse_spy_balanced_bear_dual_or_sma200_spy_slope_or_sma200_invreq_top_n1_SH_daily.csvz?vxx_regime_mtm_2016_2026_dynamic_vxx_regime_stack_daily_mtm.csvz4combine_lit_stack_S055_S057_S059_S089_VRP_equity.csvzlit_stack_vrp_margin_daily.csvz best_ideas_spy6_margin_daily.csvz'best_ideas_d6_portfolio_equity_100k.csvz%portfolio_opt_10dd_sharpe_fullvrp.csvzsp500_dip_standard_daily.csvz#sp500_relative_dip_hedged_daily.csvz$cracking_markets_sp100_dip_daily.csvz"russell3000_dip_standard_daily.csvgGz?g(\?   
   zsector_dip_standard_daily.csvz vxx_long_call_standard_daily.csv)S055S057S059S089)D095D081D039D018D041D065c                @    | j                         j                  d      S )N        )difffillna)eqs    K/opt/rentech/trading_bot/RenTech/strategy_stack/combine_best_ideas_stack.py_daily_from_equityrG     s    779C      
equity_colc                  t        j                  | dd      }t        j                  |j                        j	                         |_        ||j
                  vrt        |  d|      ||   j                  t        j                        j                  |      j                         }|j                         j                  d      S )zNDaily $ PnL from macro AW portfolio equity curve (equal-weight book at $100k).r   T	index_colparse_dates missing column rB   )pdread_csvto_datetimeindex	normalizecolumnsKeyErrorastypenpfloat64reindexffillrC   rD   pathidxrJ   dfrE   s        rF   _load_macro_aw_pnlr`     s     
TQD	9B~~bhh'113BH#$/
~>??	J		rzz	*	2	23	7	=	=	?B779C  rH   c               ^   t        j                  | dd      }t        j                  |j                        j	                         |_        ||j
                  vrt        |  d|      ||   j                  t        j                        j                  |      j                         }t        |      dk(  s4t        j                  |j                  d         r|j                  d   dk  r&t        j                  d|t        j                        S |j!                         j#                  d      S )Nr   TrL   rO   rB   rS   dtype)rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   lenisfiniteilocSeries
pct_changerD   r\   s        rF   _load_macro_aw_daily_returnri   &  s     
TQD	9B~~bhh'113BH#$/
~>??	J		rzz	*	2	23	7	=	=	?B
2w!|2;;rwwqz2bggajAoyyCrzz::==?!!#&&rH         ?weightc               &   t        j                  | dg      }t        j                  |d         j                  j	                         |d<   |j                  d      j                         }d|j                  v r#|d   j                  t        j                        }nKd|j                  v r/|d   j                  t        j                        t        |      z  }nt        |  d      |j                  |      j                  d      t        |      z  S )NdaterN   daily_pnl_usd	daily_retz! needs daily_pnl_usd or daily_retrB   )rP   rQ   rR   dtrT   	set_index
sort_indexrU   rW   rX   rY   floatrV   rZ   rD   )r]   r^   capitalrl   r_   pnls         rF   _load_equity_dip_pnlrx   6  s     
Tx	0B6
+..88:BvJ	f		(	(	*B"**$!((4	

	"o$$RZZ05>A$@ABB;;s""3'%-77rH   c                   | |t        |       t        |      }}nS| t        |       }d|z
  }n@|t        |      }d|z
  }n-|rdx}}n&|r t        t        z   }t        |z  }t        |z  }ndx}}||z   }|dk  rt        d      ||z  ||z  fS )Nrj   g      ?r   z0equity dip weights must sum to a positive number)ru   EQUITY_DIP_SHARPE_SP500EQUITY_DIP_SHARPE_RUSSELL3000
ValueError)
sp500_fracrussell3000_fracsharpe_weightequal_weightw_spw_r3ktotss           rF   _resolve_equity_dip_weightsr   I  s     "2">J'/?)@e		Z d
		%&'U{	u	%(EE&,-3uuAAvKLL!8UQYrH   c                   i }|rt        |||d      | d<   ddd}|S t        ||||      | d<   t        ||||      | d<   ||d}|S )zOAdd ``pnl_sp500_dip`` / ``pnl_russell3000_dip`` (weighted); return weight meta.rj   rk   pnl_sp500_diprB   )sp500_dip_fracrussell3000_dip_fracpnl_russell3000_dip)rx   )	panelr^   rv   sp500_dailyrussell3000_daily
sp500_onlyr   r   meta_ws	            rF   _add_equity_dip_to_panelr   f  sy      "F!5k3X[!\o$'E M "6gd"
o (<sGE(
#$ %)%HMrH   z	fund-mode)run_idc           
     h   dd l }d|| |||t        |j                         dz        d}	 t        j                  j	                  dd       t        j                  dd	      5 }|j                  t        j                  |t        
      dz          d d d        y # 1 sw Y   y xY w# t        $ r Y y w xY w)Nr   e12856  )	sessionIdrunIdhypothesisIdlocationmessager   	timestampTparentsexist_okazutf-8)encodingdefault
)timeintDEBUG_LOG_PATHparentmkdiropenwritejsondumpsstrOSError)hypothesis_idr   r   r   r   r   payloadfhs           rF   
_debug_logr     s      %t+,G##D4#@  w 7 	>2HHTZZ5<=	> 	> 	> s/   8B% ".BB% B"B% "B% %	B10B1c                   |w|j                  t        j                        j                  | j                        j                         }|j                  d   dkD  r|j                         j                  d      S t        |      }|dk  r| dz  S | j                  t        j                        |z  j                  d      S )z;Standalone backtest daily return (for fund-mode weighting).r   rB   )
rW   rX   rY   rZ   rS   r[   rf   rh   rD   ru   )rw   rv   equityrE   caps        rF    _daily_return_from_pnl_or_equityr     s     ]]2::&..syy9??A771:>==?))#..
.C
axSyJJrzz"S(0055rH   c                   t        j                  | dg      }t        j                  |d         j                  j	                         |d<   |j                  d      j                         }d|j                  v r#|d   j                  t        j                        }nBd|j                  v r&|d   j                  t        j                        dz  }nt        |  d      |j                  |      j                  d      S )Nrn   ro   rq   rp        j@z! needs daily_ret or daily_pnl_usdrB   )rP   rQ   rR   rr   rT   rs   rt   rU   rW   rX   rY   rV   rZ   rD   )r]   r^   r_   rets       rF   _load_dip_daily_returnr     s    	Tx	0B6
+..88:BvJ	f		(	(	*Bbjj o$$RZZ0	BJJ	&!((4y@$@ABB;;s""3''rH   c                   d }|D ]r  }t        j                  |dg      }t        j                  t        j                  |d         j                  j                               }||n|j                  |      }t |t        |      dk(  rt        d      t        j                  |       t        j                  |      }}|||k\  ||k  z     }t        |      dk  rt        dt        |       d      |j                         S )Nrn   ro   r   z;stock-only: no overlapping sessions across stock daily CSVsd   z&stock-only: too few aligned sessions (z); check date range)rP   rQ   DatetimeIndexrR   rr   rT   intersectionrd   
SystemExit	Timestampsort_values)	startenddaily_pathsr^   r]   r_   datest0t1s	            rF   _align_stock_calendar_idxr     s    #'C @[[F84  6
!;!>!>!H!H!JK{e(8(8(?@ {c#h!mVWW\\% ",,s"3B
sbySBY'
(C
3x#~A#c(K^_``??rH   F
stock_onlyc               j    |r j                  d      xs$  j                  d      xs  j                  d      } j                  d      r|rt        nt        }nn j                  d      r/ j                  d      r|rt        nt        }n=|rt
        nt        }n. j                  d      r|rt        nt        }n|rt        nt        }|D ci c]  } j                  |      s|||    c}S d}t         fd|D              s.t        D ci c]  } j                  |      s|t        |     c}S  j                  d	      r j                  d
      rt        nt        }n j                  d
      rt        }nt        }|D ci c]  } j                  |      s|||    c}S c c}w c c}w c c}w )Nr    r!   r"   r1   r,   r/   )r   r   r   r'   r#   r%   r   r   r    r!   r"   c              3  @   K   | ]  }j                  |        y wN)get).0kactives     rF   	<genexpr>z&_fund_weight_preset.<locals>.<genexpr>  s     /vzz!}/s   r%   r'   )r   r3   r2   r0   r-   r.   r+   r*   anyr   r(   r&   r)   r$   )r   r   with_matabler   optionals   `     rF   _fund_weight_presetr     s   JJ' /zz,-/zz-. 	
 ::k"  83 
 ZZ
#zz/*  B9   >9 
 ZZ(  >5   61 
 &+<fjjm58<<H /h//4HZqFJJWXM'**ZZzz-  zz'" -+ 	
 
G	!*!&8A&**Q-AuQxK88# = [ 9s$   F&$F&F+$F+F0F0c                   t        ||      }i }|j                  d      rt        | | n|d         |d<   |j                  d      rt        ||n|d         |d<   |j                  d      rt        ||n|d         |d<   |j                  d      rt        ||n|d         |d<   |j                  d      rt        ||n|d         |d<   |j                  d      rt        ||n|d         |d<   |j                  d      rt        ||n|d         |d<   |j                  d	      rt        ||n|d	         |d	<   |j                  d
      rt        ||n|d
         |d
<   |j                  d      r"t        |	|	n|j                  dd            |d<   |j                  d      rt        |
|
n|d         |d<   |j                  d      rt        ||n|d         |d<   |j                  d      r"t        ||n|j                  dd            |d<   |j                  d      r"t        ||n|j                  dd            |d<   |j                  d      r"t        ||n|j                  dd            |d<   |j                  d      r"t        ||n|j                  dd            |d<   |j                  d      r"t        ||n|j                  dd            |d<   |j                  d      r"t        ||n|j                  dd            |d<   t        |j	                               }|dk  rt        d      |j                         D ci c]  \  }}|||z   c}}S c c}}w )Nr   r   r   r   r   r   r   r   r%   r'   r#   r   r   r   r    r   r!   r   r"   r,   rB   r1   r/   r   z3fund-mode: no active sleeves or weights sum to zero)r   r   ru   sumvaluesr|   items)spyvxxr   r   r   r   r   r%   r'   r#   r   r   r    r!   r"   r,   r1   r/   r   r   presetrawr   r   vs                            rF   _resolve_fund_weightsr     s   . !J?FCzz+ VK=PQKzz,!#f\>RSLzz,!$0Jf\6J
L zz/"$*6MF?<S 
O zz*H,@fZFXYJzz#$!&.:OGX@Y"
 zz%&#( , +,$
 
 zz- "&2K}8M
M zz'e&7UVG_MGzz.!#(4L&**^UY:Z
N zz.!#(4L&:P
N zz/"$*6MF?<S 
O zz/"$*6MFJJX\<] 
O zz$%"'+ .5#

 zz%&#( , /6$
 
 zz* ,H&**Z2M
J zz+ ".IFJJ{C4P
K zz/"$*6MFJJX[<\ 
O 	CJJLAAvNOO!$-AAq1uH---s   M'c                  i }d|v r%| d   j                  t        j                        |d<   d|v r%| d   j                  t        j                        |d<   d|v rr|rp|r&| d   j                  t        j                        |d<   nH| d   j                  t        j                        | d   j                  t        j                        z   |d<   d|v r3d	| j                  v r%| d	   j                  t        j                        |d<   d
|v r3d| j                  v r%| d   j                  t        j                        |d
<   d|v r3d| j                  v r%| d   j                  t        j                        |d<   d|v r3d| j                  v r%| d   j                  t        j                        |d<   d|v r3d| j                  v r%| d   j                  t        j                        |d<   d|v r3d| j                  v r%| d   j                  t        j                        |d<   d|v r3d| j                  v r%| d   j                  t        j                        |d<   d|v r3d| j                  v r%| d   j                  t        j                        |d<   d|v r3d| j                  v r%| d   j                  t        j                        |d<   d|v r3d| j                  v r%| d   j                  t        j                        |d<   d|v r3d| j                  v r%| d   j                  t        j                        |d<   d|v r3d| j                  v r%| d   j                  t        j                        |d<   d |v r3d!| j                  v r%| d!   j                  t        j                        |d <   d"|v r3d#| j                  v r%| d#   j                  t        j                        |d"<   d$|v r3d%| j                  v r%| d%   j                  t        j                        |d$<   |S )&uQ   Map fund sleeve keys → daily $ PnL at standalone ``--capital`` ($100k default).r   pnl_spy_theta_mtmr   pnl_vxx_regime_stackr   r   r   r   pnl_vxx_long_callr   pnl_macro_awr   pnl_sector_momentumr   pnl_qs_actionable_etfr%   pnl_tactical_awr'   	pnl_tsmomr#   pnl_ride_rocketsr   pnl_johansen_etfr   pnl_orb_zarattinir    pnl_ma_slope_topnr!   pnl_ma_slope_inverser"   pnl_ma_slope_intradayr,   pnl_vol_edger1   pnl_ls_equityr/   pnl_spy_bear_call)rW   rX   rY   rU   )r   fund_weightswith_equity_dipr   outs        rF   _fund_sleeve_base_pnlr   i  s    !#Cl" !45<<RZZHK|#!"89@@LL|# %o 6 = =bjj IC o&--bjj9-.55bjjAB  ,&+>%--+O$%89@@LO\!n&E/66rzzBJL(-Bemm-S!&'<!=!D!DRZZ!Pl*/F%--/W#()@#A#H#H#T $):emm)K"#45<<RZZHM,;%--#?[)00<G%*<*M#$67>>rzzJN%*<*M#$67>>rzzJN,&+>%--+O$%89@@LO,&+>%--+O$%89@@LO\).D.U"'(>"?"F"Frzz"Rl*/F%--/W#()@#A#H#H#T \!n&E/66rzzBJl"%--'G 188DK,&+>%--+O$%89@@LOJrH   333333?)
fund_scalevol_edge_dailyls_equity_dailyorb_zarattini_dailymargin_cap_fracc               N	   | j                         } t        |      }|dk  rt        d      t        | |||      }t	        |j                               }|$t        t        |      j                  dd            n
t        d      }t        |||xs t        |xs t        |	|||||||d|	      }t        |      }t        |      }|}g }g }g }g }g }g }g } |j                         D !"ci c]   \  }!}"|!t        |"      t        |      z  |z  " }#}!}"|}$t        |      D ]  }%||%   }&|%dkD  rA|&|v r=|}$|j                         D !"ci c]   \  }!}"|!t        |"      t        |      z  |$z  " }#}!}"|j!                  |$       |j!                  |$|z         d
}'d
}(|j                         D ]  \  })}"|)|vr|#|)   }*|*|z  }+|'t        ||)   j"                  |%         |+z  z  }'|)|v r!|(t        ||)   j"                  |%         |+z  z  }(|*| j$                  |&d|) df<   t        ||)   j"                  |%         |+z  | j$                  |&d|) f<    d},|(d
kD  r|d
kD  r||z  }-|(|-kD  r
|-|(z  },|'|,z  }'|j!                  |'       ||'z   }|j!                  |       |j!                  |(|,z         | j!                  |,       |j!                  |$dkD  r|'|$z  nd
        t'        j(                  |g|dd z   |t*        j,                        }.|| d<   || d<   || d<   t'        j(                  ||t*        j,                        | d<   t'        j(                  ||t*        j,                        | d<   | d   j/                         j1                  d
      | d<   || d<   | | d<   t+        j2                  |      |.j5                  t*        j,                        z  dz  | d<   t        |      | d<   | d   j7                         }/t        | d   |/z  dz
  j9                         dz        }0t;        ddd t        | d   j"                  d         t        | d   j"                  d   |z  dz
        dz  |0||t        t+        j<                  |            t        t+        j>                  |            d!"       | S c c}"}!w c c}"}!w )#u  
    Fund-mode with **quarterly NAV-referenced sizing** (realistic live book).

    At each calendar quarter open, set ``nav_ref = prior close NAV``. Each sleeve
    runs at notional ``w_i × fund_scale × nav_ref`` for that quarter; daily PnL and
    margin scale linearly from the standalone ``--capital`` backtest curves
    (``scaled_pnl = base_pnl × notional / capital``).
    r   zcapital must be positive)r   r   N
_daily.csv_trades.csv/nonexistentrj   )active_sleeveslit_mtm_dailyvxx_regime_dailytsmom_dailyr   r   tactical_aw_dailymacro_aw_trades_pathequity_dip_dailyr   r   r   rv   rB   	notional__usd	pnl_fund_rb   nav_ref_usdfund_nav_rebase_scaleequity_mtm_usdpnl_best_ideas_mtmportfolio_return_funddaily_return_mtmmargin_combined_usdmargin_cap_multiplierrc         Y@bp_utilization_pcteffective_fund_scale   r   zH1-fund-nav-qz@combine_best_ideas_stack.py:_apply_fund_mode_mtm_quarterly_sizedfund_mode_quarterly_nav_summary)end_navtotal_return_pct
max_dd_pctr   r   mean_margin_usdpeak_margin_usdr   r   r   r   ) copyru   r|   r   setkeysr   r   replacer	   DEFAULT_LIT_MTM_DAILYDEFAULT_VXX_DAILY_quarter_start_datesrd   r   rangeappendrf   atrP   rg   rX   rY   rh   rD   arrayto_numpycummaxminr   meanmax)1r   r^   rv   r   r   r   r   r  r  r  ride_rockets_dailyr  macro_aw_dailyr  r   r   r   r   ref_capbase_pnlr  r  sleeve_margin_baseqstartsnnavnavspnlsnav_ref_valsrebase_scale_valsport_ret_valsmargin_combined_valsmargin_cap_mult_valsr   wsleeve_notionalnav_refirr   day_pnl
day_marginkeynotionalscalemargin_cap_mult
max_marginprev_navpeakdd_pcts1                                                    rF   $_apply_fund_mode_mtm_quarterly_sizedrM    s2   : JJLEGnG!|344$|_H **,-N % 	S ((}EF.! 
 1%#<'<)>->%'+1)/!" #3'GCA
CDD "L%'!#M(*(*>J>P>P>R)6:a58eJ'''11)O ) G1X $HVq5R7]GFRFXFXFZ>Ba58eJ//'99O  	G$  7!23
"((* 		SFC("&s+Hw&EuXc]//23e;;G((e$6s$;$@$@$CDuLL
2:EHHR9SE../.3HSM4F4Fq4I.JU.REHHR9SE**+		S c	.JJ&",z"9?*GGmC##J$@A##O4'A+Ww.3GI$HL yy'T#2Y.cLH'E-%6E
!""E
"$))D2::"NE
%'YY}Crzz%ZE
!" %&6 7 B B D K KC PE
#7E
 %9E
!"
%&):):):)LLuT 

 %**$5E
 !!"))+DU+,t3a7<<>#EFF%S1U#3499"=> %e,<&=&B&B2&F&PST&T UX[ [ ($$RWW-A%BC$RVV,@%AB
	 LS)s   '%R%R!)r   with_qs_actionable_etfqs_actionable_etf_dailywith_johansen_etfjohansen_etf_dailywith_orb_zarattinir   with_ma_slope_topnma_slope_topn_dailywith_ma_slope_inversema_slope_inverse_dailywith_ma_slope_intradayma_slope_intraday_dailywith_vol_edger   with_ls_equityr   with_spy_bear_callspy_bear_call_dailyr  r  r   c       ,           | j                         } i }/d|v r)t        | d   ||j                  |            }0|0|/d<   |0| d<   d|v r|l|j                  |      j                         j                  d   dkD  r=|j                  |      j                         j                         j                  d      }1nt        | d   |      }1|1|/d<   |1| d<   d	|v r4|r2t        |	|      }2|r|2}3nt        |
|      }4|2|z  |4|z  z   }3|3|/d	<   |3| d
<   d|v r|rt        ||      }5|5|/d<   |5| d<   d|v r|rt        |||      }6|6|/d<   |6| d<   d|v r|rt        ||      }7|7|/d<   |7| d<   d|v r|r|t        ||      }8|8|/d<   |8| d<   d|v r|rt        ||      }9|9|/d<   |9| d<   d|v r|rt        ||      }:|:|/d<   |:| d<   d|v r|rt        ||      };|;|/d<   |;| d<   d|v r|r|t        ||      }<|<|/d<   |<| d<   d|v r|r|t        ||      }=|=|/d<   |=| d<   d|v r| r|!t        |!|      }>|>|/d<   |>| d<   d |v r|"r|#t        |#|      }?|?|/d <   |?| d!<   d"|v r|$r|%t        |%|      }@|@|/d"<   |@| d#<   d$|v r|&rt        |'|      }A|A|/d$<   |A| d%<   d&|v r|(rt        |)|      }B|B|/d&<   |B| d'<   d(|v r|*rt        |+|      }C|C|/d(<   |C| d)<   t        j                  d|t        j                  *      }D|j                         D ]  \  }E}FDt        |F      |/|E   z  z   }D t        |j!                               }G|$t#        t%        |      j'                  d+d,            n
t#        d-      }Ht)        |G|,xs t*        |-xs t,        ||'|H|	|)||||.      }It/        ||I||/      }J|Jd0   j1                  t        j                  1      }Kt        |      }Lg }Mg }Ng }Og }Pt3        Dj1                  t        j                  1            D ]  \  }Q}RK|Q   }S|SdkD  rL|.z  Sz  }Tt5        |t7        d|T            }Un|}UPj9                  U       R|Uz  }VOj9                  |V       L|Vz  }WNj9                  |W       |L|Wz   }LMj9                  |L        t        j                  O|t        j                  *      }Xt        j                  P|t        j                  *      }Y|X| d2<   M| d3<   t        j                  N|4      | d5<   |X| d6<   |Y| d7<   Jd8   j:                  | d8<   |Jd0   j:                  | d0<   |Jd8   j:                  t        j                  |M|4      j=                  d9      j                  |      j:                  z  d:z  | d;<   |j                         D ]@  \  }E}F|/|E   t        |F      z  | d3   j=                  d9      j                  |      z  | d<|E <   B | d3   j?                         }Zt        | d3   |Zz  d9z
  j5                         d=z        }[tA        d>d?d@t        | d3   j                  dA         t        | d3   j                  dA   |z  d9z
        d=z  |[|t        XjC                         jE                         dBz        dCD       | S )Ez
    One NAV account: ``portfolio_ret = sum(w_i * sleeve_ret_i)``; NAV compounds daily.
    Sleeve returns come from each sleeve's standalone backtest (``pct_change`` on equity).
    r   r   ret_spy_thetar   r   rB   r   ret_vxx_regimer   ret_equity_dipr   ret_vxx_long_callr   rI   ret_macro_awr   ret_sector_momentumr   ret_qs_actionable_etfr%   ret_tactical_awr'   	ret_tsmomr#   ret_ride_rocketsr   ret_johansen_etfr   ret_orb_zarattinir    ret_ma_slope_topnr!   ret_ma_slope_inverser"   ret_ma_slope_intradayr,   ret_vol_edger1   ret_ls_equityr/   ret_spy_bear_callrb   r   r   r   )r  r  r  r  r   r  r  r  r   r   r   r   rv   )r   r   margin_scale1_usdr  r  r  rS   r  r  r  r  r  r  r  r
  r   zH1-stacked-notionalz0combine_best_ideas_stack.py:_apply_fund_mode_mtmfund_mode_nav_summaryr  i'  )r  r  r  r   mean_abs_port_ret_bpsr  )#r   r   rZ   r[   rf   rh   rD   r   ri   rP   rg   rX   rY   r   ru   r!  r"  r   r   r#  r	   r$  r%  r
   r+  	enumerater-  r/  r(  r   shiftr,  r   absr.  )\r   r^   rv   r   r   
spy_equity
vxx_equityr   r   r  russell3000_dip_dailyr   r   with_vxx_long_callvxx_long_call_dailywith_macro_awr1  macro_aw_equity_colwith_sector_momentumsector_momentum_dailyrN  rO  with_tactical_awr  
with_tsmomwith_ride_rocketsr  r0  rP  rQ  rR  r   rS  rT  rU  rV  rW  rX  rY  r   rZ  r   r[  r\  r  r  r   ret_mapret_spyret_vxxret_spret_dipret_r3ret_lc	ret_macroret_secret_qsret_tacrf  ret_rrret_johret_orbret_topnret_inv	ret_intraret_veret_lsret_bccport_ret_scale1rE  r?  r  r  sleeve_margin_map	margin_dfmargin_scale1r7  r8  r9  r<  eff_scale_valsrB  r_s1m_s1	max_scale	eff_scalerrw   port_reteff_scale_seriesrK  rL  s\                                                                                               rF   "_apply_fund_mode_mtm_returns_blendr  1  s   n JJLE$&Gl"2%&1C1CC1H
  '!(o|#!j&8&8&=&C&C&E&J&J1&MPQ&Q ((-335@@BII#NG6u=S7TV]^G '")|#'(8#>G+,A3GFtmfun4G '"),&+='(;SA#) %+!"\!m/C,?
	 (
 )nL(-A()>D%,!"'.#$|+"#/'(?E'-#$)/%&$)9():C@!(#* ,:*;<	$&k%*;'(:C@"($* !%*;@R@^();SA")$+ !,&+=BUBa()<cB#* %,!",&+=BUBa)*=sC#+ %-!"l*!".()?E&-"#(/$%|+"#/*+BCH	'0#$)2%&\!m'<$
 &nl"~'=%!'o,&+=()<cB#* %,!" ii3bjjAO$$& DQ)E!Hws|,CCD **,-N % 	S ((}EF+/+?  0%#<'<)>->%+1)'/!  &\jI 12;;"**;MM
 .CDD!#M"$N_55BJJ5GH 4Q#:.$6IJC(;<I"Ii(9QAgCCiC  yycDHyys"**M%-E
!""E
"$))D"<E
 (E
$4E
 !#,-B#C#J#JE
 !*+>!?!F!FE
'(//
))D
$
*
*1
-
4
4W
=
D
D	E
	 


 $$& nQ#*3<%(#:UCS=T=Z=Z[\=]=d=del=m#m	# n !"))+DU+,t3a7<<>#EFF+C'U#3499"=> %e,<&=&B&B2&F&PST&T UX[ [ (%*8<<>+>+>+@5+H%I
	 LrH   	quarterly)r   fund_nav_rebalancerN  rO  rP  rQ  rR  r   rS  rT  rU  rV  rW  rX  rY  r   rZ  r   r[  r\  r  r  r   c       -        d   |dk(  rt        | ||f||||	|-|.|||(|*|||
| |/dS t        | ||fi d|d|d|d|d|d|	d	|
d
|d|d|d|d|d|d|d|d|d|d|d|d|d|d|d|d|d|d|d|d|d| d |!d!|"d"|#d#|$d$|%d%|&d&|'d'|(d(|)d)|*d*|+d+|,d,|-d-|.d.|/S )/zMDispatch fund-mode combine: quarterly sized (default) or legacy return blend.r  )r   r   r   r   r  r  r  r0  r   r   r  r1  r  r   r   r   r   rw  rx  r   r   r  ry  r   r   rz  r{  r|  r1  r}  r~  r  rN  rO  r  r  r  r  r  r0  rP  rQ  rR  r   rS  rT  rU  rV  rW  rX  rY  r   rZ  r   r[  r\  r  r  r   )rM  r  )0r   r^   rv   r   r   r  rw  rx  r   r   r  ry  r   r   rz  r{  r|  r1  r}  r~  r  rN  rO  r  r  r  r  r  r0  rP  rQ  rR  r   rS  rT  rU  rV  rW  rX  rY  r   rZ  r   r[  r\  r  r  r   s0                                                   rF   _apply_fund_mode_mtmr  &  sG   h [(3
 &!+!'-#1)+/)- 3+%
 	
( .0 "	0
 0 0 0 (0 0 *0 40 0 0 .0 00  $!0" &#0$ 0%0& 2'0( 4)0*  6+0, !8-0. */00 ,102 304 ,506  708 .90: ,;0< .=0> .?0@ 0A0B .C0D 0E0F 4G0H  6I0J  6K0L !8M0N $O0P &Q0R &S0T (U0V .W0X 0Y0Z $[0\ *]0^ (_0 0rH   none)rN  r  r  r  rP  rR  rS  rU  rW  rY  rZ  r[  nav_rebalance	fund_moder  r   with_vix_dynamic_scalec                   g }|r|j                  d       | r|j                  d       |r|j                  |rdnd       |r|j                  d       |r|j                  d       |r|j                  d       |r|j                  d       |r|j                  d	       |r|j                  d
       |	r|j                  d       |
r|j                  d       |r|j                  d       |r|j                  d       |r|j                  d       |r|j                  d       |r|j                  d       |r|j                  d       |r|j                  d       |r(|j                  d       |dk(  r(|j                  d       n|dk(  r|j                  d       |r|j                  d       |syddj                  |      z   S )Nr   d6	sp500_dipr   r   r   r   r   r%   r'   r#   r   r   r    r!   r"   r,   r1   r/   fundr  nav_qvix_dyn _plus_)r(  join)with_d6r   equity_dip_sp500_onlyrz  r|  r~  rN  r  r  r  rP  rR  rS  rU  rW  rY  rZ  r[  r  r  r  r   r  partss                           rF   _out_suffixr    s   4 E\"T$9[|L_%Z &'()]#W^$^$_%_%'(()Z [!_%V,LL!	+	%WYhmmE***rH   c                    t               }d}| D ]l  }t        |j                        t        |j                        dz
  dz  f}||k7  s9|j	                  t        j                  |      j                                |}n |S )z:First trading session of each calendar quarter in *index*.Nr     )r!  r   yearmonthaddrP   r   rT   )rS   r   prev_qrr   qs        rF   r&  r&    sr     UC%)F \CMA-!34;GGBLL$..01F	
 JrH   c               .   |D cg c]  }|| j                   vs| }}|rt        d|       | j                         } |D ]*  }| |   j                  t        j
                        | | d<   , t        | j                        }t        |       }t	        j                  |t        j
                        }	t        |      }
d}| |   j                  d      j                  t        j
                        }| j                  }t        |      D ].  }||   }|dkD  r||v r|
t        |      z  }||	|<   |
||   |z  z  }
0 t        j                  |	| j                  d	      }|D ]  }| | d   |z  | |<    | j                   D cg c]3  }|j!                  d
      r |j#                  d      s||vr||k7  rd|vr|5 }}|D ]  }| |   |z  | |<    | |   j                  d      | |<   || d<   t        |      | |   j%                         z   | d<   | S c c}w c c}w )a1  
    At the **open** of each calendar quarter (first session in the index), set
    ``scale = NAV / initial_capital`` using prior close NAV; multiply that
    quarter's sleeve ``*_base`` dollar PnL by ``scale``.

    Adds ``nav_rebase_scale``, ``nav_usd``, and ``{col}_base`` for each rebased sleeve.
    znav rebase missing columns: _baser  rj   r  axisr   nav_rebase_scale)rS   namepnl_
best_ideasnav_usd)rU   rV   r   rW   rX   rY   r&  rS   rd   onesru   r   r+  r'  rP   rg   
startswithendswithcumsum)r   pnl_colsinitial_capital	total_colcmissingcolr5  r6  scalesr7  	cur_scale
base_totalr   rB  rr   scale_s	extra_pnls                     rF   _apply_quarterly_nav_rebaser    sF    #=Qau}}&<q=G=5gY?@@JJLE =$Sz00<Um= #5;;/GE
AWWQbjj)F

 CIx$$!$,55BJJ5GJKKE1X )1Xq5R7]eO44Iq	z!}y(() iiekk8JKG 4cU%=)G3c
4 <<

7#XN! 	
I   *3Z')c
*X***2E) 'E
_-i0@0G0G0IIE)LO >2s   HH 8H)rN  r  r  r  rP  rR  rS  rU  rW  rY  rZ  r[  r   c                "   |rg }nA|rddg}n:dgt         D cg c]  }d| 	 c}d}| r|j                  d t        D               |r$|j                  d       |s|j                  d       |r|j                  d       |r|j                  d	       |r|j                  d
       |r|j                  d       |r|j                  d       |r|j                  d       |	r|j                  d       |
r|j                  d       |r|j                  d       |r|j                  d       |r|j                  d       |r|j                  d       |r|j                  d       |r|j                  d       |r|j                  d       |S c c}w )Nr   r   r  pnl_VRPc              3  &   K   | ]	  }d |   yw)r  N )r   r   s     rF   r   z%_stack_pnl_columns.<locals>.<genexpr>P  s     4q$qc
4s   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )LIT_SIDSextendD6_SIDSr(  )r  r   r   rz  r|  r~  rN  r  r  r  rP  rR  rS  rU  rW  rY  rZ  r[  mtmr   colsr   s                         rF   _stack_pnl_columnsr  2  si   . 	#%;<&Sh)GD*)GSSKK4G44O$KK-.'(N#)*+,%&K &'&''('(*++,N#O$'(KK *Hs   Fc                   t        j                  | dd      }t        j                  |j                        j	                         |_        i }t
        D ]U  }d| }||j                  vrt        d| d|        t        ||         j                  |      j                  d      ||<   W d|j                  v r/t        |d         j                  |      j                  d      |d	<   |S )
Nr   TrL   eq_Missing  in rB   eq_VRPVRP)rP   rQ   rR   rS   rT   r  rU   rV   rG   rZ   rD   )r]   r^   r_   r   sidr  s         rF   _load_lit_daily_from_equity_csvr  v  s    	TQD	9B~~bhh'113BH "C HC5kbjj XcU$tf566%bg.66s;BB3GC	H
 2::'85==cBII#NE
JrH   pnl_best_ideaspnl_colr  c                  || j                   vrt        d|      g }t        |      }t        |      }| j                  | d   j                  j
                  d      D ]|  \  }}t        ||   j                               }	|rt        d      }
t        d      }nb|dkD  r|	|z  dz  nd}
|||   j                         z   }t        |      r0t        ||j                         z  d	z
  j                               d
z  nd}||	z   }|dkD  r||z  d	z
  d
z  nd}|||   j                         z   }t        |      r0t        ||j                         z  d	z
  j                               d
z  nd}|j                  t        |      t        |	d      t        |
d      t        |d      t        |d      t        |d      t        |d      t        |d      t        |      d	       |} t        j                  |      S )u  
  Yearly stats with two return definitions (Approach B dollar PnL):

  * **return_pct_constant** — ``pnl_usd / capital`` with fixed ``capital``
    (default $100k). Valid only when ``pnl_col`` is **unsized** sleeve PnL
    (``nav_q`` research combine). **NaN in fund-mode** — sized account PnL
    divided by $100k is not a return (see ``return_pct_chained``).
  * **return_pct_chained** — ``pnl_usd / start-of-year equity``. Account
    return; use this for fund-mode / live NAV books.
    zyearly table needs column rn   T)sortnanr   r  rB   r  r   r   )	r  pnl_usdreturn_pct_constantmax_dd_pct_constantreturn_pct_chainedstart_equity_chainedend_equity_chainedmax_dd_pct_chainedsessions)rU   rV   ru   groupbyrr   r  r   r  rd   r,  r-  r(  r   roundrP   	DataFrame)r_   rv   r  r  rows
eq_chainedr   yrgrw   ret_constantdd_fixedintra_fixedend_chainedret_chainedintra_chained
dd_chaineds                    rF   _yearly_tabler    s   " bjj 3G;?@@DwJ
.CBvJMM..T: "!AAgJNN$% <LU|H25'C#I.sL'
 1 1 33K {# k&8&8&::a?DDFG#M 
 !3&>H1n{Z/!3s:RU"QwZ%6%6%88 =! MM$8$8$::a?DDFG#M 	
 	B a=',\1'=',Xq'9&+K&;(-j!(<&+K&;&+J&:F
	
 !
E"!F <<rH   )r  c               V   t        t        |dd            s| i fS |rt        t        |dd            nd}t        |t        |dd      t        |dd      t        |dd      	      \  }}	}
t        t        |d
d             }t	        d|dd|	dd|
dd|dd|rdnd dd       t        | ||||t        |j                        t        |j                        t        |dd      t        |dd      t        |dd      t        |j                        |t        |j                        |      S )z>Apply VIX-regime leverage when ``--vix-dynamic-scale`` is set.vix_dynamic_scaleFr   rj   vix_scale_highNvix_scale_midvix_scale_low)
scale_high	scale_mid	scale_lowno_vix_spy_gateu   VIX dynamic scale: calm→.2fu   ×  normal→u   ×  stressed bear→u
   ×  (base=u   ×, zSPY>SMA200 gatezno SPY gate)Tflush)r   r   rv   
base_scalevix_lowvix_highr  r  r  smoothspy_trend_gatespy_smar  )boolgetattrru   r   printr   r  r  r   
vix_smoothvix_spy_sma)r   argsr  r   r   rv   r  r  shsmslgates               rF   _maybe_apply_vix_dynamic_scaler%    sK    159:by<Ewt\3783J)4!148$6$6	JBB GD"3U;<<D	
$RHM"S Bc(*Z,<D $-
8	; 	 ,dll#t}}%4!148$6$64??#D$$% rH   c                   m t        j                  t        j                  d      d         } | j	                  dd       | j	                  dd       | j	                  d	t
        d
       | j	                  dt        t               | j	                  dt        t               | j	                  dt        t               | j	                  dd       | j	                  ddd       | j	                  ddd       | j	                  dddd       | j	                  ddd       | j	                  ddd d!       | j	                  d"t
        d d#d$%       | j	                  d&t
        d d#d'%       | j	                  d(t
        d d#d)%       | j	                  d*t
        d d#d+%       | j	                  d,t
        d d#d-%       | j	                  d.dd/       | j	                  d0t        t        d12       | j	                  d3t        d45       | j	                  d6dd7       | j	                  d8dd9       | j	                  d:t        t        d;2       | j	                  d<t
        d d#d=%       | j	                  d>dd?       | j	                  d@ddA       | j	                  dBddC       | j	                  dDt        t        dE2       | j	                  dFt
        d d#dG%       | j	                  dHddI       | j	                  dJt        dKdL2       | j	                  dMddN       | j	                  dOt        t        dP2       | j	                  dQt
        d d#dR%       | j	                  dSddT       | j	                  dUddV       | j	                  dWt        t         dX2       | j	                  dYt
        d d#dZ%       | j	                  d[dd\       | j	                  d]t        t"        d^2       | j	                  d_t
        d d#d`%       | j	                  daddb       | j	                  dcddd       | j	                  det        t$        df2       | j	                  dgt
        d d#dh%       | j	                  diddj       | j	                  dkddl       | j	                  dmt        t&        dn2       | j	                  dodpdpdqgdrs       | j	                  dtt
        d d#du%       | j	                  dvddw       | j	                  dxddy       | j	                  dzt        t(        d{2       | j	                  d|t
        d d#d}%       | j	                  d~dd       | j	                  ddd       | j	                  dt        t*        d2       | j	                  dt
        d d#d%       | j	                  ddd       | j	                  dt
        ddd%       | j	                  ddd       | j	                  dt
        dd2       | j	                  dt
        dd2       | j	                  dt
        d dd%       | j	                  dt
        d dd%       | j	                  dt
        d dd%       | j	                  dt        dd2       | j	                  ddd       | j	                  dt        dd2       | j	                  ddd       | j	                  ddd       | j	                  ddd       | j	                  dt        t,        d2       | j	                  dt
        d d#d%       | j	                  ddd       | j	                  ddd       | j	                  ddd       | j	                  ddd       | j	                  ddd       | j	                  dt        t.        d2       | j	                  dt        t0        d2       | j	                  dt
        d d#d%       | j	                  dt
        d d#d%       | j	                  ddd       | j	                  ddd       | j	                  dddì       | j	                  dddŬ       | j	                  dt        t2        dǬ2       | j	                  dt
        d d#dɬ%       | j	                  dddˬ       | j	                  dt        t4        dͬ2       | j	                  dt        t6        dϬ2       | j	                  dddѬ       | j	                  dt        t8        dӬ2       | j	                  dddլ       | j	                  ddd׬       | j	                  ddd٬       | j	                  ddd۬       | j	                  dt        t:        dݬ2       | j	                  dt        t<        d߬2       | j	                  ddd       | j	                  dt
        d dd%       | j	                  dt
        d dd%       | j	                  ddd       | j	                  ddd       | j	                  ddd       | j	                  dt        t>        d2       | j	                  dt        d d2       | j	                  ddd       | j	                  ddd       | j	                  ddd5       | j	                  ddd       | j	                  ddd       | j	                  ddd       | j	                  dt        t@        d2       | j	                  d dd       | j	                  ddd       | j	                  dt
        dd2       | j	                  dt        tB        d2       | j	                  d	dd
       | j	                  dt        tD        dz         | j	                  ddd       | jG                         mtI        mjJ                        }tI        mjL                  xs |xr mjN                         }|rdnd}tI        mjP                  xs mjR                  xs |      }tI        mjT                        xr | }tI        mjV                        }tI        mjX                  xs |      }tI        mjZ                  xs |      }tI        mj\                        }	tI        mj^                        xr | }
|xr mj`                   }tI        mjb                  xs mjd                  xs |      }tI        mjf                  xs mjd                  xs |      }tI        mjh                  xs |xr mjj                         }tI        mjl                  xs |xr mjn                         }tI        mjp                  xs |xr mjr                         }tI        mjt                        }tI        mjv                        }|r|sty        d      |r|sty        d      |r|sty        d      mjr                  r|sty        d      tI        mjz                        }|r|sd}ntI        mj|                        }tI        mj~                  xs mj                        }mj                  t>        k7  rmj                  }n0|r	|st        }n%mj                  mj                  }nmj                  }mj                  t        k7  rmj                  }n|rt        }nmj                  }tI        mj                  xs mj                        }t        mj                  mj                  |xr | xr | |      \  }}i }tI        mj                  xs |      }|rmj                  sdm_L        t        t        mdd             }t        mj                        }|r|d k(  rt        d| dd       |r|d k(  rt        nt        }n|d k(  rt        }nt        }t        di dtI        mj                        d|d|dtI        mj                        d|d |d!|d"|d#|d$|	d%|d&|
d'|d(|d)|d*|d+|d,|d-|d.|d|d/|d0tI        t        md1d2            } t        di d3mj                  d4mj                  d5mj                  d6mj                  d7mj                  d8mj                  d9mj                  d:mj                  d;mj                  d<mj                  d=mj                  d>mj                  d?mj                  d@mj                  dAmj                  dBmj                  dCmj                  dDmj                  dEi dF| dG| d5|d6tI        mj                        xr | d7|d8|d9|d:|d;|d<|	d=|d>|
d?|d@|dA|dB|dC|dD|id/|}!|rvt        t        mdHd            }"|"dk7  rdI|"dJdK|"dLz  dMdNndO}#t        dPdQj                  dR |!j                         D              z   |#z   dS| z   d       |rmj                  sty        dT      d dU	 	 	 	 	 	 	 	 	 	 	 dmfdV}$|ri|r|s |$dW|dXdYg dZ[       nP |$dW|d\t        mj                        ]       |s, |$d^mj                  d_t        mj                        ]       mj                  r.|s, |$d^mj                  d_t        mj                        ]       mj                  rdd lr}%mj                  j                         j                         }&t        j                  t        t        d`z        dmj                  d	t        mj                        dat        mj                        dt        |&j                  |&j                  j                  dbdO                  g
}'mj                  r|'dmj                  gz  }'t        dcd       |%j                  |'dt        t              d       mj                  rdd lr}%mj                  j                         j                         }(|(j                  |(j                  j                  dedO            }(t        j                  t        t        dfz        dgdhd	t        mj                        dimj                  dt        |(      g
}'mj                  r|'djmj                  gz  }'t        dkd       |%j                  |'dt        t              d       mj                  rdd lr}%mj
                  j                         j                         })|)j                  |)j                  j                  dedO            }*t        j                  t        t        dlz        dmj                  d	t        mj                        dmt        mj                        dt        |*      g
}'mj                  r|'dmj                  gz  }'t        dnd       |%j                  |'dt        t              d       mj                  s|r
|j                         sdd lr}%|j                         j                         }+|+j                  |+j                  j                  dedO            },t        j                  t        t        doz        dp|dmj                  d	t        mj                        dt        |,      g
}'mj                  r|'dmj                  gz  }'t        dq| drd       |%j                  |'dt        t              d       mj                  rdd lr}%mj                  j                         j                         }-|-j                  |-j                  j                  dedO            }.t        j                  t        t        dsz        dmj                  d	t        mj                        dt        |.      g}'mj                  r|'dmj                  gz  }'t        dtd       |%j                  |'dt        t              d       |rM|j                         s<|r|sdumj                   dv}/ndumj                   dw}/ty        dx| dy|/       |rF|sDmj                  j                         s)ty        dxmj                   dzmj                   dw      |r>|rt        d{d       n+t        d|mj                  d}d~|dd|dd       mj                  rDmj                  j                         s)ty        dxmj                   dmj                   d      |r]mj                  j                         sAty        dxmj                   dt        mj                         dmj                   d      |r:t        dmj                  j                   dmj                   dd       |rFmj
                  j                         s*ty        dxmj
                   dmj                   d      |r)t        dmj
                  j                   d       |r4|j                         s#ty        dx| d| dmj                   d      |r"t        d| d|j                   d       |rFmj                  j                         s*ty        dxmj                   dmj                   d      |r)t        dmj                  j                   d       mj                  rdd lr}%mj                  j                         j                         }0|0j                  |0j                  j                  dedO            }1t        j                  t        t        dz        dmj                  d	t        mj                        dt        |1      g}'mj                  r|'dmj                  gz  }'t        dd       |%j                  |'dt        t              d       |rFmj                  j                         s*ty        dxmj                   dmj                   d      |r)t        dmj                  j                   d       mj                  rdd lr}%mj                  j                         j                         }2|2j                  |2j                  j                  dedO            }3t        t        dz        t        t        dz        dmj                  dmj                  xs dd	t        t        mj                              ddt        |3      g}'t        dd       |%j!                  |'       |	r8mj                  j                         sty        dxmj                   d      |	r)t        dmj                  j                   d       |
rFmj"                  j                         s*ty        dxmj"                   dmj                   d      |
r)t        dmj"                  j                   d       mj$                  rdd lr}%mj&                  j                         j                         }4|4j                  |4j                  j                  dedO            }5t        j                  t        t        dz        dmj                  dmj                  d	t        mj                        dt        |5      g
}'t        dd       |%j                  |'dt        t              d       |rkmj&                  j                         sOty        dxmj&                   dmj                   dmj                   dt        mj                         d	      |r)t        dmj&                  j                   d       mj(                  s|rmj*                  j                         sdd lr}%tD        dz  }6t        j                  t        t        dz        dmj                  dddt        |6      g}'mj                  r|'dmj                  gz  }'t        dd       |%j                  |'dt        t              d       |rFmj*                  j                         s*ty        dxmj*                   dmj                   d      |r)t        dmj*                  j                   d       mj,                  s|rmj.                  j                         sdd lr}%tD        dz  }7t        j                  t        t        dz        dmj                  dddt        |7      g}'mj                  r|'dmj                  gz  }'t        dd       |%j                  |'dt        t              d       |rFmj.                  j                         s*ty        dxmj.                   dmj                   d      |r)t        dmj.                  j                   d       mj0                  s|rЉmj2                  j                         sdd lr}%t        j                  t        t        dz        dmj                  dmj                  rmj                  ndd	t        t        mj                              dt        tD        dz        g
}'t        dd       |%j                  |'dt        t              d       |r8mj2                  j                         sty        dxmj2                   d      |r)t        dmj2                  j                   d       mj4                  r#dd lr}%mj6                  j                         j                         }8|8j                  |8j                  j                  dedO            }9t        j                  t        t        dz        dmj                  d	t        mj                        dt        mj8                        dt        |9      g
}'mj                  r|'dmj                  gz  }'t        dmj8                   dÝd       |%j                  |'dt        t              d       |rUmj6                  j                         s9ty        dxmj6                   dĉmj8                   dmj                   dŝ      |r8t        dƉmj8                   dǉmj6                  j                   d       mj:                  rdd lr}%mj<                  j                         j                         }:|:j                  |:j                  j                  dedO            };t        j                  t        t        dz        dmj                  d	t        mj                        dt        |;      g}'mj                  r|'dmj                  gz  }'t        dɐd       |%j                  |'dt        t              d       |rFmj<                  j                         s*ty        dxmj<                   dʉmj                   d˝      |r)t        d̉mj<                  j                   d       mj>                  rdd lr}%mj@                  j                         j                         }<|<j                  |<j                  j                  dedO            }=t        j                  t        t        dz        dmj                  d	t        mj                        dt        |=      g}'mj                  r|'dmj                  gz  }'t        dΐd       |%j                  |'dt        t              d       |rFmj@                  j                         s*ty        dxmj@                   dωmj                   dН      |r)t        dщmj@                  j                   d       mjB                  r8dd lr}%mjD                  j                         j                         }>|>j                  |>j                  j                  dedҫ            }?|>j                  |>j                  j                  dedӫ            }@t        j                  dԐdՐdpdd	t        mj                        dmj                  dt        |>      dt        |?      dt        |@      g}'mj                  r|'dmj                  gz  }'t        dڐd       |%j                  |'dt        t              d       mjF                  rmj                  sdd lr}%tD        dz  }At        j                  dԐdՐdpdd	t        mj                        dmj                  g	}'mj                  r|'dmj                  gz  }'|'dt        A      gz  }'t        dݐd       |%j                  |'dt        t              d       mjH                  rdd lr}%mjJ                  j                         j                         }B|BjL                  dz  }Ct        j                  dԐdߐdgtN        d	t        mj                        dmj                  dt        |B      dt        |C      }'mj                  r|'dmj                  gz  }'t        dd       |%j                  |'dt        t              d       |rdg}D|rDjQ                  d       |rDjQ                  d       |rDjQ                  d       |rDjQ                  d       dj                  D      dz   }E|rEdz  }E|rEdz  }E|rEdz  }Et        Ed       |s8mjR                  j                         sty        dmjR                   d      mjT                  rdd lr}%mjV                  j                         j                         }F|FjL                  jY                  dd       t        j                  t        t        dz        ddj                  tZ              dmj                  dmj                  d	t        mj                        dddt        mj\                        dmj^                  dt        |F      g}'t        dd       |%j                  |'dt        t              d       n8mjV                  j                         sty        dxmjV                   d      ta        jb                  mjR                  dg      }Gta        jd                  |Gd         jf                  ji                         |Gd<   |Gjk                  d      jm                         }Gmj                  r|rmj                  mj                  |g}H|rHjQ                  mj
                         |rHjQ                  |       |	rHjQ                  mj                         |r|sHjQ                  mj                         |rHjQ                  mj6                         |rHjQ                  mj&                         |rHjQ                  mj<                         |rHjQ                  mj*                         |rHjQ                  mj.                         |rHjQ                  mj2                         to        mj                  mj                  gH }Ita        jp                  |I      }Jts        |J|Imj                  |mj                  |||      }|r'tu        mj
                  Imj                        Jd<   |rtu        |Imj                        Jd<   tu        mj                  Imj                        Jd<   tu        mj                  |Imj                        |Jd<   |	r'tu        mj                  Imj                        Jd <   |r'tu        mj6                  Imj                        Jd<   |r'tu        mj@                  Imj                        Jd<   |r'tu        mj&                  Imj                        Jd<   |r'tu        mj<                  Imj                        Jd<   |r'tu        mj*                  Imj                        Jd<   |r'tu        mj.                  Imj                        Jd<   |r'tu        mj2                  Imj                        Jd<   |sty        d      tw        JImj                  fi d	|!dHt        t        mdHd            d|d
ta        jx                  t
              dd d|d|d|dmj                  d|d|dd2dmj                  dd2dmj                  dt        mj                        d |dmj
                  d!|d|r|nd d"|dmj                  d#|d$|	dmj                  dmj                  d%|d|rmj&                  nd d&|
d|
rmj"                  nd d'|d|rmj*                  nd d(|d|rmj.                  nd d)|d|rmj2                  nd d*|d|rmj6                  nd d+|d |rmj<                  nd d,|d!|rmj@                  nd d"d d#d d$d%}Jt{        di dd2d|d|dd2dd2d |d!|d"|d#|d$|	d%|d&|
d'|d(|d)|d*|d+|d,|d&dd/d}K|J|K   j}                  d'(      |Jd)<   |Jd*   j                         j                  d+      |Jd,<   i }Lt        |Jmdmj                  mj                  mj                  |K-      \  }J}L|Jj                  d.      }Mmj                  j                         j                         }A|AjL                  jY                  dd       t        |A |  d/      }N|Mj                  |Nd2       d0}O|s|s|rd1}O|rOd2z  }O|rOd3z  }O|rOd4z  }O|rOd5z  }O|rOd6z  }O|rOd7z  }O|d k(  rOd8z  }OLrOd9z  }Ot        Jd*   O d:      }Pd;|sd<nd=|d>   dd?|d@   dddAdBdC}Q|rdDQd=<   |rdEQdC<   |rdFmj8                   dGQdB<   |rdHQdD<   |rdIQd?<   |rdJQd@<   |rdKQdA<   i dLOd/dd*|dM|rmj8                  nd d|r$t        mj6                  j                               nd d,|d!|r$t        mj@                  j                               nd dN|d|rt        |j                               nd dOtI        |xr |       d+|d |r$t        mj<                  j                               nd d%|d|r$t        mj&                  j                               nd d'|d|r$t        mj*                  j                               nd d(|i d|r$t        mj.                  j                               nd d)|d|r$t        mj2                  j                               nd dP|d.|d|r|nd d	|r|!nd dHt        t        mdHd            dQd&d|dR|dSQdTmj                  dUt        Id   j                               dVt        |IdW   j                               dXt        t        |I            P}RLrRj                  L       |rdYJj                  v rRj                  t        JdY   j                               t        |JdY   j                               t        t        |JdY   j                               dZz  d[z        d[z  d\       t        A |  d]      }S|Sj                  t        j                  Rd^_             Mj                         }T|Td*   j                  t
              j                         j                  d+      |Td`<   t        |Tmj                  d`da      }Ut        |A |  db      }V|Uj                  |Vd2       t        dcO dd| ded       t        df|RdU    dg|RdV    dh|RdX    did       t        djPdk   dldm|Pdn   dldo|Pdp   dJdq|Pdr   dsdt|Pdu   d}
d       t        dvdQj                  dw |!j                         D              z   d       |rOdYJj                  v r?t        dxRj                  dyd      d}dz|Rj                  d{d      d}d       t        Ug d|   j                  d2      d       t        d}N d       t        d~S d       y mj                  rrmj                  rmjD                  nmj                  }W|Wj                         s%mj                  rdnd}/ty        dxW d|/       ta        jb                  Wdg      }Xta        jd                  |Xd         jf                  ji                         |Xd<   |Xjk                  d      jm                         }X|Xj                  j                  Gj                        }I|I|Ita        j                  mj                        k\  |Ita        j                  mj                        k  z     }It        |I      dLk  rty        dt        I       d      Xd*   j                         j                  d+      j                  I      j                  d+      }Yta        jp                  |I      }J|Y|Jd<   mj                  sYJd<   Gj                  D ]F  }Z|Zj                  d      sZdk7  sGZ   j                  I      j                  d+      J|Z<   H Gd   j                  I      j                  d+      Jd<   |r)ts        JImj                  |mj                  |||      }mj                  r&tu        mj                  Imj                        Jd<   |r3t        mj                  It        mj                              Jd<   |r'tu        mj
                  Imj                        Jd<   |rtu        |Imj                        Jd<   |r'tu        mj                  Imj                        Jd<   |r'tu        mj                  Imj                        Jd<   |	r'tu        mj                  Imj                        Jd <   |r'tu        mj&                  Imj                        Jd<   |
r'tu        mj"                  Imj                        Jd<   |r'tu        mj*                  Imj                        Jd<   |r'tu        mj.                  Imj                        Jd<   |r'tu        mj2                  Imj                        Jd<   dXj                  v r+Xd   j                  I      j                  d+      Jd<   d*Gj                  v r)Gd*   j                  I      j                         Jd<   t{        di dtI        mj                        d|d|dtI        mj                        d|d |d!|d"|d#|d$|	d%|d&|
d'|d(|d)|d&d}Kd*Gj                  v r%Gd*   j                  I      j                         nd }[|rtw        JImj                  fi d	|!dHt        t        mdHd            d|d
Xd*   d[d|d|d|dmj                  d|d|dtI        mj                        dmj                  d|dmj                  dt        mj                        d |dmj
                  d!|d|r|nd d"|dmj                  d#|d$|	dmj                  dmj                  d%|d|rmj&                  nd d&|
d|
rmj"                  nd d'|d|rmj*                  nd d(|d|rmj.                  nd d)|d|rmj2                  nd d"Wd#mjR                  d$d%}Jnw|d k(  r't        JKmj                  d)      }J|Jd   |Jd*<   nKJK   j}                  d'(      |Jd)<   t        mj                        |Jd)   j                         z   |Jd*<   Jd*   j                         j                  d+      |Jd,<   d)|Jj                  vrJK   j}                  d'(      |Jd)<   i }Lt        Jm|mj                  mj                  mj                  K-      \  }J}L|Jj                  d.      }Mmj                  j                         j                         }A|AjL                  jY                  dd       t        |A |  d/      }N|Mj                  |Nd2       t        }Omj                  rOdz  }O|r$|rOdz  }OnOd|d>   dd?|d@   ddz  }Omj                  rOdz  }O|rOdz  }O|rOdz  }O|rOdz  }O|rOdz  }O|rOd4z  }O|
rOdz  }O|rOdz  }O|rOdz  }O|rOd6z  }O|rOd7z  }O|d k(  rOd8z  }On|d k(  rOdz  }OLrOd9z  }Ot        Jd*   O d:      }Pt        ddd||Pj                  dk      |Pj                  dr      |Pj                  dp      |Pj                  du      |d       mj                  rddj                  tN               dnd}\|\dd}Q|r>|r dt        mj                         dQd<   nd|d>   dd?|d@   ddQd5<   mj                  rdmj                  ddQd6<   |rdQd7<   |rdQd8<   |rdQd:<   |	rdQd<<   |rdQd;<   |rdIQd?<   |rdJQd@<   |rdKQdA<   |rdQd=<   |
rdQd><   i dLOdP|d.|d|r|nd d	|r|!nd d-|dmj                  dQd&dtI        mj                        d|d|dtI        mj                        d|d|r$t        mj                  j                               nd d|rt        mj                        nd d |d|r$t        mj
                  j                               nd i d"|d|r$t        mj                  j                               nd d#|d$|	d|r$t        mj                  j                               nd d|	r$t        mj                  j                               nd d'|d|r$t        mj*                  j                               nd d(|d|r$t        mj.                  j                               nd d)|d|r$t        mj2                  j                               nd d%|d|r$t        mj&                  j                               nd d&|
d|
r$t        mj"                  j                               nd |r-|t        mj                        t        mj                        dni Qmj                  rt        tN              ng mj                  t        Id   j                               t        |IdW   j                               t        t        |I            t        Wj                               d|rdYJj                  v rt        JdY   j                               t        |JdY   j                               d%t        |Jj                  dta        jx                  t        t        mdHd                        t        t        mdHd            dz  k  j}                               t        t        |JdY   j                               dZz  d[z        d[z  dni d|rdddnmj                  dddiP}RLrRj                  L       t        A |  d]      }S|Sj                  t        j                  Rd^_             t        Mj                  d)diī      mj                  |ū      }Ut        |A |  db      }V|Uj                  |Vd2       t        dcO d| ded       t        df|RdU    dg|RdV    dh|RdX    did       t        djPdk   dldm|Pdn   dldo|Pdp   dJdq|Pdr   dsdt|Pdu   d}
d       t        dJd   j}                         dțd|Jd   j}                         dțd       |r̐dYJj                  v rt        JdY   j                               }]t        |JdY   j                               }^t        t        mdHd            }_t        |Jj                  dta        jx                  |_            |_dz  k  j}                               }`t        dx|]d}dz|^d}d|` d˝d       |d k(  rt        d̐d       nYt        d͉mj                  d}dΝd       t        Ug dϢ   j                  d2      d       t        dАd       |d k(  r)t        Ug dѢ   j                  d2      d       n(t        Ug dҢ   j                  d2      d       t        dN d       t        dԐd       t        dW d       t        d~S d       y ta        jb                  mjV                  dd֫      }ata        jd                  |aj                        ji                         |a_        |aj                  j                  Gj                        }I|I|Ita        j                  mj                        k\  |Ita        j                  mj                        k  z     }It        |I      dLk  rty        dt        I       d      t        mjV                  I      }bGd   j                  |I      j                  d+      }cta        jp                  |I      }J|c|Jd<   tZ        D ]  }db|d   Jd|d <    bd   Jd<   |r)ts        JImj                  |mj                  |||      }mj                  r&tu        mj                  Imj                        Jd<   |r3t        mj                  It        mj                              Jd<   |r'tu        mj
                  Imj                        Jd<   |rtu        |Imj                        Jd<   |r'tu        mj                  Imj                        Jd<   |r'tu        mj                  Imj                        Jd<   |	r'tu        mj                  Imj                        Jd <   |r'tu        mj&                  Imj                        Jd<   |
r'tu        mj"                  Imj                        Jd<   |r'tu        mj*                  Imj                        Jd<   |r'tu        mj.                  Imj                        Jd<   |r'tu        mj2                  Imj                        Jd<   mj                  rjmjJ                  j                         s3ty        dxmjJ                   dِdj                  tN                     ta        jb                  mjJ                  dd֫      }eta        jd                  |ej                        ji                         |e_        t        tN              }ft        mj                        t        |f      z  }gt        mj                        |gz  }htN        D ]j  }d|dej                  vrt        dd d܉mjJ                         t        ed         j                  I      j                  d+      hz  Jd|d <   l t{        tI        mj                        ||tI        mj                        |||||	||
|||d2ݫ      }K|d k(  r't        JKmj                  dÐ      }J|Jd   |Jd<   nKJK   j}                  d'(      |Jd<   t        mj                        |Jd   j                         z   |Jd<   Jj                  d.      }Mmj                  j                         j                         }A|AjL                  jY                  dd       t        |A |  de      }N|Mj                  |Nd2       t        |Jd   t              }Pdgt        tZ              mj                  r	g tN        ng dב}i|r)|rijQ                  d       nijQ                  d       mj                  rijQ                  d       |rijQ                  d       |rijQ                  d       |rijQ                  d       |rijQ                  d       |	rijQ                  d       |rijQ                  d       |
rijQ                  d       |rijQ                  d       |rijQ                  d       |rijQ                  d       t        }Omj                  rOdz  }O|r$|rOdz  }OnOd|d>   dd?|d@   ddz  }Omj                  rOdz  }O|rOdz  }O|rOdz  }O|rOdz  }O|rOdz  }O|	rOdz  }O|rOd4z  }O|
rOdz  }O|rOdz  }O|rOdz  }O|rOd6z  }O|d k(  rOdz  }Oi dLOdP|d-|dmj                  dQddtI        mj                        d|d|dtI        mj                        d|d|r$t        mj                  j                               nd d |d|r$t        mj
                  j                               nd d"|d|r$t        mj                  j                               nd d#|d$|	|r$t        mj                  j                               nd |	r$t        mj                  j                               nd ||r$t        mj*                  j                               nd ||r$t        mj.                  j                               nd ||r$t        mj2                  j                               nd ||r$t        mj&                  j                               nd |
|
r$t        mj"                  j                               nd |rt        |j                               nd |r%|s#t        mj                  j                               nd d|r-|t        mj                        t        mj                        dni mj                  r#t        mj                  j                               nd |r$t        mj                  j                               nd imj                  t        Id   j                               t        |IdW   j                               t        t        |I            mj                  ddddP}Rt        A |  dӝ      }S|Sj                  t        j                  |Rd^_             t        Mmj                        }Ut        |A |  d      }V|Uj                  |Vd2       t        dct         d| ded       t        df|RdU    dg|RdV    dh|RdX    dmj                  d}d       t        dj|Pdk   dldm|Pdn   dldo|Pdp   dJdq|Pdr   dsdt|Pdu   d}
d       t        dd       |d k(  r!t        dmj                  d}dd       K}j|jD ]\  }kt        J|k   j}                               }lt        d|kdd|ldțdhdL|lz  |Jd   j}                         z  dsdd       ^ |d k(  r9t        dd       t        Ug dѢ   j                  d2      d       nt        d͉mj                  d}dΝd       t        Ug dϢ   j                  d2      d       t        dd       t        |Ug dҢ   j                  d2      d       t        dN d       t        d~S d       t        dV d       y (   Nz

r   )description--startz
2016-01-04r   --endz
2026-06-18	--capitalr   )typer   z--vxx-dailyz--lit-equity-csvz--vrp-pnl-csvz--vrp-pnl-colpnl_vrpz	--run-lit
store_truezFRe-run combine_lit_stack_sleeves.py (slow) instead of --lit-equity-csv)actionhelpz--mtmzUse MTM daily PnL: lit4+VRP from evaluate_theta_margin daily equity; VXX from dynamic_vxx_regime_stack (per-sleeve MTM columns). Writes *_mtm_daily.csv instead of exit-day-only combine.z--nav-rebalance)r  r  r  zRebase all stack sleeve dollar PnL at each calendar quarter start: scale = NAV / --capital (prior close). Used for non-fund MTM combine only.)choicesr   r/  z--fund-modeu   Single NAV account with fractional sleeve weights. Default sizing rebases each sleeve's notional at quarter open to weight × --fund-scale × NAV (see --fund-nav-rebalance).z--fund-nav-rebalance)r  r  r  u	  How fund-mode sizes sleeves (default quarterly). quarterly: each sleeve notional = weight × fund-scale × prior-close NAV at calendar quarter open; PnL and margin scale from standalone backtests. none: legacy return-blend (fixed $100k sleeve sim, does not resize).z--fund-weight-spyWzHCapital weight for SPY theta+VRP MTM sleeve (default 0.40; renormalized))r+  r   metavarr/  z--fund-weight-vxxz2Capital weight for VXX regime stack (default 0.25)z--fund-weight-equity-dipz1Capital weight for equity dip slot (default 0.25)z--fund-weight-vxx-long-callz/Capital weight for VXX long call (default 0.10)z--fund-weight-macro-awzLCapital weight for Macro AW options book (default 0.11 when --with-macro-aw)z--with-macro-awzYMacro all-weather ETF options (8 sleeves equal-weight from macro_aw_options_portfolio.py)z--macro-aw-dailyz>Macro AW portfolio daily equity CSV (default equal_weight run))r+  r   r/  z--macro-aw-equity-colzLPortfolio equity column in --macro-aw-daily (default PORTFOLIO_EQUAL_WEIGHT))r   r/  z--run-macro-awzDRegenerate --macro-aw-daily via macro_aw_options_portfolio.py (slow)z--with-sector-momentumzWSPDR sector ETF 12-1 momentum rotation (top-k monthly; run_sector_momentum_standard.py)z--sector-momentum-dailyz>Sector momentum daily CSV from run_sector_momentum_standard.pyz--fund-weight-sector-momentumz=Capital weight for sector momentum (default 0.10 when active)z--run-sector-momentumz1Regenerate --sector-momentum-daily before combinez--with-qs-actionable-etfzQS actionable ETF diversifiers (actionable-7 on options book; actionable-4 on --stock-only). Off on options book unless set; on by default with --stock-only.z--no-qs-actionable-etfzHWith --stock-only, disable QS actionable-4 SPY sleeve (default: enabled)z--qs-actionable-etf-dailyzBQS actionable ETF daily CSV from run_qs_actionable_etf_standard.pyz--fund-weight-qs-actionable-etfzFCapital weight for QS actionable ETF sleeve (default 0.04 when active)z--run-qs-actionable-etfz3Regenerate --qs-actionable-etf-daily before combinez--sector-momentum-top-kr  zMTop SPDR sectors held each month when using --run-sector-momentum (default 3)z--with-tactical-awzbTactical All Weather equity book (SPY/TLT/IEF/GLD/DBC gates; run_tactical_all_weather_standard.py)z--tactical-aw-dailyz?Tactical AW daily CSV from run_tactical_all_weather_standard.pyz--fund-weight-tactical-awzICapital weight for tactical AW (default 0.20 when active; dip cut to 5%%)z--run-tactical-awz-Regenerate --tactical-aw-daily before combinez--with-tsmomz\Time-series momentum / managed futures (8-asset 3/6/12m blend; run_tsmom_managed_futures.py)z--tsmom-dailyz1TSMOM daily CSV from run_tsmom_managed_futures.pyz--fund-weight-tsmomzHCapital weight for TSMOM sleeve (default 0.11 when active; renormalized)z--with-ride-rocketszfRide-rockets 50/50 sleeve (near_52w_high top25 + ten_rockets top10; run_ride_rockets_5050_standard.py)z--ride-rockets-dailyzCRide-rockets 50/50 daily CSV from run_ride_rockets_5050_standard.pyz--fund-weight-ride-rocketszOCapital weight for ride-rockets sleeve (default 0.06 when active; renormalized)z--run-ride-rocketszTRegenerate --ride-rockets-daily via run_ride_rockets_5050_standard.py before combinez--with-orb-zarattiniznZarattini 5m Opening Range Breakout on Stocks in Play (run_orb_zarattini.py). Not available with --stock-only.z--orb-zarattini-dailyz1ORB Zarattini daily CSV from run_orb_zarattini.pyz--fund-weight-orb-zarattinizPCapital weight for ORB Zarattini sleeve (default 0.05 when active; renormalized)z--with-vol-edgezxVolatility Edge VIX ETN sleeve (SSRN 5316487 Strategy 3). On by default with --stock-only; use --no-vol-edge to disable.z--no-vol-edgezAWith --stock-only, use legacy weights without Vol Edge ETN sleevez--vol-edge-dailyz2Vol Edge daily CSV from run_volatility_edge_etn.pyz--vol-edge-variantevrp_bocevrp_boc_sizing_v200z6Variant when using --run-vol-edge (default Strategy 3))r   r0  r/  z--fund-weight-vol-edgezRCapital weight for Vol Edge sleeve (default 0.125 with --stock-only; renormalized)z--run-vol-edgezIRegenerate --vol-edge-daily via run_volatility_edge_etn.py before combinez--with-ls-equityu   Experimental market-neutral L/S equity momentum pod (AQR 12-1). Off by default — weak standalone in-sample; hedged dip + TSMOM already provide low-beta exposure.z--ls-equity-dailyzEL/S equity momentum daily CSV from run_ls_equity_momentum_standard.pyz--fund-weight-ls-equityzPCapital weight for L/S equity pod (default 0.10 with --stock-only; renormalized)z--run-ls-equityzRRegenerate --ls-equity-daily via run_ls_equity_momentum_standard.py before combinez--with-spy-bear-callzeSPY OTM bear-call credit spread (short vol complement; Theta 15:45 from 2016). Requires --stock-only.z--spy-bear-call-dailyzHSPY bear-call spread daily CSV from run_spy_bear_call_spread_standard.pyz--fund-weight-spy-bear-callzPCapital weight for SPY bear-call spread (default 0.07 when active; renormalized)z--run-spy-bear-callzXRegenerate --spy-bear-call-daily via run_spy_bear_call_spread_standard.py before combinez--fund-scalerj   SzLeverage multiplier applied to the normalized fund-mode portfolio return each day (default 1.0 = no leverage). Use e.g. 2.5 to scale up to ~10%% max drawdown. Compounding is applied on the levered daily return.z--vix-dynamic-scaleu   VIX-regime daily leverage: prior-day 5-EMA VIX < --vix-low → high scale; VIX ≥ --vix-high AND SPY < SMA200 → low scale; else mid. Tiers default proportional to --fund-scale (fund-mode) or 2.0/1.5/1.0 (nav_q).z	--vix-lowg      .@u/   VIX below this → high scale tier (default 15)z
--vix-highg      9@u<   VIX at/above this + bear SPY → low scale tier (default 25)z--vix-scale-highzBOverride calm-regime scale (default: proportional to --fund-scale)z--vix-scale-midz;Override normal-regime scale (default: --fund-scale or 1.5)z--vix-scale-lowzDOverride stressed-bear scale (default: proportional to --fund-scale)z--vix-smoothr5   z-EMA smoothing days for VIX signal (default 5)z--no-vix-spy-gatezBDisable SPY>SMA200 gate (delever on high VIX even during recovery)z--vix-spy-sma   z2SPY SMA window for VIX stressed gate (default 200)z--run-tsmomzHRegenerate --tsmom-daily via run_tsmom_managed_futures.py before combinez--with-johansen-etfzJohansen ETF triplet stat-arb (top-5 scan + EWA-EWC-IGE; run_johansen_triplet_etf_portfolio.py). On by default with --stock-only.z--no-johansen-etfzBWith --stock-only, disable Johansen ETF sleeve (legacy stock book)z--johansen-etf-dailyz(Johansen ETF triplet portfolio daily CSVz--fund-weight-johansen-etfzOCapital weight for Johansen ETF sleeve (default 0.08 when active; renormalized)z--run-johansen-etfzXRegenerate --johansen-etf-daily via run_johansen_triplet_etf_portfolio.py before combinez--with-ma-slopezeMA slope S&P 500 top-N long + inverse SPY bear hedge (both sleeves). On by default with --stock-only.z--no-ma-slopezQWith --stock-only, disable MA slope top-N + inverse SH sleeves (default: enabled)z--with-ma-slope-topnua   S&P 500 MA slope top-10 monthly rotation with 2× ATR trail (run_ma_slope_sp500_topn_standard.py)z--with-ma-slope-inversezSInverse SPY bear hedge (SH, SPY regime gates; run_ma_slope_inverse_spy_standard.py)z--ma-slope-topn-dailyzDMA slope top-N daily CSV (default: top10 dual_product monthly atr2x)z--ma-slope-inverse-dailyz)MA slope inverse SPY bear hedge daily CSVz--fund-weight-ma-slope-topnzQCapital weight for MA slope top-N sleeve (default 0.08 when active; renormalized)z--fund-weight-ma-slope-inversezRCapital weight for MA slope inverse hedge (default 0.05 when active; renormalized)z--run-ma-slope-topnzWRegenerate --ma-slope-topn-daily via run_ma_slope_sp500_topn_standard.py before combinez--run-ma-slope-inversez[Regenerate --ma-slope-inverse-daily via run_ma_slope_inverse_spy_standard.py before combinez--with-ma-slope-intradayzAlpaca 5m MA-slope day-trade: confirm_entry_4b + top-5 + max 20%% weight (run_ma_slope_intraday_standard.py). On by default with --stock-only.z--no-ma-slope-intradayzPWith --stock-only, disable MA slope intraday day-trade sleeve (default: enabled)z--ma-slope-intraday-dailyz;MA slope intraday standard daily CSV (confirm4b top5 cap20)z--fund-weight-ma-slope-intradayzTCapital weight for MA slope intraday sleeve (default 0.06 when active; renormalized)z--run-ma-slope-intradayzYRegenerate --ma-slope-intraday-daily via run_ma_slope_intraday_standard.py before combinez--lit-mtm-dailyz8lit4-vrp margin sim daily CSV (--mtm, without --with-d6)z--spy-mtm-dailyz2lit4+D6+VRP margin sim daily CSV (--mtm --with-d6)z	--with-d6zQInclude D095,D081,D039,D018,D041,D065 (requires --spy-mtm-daily or --run-spy-mtm)z--d-equity-csvz;Per-sleeve D### equity CSV for exit-day combine (--with-d6)z--run-lit-mtmzORe-run evaluate_theta_margin --preset lit4-vrp before --mtm combine (very slow)z--run-spy-mtmzMRe-run evaluate_theta_margin --preset best-ideas-spy (lit4+D6+VRP; very slow)z--run-d6-equityzARe-run portfolio_top_strategies for D6 sleeves (exit-day combine)z--with-equity-dipu   Equity dip slot: S&P 500 + Russell 3000 pct-drop (≥3%%, hold 10d; default top 5 / top 10 names), split on one $100k notional (Sharpe weights)z--sp500-dip-top-nz/Max new S&P 500 dip entries per day (default 5)z--russell3000-dip-top-nz5Max new Russell 3000 dip entries per day (default 10)z--sp500-dip-onlyz<Use only S&P 500 dip (full equity-dip slot); no Russell 3000z--sp500-dip-fracFRACzMFraction of equity-dip slot for S&P 500 (default: Sharpe-weighted vs Russell)z--russell3000-dip-fraczJFraction of equity-dip slot for Russell 3000 (default: 1 - sp500-dip-frac)z--equity-dip-equal-weightzI50/50 split instead of Sharpe-weighted (overrides default Sharpe weights)z--no-equity-dip-sharpe-weightz)Same as --equity-dip-equal-weight (50/50)z--with-sector-dipz@Deprecated alias for --with-equity-dip (was SPDR sector RSI dip)z--equity-dip-dailyz3Equity dip daily CSV from run_sp500_dip_standard.pyz--sector-dip-dailyzBDeprecated; use --equity-dip-daily (legacy sector CSV path if set)z--legacy-equity-dipzWith --stock-only, use legacy long-only S&P + Russell 3000 dip split instead of SPY-hedged relative dip (default for stock book)z--run-equity-dipz+Regenerate equity dip CSV(s) before combinez--equity-dip-yahoo-periodr/  zNYahoo history for dip runners (default max; 10y is too short for 2016+ SMA200)z--refresh-dip-cachezAForce re-download Yahoo panels when using --run-equity-dip (slow)z--run-sector-dipz%Deprecated alias for --run-equity-dipz--with-russell3000-dipzPDeprecated: Russell 3000 is included in --with-equity-dip split (ignored if set)z--russell3000-dip-dailyzRussell 3000 dip daily CSVz--run-russell3000-dipzBRegenerate --russell3000-dip-daily before combine (slow first run)z--with-vxx-long-callzWAdd VXX long OTM call tail hedge (~5%% of stacked book PnL; run_vxx_long_call_daily.py)z--vxx-long-call-book-fracr   zWTarget long-call share of stacked-book PnL when using --run-vxx-long-call (default 5%%)z--vxx-long-call-dailyz7VXX long call daily CSV from run_vxx_long_call_daily.pyz--run-vxx-long-callzNRegenerate --vxx-long-call-daily via run_vxx_long_call_daily.py before combine--out-prefixbest_ideas_stackz--stock-onlyu  ETF/stock book: 8 sleeves — tactical AW, CM dip, QS actionable-4, TSMOM, Johansen ETF, Volatility Edge S3, MA slope top-N + inverse SH (all default). Disables SPY theta, VRP, VXX, Macro AW options. Sector momentum omitted (high SPY rho); opt in with --with-sector-momentum. Implies --mtm --fund-mode. Legacy 7-sleeve (no monthly MA slope): --no-ma-slope. Legacy 8-sleeve (no intraday): --no-ma-slope-intraday. Legacy 4-sleeve (no vol edge): --no-vol-edge. Disable QS SPY sleeve: --no-qs-actionable-etf.zactionable-4zactionable-7z=--with-vol-edge requires --stock-only (ETF/stock book add-on)z>--with-ls-equity requires --stock-only (ETF/stock book add-on)zE--with-spy-bear-call requires --stock-only (Theta SPY options add-on)z,--no-vol-edge applies only with --stock-onlyT)r}   r~   r   r   r  zgNote: stack --nav-rebalance quarterly applies to non-fund combine; fund-mode uses --fund-nav-rebalance .r  r  r   r  rz  r|  r~  rN  r  r  r  rP  rR  rS  rU  rW  rY  rZ  r[  r  r  r   r  r	  Fr   r   r   r   r   r   r   r%   r'   r#   r   r   r    r!   r"   r,   r1   r/   r   r   r   r   z  leverage scale=r  zx  (gross notional r   z.0fz%)r  z'Fund-mode sleeve weights (normalized): z, c              3  2   K   | ]  \  }}| d |d  yw=.1%Nr  r   r   r   s      rF   r   zmain.<locals>.<genexpr>w	        H41a1#QqgH   z	  sizing=z>--fund-mode requires --mtm (single NAV on MTM sleeve returns).)
extra_argsc               ~   dd l }|j                         j                         }t        j                  t        t        dz  | z        dj                  dt        j                        dt        t        |            dt        |j                  |j                  j                  dd                  d	t        j                        g}|r|j                  |       j                  r|d
gz  }j                   r|dj                   gz  }t#        d| d| dd       |j%                  |dt        t                     y )Nr   zRenTech/strategy_stackr(  r*  --top-nr8  _dailyr  z--yahoo-periodz--refresh-cacher)  zRunning z (top_n=   ) …Tr  checkcwd)
subprocess
expanduserresolvesys
executabler   _REPOr   rv   r   	with_namestemr#  equity_dip_yahoo_periodr  refresh_dip_cacher   r  run)	script	out_dailylabeltop_nrB  rJ  dip_outcmdr   s	           rF   _run_dip_runnerzmain.<locals>._run_dip_runner	  s    	&&(002NN0069:JJE
O!!',,"6"6x"DEF,,-
 JJz"!!%&&C88GTXX&&Cxwe4DAs$CJ7rH   zrun_sp500_dip_standard.pyz;CrackingMarkets dip (SP100, limit entry + multi-rule exits)r6   )z
--universesp100z--execution-stylecracking_marketsz--max-holdings10z--hold-daysr^  z	--rank-byatr_normz--limit-atr-multz0.9z--profit-atr-multz0.5)rX  rB  zS&P 500 pct-drop dip)rX  zrun_russell3000_dip_standard.pyzRussell 3000 pct-drop dipz1RenTech/strategy_stack/run_vxx_long_call_daily.pyz--book-pnl-fracrE  u$   Running VXX long call MTM sleeve …rG  r   z4RenTech/strategy_stack/macro_aw_options_portfolio.pyz--allocationr   z--start-datez
--end-dateu@   Running Macro AW options portfolio (8 sleeves, equal_weight) …z6RenTech/strategy_stack/run_sector_momentum_standard.pyz--top-ku:   Running sector momentum standard (SPDR top-k rotation) …z8RenTech/strategy_stack/run_qs_actionable_etf_standard.pyz--presetzRunning QS u    ETF standard …z;RenTech/strategy_stack/run_tactical_all_weather_standard.pyu)   Running tactical All Weather standard …zL  .venv/bin/python RenTech/strategy_stack/run_sp500_dip_standard.py --start z --relative-spy-min 0.02 --rank-by rel_underperf --hedge-spy --max-holdings 10 --out-prefix RenTech/data/logs/sp500_relative_dip_hedged
or pass --run-equity-dip to this script.z)
or pass --run-equity-dip to this script.r  z; run:
zY; run:
  .venv/bin/python RenTech/strategy_stack/run_russell3000_dip_standard.py --start z'Equity dip: S&P 500 only (100% of slot)zEquity dip split (one $z,.0fz slot): S&P r>  z / Russell 3000 zT; run:
  .venv/bin/python RenTech/strategy_stack/run_vxx_long_call_daily.py --start z,
or pass --run-vxx-long-call to this script.zs; run:
  .venv/bin/python RenTech/strategy_stack/macro_aw_options_portfolio.py --allocation equal_weight --capital z --start-date zd --out-prefix RenTech/data/logs/macro_aw_options_portfolio_eq
or pass --run-macro-aw to this script.z*Macro AW: equal-weight 8-sleeve book from z (r  zY; run:
  .venv/bin/python RenTech/strategy_stack/run_sector_momentum_standard.py --start z.
or pass --run-sector-momentum to this script.z$Sector momentum: SPDR rotation from z\; run:
  .venv/bin/python RenTech/strategy_stack/run_qs_actionable_etf_standard.py --preset z	 --start z0
or pass --run-qs-actionable-etf to this script.zQS z': calendar/overnight diversifiers from z^; run:
  .venv/bin/python RenTech/strategy_stack/run_tactical_all_weather_standard.py --start z*
or pass --run-tactical-aw to this script.z"Tactical AW: macro ETF gates from z3RenTech/strategy_stack/run_tsmom_managed_futures.pyu#   Running TSMOM / managed futures …zV; run:
  .venv/bin/python RenTech/strategy_stack/run_tsmom_managed_futures.py --start z$
or pass --run-tsmom to this script.z4TSMOM / managed futures: 8-asset 3/6/12m blend from z.venv/bin/pythonz8RenTech/strategy_stack/run_ride_rockets_5050_standard.pyz
2026-04-02z--reuse-equity-cacheu   Running ride-rockets 50/50 …z; run:
  .venv/bin/python RenTech/strategy_stack/run_ride_rockets_5050_standard.py --start 2016-01-04 --end 2026-04-02 --reuse-equity-cache
or pass --run-ride-rockets to this script.zARide-rockets 50/50: near_52w_high top25 + ten_rockets top10 from zN; run:
  .venv/bin/python RenTech/strategy_stack/run_orb_zarattini.py --start z/
or pass an existing --orb-zarattini-daily CSV.z&ORB Zarattini 5m: Stocks in Play from z<RenTech/strategy_stack/run_johansen_triplet_etf_portfolio.pyu/   Regenerating Johansen ETF triplet portfolio …z_; run:
  .venv/bin/python RenTech/strategy_stack/run_johansen_triplet_etf_portfolio.py --start z --end z --capital z+
or pass --run-johansen-etf to this script.z/Johansen ETF triplets: 6-sleeve Chan book from ma_slope_sp500_top10z:RenTech/strategy_stack/run_ma_slope_sp500_topn_standard.pyrD  r^  uC   Running MA slope S&P 500 top-10 (dual_product monthly, ATR 2×) …z]; run:
  .venv/bin/python RenTech/strategy_stack/run_ma_slope_sp500_topn_standard.py --start z7 --top-n 10
or pass --run-ma-slope-topn to this script.u;   MA slope top-N: S&P 500 dual-slope rotation + ATR 2× from ma_slope_inverse_spy_balancedz;RenTech/strategy_stack/run_ma_slope_inverse_spy_standard.pyz	--tickersSHuB   Running MA slope inverse SPY bear hedge (SH, balanced default) …z^; run:
  .venv/bin/python RenTech/strategy_stack/run_ma_slope_inverse_spy_standard.py --start zy --tickers SH --out-prefix RenTech/data/logs/ma_slope_inverse_spy_balanced
or pass --run-ma-slope-inverse to this script.z,MA slope inverse hedge: SH bear sleeve from z8RenTech/strategy_stack/run_ma_slope_intraday_standard.pyz
2026-06-26/ma_slope_intraday_confirm4b_top5_cap20_standardu=   Running MA slope intraday standard (confirm4b top5 cap20) …z; run:
  .venv/bin/python RenTech/strategy_stack/run_ma_slope_intraday_standard.py --out-prefix RenTech/data/logs/ma_slope_intraday_confirm4b_top5_cap20_standard
or pass --run-ma-slope-intraday to this script.z-MA slope intraday: confirm4b top5 cap20 from z1RenTech/strategy_stack/run_volatility_edge_etn.pyz	--variantzRunning Volatility Edge ETN (rF  zV; run:
  .venv/bin/python RenTech/strategy_stack/run_volatility_edge_etn.py --variant z'
or pass --run-vol-edge to this script.z$Volatility Edge ETN (SSRN 5316487): z from z9RenTech/strategy_stack/run_ls_equity_momentum_standard.pyu.   Running market-neutral L/S equity momentum …z\; run:
  .venv/bin/python RenTech/strategy_stack/run_ls_equity_momentum_standard.py --start z(
or pass --run-ls-equity to this script.z&L/S equity momentum (market-neutral): z;RenTech/strategy_stack/run_spy_bear_call_spread_standard.pyu+   Running SPY OTM bear-call credit spread …z^; run:
  .venv/bin/python RenTech/strategy_stack/run_spy_bear_call_spread_standard.py --start z,
or pass --run-spy-bear-call to this script.zSPY bear-call credit spread: r   z
_meta.jsonz-mzHRenTech.strategy_stack.diverse_theta_strategies_v1.evaluate_theta_marginzbest-ideas-spyz--out-dailyz--out-tradesz
--out-metau9   Running best-ideas-spy margin + MTM (lit4 + D6 + VRP) …lit_stack_vrp_marginzlit4-vrpu,   Running lit4-vrp margin + MTM evaluation …z)best_ideas_d6_portfolio_summary_100k.jsonzKRenTech.strategy_stack.diverse_theta_strategies_v1.portfolio_top_strategiesz--sidsz	--out-csvz
--out-jsonu*   Running D6 portfolio equity (exit-day) …z?Stock-only book: tactical AW + CM dip + QS actionable-4 + TSMOMzJohansen ETFzMA slope top-NzMA slope inversezsector momentumz + z (no options)z + Volatility Edge ETNz + SPY bear-call spreadz' + L/S equity momentum (market-neutral)zMissing VXX stack daily: z
Run: .venv/bin/python RenTech/strategy_stack/run_vxx_regime_mtm_report.py --combine-only --out-prefix RenTech/data/logs/vxx_regime_mtm_2016_2026r   z3RenTech/strategy_stack/combine_lit_stack_sleeves.py,z--moder   z--out-equity-csvu$   Running literature + VRP combine …z; pass --run-lit to generate.rn   ro   rq  )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   z9--stock-only requires --fund-mode (enabled automatically)r   rw  r  rx  r   r  ry  r   r   r{  r1  r}  r  rO  r  r  r0  rQ  r   rT  rV  rX  r   r   r\  r  r  r   r   r  r  r  r  r  rB   r  )r  r   r   rv   r  )namesz_mtm_daily.csvzStock-only stackzStock-only multi-pod stackz + Vol Edge S3z + SPY bear-callz + Johansen ETFz + L/S equity MNz + MA slope intradayz + fund modez (quarterly sized)z + VIX dynamic scalez MTMzATactical All Weather: SPY/TLT/IEF/GLD/DBC; SMA(200)+AQR mom gatesuV   S&P 500 relative dip: −3% + underperf SPY ≥2%, rank underperf, SPY-hedged (β≈0)z$S&P + Russell 3000 pct-drop dip (SP r   z / R3k r   z(8-asset time-series momentum (ETF proxy)z"SPDR sector 12-1 momentum rotation)r%   r   r'   r   zIJohansen ETF triplet stat-arb (6 sleeves, equal-weight; Chan EWA-EWC-IGE)zMMarket-neutral L/S equity momentum (AQR 12-1, top/bottom 10, sector-balanced)zVolatility Edge VIX ETNs (z; SSRN 5316487)zaSPY OTM bear-call credit spread: ~3% OTM short call + $5 wing; SMA200 + VIX gate; Theta 15:45 MTMuN   S&P 500 MA slope top-10: dual EMA slope rank, monthly rebalance, 2× ATR trailzPInverse SPY bear hedge: SH only, SPY bear regime + inverse momentum confirmationzRMA slope intraday day-trade: confirm_entry_4b + top-5 + max 20% weight (Alpaca 5m)r  vol_edge_variantlegacy_equity_diphedged_relative_dipcombine_modemetric_modeequity_dip_weightsconstituentscapital_usdr   r   r  
n_sessionsr  g      ?r   )margin_combined_mean_usdmargin_combined_peak_usdmin_account_size_usdz_mtm_meta.jsonr   )indentpnl_fund_navr  z_mtm_yearly.csvz
=== u
    — MTM (z) ===z	  Window u    → z  (z
 sessions)z	  Return 
return_pctz+.1fz%  CAGR cagr_pctz
%  Sharpe sharpez  MaxDD r  z.1fz%  End $
end_equityz  Sleeve weights: c              3  2   K   | ]  \  }}| d |d  ywr<  r  r?  s      rF   r   zmain.<locals>.<genexpr>  r@  rA  z  [Margin] combined mean $rp  z  peak $rq  )r  r  r  u   
MTM daily → u
   Meta  → aX    .venv/bin/python -m RenTech.strategy_stack.diverse_theta_strategies_v1.evaluate_theta_margin --preset best-ideas-spy --capital 100000 --start 2016-01-04 --out-daily RenTech/data/logs/best_ideas_spy6_margin_daily.csv --out-trades RenTech/data/logs/best_ideas_spy6_margin_trades.csv --out-meta RenTech/data/logs/best_ideas_spy6_margin_meta.jsonzE  .venv/bin/python -m ... evaluate_theta_margin --preset lit4-vrp ...z; run with --run-spy-mtm or:
zToo few aligned sessions (z); check date range.r   pnl_lit4_vrp_mtmr  	pnl_stackr   r   rI   r   r   unrealized_mtm_usdspy_unrealized_mtm_usdvxx_equity_mtm_usd)r  r  z + D6z
 + S&P dipz + equity dip (SP z.0%z + VXX long callz + Macro AWz + sector momentumz + tactical AWz + TSMOMz + ORB Zarattiniz + MA slope top-Nz + MA slope inversez + NAV qtr rebasezH2-compare-modesz$combine_best_ideas_stack.py:main:mtmmtm_headline_metrics)rj  ru  r  rw  rx  r  r  zS055+S057+S059+S089+z+VRP margin simulatorz(S055+S057+S059+S089+VRP margin simulatorz-Dynamic VXX Regime Strategy Stack (6 sleeves))spy_theta_mtmvxx_regime_stacku+   S&P 500 pct-drop dip (≥3%, hold 10d, top z, BuyTheDipSleeve)r  zFS&P 500 + Russell 3000 pct-drop dip (split one $100k slot; weights SP zVXX long OTM call (10% OTM, ~z book PnL, contango gate)uY   Macro AW options: TLT×3, USO×3, DBC put diagonal, GLD putw (equal_weight 8-sleeve book)zDSPDR sector ETF rotation (12-1 momentum, top-k monthly equal weight)zlTactical All Weather: SPY/TLT/IEF/GLD/DBC baseline weights; SMA(200)+AQR mom gates; cash yield on uninvestedz<Ride-rockets 50/50 (near_52w_high top25 + ten_rockets top10)zTime-series momentum / managed futures: 8 ETFs (SPY,EFA,EEM,TLT,IEF,GLD,DBC,UUP), 3/6/12m signal blend, vol-norm per asset, monthly rebalancezJohansen ETF triplet stat-arb: GDXJ-IAU-SIL, GLD-UNG-USO, XLB-XLI-XLP, COP-USO-XOP, DBC-PDBC-USO, EWA-EWC-IGE (equal-weight 6 sleeves)zfZarattini 5m Opening Range Breakout on Stocks in Play (Zarattini/Barbon/Aziz); day-trade equity sleevenav_rebase_reference_usd)rl  sp500_dip_top_nrussell3000_dip_top_n)rm  diverse_sidsrn  r   r   ro  spy_mtm_dailyr  g+?)rp  rq  r   margin_capped_daysrr  yearly_return_basisz2account return: sum(daily_pnl) / start-of-year NAVz@n/a (fund-mode PnL is NAV-sized; constant/$100k is not a return))r  r  z+sum(daily_pnl) / constant_notional per yearz-sum(daily_pnl) / start-of-year stacked equity)constant_notional_usdr  r  r  )rU   )r  u    — MTM daily view (z  SPY theta MTM PnL $z+,.0fz    VXX stack MTM PnL $z  margin-capped days: z7  (re-run sleeve engines to populate non-theta sleeves)u=   
--- By year (chained NAV — use after quarterly rebase) ---z
--- By year (constant $u    notional — comparable) ---)r  r  r  r  z%
--- By year (chained MTM equity) ---)r  r  r  r  r  r  )r  r  r  r  r  u   
MTM daily (open in Excel) → u?     VXX per-sleeve MTM cols: pnl_steepcontango_* … in same fileu     SPY book source → rL   r  r  zC; pass --run-d6-equity or run portfolio_top_strategies with --sids  zMissing column r  )r  r   r   rz  r|  r~  r  r  r  rP  rR  rS  rU  rW  r  
equity_usdz!Dynamic VXX Regime Strategy Stackz&sp500_dip (pct-drop, hold 10d, top 10)z?equity_dip: sp500 + russell3000 pct-drop (split one $100k slot)zvxx_long_call (tail hedge)z&macro_aw (8 ETF options, equal_weight)z%sector_momentum (SPDR top-k rotation)z-tactical_aw (SPY/TLT/IEF/GLD/DBC gated macro)z.tsmom (8-asset managed futures, 3/6/12m blend)z<ride_rockets (50/50 near_52w_high top25 + ten_rockets top10)z1johansen_etf (6-sleeve Chan ETF triplet stat-arb)z0orb_zarattini (Zarattini 5m ORB, Stocks in Play)u3   ma_slope_topn (S&P 500 top-10 dual slope + ATR 2×)z2ma_slope_inverse (SH bear hedge, SPY regime gates)zHma_slope_intraday (confirm_entry_4b + top-5 + max 20% weight, Alpaca 5m)z + Ride-rocketsexit_day_lit_combine)r  r0  rS  rT  rU  rV  rW  rX  rP  rQ  rR  r   r  ry  )r{  r1  rm  rn  r   r   ro  r  z_yearly.csvz sessions)  capital $z*
--- Constituent $ PnL (same calendar) ---z#  NAV quarterly rebase (reference $z%; constituents are post-scale totals)z  24sz  $z% of total)z5
--- By year (chained NAV after quarterly rebase) ---uA   
--- By year (chained equity — book label grows with stack) ---u   
Daily → u   Yearly → r  )rU  r   rV  r   rW  r   rX  r   rB  list[str] | NonereturnNone)argparseArgumentParser__doc__splitadd_argumentru   r   r%  DEFAULT_LIT_EQUITYDEFAULT_VRP_PNLDEFAULT_MACRO_AW_DAILYDEFAULT_MACRO_AW_EQUITY_COLDEFAULT_SECTOR_MOMENTUM_DAILYDEFAULT_QS_ACTIONABLE_ETF_DAILYr   DEFAULT_TACTICAL_AW_DAILYDEFAULT_TSMOM_DAILYDEFAULT_RIDE_ROCKETS_DAILYDEFAULT_ORB_ZARATTINI_DAILYDEFAULT_VOL_EDGE_DAILYDEFAULT_LS_EQUITY_DAILYDEFAULT_SPY_BEAR_CALL_DAILYDEFAULT_JOHANSEN_ETF_DAILYDEFAULT_MA_SLOPE_TOPN_DAILYDEFAULT_MA_SLOPE_INVERSE_DAILYDEFAULT_MA_SLOPE_INTRADAY_DAILYr$  DEFAULT_SPY6_MTM_DAILYDEFAULT_D6_EQUITYDEFAULT_SP500_DIP_TOP_NDEFAULT_RUSSELL3000_DIP_TOP_NDEFAULT_EQUITY_DIP_DAILYDEFAULT_RUSSELL3000_DIP_DAILYDEFAULT_VXX_LONG_CALL_DAILYLOGS
parse_argsr  r   rN  no_qs_actionable_etfr   with_sector_dipr|  r~  r  r  r  rR  no_ma_sloperS  with_ma_sloperU  rW  no_ma_slope_intradayrP  no_johansen_etfrY  no_vol_edgerZ  r[  r   rh  sp500_dip_onlyrun_equity_diprun_sector_dipr  "DEFAULT_CRACKING_MARKETS_DIP_DAILYsector_dip_dailyrO  DEFAULT_QS_ACTIONABLE_4_DAILYequity_dip_equal_weightno_equity_dip_sharpe_weightr   r   r   r  r  r   r  r  r  COMBINE_MODE_FUND_NAV_QCOMBINE_MODE_FUNDCOMBINE_MODE_NAV_QCOMBINE_MODEr  r  rz  r   fund_weight_spyfund_weight_vxxfund_weight_equity_dipfund_weight_vxx_long_callfund_weight_macro_awfund_weight_sector_momentumfund_weight_qs_actionable_etffund_weight_tactical_awfund_weight_tsmomfund_weight_ride_rocketsfund_weight_johansen_etffund_weight_orb_zarattinifund_weight_ma_slope_topnfund_weight_ma_slope_inversefund_weight_ma_slope_intradayfund_weight_vol_edgefund_weight_ls_equityfund_weight_spy_bear_callr  r   r  ry  r  run_russell3000_diprun_vxx_long_callrJ  r{  rK  rL  rM  rN  rO  r   rv   vxx_long_call_book_fracrP  rQ  r#  r   rT  run_macro_awr1  r  run_sector_momentumr  sector_momentum_top_krun_qs_actionable_etfis_filerun_tactical_awr  r}  	run_tsmomr  run_ride_rocketsr0  
check_callr   run_johansen_etfrQ  run_ma_slope_topnrT  run_ma_slope_inverserV  run_ma_slope_intradayrX  run_vol_edger   rg  run_ls_equityr   run_spy_bear_callr\  run_spy_mtmr  run_lit_mtmrun_d6_equityd_equity_csvr   r  r(  	vxx_dailyrun_litlit_equity_csvr   r  vrp_pnl_csvvrp_pnl_colrP   rQ   rR   rr   rT   rs   rt   r   r  r   rx   r  rg   r  r   rh   rD   r%  reset_index
out_prefixto_csvr   rn   rd   updaterU   r.  r/  r  
write_textr   r   r   rW   rC   r  r   	to_stringr  rS   r   r   rZ   r  r`   r[   r  r  
STACK_NAMEr   listrenamer  rV   rG   )napr   rN  qs_actionable_presetr   r|  r~  r  r  r  rR  ma_slope_default_stockrS  rU  rW  rP  rY  rZ  r[  rh  r   r  r  rO  equal_wr   r   equity_dip_weight_metar  r  r  rj  
out_suffixr   fund_scale_val
scale_noter[  rJ  lc_outrZ  macro_prefixsm_out	sm_prefixqs_out	qs_prefixtac_out
tac_prefixhint	tsmom_outtsmom_prefixrr_out	rr_prefixjoh_out
joh_prefixtopn_prefix
inv_prefixve_out	ve_prefixls_out	ls_prefixbcc_out
bcc_prefixout_dout_tout_mprefixout_csvout_jsonr  msgout_litr   	cal_pathsr^   r   stack_pnl_colsvix_metar   
daily_pathstack_labelmconstituents_mtmmeta	meta_pathout_navyearlyyearly_pathspy_mtm_pathspy_mtmpnl_spy_mtmr  vxx_eqspy_constituentsmg_meanmg_peakcap_pctcapped_dayslit_eq	lit_dailypnl_vxxr  d_eqn_d
sleeve_cap
scale_fullrm  r  r  r   r   sn                                                                                                                @rF   mainr=    s_   		 	 W]]6-B1-E	FBOOI|O4OOG\O2OOKeYO?OOM6GOHOO&T;MONOOO$OHOOOYO7OOU  
 OOG	   OO%Y   OO*	   OO%S  
 OOW   OOA   OO"@   OO%>   OO [   OO-	   OO&M	   OO+[  
 OOS  
 OO f  
 OO!-M	   OO'L   OO@  
 OO"/	   OO W  
 OO#/Q	   OO)U   OO!B  
 OO!\	   OO4	   OO)N	   OO#X   OO<  
 OO,	   OO#@	   OOW   OO1	   OO*R	   OO$^   OOc  
 OOG	   OO+@	   OO%_   OOM	   OOP  
 OO&A	   OO34E	   OO a   OOX  
 OO)	   OO'T	   OO!_   OOa  
 OO%	   OO+W	   OO%_   OOg  
 OOP  
 OOO	   OO>	   OOK	   OOQ   OOJ   OOS   OO<	   OOQ  
 OOA	   OOW  
 OOW	   OOQ  
 OO*7	   OO$^   OOg  
 OO/	   OO`  
 OO4	   OO!4	   OO+S	   OO".8	   OO%`   OO(a   OOf  
 OO j  
 OO"T	   OO _  
 OO#/J	   OO)c   OO!h  
 OO%G	   OO&A	   OO`  
 OO!J	   OO^  
 OO\  
 OOP  
 OOZ	   OO'>	   OO!-D	   OOK  
 OO\   OO Y   OO#X  
 OO'8  
 OOO  
 OO(B	   OOQ	   OOJ	   OO:  
 OO#]  
 OOP  
 OO4  
 OO _  
 OO!-)	   OOQ  
 OOf  
 OO#f	   OO+F	   OO]  
 OO))  
 OOL	   ==?Ddoo&J!##U
(T4;T;T7T .8>^4//U43G3GU:VO++,?ZM 9 9:D11?Z@doo34JT334d556Iz>'@0@0@,@O4#5#5O9O !""Rd&8&8R<R "		$	$	2
UD<U<U8U 				-:Kt7K7K3K CzB$2B2B.BM $--.Nd556ZXYYjYZZ*`aa
GHHT334+
$--.
$--D1D1DEN 8800	-=				&0000##'FF"&">">	"?"&">">4//S43S3STG-&&22%Hj.H[	KD% 02T^^1z2I$((WT+?MN**+M]k133E2FaI	

  "[0 $" 	
 
+	%)# T\\"' )   7 78	
 $ 2  6 *  , , . . 4  6  $!" &#$ .%& $'( )* .+, -.  $GD2Eu$MN/J2 ) (  (  ( ..( 44	(
 **( 88( <<( 00( $$( 22( 22( 44( 44( ::( <<(  **!(" ,,#($ 44%(&
Z
j.
 /
 T$"9"9:M:~	

 
 3
  !7
 +
 Z
 -
 -
 /
 /
  5
  !7
  !
" #
$ /%
'(N O(LR wt\3?@n|  AD  oD((<<OP^_bPbcfOggij  JL
5iiH<3E3E3GHHI ,-./ 	
 YZZ (, 8 8 8  8
  8 % 8 
 8D /+ M. + &$../	 5../d889	 -&&'d001		
 ))446>>@NNKKLJJ,,-  !4!4Xr!BCD
 88GTXX&&C4DAs$CJ7**557??A#--%%lB7
 NNNNOJJ
 88L$((++CPX\]s$CJ7++668@@B$$V[[%8%8r%JK	NNPPQJJ**+	N
 88GTXX&&CJRVWs$CJ7!!'>'F'F'H(335==?$$V[[%8%8r%JK	NNRRS JJ	N
 88GTXX&&C011BC4Ps$CJ7((335==?&&w||';';L"'MN
NNUUVJJ
O	
 88GTXX&&C9Fs$CJ7/779/::, ';; ::, ';; 
 8$4#5XdVDEEz$2L2L2T2T2Vt112 3zzl #77
 	
 ;4H)$,,t)< =Cj 0s= t'?'?'G'G'It//0 1zzl #::
 	
 T0088:t**+ ,336t||3D2E F JJ< (55
 	
 89L9L9Q9Q8R S((),	
 D$>$>$F$F$Ht112 3zzl #<<
 	
 243M3M3R3R2ST	

 &=&E&E&G./ 0,-Ytzzl C>>
 	
 &''N&++,.	
  6 6 > > @t--. /zzl #88
 	
 01G1G1L1L0MN	

 ~~$$//199;	 **9>>+A+A,PR+STNNMMNJJ	
 88GTXX&&C34@s$CJ7$**224t''( )zzl #22
 	
 B4CSCSCXCXBYZ	

 ((335==?$$V[[%8%8r%JK	**+RRSJJHH$DLL!""	N
 	.d;c"!8!8!@!@!Bt../ 09 9
 	
 OPTPgPgPlPlOmn	
 $":":"B"B"Dt//0 1zzl #==
 	
 4T5M5M5R5R4ST	

 ))446>>@&&w||';';L"'MN
NNVVWJJHH
O
 	?tLs$CJ7!8!8!@!@!Bt../ 0zzl'$((;s4<<?P>Q R99
 	
 =d>U>U>Z>Z=[\	

 4#;#;#C#C#E33NNTTUJJ	
 88GTXX&&CS[_`s$CJ7$":":"B"B"Dt//0 1zzl #::
 	
 I'',,-/	
   d&A&A&I&I&K;;
NNUUVJJ
O	
 88GTXX&&CRZ^_s$CJ7T%@%@%H%H%Jt223 4zzl #==
 	
 :4;V;V;[;[:\]	

 !!t'C'C'K'K'M NNRRSJJDHHlDLL!"HHI
 	MUYZs$CJ7d&B&B&J&J&Lt334 5> >
 	
 ;D<X<X<]<];^_	

 $$//199;$$V[[%8%8r%JK	NNKKLJJ%%&	N
 88GTXX&&C-d.C.C-DEJRVWs$CJ7T0088:t**+ ,../y E55
 	
 243H3H2I""''(*	
 %%002::<$$V[[%8%8r%JK	NNSSTJJ	N	
 88GTXX&&C>dKs$CJ7d22::<t++, -zzl #66
 	
 4T5I5I5N5N4OP	

 **557??A&&w||';';L"'MN
NNUUVJJ
O	
 88GTXX&&C;4Hs$CJ7$":":"B"B"Dt//0 1zzl #::
 	
 +D,D,D,I,I+JK	

 ""--/779

 2 2< OP

 2 2< NONNVJJJJJ
" 88GTXX&&CIQUVs$CJ7..NNVJJ

 88GTXX&&CF,,<DIs$CJ7##..088:>>$OONNY	

 
 
 
 
 JJ
 
 L
 
 M
 88GTXX&&C:$Gs$CJ7RSLL(LL)* LL+,LL*+jj/1++C,,C<<Ccdnn446''7 8U U
 	
 ||%%002::<TD9NNMMNHHXJJHH  !L%
( 	4DAs$CJ7  ((*8D$7$7#88UVWW
++dnn6(
;C..V-00::<CK
--

*
*
,CxxJ""
	
  T778!45T445:T778T001T445T112T556 T889!T99:'

DHHIyI3'!9LL("88!	"
  +?**C,E'( "-A'dll.E)* $8""C$
  2$2B2BCVk(<''dll)E$% $8##S$,,%E.! )=((#t||*E%& (<''dll)E$% %9$$c4<<&E/" )=((#t||*E%& !,@++S$,,-E() "-A,,c4<<.E)* XYY$LL7
 &	7

 WT<=>7
  27
 yyu-7
 7
 ,7
 "7
 .7
 #'"<"<7
 7
 7
  %7
  !% 8 8!7
"  #7
$  ..%7
& !$D$<$< ='7
( "6)7
* #'"<"<+7
, $:-7
0 ,B't17
4 .57
6 #4477
8 "97
: 0;7
< ((=7
>  $66?7
@ 0A7
B ;Lt66QUC7
D  2E7
F =O 8 8TXG7
H  2I7
J =O 8 8TXK7
L #8M7
P 0E++$Q7
T $:U7
X 1G,,DY7
\ (]7
^ 3@4..T_7
` *a7
b 5CD00c7
d  2e7
f =O 8 8TXg7
h i7
j "k7
l !m7
p , 

+
 "
  %	

  
 "6
 $:
 .
 "
 0
 0
  2
  2
 #8
 $:
  (!
" *#
$  2%
& '
( )
, ',N&;&?&?Q&?&G"#$)*:$;$F$F$H$O$OPS$T !8**LL#
x f-++-557D48VHZL?@


:U
+(N.@6K++K--K,,K--K!11K>)K![03311K5!12{m44HI T ) i ;;QRb;cdg:h45KLSQQRT @C
 [ ^, _ [) ,T-B-B,C?S Z( 5 _- ` _- !b /0 "d 01-
K-
$-
 ]-
  5 5D	-

 Mc$"5"5"="="?@W[-
 !"4-
 "! $'t'?'?'G'G'I#J-
  !2-
 ?$4$<$<$> ?X\-
 "4
(L;L7L#M-
 n-
 ns4#7#7#?#?#ABZ^-
  !2-
  !  #&d&=&=&E&E&G"H%-
& !"4'-
( "! $'t'?'?'G'G'I#J--
. $%:/-
0 %$ '*$*E*E*M*M*O&P5-
6 %&<7-
8 &% (+4+G+G+O+O+Q'R=-
> L?-
@ A-
B !	"4tC-
D IL4E-
F %lC @AG-
H 5I-
J K-
L !"8M-
N ,O-
P 4<<Q-
R SQ'S-
T 3s2w||~&U-
V #c#h-W-
X Y-
\ KK!.%--?KK05e<Q6R6W6W6Y0Z05e<Q6R6V6V6X0Y,1e$9:>>@ADH4O- -	 F8J<~>?	TZZQ78((*")*:";"B"B5"I"N"N"P"W"WX["\T\\>T
 fXj\ABk/{m:l^5ANWeDK=D<N;OzZ	
 	,-Xa
mD5I Jk#&hqs.C DlOD)+ 		
 	 iiH<3E3E3GHHI	

 .%--?,TXX6PRS-TUY,Z ["<a@FH
 	GHRR S  		
 	 -T:
9+&d3xx-1\\t))t?Q?Q##% <<P ]  x~5STXSYZ[[++lA..9<<FFH##F+668mm((33",,tzz22sbll488>T7TUVs8c>9#c(CWXYY./446==cBJJ3OVVWZ[3'%0!"||(3E$% 	;A||F#[(8q6>>#.55c:a	; ),K(8(@(@(E(L(LS(Q$%%=,"&"<"<%	&" "")=((#t||*E%& $6##t778%E.!
  +?**C,E'( "-A'dll.E)* ';&&T\\(E#$ !5d6F6FT\\!ZE+(<''dll)E$% (<''dll)E$% )=((#t||*E%& )=((#t||*E%& !,@++S$,,-E() "-A,,c4<<.E)*  7??2.56J.K.S.STW.X._._`c.dE*+s{{**-.>*?*G*G*L*R*R*TE&'+ 
&
+
 "
  $D$;$;<	

 (
 "6
 $:
 .
 "
 0
 0
  2
  2
 #8
 $:
  !
(  3;;.  !))#.446 	
 (2 *	2
 !|S!AB2 $62 ##342 "2 !02 &2 "22 '+&@&@2 2 2 $((?(?#@2  %)$<$<!2" ,#2$  $22%2& %((@(@$A'2( &:)2* '+&@&@+2, (>-20 0F+4124 "2526 #'"8"8728 &92: #4;2< !,,=2> $(#:#:?2@ #4A2B ?P4#:#:UYC2D $6E2F ASD$<$<X\G2H $6I2J ASD$<$<X\K2L '<M2P 4ID//dQ2T (>U2X 5KD00PTY2^ +_2` "&a2b !%c2Ef k)/.	E ',I&6E"#*/*?*C*C*C*KE&'dll#e,@&A&H&H&JJ "# %**:$;$F$F$H$O$OPS$T !u}}4*/*?*C*C*C*KE&'8**LL#
x f-++-557D48VHZL?@


:U
+ <<7"K|+()?@P)QRU(V45KLSQQRT ""--K=(K//K++K:%K,,K--K..K 00K!11K>)K![033k)..K11K5!12{m44HI,;* ,eeL1eeL1%%/eeL1&		
 || #388G#4"55JK; 	 . O
 A#dFZFZB[A\\no !-
""89I"J3!O P12HI#NaQ !.
 ""/0L0LS/QQjk _- / Z(  V ./ C ]+ N ^, N W% ` _- !b /0 "d 01 R ^, C _-[
K[
L[
 [
 !	"4t	[

 IL4[
 ][
 '[
 5[
 tDLL)[
 [
 $Z[
 !$t'>'>"?[
 ][
 Mc$"5"5"="="?@W[[
 "M3t'?'?#@W[[
  #$8![
" $# &))C)C)K)K)M%N'[
(  0)[
*   "%T%;%;%C%C%E!F/[
0 *1[
2  !23[
4 j3t//779:d5[
6 !L]#d&=&=&E&E&G"Hcg7[
8 !"49[
: "! $'t'?'?'G'G'I#J?[
@ $%:A[
B %$ '*$*E*E*M*M*O&PG[
H %&<I[
J &% (+4+G+G+O+O+Q'RO[
P  !2Q[
R !  #&d&=&=&E&E&G"HW[
X !"4Y[
Z "! $'t'?'?'G'G'I#J_[
l #	 +A'*4+?+?'@-01K1K-L o[
r --1\\DMr<<Q's2w||~&c#h- !5!5!78[
V !6%--!G 16e<Q6R6W6W6Y0Z05e<Q6R6V6V6X0Y'+*-#9299U7SWYegjKkEl;mnwt\3?@5HIJM#%+ -2%>S8T8X8X8Z2[^b2bei2i,jmq,q	 Y[
\ "
  +_+m .2\\+X*Yi[
t u[
x KK!F8J<~>?	TZZQ78JJ 46FGJHLL

 fXj\ABk/{m#8eLTXYWeDK=D<N;OzZ	
 	,-Xa
mD5I Jk#&hqs.C DlOD)+ 		
 	#E*=$>$B$B$DU#K L$$)*@$A$E$E$G#NP	

 .%--?E"78==?@GE"78<<>?GGD,<=Guyy)?7ASTW^afWffkkmnK,WTN(74.(IK 	 K'RZ^_+DLL+>>[\ U)%)(	 :$GK'	 )%)(  )%)( 	0=TJOX\]&|n5TB
9+&d3[[,,tLF>>&,,/99;FL
,,
#
#CII
.C
sbll4::..3",,txx:P3PQ
RC
3x#~5c#hZ?STUU/0C0CSII+&&s+2237GLLs#E$+E
 ! -'nSEl- 'E)!9LL("88!	"
 %9$$c4<<&
!"  24334!
n
 ';&&T\\(
#$ )=#S$,,*
%& #7""C$
  1c4<<
k $8##S$,,%
 ! $8##S$,,%
 ! %9$$c4<<&
!" %9$$c4<<&
!" (<''dll)
$% )=((#t||*
%& ||  ((*4,,- ."xx013  {{4,,tL^^DJJ/99;
'l4<<(5:5
4<<(:5
 	C$,,&T$:K:K9LMNN"49-55c:AA#FS D,	 (T\\"' 7 78#1)++--35N" #+LL&	
 $I.l"'"7";";";"C#DLL1E:J4K4R4R4TTl


&

)C__'')113F
MMt4J78JJJzJ'u\*J7A+	h *G*" 		L  HIQ 89DECDKLLMZ[OPNOQRPQV	
 K||w<'K$%;<L%Mc$R01GHMQPK ))}$++''z!(((())**,,--#**FFF 	F 	#DLL	F
 	-F 	4%F 	?F 	 F 	d4#:#:;F 	F 	#d1199;<SWF 	 4F 	  "%T%?%?%G%G%I!JF  	,!F" 	FVS!7!7!?!?!AB\`#F$ 	j%F&  !2'F( ;Es4++3356$L]#d&=&=&E&E&G"Hcg0  #4#;#;#C#C#EF!6  #&d&A&A&I&I&K"L"8! $'t'C'C'K'K'M#N. "$"9"9"A"A"CD0  #4#;#;#C#C#EF?NC 0 8 8 :;TX: "%T%?%?%G%G%I!J[Fh 	 '=#&t';';#<),T-G-G)H kFp ""  #4#;#;#C#C#EF@M#d1199;<SW$||SV[[]#3r7<<>"#c(m%)\\#P"Q 
AFJ KFDN x
|:67ID343-F&*[9:K
MM+UM+ 
F:,be
4DA	
DM?%U}C\8J7K LLL&	(
 

AlOD)!J-1E FH+c"(1\?3*? @,%	' 	 

7tD#1$,,t1D E2 2	

 H qE#JNN$%3s)3s5kSWU;K5L5P5P5R-RSV,WWbckopq #FdS	 iei$	
 	'T'::WX	
 	TU__ `  		
 	RZ^_ iei$	
 
L
%T2	Jyk
"$/	K}
%T2rH   __main__)rE   	pd.Seriesr  r?  )r]   r   r^   pd.DatetimeIndexrJ   r   r  r?  )
r]   r   r^   r@  rv   ru   rl   ru   r  r?  )
r}   float | Noner~   rA  r   r  r   r  r  ztuple[float, float])r   pd.DataFramer^   r@  rv   ru   r   r   r   r   r   r  r   ru   r   ru   r  r   )r   r   r   r   r   r   r   dictr   r   r  r  r   )rw   r?  rv   ru   r   pd.Series | Noner  r?  )r]   r   r^   r@  r  r?  )r   r   r   r   r   r   r  r@  )r   dict[str, bool]r   r  r  r   )*r   rA  r   rA  r   rA  r   rA  r   rA  r   rA  r   rA  r%   rA  r'   rA  r#   rA  r   rA  r   rA  r    rA  r!   rA  r"   rA  r,   rA  r1   rA  r/   rA  r   rE  r   r  r  r   )
r   rB  r   r   r   r  r   r  r  dict[str, pd.Series])&r   rB  r^   r@  rv   ru   r   r   r   ru   r   r  r   r  r  Path | Noner  rG  r  r   r0  r   r  r   r1  r   r  r   r   rG  r   rG  r   rG  r   ru   r  rB  )`r   rB  r^   r@  rv   ru   r   r   r   ru   rw  r?  rx  rD  r   r  r   r  r  r   ry  r   r   ru   r   ru   rz  r  r{  r   r|  r  r1  r   r}  r   r~  r  r  r   rN  r  rO  rG  r  r  r  r   r  r  r  r  r  r   r0  r   rP  r  rQ  rG  rR  r  r   rG  rS  r  rT  rG  rU  r  rV  rG  rW  r  rX  rG  rY  r  r   rG  rZ  r  r   rG  r[  r  r\  rG  r  rG  r  rG  r   ru   r  rB  )br   rB  r^   r@  rv   ru   r   r   r   ru   r  r   rw  r?  rx  rD  r   r  r   r  r  r   ry  r   r   ru   r   ru   rz  r  r{  r   r|  r  r1  r   r}  r   r~  r  r  r   rN  r  rO  rG  r  r  r  r   r  r  r  r  r  r   r0  r   rP  r  rQ  rG  rR  r  r   rG  rS  r  rT  rG  rU  r  rV  rG  rW  r  rX  rG  rY  r  r   rG  rZ  r  r   rG  r[  r  r\  rG  r  rG  r  rG  r   ru   r  rB  )0r  r  r   r  r  r  rz  r  r|  r  r~  r  rN  r  r  r  r  r  r  r  rP  r  rR  r  rS  r  rU  r  rW  r  rY  r  rZ  r  r[  r  r  r   r  r  r  r   r   r  r  r  r  r   )rS   r@  r  zset[pd.Timestamp])
r   rB  r  	list[str]r  ru   r  r   r  rB  )*r  r  r   r  r   r  rz  r  r|  r  r~  r  rN  r  r  r  r  r  r  r  rP  r  rR  r  rS  r  rU  r  rW  r  rY  r  rZ  r  r[  r  r  r  r   r  r  rH  )r]   r   r^   r@  r  rF  )
r_   rB  rv   ru   r  r   r  r  r  rB  )r   rB  r   zargparse.Namespacer  r  r   r   r   r   rv   ru   r  r  r  ztuple[pd.DataFrame, dict])r  r  )kr  
__future__r   r  r   mathrM  pathlibr   numpyrX   pandasrP   __file__rL  r   rO  r   r]   insert-RenTech.strategy_stack.portfolio_vrp_plus_vxxr   ,RenTech.strategy_stack.run_vix_dynamic_scaler   r   -RenTech.strategy_stack.unified_margin_trackerr	   r
   r  r  r  r  r  r  r   r   __annotations__r$   r&   r(   r)   r*   r+   r-   r.   r0   r2   r3   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r%  r  r$  r  r  r  r  'DEFAULT_STOCK_RELATIVE_DIP_HEDGED_DAILYr  r  rz   r{   r  r  LEGACY_SECTOR_DIP_DAILYr  r  r  rG   r`   ri   rx   r   r   r   r   r   r   r   r   r   rM  r  r  r  r&  r  r  r  r  r%  r=  __name__r  rH   rF   <module>rW     s  'R #    
   X ((+u:SXXHHOOAs5z" H
 y6!F*
1 / 4 "%77 	* &  0 , " 0 , " 6  "2 & ' #   2 .  
; %'7 
 6  "2  ? )+;  C -/?  	4  0 	 = ')9   HH FF   #%NN !HH  II 6  $'K K "&)O"O  $'K K  #CC >> !$JJ !$MM "%JJ LL  	hi 
 \\ RR ??  BB DD @@"@@ *.1V*V '%),R%R " $'K K   $   " !@@ "%GG +
:! 2	!
!	! 	!
 !& 2	'
'	' 	'
 '* 8
8	8 8
 8 8& # 	
  :	 
      B   	
   
@  $6	66 6 	6 
( HM 79^ +b.	b. 
b. 	b.
  b. b. "b. $b. b. b. b. b.  b.  b. #b.  $!b." #b.$ %b.&  'b.( )b.* +b., -b.J33"3 	3
 3 3x  #'#''+!'OO	O O
 #O O O O O "O O O O O O   !O" !#O$ %%O& 'O( )Op   $)+/ $&*$'+$'+"'*.#(+/"& #'$'+!%$(!crr	r r
 #r r r !r r r r  r r r r  !r" #r$ %r& 'r( )r*  +r, !-r. )/r0 1r2 3r4 5r6 7r8 9r: ;r< =r> $?r@ ArB %CrD ErF %GrH  IrJ (KrL !MrN )OrP QrR  SrT UrV !WrX YrZ %[r^ _r` "arb crd erv )  $)+/ $&*$'+$'+"'*.#(+/"& #'$'+!%$(!cyy	y y
 #y y y y !y y y y  y y y  !y" #y$ %y& 'y( )y* +y,  -y. !/y0 )1y2 3y4 5y6 7y8 9y: ;y< =y> ?y@ $AyB CyD %EyF GyH %IyJ  KyL (MyN !OyP )QyR SyT  UyV WyX !YyZ [y\ %]y^ _y` "ayb cyd eyH $)"##$$"'#( $)#(1I+I+ I+  	I+
 I+ I+ I+ !I+ I+ I+ I+ I+ I+ I+  I+  !!I+" #I+$ %I+& 'I+( )I+* +I+, -I+. /I+0 !1I+2 	3I+X	555 5
 5 5@ $)"##$$"'#( $+AA A 	A
 A A A !A A A A A A A  A  !!A" #A$ %A& 'A( 
)A* +A, -AH$ $999 	9
 9 9H "&**
* 	*
 * 
* * * *Zp,3fY zF rH   