
    	js                         d Z ddlmZ ddlmZ ddlZddlZddl	m
Z
 ddlmZ ddlmZ ddlmZ dd	lmZ  ed
       G d d             ZddZddZdddddZdddd	 	 	 	 	 	 	 	 	 	 	 	 	 ddZddZy)zILeakage-aware research utilities for relative extreme-bar classification.    )annotations)	dataclassN)SimpleImputer)LogisticRegression)average_precision_score)make_pipeline)StandardScalerT)frozenc                  ,    e Zd ZU ded<   ded<   ded<   y)TailRulestrfeaturesidefloatcutN)__name__
__module____qualname____annotations__     %strategies/mlp_tail_event_research.pyr   r      s    L
I	Jr   r   c                F   d|cxk  rdk  st        d       t        d      | d   }|j                  |      |j                  d|z
        }}t        j                  d| j                  t
        j                        }d|j                  ||k  <   d|j                  ||k\  <   |S )	zCLabel each complete outcome as down (-1), ordinary (0), or up (+1).r         ?z'tail_fraction must be between 0 and 0.5forward_return      ?)indexdtype   )
ValueErrorquantilepdSeriesr   npint8loc)frametail_fractionreturnslowerupperlabelss         r   relative_tail_labelsr.      s    }"s"BCC #BCC$%G##M2G4D4DS=EX4Y5EYYq277;F#%FJJw% #$FJJw% Mr   c                    |j                   dk(  r| |j                     |j                  k  S |j                   dk(  r| |j                     |j                  k\  S t        d      )Nlowhighz!rule side must be 'low' or 'high')r   r   r   r!   )r(   rules     r   
_selectionr3   "   sV    yyET\\"dhh..yyFT\\"dhh..
8
99r   	rvol_norm
   )volatility_featurebinsc          
     @   |dk  rt        d      dd|j                  |g}|D cg c]	  }|| vs| }}|rt        d|       | j                  |      j                         }t	        ||      }	t        ||      |d<   |	j                  d      |d	<   |d   j                  j                  |d
<   |j                  d
      |   j                  dd      j                  |      j                  |dz
        j                  t              |d<   dx}
x}x}}d}|j                  d
dgd      D ]  \  }}||d      ||d       }}|j                  s|j                  r0t!        |      }|
|z  }
|t!        |      z  }|||d	   j#                         z  z  }|||d	   j#                         z  z  }|dz  } |
dk(  r
ddddddddS ||
z  }||
z  }t        |
      t        |      |t%        |      t%        |      t%        ||z
        |dkD  rt%        ||z        dS ddS c c}w )u  Compare selected and control bars within calendar-year × volatility bins.

    This standardizes the control rate to the selected bars' stratum mix. It
    is deliberately a simple matched descriptive test, not a causal estimator
    of a deployable trading rule.
       zbins must be at least twotimer   missing required columns: subsetselectedr   downyearfirstT)methodpctg-q=)r,   vol_bing        r   )observedr    N)r>   controlsstrataselected_ratematched_control_ratedeltalift)r!   r   dropnacopyr.   r3   eqdtr@   groupbyrankmulclipastypeintemptylenmeanr   )r(   r2   r)   r6   r7   requiredcolumnmissingdatar-   selected_totalcontrol_totalweighted_selected_rateweighted_control_raterG   _groupr>   controlweightrH   control_rates                         r   #volatility_matched_downside_profilerf   *   s    ax455($,,8JKH$,DH&e0CvHGD5gY?@@<<x<(--/D!$6F!$-D99R=DL<??''DLll6*+=>CC7X\C]aabfgllswzsl  A  H  H  IL  MDOVYYNY]Y%;>SFLL&)!4tLD5!%
"34eU:=N<N6O'>>W]]X& W%&8F+;+@+@+B"BB'&/*>*>*@!@@! E 1Djny}  HL  M  	M*^;M(>9L'&}- %l 3}|347Ca7Gml23  NR 5 Es
   	HH         )
block_barsrepetitionsseedc          
     p   |dk  rt        d      |dk  rt        d      | j                  dd|j                  dg      j                  d	
      }t	        |      |k  rt        d      t
        j                  j                  |      }g }t        j                  t	        |      |z
  dz         }	t        |      D ]  }
g }t	        |      t	        |      k  rPt        |j                  |	            }|j                  t        |||z                t	        |      t	        |      k  rP|j                  |dt	        |          j                         }t        |||      d   }|t        j                   |      s|j#                  t%        |              |s	|ddddddS t        j&                  |      }|t	        |      t%        t        j(                  |d            t%        t        j(                  |d            t%        t        j(                  |d            t%        |dkD  j+                               dS )az  Estimate matched-lift uncertainty with deterministic contiguous resampling.

    Resampling individual bars would assume independent six-hour returns. This
    uses contiguous blocks (seven days by default), retaining short-run serial
    structure. It is an uncertainty description for this observational study,
    not an optimization input or a trading confidence score.
    r9   zblock_bars must be at least two   zrepetitions must be at least 20r:   r   r4   r<   T)dropz'frame needs at least one complete blockr    N)r)   rK   r   )rk   valid_repetitionsp05p50p95share_above_oneg?r   gffffff?r   )r!   rL   r   reset_indexrW   r%   randomdefault_rngarangerangerU   choiceextendilocrM   rf   isfiniteappendr   asarrayr"   rX   )r(   r2   r)   rj   rk   rl   r\   rngliftsstartsra   indexesstartsamplerK   valuess                   r   #moving_block_bootstrap_matched_liftr   Y   s     A~:;;R:;;<<(8$,,T<UaagkalD
4y:BCC
))


%CEYYs4y:-12F;'lSY&

6*+ENN5
(:;< 'lSY& 7:CI./446264}]^deD 1LLt%   *4X\ei  C  D  	DZZF" [R[[./R[[./R[[./ &3,!4!4!67 r   c                  g |dD cg c]  }|| vs||vs| }}|rt        d|       t        | |      j                         dz   }t        ||      j                         dz   }t        t	        d      t               t        dddd	d
            }| |   j                  t        j                  t        j                   gt        j                        }	||   j                  t        j                  t        j                   gt        j                        }
|j                  |	|       |d   }|dd j                  |
      }t        j                  d||j                        |j                  z   }||j!                  dd      z  }t        j"                  |      }||j%                  dd      z  }|j&                  }t)        t        j*                  |dk(        d         t)        t        j*                  |dk(        d         }}t-        |      t/        t1        |dk(  |dd|f               t/        t1        |dk(  |dd|f               t/        |      dS c c}w )zDFit on an earlier window and score relative tails in a later window.r   r;   r    median)strategyg?balancedi  ri   saga)Cclass_weightmax_iterrandom_statesolverr   Nz	ij,kj->ikT)axiskeepdimsr   r9   )observationsdown_pr_auc	up_pr_auctail_base_rate)r!   r.   to_numpyr   r   r	   r   replacer%   infnanfit	transformeinsumcoef_
intercept_maxexpsumclasses_rU   flatnonzerorW   r   r   )train
evaluationfeaturesr)   rZ   r[   y_trainy_evalmodeltrain_featuresevaluation_features
classifiertransformedscores
exp_scoresprobabilitiesclassesdown_column	up_columns                      r   tail_classifier_metricsr      s7   $Ah$A0@$Au$A&VSXEX\bjt\tv$AGu5gY?@@"5-8AACaGG!*m<EEG!KFx(
 	#	
E" 8_,,bffrvvg->GN$X.667H"&&Q	IIng&
 rJ*&&':;KYY{K1A1ABZEZEZZF
fjja$j//FJQ!FFM!!G 1!=a!@A3r~~V]abVbGcdeGfCgKJ4Vq[-PQS^P^B_`a26Q;aQZl@[\].	 K vs
   II)r(   pd.DataFramer)   r   return	pd.Series)r(   r   r2   r   r   r   )r(   r   r2   r   r)   r   r6   r   r7   rU   r   dict[str, float | int | None])r(   r   r2   r   r)   r   rj   rU   rk   rU   rl   rU   r   r   )
r   r   r   r   r   z	list[str]r)   r   r   zdict[str, float | int])__doc__
__future__r   dataclassesr   numpyr%   pandasr#   sklearn.imputer   sklearn.linear_modelr   sklearn.metricsr   sklearn.pipeliner   sklearn.preprocessingr	   r   r.   r3   rf   r   r   r   r   r   <module>r      s    O " !   ( 3 3 * 0 $  	: AL  Z\ ,h --
- 	-
 - - - #-`,r   