Ë
    =I±j‰.  ã                  ó¦   — 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ZdZdZd	Zd
Zd„ Zd„ Zd„ Ze G d„ d«      «       Zdd„Zefd„Zd„ Zdddœd„Zy)záNon-promoting, position-conditioned continuation-value experiment.

The value target compares selling now against a fixed short continuation, not
an oracle's best future exit. Inference always uses the candidate's own state.
é    )Úannotations)Ú	dataclassN)ÚCOMMISSION_RATEé   é   é   )ÚscoreÚscore_changeÚreturn_4Úvolatility_20Úmvrv_regimeÚ	rvol_normÚfed_net_liq_sign)ÚageÚunrealized_returnÚdrawdown_from_highÚextension_ageÚage_times_returnÚreturn_squaredÚdrawdown_squaredc           	     óz  — g d¢}|D ]\  }|| vrt        d|› �«      ‚t        j                  | |   j                  t        ¬«      «      j                  «       rŒPt        d|› �«      ‚ | j                  dz  }| j                  j                  «       }t        j                  ||j                  d«      j                  d«      | j                  j                  d«      j                  d«      |j                  d	d¬
«      j                  «       j                  d«      | j                  | j                  | j                   g«      S )N)Úactivation_scoreÚcloser   r   r   zMissing learned-exit input: ©ÚdtypezNonfinite learned-exit input: iè  é   r   r   r   )Úmin_periods)Ú
ValueErrorÚnpÚisfiniteÚto_numpyÚfloatÚallr   r   Ú
pct_changeÚcolumn_stackÚdiffÚfillnaÚrollingÚstdr   r   r   )ÚframeÚcolumnsÚnamer	   Úreturnss        úF/Users/jameslopez/projects/TradingBot25/strategies/mlp_learned_exit.pyÚmarket_featuresr/      s  € Ú[€GÛˆØ�uÑÜÐ;¸D¸6ÐBÓCÐCÜ�{‰{˜5 ™;×/Ñ/´eÐ/Ó<Ó=×AÑAÕCÜÐ=¸d¸VÐDÓEÐEð	 ð
 ×"Ñ" TÑ)€EØ�k‰k×$Ñ$Ó&€GÜ�?‰?˜E 5§:¡:¨a£=×#7Ñ#7¸Ó#:¸E¿K¹K×<RÑ<RÐSTÓ<U×<\Ñ<\Ð]^Ó<_Ø#ŸO™O¨B¸A˜OÓ>×BÑBÓD×KÑKÈAÓNØ!×-Ñ-¨u¯©À×@VÑ@VðXó Yð Yó    c           
     ó¶   — t        | |z
  dz  d«      }||z  dz
  }||z  dz
  }|dk  rdn| |z
  t        z  }	t        j                  ||||	||z  ||z  ||z  g«      S )Néd   g      @é   r   ç        )ÚminÚMAX_EXTENSIONr   Úarray)
ÚtÚ	entry_barÚentry_priceÚhighr   Úpendingr   ÚpnlÚddÚ	extensions
             r.   Ústate_featuresr@   &   st   € Ü
ˆq�9‰} Ñ# RÓ
(€CØ
�+Ñ
 Ñ
!€CØ	�‰˜Ñ	€BØ ’k‘¨¨G©´}Ñ'D€IÜ�8‰8�S˜#˜r 9¨c°#©g°s¸3±wÀÀ2ÁÐFÓGÐGr0   c                ó–   — |dk(  r| S |dk(  r|S |dk(  r)t         j                  | || d   |d   z  | d   |d   z  f   S t        d|› �«      ‚)	NÚmarketÚstateÚcombinedr   r3   r   r   zUnknown input kind: )r   Úr_r   )rB   rC   Úkinds      r.   Úfeature_vectorrG   .   sh   € ØˆxÒØˆØˆw‚ØˆØˆzÒÜ�u‰u�V˜U F¨1¡I¨e°A©hÑ$6¸¸q¹	À%ÈÁ(Ñ8JÐJÑKÐKÜ
Ð+¨D¨6Ð2Ó
3Ð3r0   c                  óZ   — e Zd ZU ded<   ded<   ded<   ded<   ded<   d	Zd
ed<   d„ Zd„ Zy	)Ú	ValueHeadÚstrrF   z
np.ndarrayÚmeanÚscaleÚcoefficientsr"   Ú	interceptNzdict | NoneÚtreec                ó(  — t        ||| j                  «      }|| j                  z
  | j                  z  }| j                  �œ|j                  t        j                  «      }d}| j                  d   |   dk7  rT|| j                  d   |      | j                  d   |   k  rdnd}| j                  |   |   }| j                  d   |   dk7  rŒT| j                  d   |   S t        t        j                  || j                  z  «      | j                  z   «      S )Nr   ÚleftéÿÿÿÿÚfeatureÚ	thresholdÚrightÚvalue)rG   rF   rK   rL   rO   Úastyper   Úfloat32r"   ÚsumrM   rN   )ÚselfrB   rC   ÚxÚzÚnodeÚbranchs          r.   ÚpredictzValueHead.predictA   sý   € Ü˜6 5¨$¯)©)Ó4ˆØˆt�y‰y‰[˜DŸJ™JÑ&ˆØ�9‰9Ð ð —‘œŸ™Ó$ˆAØˆDØ—)‘)˜FÑ# DÑ)¨RÒ/Ø#$ T§Y¡Y¨yÑ%9¸$Ñ%?Ñ#@ÀDÇIÁIÈkÑDZÐ[_ÑD`Ò#`™Ðfm�Ø—y‘y Ñ(¨Ñ.�ð —)‘)˜FÑ# DÑ)¨RÓ/ð —9‘9˜WÑ% dÑ+Ð+Ü”R—V‘V˜A × 1Ñ 1Ñ1Ó2°T·^±^ÑCÓDÐDr0   c           
     óº  — t        | j                  dk(  rt        nt        «      }| j                  dk(  rt        t        t        z   «      ddgz   }| j                  || j                  j                  «       | j                  j                  «       | j                  j                  «       | j                  | j                  €dnd | j                  €dnd| j                  dœ	S )	NrB   rD   Úscore_times_returnÚregime_times_drawdownç      ð?ÚridgeÚtree_depth_2)	rF   ÚfeaturesrK   rL   rM   rN   Úridge_penaltyÚ
model_typerO   )
ÚlistrF   ÚMARKET_NAMESÚSTATE_NAMESrK   ÚtolistrL   rM   rN   rO   )rZ   Únamess     r.   ÚartifactzValueHead.artifactO   s±   € Ü T§Y¡Y°(Ò%:•\ÄÓLˆØ�9‰9˜
Ò"Üœ¬Ñ3Ó4Ð8LÐNeÐ7fÑfˆEØŸ	™	¨u¸d¿i¹i×>NÑ>NÓ>PØŸ™×*Ñ*Ó,¸d×>OÑ>O×>VÑ>VÓ>XØ!Ÿ^™^ÀTÇYÁYÐEV¹cÐ\`Ø)-¯©Ð):™gÀÐX\×XaÑXañcð 	cr0   )Ú__name__Ú
__module__Ú__qualname__Ú__annotations__rO   r_   rn   © r0   r.   rI   rI   8   s5   … à
ƒIØ
ÓØÓØÓØÓØ€Dˆ+ÓòEócr0   rI   c           
     óV  ‡— | D �cg c]#  }‰|d      t        j                  |«      k  sŒ"|‘Œ% }}t        j                  |D �cg c]  }|d   ‘Œ	 c}t        ¬«      }t        j
                  |d¬«      \  }}	t        |«      t        |«      t        |«      t        t        ˆfd„|D «       d¬«      «      t        |«      t        k  d	œ}
|
d
   rd|
fS t        t        ||	«      «      }t        j                  |D �cg c]
  }d||   z  ‘Œ c}t        ¬«      }||j                  «       z  }t        j                  |D �cg c]  }t        |d   |d   |«      ‘Œ c}«      }t        j                  |D �cg c]  }|d   ‘Œ	 c}«      }t        j                  |«      j!                  «       r#t        j                  |«      j!                  «       st#        d«      ‚t        j                  |dd…df   |z  d¬«      }t        j$                  t        j                  |dd…df   ||z
  dz  z  d¬«      «      }d||dk  <   ||z
  |z  }t        t        j                  ||z  «      «      }|dk(  rëddlm}  |ddd¬«      }|j+                  |||¬«       |j,                  }|j.                  j1                  «       |j2                  j1                  «       |j4                  j1                  «       |j6                  j1                  «       |j8                  dd…ddf   j1                  «       dœ}t;        |||t        j<                  |j>                  d   «      ||«      |
fS |dk7  rt#        d«      ‚t        j@                  d|||«      }t        j@                  d||||z
  «      }t        jB                  jE                  |t        jF                  |j>                  d   «      z   |«      }t        j                  |«      j!                  «       st#        d«      ‚t;        |||||«      |
fS c c}w c c}w c c}w c c}w c c}w ) zEPurge target endpoints at/after cutoff; equal total weight per trade.Ú	label_endr9   r   T)Úreturn_countsc              3  ó.   •K  — | ]  }‰|d       –— Œ y­w)ru   Nrs   )Ú.0ÚrÚtimess     €r.   Ú	<genexpr>zfit_head.<locals>.<genexpr>_   s   øè ø€ Ð&OÁhÀ u¨Q¨{©^Õ'<Áhùs   ƒN)Údefault)ÚsamplesÚtradesÚcutoffÚmax_label_endÚabstainr�   r3   rB   rC   Útargetz$Nonfinite learned-exit training rowsr   )Úaxisr   rc   g:Œ0âŽyE>rO   )ÚDecisionTreeRegressorgš™™™™™¹?)Ú	max_depthÚmin_weight_fraction_leafÚrandom_state)Úsample_weight)rQ   rU   rS   rT   rV   rd   zUnknown value model typezni,n,nj->ijz	ni,n,n->iz#Nonfinite learned-exit coefficients)$ÚpdÚ	Timestampr   r7   ÚintÚuniqueÚlenrJ   ÚmaxÚMIN_TRAIN_TRADESÚdictÚzipr"   rY   rG   r    r#   r   ÚsqrtÚsklearn.treer„   ÚfitÚtree_Úchildren_leftrl   Úchildren_rightrS   rT   rV   rI   ÚzerosÚshapeÚeinsumÚlinalgÚsolveÚeye)Úrecordsrz   r   rF   rh   ry   ÚeligibleÚgroupsrŒ   ÚcountsÚauditÚcount_by_tradeÚgÚweightsr[   ÚyrK   rL   r\   rN   r„   Ú	estimatorrO   ÚexportedÚgramÚrhsrM   s    `                         r.   Úfit_headr«   Y   s„  ø€ á"ÓS™7�a e¨A¨k©NÑ&;¼b¿l¹lÈ6Ó>RÓ&R’˜7€HÐSÜ�X‰X©xÓ8©x¨!�q˜“~¨xÑ8ÄÔD€FÜ—Y‘Y˜v°TÔ:�N€FˆFÜ˜H›´°V³ÌÈFËÜ!¤#Ó&OÁhÓ&OÐY]Ô"^Ó_Ü˜F›Ô&6Ñ6ñ8€Eð ˆYÒØ�Uˆ{ÐÜœ#˜f fÓ-Ó.€NÜ�h‰h±vÓ>±v°!˜˜N¨1Ñ-Ó-°vÑ>ÄeÔL€GØˆw�{‰{‹}Ñ€GÜ
�‰ÉÓRÉÀA”.  8¡¨a°©j¸$Õ?ÈÑRÓS€AÜ
�‰¡xÓ0¡x !�!�H“+ xÑ0Ó1€AÜ�;‰;�q‹>×ÑÔ¤r§{¡{°1£~×'9Ñ'9Ô';ÜÐ?Ó@Ð@Ü�6‰6�'š!˜T˜'Ñ" 1Ñ$¨1Ô-€DÜ�G‰G”B—F‘F˜7¢1 d 7Ñ+¨a°©f°q©[Ñ9ÀÔBÓC€EØ€Eˆ%�$‰,ÑØ	
ˆ4‰�5Ñ€AÜ”b—f‘f˜W Q™YÓ'Ó(€IØ�VÒÝ6Ù)°AÐPRÐabÔcˆ	Ø�‰�a˜¨'ˆÔ2Ø�‰ˆØ ×.Ñ.×5Ñ5Ó7À$×BUÑBU×B\ÑB\ÓB^Ø#Ÿ|™|×2Ñ2Ó4À4Ç>Á>×CXÑCXÓCZØ!ŸZ™Zª¨1¨a¨Ñ0×7Ñ7Ó9ñ;ˆô ˜˜t U¬B¯H©H°Q·W±W¸Q±ZÓ,@À)ÈXÓVÐX]Ð]Ð]Ø�WÒÜÐ3Ó4Ð4Ü�9‰9�] A w°Ó2€DÜ
�)‰)�K  G¨Q¨y©[Ó
9€CÜ—9‘9—?‘? 4¬"¯&©&°·±¸±Ó*<Ñ#<¸cÓB€LÜ�;‰;�|Ó$×(Ñ(Ô*ÜÐ>Ó?Ð?Ü�T˜4 ¨°iÓ@À%ÐGÐGùòI TùÚ8ùò ?ùâRùÚ0s"   †#PªPÁPÃ7PÄ9P!Å-P&c                ód  — t        |t        z   ||z   «      }|dk  s|t        | «      k\  ryd}t        |dz   |dz   «      D ]e  }	|	|dz   k7  rt	        |||	   «      }|dkD  xr | |	   |d|z
  z  k  }
|
xs |	|k(  }|| |	   | |	dz
     z  |rt
        ndz
  z  }|sŒW|dt
        z
  z
  |	fc S  t        d«      ‚)zICanonical after-fee wealth difference versus exit now; endpoint explicit.r3   Nrc   r   r4   zContinuation must terminate)r5   ÚHORIZONr�   ÚrangerŽ   r   ÚAssertionError)r   r;   r8   r9   Ú
trade_highÚtrailÚbudgetÚendÚwealthÚjÚstopÚlasts               r.   Úcontinuation_targetr¸   ‚   sÝ   € ä
ˆa”‰i˜˜6™Ó
"€CØ�‚z�SœC ›JÒ&ØØ€FÜ�1�Q‘3˜˜A™ÖˆØ�	˜!‘ÒÜ˜Z¨¨a©Ó1ˆJØ�q‰yÒ=˜U 1™X¨°Q°u±WÑ)=Ñ=ˆØÒ�q˜C‘xˆà�%˜‘(˜5  1¡™:Ñ%¹D­ÀbÑIÑIˆÚØ˜QœÑ.Ñ/°Ð2Ò2ð ô Ð6Ó
7Ð7r0   c           
     ó  ‡‡‡‡‡— t        | «      Š| j                  j                  «       | j                  j                  «       cŠŠg Šd\  }}d\  }}ˆˆˆˆˆfd„}t	        t        | «      «      D �]  }|s/‰d   |   r&‰d   |   rd|‰|   }}}‰d   xr ‰d   |   ‰d	   k  }Œ5||d
z   k7  rt        |‰|   «      }‰d   dkD  xr ‰|   |d
‰d   z
  z  k  }|r‰d   |   n‰d   |   }	‰d   |   sŒ‚|rd}Œ‡ |||||	r|nd«       |	sŒ™|}
t	        |d
z   t        |t        z   t        | «      «      «      D ]G  }||d
z   k7  rt        |
‰|   «      }
‰d   |   r‰d   dkD  r‰|   |
d
‰d   z
  z  k  r n ||||
|«       ŒI d}�Œ ‰S )zFBaseline on-policy rows plus bounded, stopped post-exit continuations.©FF)rR   r4   c                óÔ   •— |dk  rt         nt         | |z
  z
  }t        ‰‰| ||‰	d   |«      }|�:‰
j                  | ||d   |d   ‰|    t        | |‰|   |‰|    |«      || k(  dœ«       y y )Nr   r±   r3   )Úbarr9   ru   r‚   rB   rC   Úis_exit_event)r6   r¸   Úappendr@   )r8   ÚentryÚpeakr<   r²   r‚   r   r;   rB   Úopportunitiesrž   s         €€€€€r.   r¾   z training_records.<locals>.appendœ   s”   ø€ Ø")¨A¢+•´=À!ÀGÁ)Ñ3LˆÜ$ U¨D°!°U¸DÀ-ÐPWÑBXÐZ`ÓaˆØÐØ�N‰N 1°5ÀvÈaÁyÐ\bÐcdÑ\eØ&,¨Q¡i¼.ÈÈEÐSXÐY^ÑS_ÐaeÐglÐmnÑgoÐqxÓ:yØ-4¸©\ñ;õ <ð r0   r¿   Útime_okTÚ	dead_zoneÚ
score_exitÚexit_thresholdr3   r±   r   ÚfallbackÚexitFrR   )	r/   r   r!   r;   r®   r�   rŽ   r5   r6   )r*   rÁ   ÚpositionÚuse_rawr9   r°   r¾   r8   r¶   rÄ   rÀ   rµ   r   r;   rB   rž   s    `          @@@@r.   Útraining_recordsrÊ   ”   s  ü€ ä˜UÓ#€FØ—+‘+×&Ñ&Ó(¨%¯*©*×*=Ñ*=Ó*?€K€Eˆ4Ø€GØ$Ñ€HˆgØ"Ñ€Iˆz÷<ð <ô ”3�u“:×ˆÙØ˜WÑ% aÒ(¨]¸9Ñ-EÀaÒ-HØ26¸¸5À¹8 Z˜)�Ø'¨Ñ4Òy¸À|Ñ9TÐUVÑ9WÐZgÐhxÑZyÑ9y�ØØ�	˜!‘ÒÜ˜Z¨¨a©Ó1ˆJØ˜WÑ%¨Ñ)Ò_¨e°A©h¸*ÀaÈÐV]ÑH^ÑF^Ñ:_Ñ._ˆÙ5<�] :Ñ.¨qÒ1À-ÐPVÑBWÐXYÑBZˆ
Ø˜YÑ'¨Ò*ØÙØˆHØÙˆq�)˜Z©j©¸bÔAÚØˆDÜ˜1˜Q™3¤ A¤m¡O´S¸³ZÓ @ÖA�Ø˜	 !™Ò#Ü˜t T¨!¡WÓ-�DØ$ YÑ/°Ò2°}ÀWÑ7MÐPQÒ7QÐV[Ð\]ÑV^ÐbfÐhiÐjwÐxñ  kAñ  iAñ  cBò  WBÙÙ�q˜) T¨1Õ-ð Bð ŠHð1 ð2 €Nr0   Úbaseline)ÚheadÚmodec               óh  — |dvrt        d«      ‚| j                  «       }t        | «      }| j                  j	                  «       | j
                  j	                  «       }	}| j                  t        j                  |«      k\  | j                  t        j                  |«      t        j                  d¬«      z   k  z  j	                  «       |d   z  }
t        | «      }t        j                  |t        «      t        j                  |t        «      t        j                  |t        «      }}}g }d\  }}d\  }}}t        |«      D �]\  }|�r!||dz   k7  rt!        ||	|   «      }|d   d	kD  xr ||   |d|d   z
  z  k  }t        |r|d
   |   n|d   |   «      }|
|   rÿ|r|d	k  r|}t#        ||||   |||   |«      }d}d}|rd}nP|dk(  s|€
|dk7  r|rBd}n?|d	k\  r||z
  t$        k\  rd}n+|dk7  r&|d	k\  s|dk(  r|j'                  ||   |«      }|d	k  rd}|j)                  |t+        | j                  j,                  |   «      |||z
  |d   |||||rdnd|dœ«       |r>d\  }}d\  ||<   }n0|
|   r+|d   |   r#d|||   }}}d||<   |d   xr |d   |   |d   k  }|||<   �Œ_ |||c|d<   |d<   |d<   ||fS )zéSequential candidate rollout, flat at evaluation start; warm market data.

    `veto` evaluates at and after a score exit; `manage` also exits early.
    Missing fitted heads abstain to baseline. `delay` is the constant control.
    >   ÚvetoÚdelayÚmanagerË   zInvalid exit policy moder3   )ÚdaysrÂ   rº   )rR   r4   rR   r±   r   rÆ   rÇ   NÚ Útrailing_stoprË   rÐ   rÄ   Úextension_caprÑ   Úlearned_exitÚhold)r¼   Útimer9   Úage_barsr   r°   rÄ   Úpending_sinceÚpredicted_advantageÚactionÚreason)TrR   r¿   TrÃ   rÅ   rÈ   Úexecute_entryÚexecute_exit)r   Úcopyr/   r   r!   r;   rØ   r‰   rŠ   Ú	Timedeltar�   r   r˜   r‹   Úboolr®   rŽ   r@   r6   r_   r¾   rJ   Úiloc)r*   rÁ   Ústartr³   rÌ   rÍ   ÚresultrB   r   r;   ÚallowedÚnÚ	positionsÚenteredÚexitedÚ	decisionsrÈ   rÉ   r9   r°   r<   r8   r¶   rÄ   rC   rV   rÝ   s                              r.   Úreplayrì   À   s"  € ð Ð:Ñ:ÜÐ3Ó4Ð4Ø�Z‰Z‹\€FÜ˜UÓ#€FØ—+‘+×&Ñ&Ó(¨%¯*©*×*=Ñ*=Ó*?ˆ4€EØ—
‘
œbŸl™l¨5Ó1Ñ1Ø—
‘
œRŸ\™\¨#Ó.¬r¯|©|ÀÔ/CÑCÑCñEßFNÁhÃjÐS`ÐajÑSkñl€GäˆE‹
€AÜ!#§¡¨!¬SÓ!1´2·8±8¸A¼tÓ3DÄbÇhÁhÈqÔRVÓFW˜ˆw€IØ€IØ$Ñ€HˆgØ%/Ñ"€Iˆz˜7Ü�1�XˆÚØ�I˜a‘KÒÜ  ¨T°!©WÓ5�
Ø  Ñ)¨AÑ-Òc°%¸±(¸jÈ!ÈMÐZaÑLbÑJbÑ>cÑ2cˆDÜ¹g˜m¨JÑ7¸Ò:È=ÐY_ÑK`ÐabÑKcÓdˆJØ�qŠzÙ '¨A¢+Ø�GÜ& q¨)°U¸9Ñ5EÀzÐSXÐYZÑS[Ð]dÓe�Ø�Ø�ÙØ,‘FØ˜ZÒ'¨D¨L¸TÀWº_Ù!Ø!-™Ø ’\ a¨¡i´=Ò&@Ø,‘FØ˜W’_¨'°Qª,¸$À(Ò:JØ ŸL™L¨°©°EÓ:�EØ ’zØ!/˜Ø× Ñ ¨´C¸¿
¹
¿¹ÈÑ8JÓ4KÐZcØ./°	©kÐPUÐVWÑPXØ0:Ø0:ÈWØ9>ÑTZÉ&Ð`fØ,2ñ"4ô 5ñ Ø(4Ñ%�H˜gØ)1Ñ&�F˜1‘I™wØ�QŠZ˜M¨'Ñ2°1Ò5Ø.2°A°u¸Q±x �iˆHØˆG�A‰JØ# KÑ0Òu°]À<Ñ5PÐQRÑ5SÐVcÐdtÑVuÑ5uˆGØˆ	�!‹ðI ðJ KTÐU\Ð^dÐG€Fˆ:Ñ˜˜Ñ/°¸Ñ1GØ�9ÐÐr0   )rd   )Ú__doc__Ú
__future__r   Údataclassesr   Únumpyr   Úpandasr‰   Ú%strategies.strategy_activation_scoresr   r­   r6   r�   rj   rk   r/   r@   rG   rI   r«   r¸   rÊ   rì   rs   r0   r.   Ú<module>ró      sŽ   ðñõ
 #å !ã Û å Aà
€Ø€ØÐ ð@€ðI€òYòHò4ð ÷cð có ðcó@&HðR N[ó 8ò$)ðX 6:À
õ 8r0   