
    Dj(                    |   d Z ddlm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                  j                  Zej                   j#                  d ee             ddlmZmZmZ ddlmZmZ ddlmZ ddlmZmZmZ dd	l m!Z! ddd
Z"ddZ#ddddZ$ddZ%e&dk(  r e' e%             y)a  Research-only SOPR forced-exit ablation for promoted BTC MLP replays.

Entries, MLP weights, promoted thresholds, and Pine code remain unchanged. A
long position is closed at a decision-bar close when SOPR is at or below a
discovery-calibrated low-tail cutoff.
    )annotationsN)Path)	OOS_STARTSCORE_START	WFO_FOLDS)calculate_metricsgenerate_signals)load_params)DISCOVERY_ENDVALIDATION_STARTparse_chart_time)calibrate_sopr_cutoffc           
     :   || n+| | d   t        j                  |      k     j                         }t        ||d      }|j	                         D ci c]<  \  }}|t        |t        t        j                  f      rt        |      n
t        |      > c}}S c c}}w )Ntimer   )score_start
min_trades)
pd	Timestampcopyr   items
isinstancefloatnpfloatingint)signalsstartendwindowresultkeyvalues          #tools/run_mlp_sopr_exit_ablation.py_metricsr$      s    WBLLQTDU1U)V)[)[)]Fv5QGFkqkwkwkyzky]g]`bgCEE2;;3G!HucRWjXkyzzzs   ABc                ^   | d   t        j                  |      k\  }||| d   t        j                  |      k  z  }| d   j                  dd      j                  d      |z  |z  }| d   j                  d      j	                  | d         j                  d      }||   j                         }t        |j                               t        t        |            t        |      rt        |j                         d	z        nd t        |      rt        |dkD  j                               d
S d d
S )Nr   position   r   )
fill_valuecloseg      ?d   )baseline_forceable_exitsnext_bar_observationsnext_bar_mean_return_pctnext_bar_positive_rate)r   r   shifteqdivsubdropnar   sumlenr   mean)r   forced_exitr   r   mask	forceablenext_returnvaluess           r#   _exit_diagnosticsr=   !   s   6?bll511D
2<<#444
#))!):==a@;NQUUI'"((,001ABFFsKK#**,F$'	$8!$S[!1BEf+E&++-#*=$>SW@CF%!(9(9(;"<	  RV	     g?)feature_tailc                  d|cxk  rdk  st        d       t        d      t        j                  |       }|j                  j                  j                         j                  j                         |_        d|j                  vrt        d      t        |d         |d<   |j                  d      j                  d      }t        t	        |            }|j                  d	      st        d
|       t        |t        |      }|d   j                  |      j                  d      }t!        |j#                         fi |}t!        |j#                         fd|j%                  t&              i|}t!        |j#                         fdt)        j*                  t-        |      t&              i|}	dD ]'  }
||
   j/                  |	|
         rt1        d|
        t2        t	        t              ft	        t4              t	        t        j6                  t8              t        j:                  d      z
        ft8        d fd}|j=                         D ci c]1  \  }\  }}|t?        |||      t?        |||      tA        ||||      d3 }}}}i }tB        D ]  \  }}}t        |||      }|d   j                  |      j                  d      }t!        |j#                         fd|j%                  t&              i|}|t?        |||      t?        |||      tA        ||||      d||<    t	        |       t	        |      d||g ddddd||dS c c}}}w )Nr   g      ?z&feature_tail must be between 0 and 0.5	sopr_normzdata has no sopr_norm columnr   T)dropmlp_weights_filez winner has no mlp_weights_file: Fr8   )dtype)r&   execute_entryexecute_exitz,all-false forced-exit mask changed baseline r'   )nanoseconds)	discovery
validationoos)baselinesopr_forced_exitexit_diagnostics)cutoffrK   rL   rM   z]when already long at the start of a decision bar, force exit if sopr_norm <= discovery cutoff)zMLP weightszall promoted parameterszentry logicz	Pine codezYstrategy metrics include the repository's 0.5% entry and 0.5% exit commission assumptionszgeach fold recalibrates its fixed 10th-percentile cutoff using only history before that fold's OOS startzNthis is a one-policy ablation, not a threshold sweep or a promotable candidate)policyr?   sopr_cutoff	unchangedcostswfo_calibrationwarning)	data_pathwinner_path
definitionwindows	wfo_folds)"
ValueErrorr   read_csvcolumnsstrlowerstripr   sort_valuesreset_indexr
   getr   r   lefillnar	   r   to_numpyboolr   zerosr6   equalsAssertionErrorr   r   r   r   	Timedeltar   r$   r=   r   )rU   rV   r?   dataparamsrN   r8   rK   gated	all_falsecolumnrX   namer   r   	summariesfoldsis_endfold_cutofffold_forced_exit
fold_gateds                        r#   runrw   1   sE   |!c!ABB "ABB;;y!D<<##))+//557DL$,,&788#DL1DLF#//T/:D[)*F::();K=IJJ"4EF{#&&v.55e<K		6v6HTYY[ak6J6JQU6J6VaZ`aE d"((3t9TX:Yd]cdI?&&y'89 #OPVx!XYY @
 "3}#56+,c",,y2IBLLefLg2g.hi4 2G #*--/ #2D,5# 	 5#6 (s ; 1(KPS T
 	

 #2   +-E's+D&,G,//<CCEJ%diiko?O?X?X_c?X?dohno
! 5#6 (UC @ 1(<LeUX Y	
c
	 ( ^;'u(!_p  Ig
  's   6Mc                    t        j                  t              } | j                  dt        d       | j                  dt        d       | j                  dt               | j                         }t        |j                  |j                        }t        j                  |d	      }t        |       |j                  rE|j                  j                  j                  dd
       |j                  j                  |dz          y)N)descriptionz--dataT)typerequiredz--winnerz--output)rz      )indent)parentsexist_ok
r   )argparseArgumentParser__doc__add_argumentr   
parse_argsrw   rk   winnerjsondumpsprintoutputparentmkdir
write_text)parserargsr    texts       r#   mainr   p   s    $$9F
td;

=

.DDKK(F::fQ'D	$K{{   =td{+r>   __main__)N)r   pd.DataFramer   r]   r   
str | Nonereturnzdict[str, float | int])
r   r   r8   z	pd.Seriesr   r]   r   r   r   zdict[str, float | int | None])rU   r   rV   r   r?   r   r   zdict[str, object])r   r   )(r   
__future__r   r   r   syspathlibr   numpyr   pandasr   __file__resolver   REPOpathinsertr]   configr   r   r   strategies.strategy_mlp_scoresr   r	   tools.check_mlp_parityr
   %tools.run_mlp_extreme_bar_event_studyr   r   r   !tools.run_mlp_sopr_entry_ablationr   r$   r=   rw   r   __name__
SystemExit r>   r#   <module>r      s    #   
   H~&&-- 3t9  4 4 N . c c C{  FJ <~ z
TV
 r>   