
    im!                    t   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ZddZ	 	 	 	 	 	 	 	 ddZdd	Z	 	 	 	 	 	 	 	 	 	 	 	 dd
ZddZedk(  r e        yy)u  
**Complement sleeve** for the 4-regime VRP book: align **IV mispricing** trades (e.g. bear call
credit spread JSONL from ``backtest_iv_rich_vol_bear_call_spread.py``) with **VRP** trades exported
via ``vrp_backtest_theta.py --export-trades-jsonl``.

**analyze** — Same calendar: correlation of realized P&amp;L (assigned to **exit** dates), mean
overlay P&amp;L on days the main sleeve lost money, etc.

**combine** — Simulate a two-book portfolio: fixed notionals for main + overlay, optional
**drawdown boost**: overlay realized P&amp;L is scaled by ``1 + dd_boost × drawdown_fraction`` of
the **main** equity path (so the complement sleeve gets larger when VRP is underwater — without
filtering away main trades).

This does **not** guarantee negative correlation; use **analyze** first. Typical use: run VRP with
``--export-trades-jsonl``, run IV overlay backtest with ``--out-trades``, then this script.

Example::

    python RenTech/strategy_stack/vrp_backtest_theta.py --export-trades-jsonl RenTech/data/logs/vrp_trades.jsonl
    python RenTech/strategy_stack/backtest_iv_rich_vol_bear_call_spread.py ... --out-trades RenTech/data/logs/bear_spread.jsonl
    # Or use straddle JSONL: --overlay-trades RenTech/data/logs/iv_mispricing_straddle_trades.jsonl
    python RenTech/strategy_stack/iv_mispricing_complement.py analyze \
        --vrp-trades RenTech/data/logs/vrp_trades.jsonl \
        --overlay-trades RenTech/data/logs/bear_spread.jsonl
    python RenTech/strategy_stack/iv_mispricing_complement.py combine \
        --vrp-trades RenTech/data/logs/vrp_trades.jsonl \
        --overlay-trades RenTech/data/logs/bear_spread.jsonl \
        --capital-main 100000 --capital-overlay 25000 --dd-boost 1.5
    )annotationsN)Path   c                   | j                         j                         }|j                         s7t        d| d| dt        j
                         t	        j                  d       |S )NzERROR: file not found: z
  ())file   )
expanduserresolveis_fileprintsysstderrexit)pathhintps      K/opt/rentech/trading_bot/RenTech/strategy_stack/iv_mispricing_complement.py_require_jsonlr   0   sY    !!#A99;%aS )q	

 	H    c                    g }| j                  d      5 }|D ]9  }|j                         }|s|j                  t        j                  |             ; 	 d d d        |S # 1 sw Y   |S xY w)Nzutf-8)encoding)openstripappendjsonloads)r   rowsflines       r   _load_jsonlr!   <   sj    D	G	$ * 	*D::<DKK

4()		** K* Ks   ?AA)c                  i }| D ]  }|j                  |      }|t        j                  |      j                         }t	        |j                  |d      xs d      }t        j                  |      so|j                  |d      |z   ||<    |st        j                  t              S t        j                  t        |j                                     }t        j                  |D 	cg c]  }	||	   	 c}	|t              S c c}	w )z<Daily P&amp;L summed on **exit** date (normalized midnight).        )dtype)indexr$   )getpd	Timestamp	normalizefloatmathisfiniteSeriesDatetimeIndexsortedkeys)
tradesexit_keypnl_keysrexdr   idxks
             r   _pnl_series_from_tradesr:   G   s     $&A !UU8_:LL&&(!%%%,-}}QuuQ}q !! yyu%%


6!&&(+
,C99C(qad(5AA(s   )Dc                   t        t        | d            }t        t        |d            }t        |dd      }t        |dd      }|j                  j	                  |j                        j                         }|j                  |d	      }|j                  |d	      }|d
k7  |d
k7  z  }	t        |	j                               dk  rddiS ||	   }
||	   }|
j                         d
kD  r-|j                         d
kD  rt        |
j                  |            n
t        d      }|d
k  }t        |j                               }|rt        ||   j                               n
t        d      }t        | j                               rt        ||    j                               n
t        d      }t        |      t        |      t        |	j                               ||||t        |j                               t        |j                               d	S )Nz@Export VRP with: vrp_backtest_theta.py --export-trades-jsonl ...r   zCreate overlay trades, e.g. backtest_iv_rich_vol_bear_call_spread.py ... --out-trades RenTech/data/logs/bear_spread.jsonl or use iv_mispricing_straddle_trades.jsonl from the straddle backtest.	exit_datepnl_usdr2   r3   	pnl_totalr#   
fill_valuer      errorz!too few overlapping days with PnLnan)	n_vrp_tradesn_overlay_tradescalendar_days_with_any_pnlcorr_daily_pnl_exit_daydays_main_pnl_negative#mean_overlay_pnl_when_main_negative'mean_overlay_pnl_when_main_non_negativetotal_main_pnltotal_overlay_pnl)r!   r   r:   r%   unionsort_valuesreindexintsumstdr*   corrmeanlen)vrp_pathoverlay_pathvrpovmainovlall_idxMO	mask_bothMcOcrU   	main_lossn_lossmean_ov_when_main_lossmean_ov_when_main_wins                    r   run_analyzerh   ^   s   
nX4vw
xC	U	

B #3iPD
!"{K
PCjjsyy)557GW-AG,AaAF#I
9==?a<==	
9B	
9B!#A"&&(Q,5E%LDAI!F;AU1Y<#4#4#67uU|;>
?O?O?Q;RE!YJ-"4"4"67X]^cXd CG&))--/&:#'"(/E3H."1557^
 
r   c                  t        t        | d            }t        t        |d            }t        |dd      }t        |dd      }|j                  j	                  |j                        j                         }	|j                  |	d	      }
|j                  |	d	      }t        |      |
j                         z   }|j                         }||z
  |j                  dt        j                        z  }|j                  d      j                  dd
      }d
t        |      |j                  d      j                  d      z  z   }||z  }t        |      |j                         z   }||z   }dd}t        |      t        |      t        |      t!        |      rt        |j"                  d         n
t        |      t!        |      rt        |j"                  d         n
t        |      t!        |      rt        |j"                  d         nt        ||z          ||       ||       ||      t        |
j%                               t        |j%                               dS )z
    Cumulative wealth = main book + overlay book. Overlay daily P&amp;L scaled by
    ``1 + dd_boost * dd_main`` where ``dd_main`` is drawdown of main equity (prev day).
    z%Export VRP with --export-trades-jsonlr<   zECreate overlay JSONL (bear spread or straddle backtest --out-trades).r=   r>   r?   r@   r#   rA   g      ?r	   c                    | j                         }|| z
  |j                  dt        j                        z  }t	        |       rt        |j                               S dS )Nr#   )cummaxreplacenprE   rW   r*   max)eqr   xs      r   _max_ddzrun_combine.<locals>._max_dd   sE    IIKVqyybff--!$RuQUUW~1c1r   )capital_maincapital_overlaydd_boostending_mainending_overlayending_combinedmax_dd_mainmax_dd_overlaymax_dd_combinedtotal_pnl_maintotal_pnl_overlay_scaled)ro   	pd.Seriesreturnr*   )r!   r   r:   r%   rO   rP   rQ   r*   cumsumrk   rl   rm   rE   fillnaclipshiftrW   ilocrS   )rX   rY   rs   rt   ru   rZ   r[   r\   r]   r^   r_   O_raweq_mpeakddscaler`   eq_ototalrq   s                       r   run_combiner      s    nX4[\
]C	X	

B #3iPD
!"{K
PCjjsyy)557GW-AKKCK0E+D;;=D
+c2662	2B	3		S#	&B%/BHHQK$6$6s$;;;EA!AHHJ.D4KE2 l+ 1(O/24yuTYYr]+eL>Q25d)%		".AW47J5B0E,YhJhDit}!$-"5>.$)!%%'N r   c            	        t        j                  d      } | j                  dd      }|j                  dd      }|j	                  d	t
        d
       |j	                  dt
        d
       |j                  dd      }|j	                  d	t
        d
       |j	                  dt
        d
       |j	                  dt        d       |j	                  dt        d       |j	                  dt        dd       | j                         }|j                  dk(  r[t        |j                  |j                        }t        t        j                  |d             d|v rt        j                   d       y y |j                  dk(  r~t#        |j                  |j                  t        |j$                        t        |j&                        t        |j(                              }t        t        j                  |d             y y )Nz.VRP + IV mispricing complement sleeve analysis)descriptioncmdT)destrequiredanalyzez!Correlation and conditional means)helpz--vrp-trades)typer   z--overlay-tradescombinez:Simulate combined equity with optional DD boost on overlayz--capital-maing     j@)r   defaultz--capital-overlayg     j@z
--dd-boostr#   zOMultiply overlay PnL by (1 + dd_boost * main_drawdown); 0 = fixed overlay size.)r   r   r   r   )indentrD   r	   )rs   rt   ru   )argparseArgumentParseradd_subparsers
add_parseradd_argumentr   r*   
parse_argsr   rh   
vrp_tradesoverlay_tradesr   r   dumpsr   r   r   rs   rt   ru   )apsubacargsouts         r   r\   r\      s   		 	 -]	^B




6Cy'JKANN>tN<NN%D4N@y'cdANN>tN<NN%D4N@NN#%NCNN&UHNENN^	   ==?Dxx9$//4+>+>?djjQ'(c>HHQK 	Y	OOt001!$"6"674==)
 	djjQ'( 
r   __main__)r   r   r   strr   r   )r   r   r   
list[dict])r1   r   r2   r   r3   r   r   r~   )rX   r   rY   r   r   dict)rX   r   rY   r   rs   r*   rt   r*   ru   r*   r   r   )r   None)__doc__
__future__r   r   r   r+   r   pathlibr   numpyrm   pandasr'   __file__r   parents_REPOr   r   insertr   r!   r:   rh   r   r\   __name__ r   r   <module>r      s   < #    
   X ((+u:SXXHHOOAs5z"	BB B 	B
 B.'T444 	4
 4 4 
4n")J zF r   