Ë
    ËE±jš  ã                  ó  — d Z ddlmZ ddlZddlmZ ddlZddlZddlm	Z	 ddl
Z
ddlZddlZ e	e«      j!                  «       j"                  j"                  Ze
j&                  j)                  d ee«      «       ddlmZmZmZmZmZ ddlmZ ddlmZ dd	l m!Z!m"Z" dd
l#m$Z$m%Z%m&Z& ddl'm(Z(  e«       df e«       df ed¬«      df ed¬«      df ed¬«      df ed¬«      df ed¬«      df ed¬«      df eddd¬«      dfdœ	Z)d„ Z*d„ Z+d„ Z,e-dk(  rq ej\                  e ¬«      Z/e/ja                  ddg d¢g d¢¬«       e/ja                  de	edz  ¬ «       e/jc                  «       Z2 e,e2jf                  e2jh                  «       yy)!zèFixed, non-promoting action-state ablations on existing BTC MLP winners.

No fitting, threshold search, or promotion. Historical regime slices are not
out-of-fold model validation: the frozen winners were trained through TRAIN_END.
é    )ÚannotationsN)Úasdict)ÚPath)ÚSCORE_STARTÚ	TRAIN_ENDÚ	OOS_STARTÚ	WFO_FOLDSÚWFO_MIN_OOS_TRADES)ÚStatePolicy)ÚCOMMISSION_RATE)Úgenerate_signalsÚ_score_to_signals)Ú
_data_pathÚ_load_winnerÚ_winner_path)Úvalidate_fileFTé   )Úmacro_memoryé   )Úexit_cooldown)Úmin_hold)r   r   r   )	ÚbaselineÚ	macro_nowÚmacro_memory_4Úmacro_memory_12Ú
cooldown_4Úcooldown_12Úhold_4Úhold_12Ú
combined_4c                óŽ  — | j                   j                  dd¬«      | j                  j                  «       j	                  d«      z  }|t
        | j                  j                  dd¬«      j                  t        «      | j                  j                  t        «      z   z  z  }| j                  t        j                  |«      k\  | j                  t        j                  |«      t        j                  d¬«      z   k  z  }| j                  |   |j                  |   j                  «       }}t!        |«      st#        d|› d|› �«      ‚t$        j&                  dt%        j(                  d|z   «      f   }t        t%        j*                  |t$        j,                  j/                  |«      z  dz
  «      «      }| j                  j1                  «       j3                  «       }	|j                  j4                  d	   |j                  j4                  d   z
  |	z   j7                  «       d
z  }
|d	   dkD  r|d	   d|
z  z  dz
  nd}|d	   dz
  dz  |dz  |dk  r|t9        |«      z  ndt;        |j                  j=                  «       «      t;        |j                  j=                  «       «      t        |j                   j?                  «       dz  «      t;        |jA                  dt        jB                  tD        ¬«      «      j=                  «       «      t;        |jA                  dt        jB                  tD        ¬«      «      j=                  «       «      dœS )zìCalendar annualization; preserve carry-in P&L even with zero new entries.

    Matches canonical close-to-close returns and fee timing. Windows include
    the whole last day. Drawdown includes initial equity, including early loss.
    é   r   )Ú
fill_valueF)ÚdayszNo bars in requested window z	 through g      ð?éÿÿÿÿg    ~~Ag      ð¿éd   NÚpolicy_blocked_entry)ÚdtypeÚpolicy_deferred_exit)Úpnl_pctÚdd_pctÚcalmarÚentriesÚexitsÚexposure_pctÚblocked_entriesÚdeferred_exit_bars)#ÚpositionÚshiftÚcloseÚ
pct_changeÚfillnar   Úexecute_entryÚastypeÚfloatÚexecute_exitÚtimeÚpdÚ	TimestampÚ	TimedeltaÚlocÚto_numpyÚlenÚ
ValueErrorÚnpÚr_ÚcumprodÚminÚmaximumÚ
accumulateÚdiffÚmedianÚilocÚtotal_secondsÚabsÚintÚsumÚmeanÚgetÚSeriesÚbool)ÚsignalsÚstartÚendÚreturnsÚmaskÚframeÚvaluesÚequityÚddÚintervalÚyearsÚcagrs               úP/Users/jameslopez/projects/TradingBot25/tools/run_mlp_state_policy_experiment.pyÚwindow_metricsra   ,   sŸ  € ð ×Ñ×$Ñ$ Q°1Ð$Ó5¸¿¹×8PÑ8PÓ8R×8YÑ8YÐZ[Ó8\Ñ\€GØŒ '×"7Ñ"7×"=Ñ"=¸aÈEÐ"=Ó"R×"YÑ"YÔZ_Ó"`Ø#*×#7Ñ#7×#>Ñ#>¼uÓ#Eñ#Fñ Gñ G€Gà�L‰LœBŸL™L¨Ó/Ñ/°G·L±LÄ2Ç<Á<ÐPSÓCTÔWY×WcÑWcÐijÔWkÑCkÑ4kÑl€DØ—K‘K Ñ% w§{¡{°4Ñ'8×'AÑ'AÓ'Cˆ6€EÜˆuŒ:ÜÐ7¸°w¸iÈÀuÐMÓNÐNÜ�U‰U�2”r—z‘z ! f¡*Ó-Ð-Ñ.€FÜ	Œr�v‰v�fœrŸz™z×4Ñ4°VÓ<Ñ<¸qÑ@ÓAÓ	B€BØ�|‰|× Ñ Ó"×)Ñ)Ó+€HØ�Z‰Z�_‰_˜RÑ  5§:¡:§?¡?°1Ñ#5Ñ5¸Ñ@×OÑOÓQÐUaÑb€EØ*0°©*°qª.ˆ6�"‰:˜!˜E™'Ñ" QÒ&¸c€DØ˜r™
 1™ cÑ)°R¸±VØ&(¨1¢f�dœ3˜r›7’l°$Ü˜5×.Ñ.×2Ñ2Ó4Ó5ÄÀE×DVÑDV×DZÑDZÓD\Ó@]Ü! %§.¡.×"5Ñ"5Ó"7¸Ñ";Ó<Ü" 5§9¡9Ð-CÄRÇYÁYÔUYÔEZÓ#[×#_Ñ#_Ó#aÓbÜ"% e§i¡iÐ0FÌÏ	É	ÔX\ÔH]Ó&^×&bÑ&bÓ&dÓ"eñgð gó    c                óv   — t        j                  t        | «      j                  «       «      j	                  «       S )N)ÚhashlibÚsha256r   Ú
read_bytesÚ	hexdigest)Úpaths    r`   Údigestri   F   s'   € Ü�>‰>œ$˜t›*×/Ñ/Ó1Ó2×<Ñ<Ó>Ð>rb   c                óâ	  — g g }}d}| D �]Ò  }t        ||«      }t        t        |«      «      \  }}}	|rt        |› d|› �«      ‚t	        j
                  |«      }
|
j                  j                  j                  «       j                  j                  «       |
_        t        j                  j                  j                  |
j                  «      rdnd }t	        j                  |
j                  |d¬«      j                  j                  d «      |
_        d}d|
v rKt	        j                   |
j"                  j$                  d   «      r|
j$                  d d j'                  «       }
d	}d|
vs+|
j"                  j)                  g d
¢«      j+                  «       st        d«      ‚t-        ||«      }t.        |d<   t1        |
fi |¤Ž}|j3                  |t        |j5                  t6        «      «      t9        |«      t9        t;        ||«      «      t9        |d   «      t        |
j                  j$                  d   «      t        |
j                  j$                  d   «      |||dœ
«       dt.        t<        fgt>        D �	��cg c]  \  }	}}d|d d › �||f‘Œ c}}}	¢dt@        t        |
j                  j$                  d   jC                  «       «      f‘}tD        jG                  «       D ]ÿ  \  }\  }}tI        |j'                  «       ||jJ                  jM                  «       |jN                  jM                  «       |jP                  jM                  «       ||r|
j"                  jM                  «       dk  nd ¬«      }|dk(  r-dD ](  }tR        jT                  jW                  ||   ||   «       Œ* |D ]8  \  }}}tY        |||«      }|j3                  |||dœ|¥d|d   tZ        k\  i¥«       Œ: �Œ �ŒÕ t	        j\                  |«      }|j_                  dd¬«       |ja                  |dz  d¬«       |dz  jc                  te        jf                  dtD        jG                  «       D ���ci c]  \  }\  }}|ti        |«      |dœ“Œ c}}}|dD �ci c]  }|t9        t6        |z  «      “Œ c}d œd!¬"«      «       tk        ||jl                  j)                  ddg«         jo                  dd#„ ¬$«      «       |S c c}}}	w c c}}}w c c}w )%NÚCOINBASE_BTCUSDz: ÚsT)ÚunitÚutcr   Úmvrv_regimer%   r"   )r%   r   r"   z0Expected finite mvrv_regime values in {-1, 0, 1}Ú_pine_time_startÚmlp_weights_file)
ÚtfÚdataÚdata_sha256Úwinner_sha256Úweights_sha256ÚfirstÚlastÚwarningsÚdropped_incomplete_tailÚparamsÚISÚhistorical_é   ÚOOS)Ústate_policyÚpolicy_riskr   )r2   r7   r:   )rr   ÚvariantÚwindowÚtrade_coverager-   )ÚparentsÚexist_okzmetrics.csvF)Úindexzmanifest.json)ÚpolicyÚmacro)	zstrategies/mlp_state_policy.pyz!strategies/strategy_mlp_scores.pyz(strategies/strategy_activation_scores.pyz'strategies/library_activation_scores.pyz#strategies/mlp_temporal_features.pyztools/validate_chart_data.pyz+tools/run_mlp_score_structure_experiment.pyz(tools/run_mlp_state_policy_experiment.pyz	config.py)Únon_promotingÚvariantsÚinputsÚcode_sha256é   )Úindentc                ó
   — | d›S )Nz.3f© )Úxs    r`   Ú<lambda>zrun.<locals>.<lambda>‚   s   € ÐghÐilÐfmÐdnrb   )r‡   Úfloat_format)8r   r   ÚstrrB   r<   Úread_csvÚcolumnsÚlowerÚstripÚapiÚtypesÚis_numeric_dtyper;   Úto_datetimeÚdtÚtz_localizeÚisnaro   rK   ÚcopyÚisinÚallr   r   r   ÚappendÚrelative_toÚREPOri   r   r   r	   r   ÚdateÚVARIANTSÚitemsr   Ústoch_peak_normr@   r4   ÚhighrC   ÚtestingÚassert_array_equalra   r
   Ú	DataFrameÚmkdirÚto_csvÚ
write_textÚjsonÚdumpsr   Úprintrƒ   Ú	to_string)ÚtfsÚoutputÚrowsÚ
provenanceÚassetrr   rh   Úerrorsry   Ú_rY   rm   rz   r{   ÚbaserU   rV   ÚwindowsÚnamerˆ   r‰   rT   ÚcolumnÚlabelÚmetricsÚresultsÚpÚms                               r`   ÚrunrÆ   J   sˆ  € Ø˜2ˆ*€DØ€EÜˆÜ˜% Ó$ˆÜ+¬C°«IÓ6Ñˆ�˜!ÙÜ ˜v R¨ xÐ0Ó1Ð1Ü—‘˜DÓ!ˆØŸ™×)Ñ)×/Ñ/Ó1×5Ñ5×;Ñ;Ó=ˆŒÜ—f‘f—l‘l×3Ñ3°E·J±JÔ?‰sÀTˆÜ—^‘^ E§J¡J°T¸tÔD×GÑG×SÑSÐTXÓYˆŒ
Ø"#ÐØ˜EÑ!¤b§g¡g¨e×.?Ñ.?×.DÑ.DÀRÑ.HÔ&IØ—J‘J˜s �O×(Ñ(Ó*ˆEØ&'Ð#ð  Ñ%¨U×->Ñ->×-CÑ-CÂJÓ-O×-SÑ-SÔ-UÜÐOÓPÐPÜ˜e RÓ(ˆÜ%0ˆÐ!Ñ"Ü Ñ0¨Ñ0ˆØ×Ñ ¬S°×1AÑ1AÄ$Ó1GÓ-HÔY_Ð`dÓYeÜ,2´<ÀÀrÓ3JÓ,KÜ-3°FÐ;MÑ4NÓ-OÜ$'¨¯
©
¯©¸Ñ(:Ó$;ÄSÈÏÉÏÉÐY[ÑI\ÓE]Ø'/ÐLcØ%+ñ-ô 	.ð œ+¤yÐ1ð HÝR[Õ\ÑR[ÁÀÀEÈ3˜ E¨"¨1 I ;Ð/°¸Ò<ÐR[Ó\ðHàœ9¤c¨%¯*©*¯/©/¸"Ñ*=×*BÑ*BÓ*DÓ&EÐFðHˆô &.§^¡^Ö%5Ñ!ˆD‘/�6˜5Ü'¨¯	©	«°V¸T×=QÑ=Q×=ZÑ=ZÓ=\Ø—
‘
×#Ñ#Ó% t§y¡y×'9Ñ'9Ó';È&ÙBG˜U×.Ñ.×7Ñ7Ó9¸AÒ=ÈTôSˆGð �zÒ!ÛK�FÜ—J‘J×1Ñ1°'¸&±/À4ÈÁ<ÕPð Lã%,Ñ!��u˜cÜ(¨°%¸Ó=�Ø—‘ 2°$À%ñ YÈ7ð YØ-¨w°yÑ/AÔEWÑ/WñYõ Zò &-ò &6ð; ôP �l‰l˜4Ó €GØ
‡L�L˜¨€LÔ-Ø‡N�N�6˜MÑ)°€NÔ7ØˆoÑ×)Ñ)¬$¯*©*ØÔhp×hvÑhvÔhxÕ+yÑhxÑXdÐX\Ñ^dÐ_`Ðbc¨D¼VÀA»YÐQRÑ2SÑ,SÐhxÓ+yØñFóGñFð 7;˜œf¤T¨D¡[Ó1Ñ1ðFñGñ	6ð ô	+ô 	ô 
ˆ'�'—.‘.×%Ñ% t¨U mÓ4Ñ
5×
?Ñ
?ÀeÑZnÐ
?Ó
oÔpØ€Nùô7 ]ùô" ,zùòGs   É3SÑS%Ñ8S,Ú__main__)Údescriptionz--tfsÚ+)Ú4HÚ6HÚ8HÚ12HÚ1D)ÚnargsÚchoicesÚdefaultz--outputz$results/mlp_experiments/state_policy)ÚtyperÑ   )5Ú__doc__Ú
__future__r   ÚargparseÚdataclassesr   rd   r²   Úpathlibr   ÚsysÚnumpyrC   Úpandasr<   Ú__file__ÚresolveÚparentr¦   rh   Úinsertr•   Úconfigr   r   r   r	   r
   Ústrategies.mlp_state_policyr   Ú%strategies.strategy_activation_scoresr   Ústrategies.strategy_mlp_scoresr   r   Ú(tools.run_mlp_score_structure_experimentr   r   r   Útools.validate_chart_datar   r¨   ra   ri   rÆ   Ú__name__ÚArgumentParserÚparserÚadd_argumentÚ
parse_argsÚargsr¶   r·   r‘   rb   r`   Ú<module>rë      su  ðñõ
 #ã Ý Û Û Ý Û 
ã Û áˆHƒ~×ÑÓ×&Ñ&×-Ñ-€Ø ‡�‡��‘3�t“9Ô ç SÕ SÝ 3Ý Aß Nß [Ñ [Ý 3ñ “ Ð&Ù“- Ð&Ù"°Ô2°DÐ9Ù#°Ô4°dÐ;Ù¨QÔ/°Ð7Ù¨bÔ1°5Ð9Ù AÔ&¨Ð.Ù RÔ(¨%Ð0Ù¨A¸QÈÔKÈTÐRñ
€ògò4?ò9ðx ˆzÒØ$ˆX×$Ñ$°Ô9€FØ
×Ñ˜ sÒ4SÒ]|ÐÔ}Ø
×Ñ˜
¨°tÐ>dÑ7dÐÔeØ×ÑÓ€DÙˆ�‰�$—+‘+Õð rb   