Ë
    sp±jZq  ã            	       ó2  — d Z ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlmZmZ ddlZddlZe
j$                  j'                  ej$                  j)                  ej$                  j+                  ej$                  j-                  e«      d«      «      «       ddlZddlmZmZmZmZmZmZ ddl m!Z! ddl"m#Z#m$Z$ dZ%d	Z&d
Z'dZ(dZ)dZ*da+d„ Z,d„ Z-d„ Z.d!d„Z/d!d„Z0d„ Z1d„ Z2d„ Z3d„ Z4d„ Z5	 d"d„Z6d„ Z7d„ Z8d„ Z9	 d"d„Z:d#d„Z;d„ Z<d„ Z=e>d k(  r e=«        yy)$uº  
Two-phase trainer for the MLP activation-score strategy (strategy_mlp_scores).

Phase 1 â€” supervised pretrain (PyTorch):
    Target: y_t = tanh( scale * (k-bar forward log return / k) / rolling_vol_t )
    where rolling_vol is past-only (shifted) so there is no lookahead leakage.
    Temporal split: train on bars up to the last WFO fold's IS end, early-stop
    on the last fold's OOS span. (Full per-epoch expanding-window CV across all
    folds was deliberately simplified away â€” Phase 2 does the real fold-averaged
    model selection on the actual backtest metric.)

Phase 2 â€” CMA-ES fine-tune (cma):
    Parameter vector = flattened MLP weights + [entry, exit, exit_conf, trail]
    thresholds. Fitness = -(mean per-fold OOS Calmar across config.WFO_FOLDS,
    invalid folds scoring 0, >= WFO_MIN_VALID_FOLDS valid folds required)
    + lambda * mean squared deviation from the pretrained weights (L2 anchor).
    `--fold-objective robust` keeps the same WFO-only training boundary but
    subtracts penalties for high fold drawdown, zero P&L/DD, low fold trade
    coverage, negative folds, and threshold fragility.
    Per-fold Calmar matches the existing WFO rescore convention in
    auto_optimize_loop.py (composite_score's 1000% P&L gate is meaningless on
    ~1-year folds, so Calmar is the per-fold metric).

Usage:
    python3 tools/train_mlp.py --data data/COINBASE_BTCUSD-6H.csv         [--hidden 16 8] [--target-k 10] [--phase1-epochs 300]         [--es-generations 300] [--es-popsize 32] [--es-sigma 0.05] [--l2 1e-3]         [--fold-objective mean|robust] [--es-workers 0]         [--seed 42] [--smoke] [--skip-phase2] [--out PATH]

Output: strategies/params/mlp/mlp_weights_{ASSET}_{TF}.json
é    N)ÚdatetimeÚtimezoneú..)ÚACTIVATION_NAMEÚFEATURE_COLSÚ_score_to_signalsÚcalculate_metricsÚmlp_forwardÚsave_mlp_artifact)Ú_prepare_features)ÚDEFAULT_WORKER_FRACTIONÚresolve_worker_counté<   g       @ç      Y@g      I@çš™™™™™©?ç      ð?c                 óÌ   — t        j                  dt        j                  j	                  | «      «      }|st        d| › �«      ‚|j                  d«      |j                  d«      fS )Nz ([A-Z0-9_!]+)-([0-9]+[HDW])\.csvz&Cannot derive ASSET/TF from filename: é   é   )ÚreÚmatchÚosÚpathÚbasenameÚ
ValueErrorÚgroup)Ú	data_pathÚms     ú`/Users/jameslopez/projects/TradingBot25/.worktrees/mlp-comparable-measurement/tools/train_mlp.pyÚderive_asset_tfr    I   sS   € Ü
�‰Ð4´b·g±g×6FÑ6FÀyÓ6QÓR€AÙÜÐAÀ)ÀÐMÓNÐNØ�7‰7�1‹:�q—w‘w˜q“zÐ!Ð!ó    c                 óÊ  — t        j                  | «      }|j                  j                  j	                  «       j                  j                  «       |_        t         j                  j                  j                  |d   «      }t        j                  |d   |rdnd d¬«      j                  j                  d «      |d<   t        j                  t        j                  «      }t        t        t        j                  «      «      dk(  r|d   |t        j                   d¬«      z   k  n|d   |k  }|d   t        j"                  k\  |z  }|j$                  |   j'                  d¬«      S )	NÚtimeÚsT)ÚunitÚutcé
   r   ©Údays©Údrop)ÚpdÚread_csvÚcolumnsÚstrÚlowerÚstripÚapiÚtypesÚis_numeric_dtypeÚto_datetimeÚdtÚtz_localizeÚ	TimestampÚconfigÚ	TRAIN_ENDÚlenÚ	TimedeltaÚTRAIN_STARTÚlocÚreset_index)r   ÚdfÚnumeric_timeÚendÚend_maskÚmasks         r   Ú	load_datarE   P   s  € Ü	�‰�YÓ	€BØ—‘—‘×%Ñ%Ó'×+Ñ+×1Ñ1Ó3€B„JÜ—6‘6—<‘<×0Ñ0°°F±Ó<€LÜ—‘  6¡
¹±È$ÐTXÔY×\Ñ\×hÑhÐimÓn€B€v�JÜ
�,‰,”v×'Ñ'Ó
(€Cä:=¼cÄ&×BRÑBRÓ>SÓ:TÐXZÒ:Zˆr�&‰z˜C¤"§,¡,°AÔ"6Ñ6Ò6Ð`bÐciÑ`jÐnqÑ`q€HØˆv‰Jœ&×,Ñ,Ñ,°Ñ8€DØ�6‰6�$‰<×#Ñ#¨Ð#Ó.Ð.r!   c                 ó�  — t        j                  | d   j                  j                  t         j                  «      «      }t        j                  t        j                  ||d   ¬«      «      }|j                  t        «      j                  «       j                  d«      j                  }t        j                  t        | «      t         j                  «      }||d |d|  z
  |z  |d|  t        j                  t         |z  |dz   z  «      }t        j"                  |«       }|| d   t$        j&                  k\  j                  z  }||fS )zJtanh-squashed vol-normalised k-bar forward log return. Returns (y, valid).Úcloser   )Úprependr   Nç�íµ ÷Æ°>r#   )ÚnpÚlogÚvaluesÚastypeÚfloat64r,   ÚSeriesÚdiffÚrollingÚ
VOL_WINDOWÚstdÚshiftÚfullr;   ÚnanÚtanhÚTARGET_SCALEÚisnanr9   ÚSCORE_START)r@   ÚkÚ	log_closeÚret1ÚvolÚfwdÚyÚvalids           r   Úbuild_targetrb   \   sþ   € ä—‘�r˜'‘{×)Ñ)×0Ñ0´·±Ó<Ó=€IÜ�9‰9”R—W‘W˜Y°	¸!±Ô=Ó>€Dà
�,‰,”zÓ
"×
&Ñ
&Ó
(×
.Ñ
.¨qÓ
1×
8Ñ
8€CÜ
�'‰'”#�b“'œ2Ÿ6™6Ó
"€CØ˜!˜"� 	¨#¨A¨2 Ñ.°!Ñ3€Cˆˆ!ˆ€HÜ
�‰”˜sÑ" c¨D¡jÑ1Ó2€AÜ�X‰X�a‹[ˆL€EØ	ˆb�‰jœF×.Ñ.Ñ.×6Ñ6Ñ6€EØˆeˆ8€Or!   c                 ó  — |dk  rt        d«      ‚t        j                  |«      j                  d¬«      }|r|j	                  | «      n|}t        j                  | t        ¬«      ||k  j                  «       z  ||k  j                  «       z  S )z@Keep labels whose final forward observation precedes validation.r   z"target_horizon must be nonnegativeTr*   ©Údtype)	r   r,   rO   r?   rT   rJ   ÚasarrayÚboolÚto_numpy)ra   ÚtimesÚ	val_startÚtarget_horizonÚ	label_ends        r   Úpurged_training_maskrm   n   s~   € à˜ÒÜÐ=Ó>Ð>Ü�I‰I�eÓ×(Ñ(¨dÐ(Ó3€EÙ0>�—‘˜^˜OÔ,ÀE€IÜ�:‰:�e¤4Ô(¨E°IÑ,=×+GÑ+GÓ+IÑIÈYÐYbÑMb×LlÑLlÓLnÑnÐnr!   c                 ó6  ‡ ‡‡"‡#— dd l Š#‰#j                  j                  «       rdn'‰#j                  j                  j                  «       rdndŠ"‰#j                  |«       t        j                  j                  |«       ‰ j                  d   gt        |«      z   dgz   }g }g }t        t        |«      dz
  «      D ]W  }‰#j                  j                  ||   ||dz      «      }||‰#j                  j                  «       gz  }|j!                  |«       ŒY  ‰#j                  j"                  |Ž j%                  ‰"«      }|||k\  j&                  z  ||k  j&                  z  }t)        ||||
«      } |	d‰"› d|› d|j+                  «       › d	|j+                  «       › �«       ˆ ˆ"ˆ#ˆfd
„} ||«      \  }} ||«      \  }}‰#j,                  j/                  |j1                  «       dd¬«      }‰#j                  j3                  «       }t        j4                  d ddf\  }}}}t        |«      D �]§  }|j7                  «        |j9                  «         | ||«      |«      }|j;                  «        |j=                  «        |j?                  «       } |jA                  «        ‰#jC                  «       5  t        |«      rtE         | ||«      |«      «      n| }!d d d «       !|dz
  k  r¶|!d}}|D �cg c]¦  }|jF                  jI                  «       jK                  «       jM                  «       jO                  «       jQ                  «       |jR                  jI                  «       jK                  «       jM                  «       jO                  «       jQ                  «       f‘Œ¨ }}n|dz  }||k\  r |	d|› d|d›d�«        n |dz  dk(  s�Œ• |	d|› d| d›d|!d›�«       �Œª |‰"|dz   |tU        |j+                  «       «      tU        |j+                  «       «      dœfS # 1 sw Y   �Œ@xY wc c}w )Nr   ÚcudaÚmpsÚcpur   zphase1: device=z arch=z train_bars=z
 val_bars=c                 ó¦   •— ‰j                  ‰|    ‰j                  ‰¬«      ‰j                  ‰|    ‰j                  ‰¬«      j                  d«      fS )N)re   Údevicer   )ÚtensorÚfloat32Ú	unsqueeze)Úmask_arrÚXrs   Útorchr`   s    €€€€r   Útenszpretrain.<locals>.tensŽ   sO   ø€ Ø—‘˜Q˜x™[°·±Àf�ÓMØ—‘˜Q˜x™[°·±Àf�ÓM×WÑWÐXYÓZð\ð 	\r!   g{®Gáz„?g-Cëâ6?)ÚlrÚweight_decayé   rI   zphase1: early stop at epoch z (best val MSE z.5fÚ)é2   zphase1: epoch z train=z val=)rs   ÚarchÚ
epochs_runÚbest_val_mseÚ
train_barsÚval_bars)+ry   ro   Úis_availableÚbackendsrp   Úmanual_seedrJ   ÚrandomÚseedÚshapeÚlistÚranger;   ÚnnÚLinearÚTanhÚappendÚ
SequentialÚtorL   rm   ÚsumÚoptimÚAdamÚ
parametersÚMSELossÚinfÚtrainÚ	zero_gradÚbackwardÚstepÚitemÚevalÚno_gradÚfloatÚweightÚdetachrq   ÚdoubleÚnumpyÚcopyÚbiasÚint)$rx   r`   ra   ri   ÚhiddenÚepochsr‰   rj   Úval_endrK   rk   r€   Úlayers_tÚmodulesÚiÚlinÚmodelÚval_maskÚ
train_maskrz   ÚXtrÚytrÚXvaÚyvaÚoptÚloss_fnÚbest_valÚ
best_stateÚpatienceÚ
since_bestÚepochÚlossÚ
train_lossÚval_lossrs   ry   s$   ``                                @@r   ÚpretrainrÀ   w   sª  û€ ÛàŸ
™
×/Ñ/Ô1‰fØ!ŸN™N×.Ñ.×;Ñ;Ô=‘5Øð ð 
×Ñ�dÔÜ‡I�I‡N�N�4Ôà�G‰G�A‰Jˆ<œ$˜v›,Ñ&¨!¨Ñ,€DØ€HØ€GÜ”3�t“9˜q‘=Ö!ˆØ�h‰h�o‰o˜d 1™g t¨A°©E¡{Ó3ˆØ�C˜Ÿ™Ÿ™›Ð)Ñ)ˆØ�‰˜Õð "ð  ˆE�H‰H×Ñ Ð)×,Ñ,¨VÓ4€Eà˜ Ñ*×2Ñ2Ñ2°e¸wÑ6F×5NÑ5NÑN€HÜ% e¨U°I¸~ÓN€JÙˆ/˜&˜ ¨ v¨\¸*¿.¹.Ó:JÐ9Kð LØ—L‘L“NÐ#ð	%ô &÷\ñ �JÓ�H€CˆÙ�H‹~�H€Cˆà
�+‰+×
Ñ
˜5×+Ñ+Ó-°$ÀTÐ
Ó
J€CØ�h‰h×ÑÓ €GÜ13·±¸¸rÀ1Ð1DÑ.€Hˆj˜( Jä�v—ˆØ�‰ŒØ�‰ŒÙ‘u˜S“z 3Ó'ˆØ�‰ŒØ�‰Œ
Ø—Y‘Y“[ˆ
Ø�
‰
ŒØ�]‰]�_Ü:=¸c¼(”u™W¡U¨3£Z°Ó5Ô6È
ˆH÷ à�h ‘oÒ%Ø#+¨Q�jˆHñ &.ó/á%-˜cð Ÿ:™:×,Ñ,Ó.×2Ñ2Ó4×;Ñ;Ó=×CÑCÓE×JÑJÓLØŸ8™8Ÿ?™?Ó,×0Ñ0Ó2×9Ñ9Ó;×AÑAÓC×HÑHÓJòLà%-ð ñ /ð ˜!‰OˆJØ˜XÒ%ÙÐ2°5°'¸ÈÐRUÈÐVWÐXÔYÙØ�2‰:˜Œ?Ù�.   w¨z¸#Ð.>¸eÀHÈSÀ>ÐRÖSð+ ð.  &°$ÀeÈaÁiØ(0Ü&)¨*¯.©.Ó*:Ó&;Ü$'¨¯©«Ó$7ñ9ð 9ð 9÷ ‰_üò/s   Ê%&P	Ë#B+PÐ	P	c                 óÀ   — t        j                  | D ��cg c]8  \  }}t        j                  |j                  «       |j                  «       g«      ‘Œ: c}}«      S c c}}w ©N)rJ   ÚconcatenateÚravel)ÚlayersÚWÚbs      r   Úflatten_layersrÈ   º   sA   € Ü�>‰>ÉfÔUÉfÁdÀaÈœ2Ÿ>™>¨1¯7©7«9°a·g±g³iÐ*@ÕAÈfÒUÓVÐVùÓUs   •=A
c                 óæ   — g d}}t        t        |«      dz
  «      D ]R  }||dz      ||   }}| ||||z  z    j                  ||«      }|||z  z  }| |||z    }||z  }|j                  ||f«       ŒT |S )Nr   r   )rŒ   r;   Úreshaper�   )	Úthetar€   rÅ   r­   ÚliÚn_outÚn_inrÆ   rÇ   s	            r   Úunflatten_layersrÏ   ¾   s•   € Ø�AˆA€FÜ”C˜“I ‘MÖ"ˆØ˜2 ™6‘l D¨¡HˆtˆØ�!�A˜ ™Ñ$Ð%×-Ñ-¨e°TÓ:ˆ¸AÀÈÁÑ<M¸AØ�!�A˜‘IÐˆ  U¡
 Ø�‰�q˜!�fÕð	 #ð
 €Mr!   c                 ó:  — |dk(  rt        t        j                  | «      «      S |dk(  rt        t        j                  | «      «      S |dk(  rCdt        t        j                  | «      «      z  dt        t        j                  | «      «      z  z   S t	        d|› �«      ‚)NÚmeanÚminÚmean_mingffffffæ?ç333333Ó?zUnknown fold objective: )r    rJ   rÑ   rÒ   r   )ÚcalmarsÚ	objectives     r   Úaggregate_fold_scorer×   È   s„   € Ø�FÒÜ”R—W‘W˜WÓ%Ó&Ð&Ø�EÒÜ”R—V‘V˜G“_Ó%Ð%Ø�JÒØ”Uœ2Ÿ7™7 7Ó+Ó,Ñ,¨s´U¼2¿6¹6À'»?Ó5KÑ/KÑKÐKÜ
Ð/°	¨{Ð;Ó
<Ð<r!   c           	      ór  — t        j                  |d d t         j                  ¬«      }t        |«      dk(  ryt        j                  | t         j                  ¬«      } t        j                  t        j
                  | d d …d f   |d d d …f   z
  «      d¬«      }t        t        j                  ||k  «      «      S )Né   rd   r   r   )Úaxis)rJ   rf   rN   r;   rÒ   Úabsr§   r“   )ÚscoresÚ
thresholdsÚmarginÚdists       r   Úthreshold_fragility_countrà   Ò   s†   € Ü—‘˜J r¨˜N´"·*±*Ô=€JÜ
ˆ:ƒ˜!ÒØÜ�Z‰Z˜¤b§j¡jÔ1€FÜ�6‰6”"—&‘&˜¢ 4 ™¨:°dºA°gÑ+>Ñ>Ó?ÀaÔH€DÜŒr�v‰v�d˜V‘mÓ$Ó%Ð%r!   c           	      óB  — t        | d«      }t        |dz   t        t        j                  |dz  «      «      «      }t        dt        |«      «      }d}d}	d}
d}|D ]Í  }t        |j                  dd«      «      }t        t        |j                  dd«      «      «      }t        |j                  d	d«      «      }t        |j                  d
d«      «      }|t        d|t        z
  «      t        z  z  }|dk  r|	dz  }	|
t        d||z
  «      |z  z  }
|t        dt        d| «      «      z  }ŒÏ ||z  }|	|z  }	|
|z  }
||z  }t        ||t        «      }t        ||t        «      }d|z  t        d|dz  «      z   }||	|
|||||dœ}d|z  d|	z  z   d|
z  z   d|z  z   |z   }||z
  |fS )NrÓ   é   g      ø?r   ç        úTotal Tradesr   úMax Drawdown %úP&L/DD RatioúCalmar Ratioç      $Àr   r   g     @@)Údrawdown_penaltyÚpnl_dd_penaltyÚtrade_penaltyÚnegative_fold_penaltyÚfragility_penaltyÚfragile_0_05Úfragile_1_0Útrade_targetgš™™™™™é?g      Ð?rÔ   )r×   Úmaxr§   rJ   Úceilr;   ÚgetrÛ   r    ÚROBUST_DRAWDOWN_TARGETrÒ   rà   ÚROBUST_FRAGILITY_TIGHT_MARGINÚROBUST_FRAGILITY_WIDE_MARGIN)rÕ   Úfold_metricsrÜ   rÝ   Úmin_fold_tradesÚbaserð   Ún_foldsré   rê   rë   Úneg_fold_penaltyÚmetricsÚtradesÚdrawdownÚpnl_ddÚcalmarÚfragile_tightÚfragile_widerí   Ú	penaltiesÚpenaltys                         r   Úrobust_objective_scorer  Û   sþ  € Ü ¨Ó4€DÜ�¨Ñ*¬C´·±¸È#Ñ8MÓ0NÓ,OÓP€LÜ�!”S˜Ó&Ó'€GàÐØ€NØ€MØÐÛˆÜ�W—[‘[ °Ó3Ó4ˆÜ”u˜WŸ[™[Ð)9¸3Ó?Ó@ÓAˆÜ�w—{‘{ >°3Ó7Ó8ˆÜ�w—{‘{ >°5Ó9Ó:ˆàœC  XÔ0FÑ%FÓGÔJ`Ñ`Ñ`ÐØ�SŠ=Ø˜cÑ!ˆNØœ˜S ,°Ñ"7Ó8¸<ÑGÑGˆØœC ¤S¨¨v¨gÓ%6Ó7Ñ7Ñð  ð ˜ÑÐØ�gÑ€NØ�WÑ€MØ˜ÑÐä-¨f°jÔB_Ó`€MÜ,¨V°ZÔA]Ó^€LØ Ñ-´°S¸,ÈÑ:NÓ1OÑOÐð -Ø(Ø&Ø!1Ø.Ø%Ø#Ø$ñ	€Ið 	ÐÑØ
�Ñ
ñ	à
�Ñ
ñ	ð Ð!Ñ
!ñ	"ð ñ		ð ð �'‰>˜9Ð$Ð$r!   c	                 óŠ  — | ddg   j                  «       | d   j                  «       | d   j                  j                  t        j                  «      | d   j                  j                  t        j                  «      |d d …df   |t        |«      t        j                  |t        j                  ¬«      t        |«      ||||dœS )Nr#   rG   Úhighé	   rd   )Úbase_dfri   Ú	close_arrÚhigh_arrÚstoch_peak_arrrx   r€   Útheta0_wÚfoldsrø   Úmin_valid_foldsÚl2Úfold_objective)r¥   rL   rM   rJ   rN   r‹   rf   )	r@   rx   r€   r  r  rø   r  r  r  s	            r   Úmake_fitness_contextr    s¤   € ð �v˜wÐ'Ñ(×-Ñ-Ó/Ø�F‘—‘Ó"Ø˜‘[×'Ñ'×.Ñ.¬r¯z©zÓ:Ø�v‘J×%Ñ%×,Ñ,¬R¯Z©ZÓ8ØšA˜q˜D™'ØÜ�T“
Ü—J‘J˜x¬r¯z©zÔ:Ü�e“Ø*Ø*ØØ(ñð r!   c           
      ó  — t        j                  | t         j                  ¬«      } |d   }t        |«      }t	        | d | |d   «      }t        j
                  | |d  t        z  g d¢g d¢«      }t        |d   |«      }|d   j                  «       }||d<   |d	   |d
<   |d   |d   |d   ddt        d|d   «      dœ}t        |||d   |d   |d	   «      }g g d}}
}	|d   }|d   }|d   D �]  \  }}}t        j                  |«      }t        |t        «      r*t        |«      dk(  r||t        j                  d¬«      z   k  n||k  }|j                   |   }t#        ||k\  |z  j%                  «       «      dk  r(|
j'                  dddddœ«       |	j'                  d«       Œµt)        |||¬«      }|
j'                  |«       |d   dk  s|d   |k  r|	j'                  d«       Œö|	j'                  |d   «       |dz  }�Œ d|i}|d    }|d!k(  r3t+        |	|
|||«      \  }}|j-                  |«       t/        |	d"«      |d#<   n||d$   k  rd}nt/        |	|«      }|d%   t1        t        j2                  | d | |z
  dz  «      «      z  }| |z   |	||fS )&Nrd   r  r€   )ç      ŒÀr  r  rã   )ç      Œ@r  r  g      >@rx   r	  Úactivation_scorer  r  r   r   r   r   Frã   rÙ   )Ú!i_long_entry_activation_thresholdÚ i_long_exit_activation_thresholdÚ-i_long_exit_activation_confirmation_thresholdÚi_use_long_exit_confirmationÚi_use_long_entry_confirmationÚi_trailing_stop_thresholdr  r
  ri   rø   r  r'   r(   rè   )rä   rç   ræ   rå   )Úscore_startÚ
min_tradesrç   rä   Úvalid_foldsr  ÚrobustrÓ   Úbase_fold_scorer  r  )rJ   rf   rN   r;   rÏ   ÚclipÚTHRESHOLD_SCALEr
   r¥   rñ   r   r,   r8   Ú
isinstancer/   r<   r>   r§   r“   r�   r	   r  Úupdater×   r    rÑ   )rË   Úcontextr  Ún_wrÅ   rÝ   rÜ   ÚdÚparamsrÕ   r÷   ra   ri   rø   Ú_Ú	oos_startÚoos_endrB   rC   Úslrü   Údiagnosticsr  Úscorer  Úanchors                             r   Úevaluate_thetar1     sð  € Ü�J‰J�u¤B§J¡JÔ/€EØ�zÑ"€HÜ
ˆh‹-€CÜ˜e D S˜k¨7°6©?Ó;€FÜ—‘Øˆcˆdˆ”oÑ%Ú%Ú#ó€Jô ˜ ™ vÓ.€FØ�	Ñ×ÑÓ!€AØ"€AÐÑØ˜
Ñ#€A€f�Ià-7¸©]Ø,6°q©MØ9CÀA¹Ø(+Ø).Ü%(¨¨j¸©mÓ%<ñ€Fô 	Ø	ØØÐ Ñ!Ø�ÑØ�
Ñó	€Að $& r¨1˜5ˆ\€GØ�GÑ€EØÐ/Ñ0€OØ!(¨Õ!1Ñˆˆ9�gÜ�l‰l˜7Ó#ˆÜ9CÀGÌSÔ9QÔVYÐZaÓVbÐfhÒVh�5˜3¤§¡°1Ô!5Ñ5Ò5ÐnsÐwzÑnzˆØ�U‰U�8‰_ˆÜ�˜)Ñ# xÑ/×4Ñ4Ó6Ó7¸"Ò<Ø×Ñ°ÀEØ14Èñ!Mô Nà�N‰N˜3ÔØÜ# B°IÈ/ÔZˆØ×Ñ˜GÔ$Ø�>Ñ" eÒ+¨w°~Ñ/FÈÒ/XØ�N‰N˜3Õà�N‰N˜7 >Ñ2Ô3Ø�Q‰JŠEð "2ð" ! %Ð(€KØÐ-Ñ.€NØ˜Ò!Ü1ØØØØØó
Ñˆˆyð 	×Ñ˜9Ô%Ü)=¸gÀzÓ)RˆÐ%Ò&Ø	�Ð*Ñ+Ò	+Ø‰ä$ W¨nÓ=ˆà�T‰]œU¤2§7¡7¨E°$°3¨K¸(Ñ,BÀqÑ+HÓ#IÓJÑJ€FØˆ8�fÑ˜g z°;Ð>Ð>r!   c                 ó   — | a y rÂ   )Ú_FITNESS_CONTEXT)r&  s    r   Úinit_fitness_workerr4  h  s   € àÑr!   c                 ó"   — t        | t        «      S rÂ   )r1  r3  )rË   s    r   Úevaluate_theta_workerr6  m  s   € Ü˜%Ô!1Ó2Ð2r!   c	                 óX   ‡	‡
— t        | ||||||||«	      Š	ˆ	ˆ
fd„Š
‰	‰
_        i ‰
_        ‰
S )Nc                 ó>   •— t        | ‰«      \  }}}}|‰_        |||fS rÂ   )r1  Úlast_diagnostics)rË   ÚfitrÕ   rÝ   r.  r&  Úfitnesss        €€r   r;  zmake_fitness.<locals>.fitnessx  s-   ø€ Ü0>¸uÀgÓ0NÑ-ˆˆW�j +Ø#.ˆÔ Ø�G˜ZÐ'Ð'r!   )r  r&  r9  )r@   rx   r€   r  r  rø   r  r  r  r&  r;  s            @@r   Úmake_fitnessr<  q  s<   ù€ ä"Ø
ˆAˆt�X˜u o°ÈØó€Gõ
(ð
 €G„OØ!€GÔØ€Nr!   c                 ó4  ‡ ‡‡‡‡‡‡‡— dd l }|j                  ||||ddœ«      Št        dt        ‰«      «      Št        j
                  |d d i ‰dœŠˆˆfd„Šˆˆˆˆˆfd„}	‰dk(  rF ‰d«       ˆ fd	„}
t        ‰«      D ])  } |	||
«       ‰j                  «       sŒ ‰d
|› �«        ‰S  ‰S t        ‰ dd «      }|€t        d«      ‚ ‰d‰› d�«       t        j                  d«      }	 t        j                  j                  ‰|t        |f¬«      5 Št        ‰«      D ]+  } |	|ˆfd„«       ‰j                  «       sŒ  ‰d
|› �«        n d d d «       ‰S # 1 sw Y   ‰S xY w# t         t"        f$ r)} ‰d|› d�«       t%        ‰ |||‰|‰d¬«      cY d }~S d }~ww xY w)Nr   i÷ÿÿÿ)Úpopsizer‰   Úverboser   ©r:  rË   rÕ   Úthrr.  Úworkersc                 ó®   •— |\  }}}}|j                  |«       |‰d   k  r4|t        j                  | «      j                  «       ||t	        |«      ‰dœŠy y )Nr:  r@  )r�   rJ   rf   r¥   Údict)	ÚsolutionÚresultÚfitsÚfrÕ   rA  r.  ÚbestrB  s	          €€r   Úobserve_solutionz!run_cma.<locals>.observe_solution‹  s\   ø€ Ø'-Ñ$ˆˆ7�C˜Ø�‰�AŒàˆt�E‰{Š?àÜŸ™ HÓ-×2Ñ2Ó4Ø"ØÜ# KÓ0Ø"ñ‰Dð r!   c                 óž  •— ‰
j                  «       D �cg c]'  }t        j                  |t        j                  ¬«      ‘Œ) }} ||«      }g }t	        ||«      D ]  \  }} ‰|||«       Œ ‰
j                  ||«       | dz  dk(  s| ‰dz
  k(  r8 ‰d| › d‰› d‰	d   d	›d
‰	d   xs g D �cg c]  }t        |d«      ‘Œ c}› �«       y y c c}w c c}w )Nrd   r'   r   r   zphase2: gen Ú/z best_fitness=r:  ú.4fú fold_calmars=rÕ   r   )ÚaskrJ   rf   rN   ÚzipÚtellÚround)ÚgenÚ	evaluatorr$   Ú	solutionsÚresultsrG  rE  rF  ÚcrI  ÚesÚgenerationsrK   rJ  s            €€€€€r   Úrun_generationzrun_cma.<locals>.run_generation™  sé   ø€ Ø>@¿f¹f¼hÓG¹h¸”R—Z‘Z ¬¯©Ö4¸hˆ	ÐGÙ˜IÓ&ˆØˆÜ # I¨wÖ 7ÑˆH�fÙ˜X v¨tÕ4ð !8à
�‰�	˜4Ô Ø�‰8�qŠ=˜C ;°¡?Ò2Ù�,˜s˜e 1 [ M°ÀÀUÁÈCÐ?Pð Q Ø7;¸I±Ò7LÈ"Ð7LÓ NÑ7L°¤ q¨!¥Ð7LÑ NÐOðQõ Rð 3ùò Hùò !Os   ”,CÂ'C
z1phase2: evaluating CMA-ES population sequentiallyc                 ó„   •— g }| D ]7  } ‰|«      \  }}}|j                  |||t        t        ‰di «      «      f«       Œ9 |S )Nr9  )r�   rD  Úgetattr)rU  ÚoutrE  rH  rÕ   rA  r;  s         €r   Úsequential_evaluatorz%run_cma.<locals>.sequential_evaluator§  sT   ø€ ØˆCÛ%�Ù")¨(Ó"3‘��7˜CØ—
‘
˜A˜w¨Ü ¤¨Ð2DÀbÓ!IÓJðLõ Mð &ð ˆJr!   z phase2: CMA-ES converged at gen r&  z*Parallel CMA-ES requires a fitness contextz*phase2: evaluating CMA-ES population with z worker processesÚspawn)Úmax_workersÚ
mp_contextÚinitializerÚinitargsc                 óB   •— t        ‰j                  t        | «      «      S rÂ   )r‹   Úmapr6  )rU  Úpools    €r   Ú<lambda>zrun_cma.<locals>.<lambda>Ä  s   ø€ ´d¸4¿8¹8ÔDYÐ[dÓ;eÔ6fr!   z!phase2: worker pool unavailable (z(); falling back to sequential evaluation)rB  )ÚcmaÚCMAEvolutionStrategyrñ   r§   rJ   r˜   rŒ   Ústopr\  r   ÚmpÚget_contextÚ
concurrentÚfuturesÚProcessPoolExecutorr4  ÚOSErrorÚPermissionErrorÚrun_cma)r;  Útheta0Úsigma0r>  rY  r‰   rK   rB  rh  rZ  r^  rS  r&  ra  ÚexcrI  rX  rJ  rf  s   `   ` ``       @@@@r   rr  rr  ‚  sÁ  ÿ€ Ûà	×	!Ñ	! &¨&Ø.5¸tÐPRÑ"Só
U€Bä�!”S˜“\Ó"€GÜ—6‘6 F°tÀDØ¨'ñ3€Dõ÷	Rð 	Rð �!‚|ÙÐ?Ô@ô	ô ˜Ö%ˆCÙ˜3Ð 4Ô5Ø�w‰w�yÙÐ6°s°eÐ<Ô=ØØˆð &ð
 ˆä�g˜y¨$Ó/€GØ€ÜÐEÓFÐFáÐ
4°W°IÐ=NÐOÔPÜ—‘ Ó(€Jð\Ü×Ñ×3Ñ3ØØ!Ü+Ø�Zð	 4ô 
ð
 Ü˜[Ö)�Ù˜sÓ$fÔgØ—7‘7•9ÙÐ:¸3¸%Ð@ÔAÙð	 *÷
ð €K÷
ð €Kûô ”_Ð%ò \ÙÐ/°¨uÐ4\Ð]Ô^Ü�w ¨°¸ÀdÈCÐYZÔ[Õ[ûð\úsB   Ã&(E Ä+EÄ:EÅE ÅEÅE ÅE ÅFÅ.FÆFÆFc                 óú  — ddl m} |j                  xs	 d|› d|› d�} |d|› �«       t        j                  |«      }|j
                  d   j                  «       } |d«        || j                  «       fi |¤Ž}	|	d   j                  }
|
j                  t        j                  «      }t        j                  t        |
«      t        j                  ¬	«      }d}t        t        |
«      «      D ]$  }|
|   dkD  rt        |d
z  d«      ||<   |dz  }Œ#d}Œ& || d<   || d<   t!        |j#                  «       «      }t%        |j'                  «       «      } |d|› dt        | «      › d|d›d|dz  d›d�	«       t(        ddgz   S )aÒ  Compute in_long_position + bars_held_norm from the current winner policy.

    One-cycle circularity (documented in roadmap): the position state used for
    training comes from the OLD model's decisions, not the new model.  This is
    acceptable for the first retrain; a second retrain with the new policy's
    state would converge.

    Mutates df in-place, adding columns 'in_long_position' and 'bars_held_norm'.
    Returns the extended feature_cols list.
    r   )Úgenerate_signalsz8results/winners/optimization_winner_strategy_mlp_scores_r*  z.csvz'approach-b: loading winner params from zNapproach-b: running generate_signals with old policy to get position state ...Úpositionrd   r   r   r   Úin_long_positionÚbars_held_normu+   approach-b: position features injected â€” rL  z& bars in-position, max bars_held_norm=z.3fz (=éd   ú.0fz bars))Ústrategies.strategy_mlp_scoresrw  Úapproach_b_paramsr,   r-   ÚilocÚto_dictr¥   rL   rM   rJ   rN   Úzerosr;   rŒ   rÒ   r§   r“   r    rñ   r   )r@   ÚassetÚtfÚargsrK   Ú_gen_signalsÚparams_pathÚ	params_dfr)  Úsignalsrx  Úin_longÚ	bars_heldÚbars_inr­   Ún_in_posÚmax_helds                    r   Ú_inject_position_featuresrŽ  Ò  s�  € õ Pð 	×Ñò 	WØEÀeÀWÈAÈbÈTÐQUÐVð ñ Ð
1°+°Ð?Ô@Ü—‘˜KÓ(€IØ�^‰^˜AÑ×&Ñ&Ó(€FáÐXÔYá˜2Ÿ7™7›9Ñ/¨Ñ/€Gà�zÑ"×)Ñ)€HØ�o‰oœbŸj™jÓ)€Gä—‘œ˜X›¬b¯j©jÔ9€IØ€GÜ”3�x“=Ö!ˆØ�A‰;˜Š?Ü˜w¨™°Ó4ˆI�a‰LØ�q‰L‰Gà‰Gð "ð %€BÐÑØ$€BÐÑä�7—;‘;“=Ó!€HÜ�Y—]‘]“_Ó%€HÙÐ
5°h°Z¸qÄÀRÃÀ	ð JØ& s˜^¨3¨x¸©|¸CÐ.@Àð	Hô Iô Ð-Ð/?Ð@Ñ@Ð@r!   c                  óÚ  — t        j                  d¬«      } | j                  dd¬«       | j                  dt        ddd	g¬
«       | j                  dt        d¬«       | j                  dt        d¬«       | j                  dt        d¬«       | j                  dt        d¬«       | j                  dt        d¬«       | j                  dt        d¬«       | j                  dg d¢dd¬«       | j                  dt        dd¬«       | j                  d t        t
        d!¬«       | j                  d"t        d#¬«       | j                  d$d%d&¬'«       | j                  d(d%¬)«       | j                  d*d+¬,«       | j                  d-d.¬,«       | j                  d/d0¬,«       | j                  d1d%d2¬'«       | j                  d3d4¬,«       | j                  d5g d6¢d7d8¬«       | j                  «       }t        j                  «       }d9„ }|j                  r%|j                  r|j                  |j                  }}nt        |j                  «      \  }}t        |j                  «      }|j                  rî|j                  d:«      j                  d¬;«      }d	d<g|_        t#        |j$                  d=«      |_        t#        |j&                  d>«      |_        t#        |j(                  d	«      |_        |d?   j*                  t        t-        |«      d@z  «         }d t/        |j1                  «       «      t/        |d?   j*                  dA   j1                  «       «      fg}dB\  }	}
|}nKt2        j4                  }t2        j6                  }	t2        j8                  }
t;        j<                  |dA   dC   «      }t?        |j@                  |j(                  |jB                  «      |_         |d?   j*                  dA   } |dD|› dE|› dFt-        |«      › dG|d?   j*                  d   j1                  «       › dH|d?   j*                  dA   j1                  «       › dI|j                   › �«       |jD                  rtG        |||||«      }ntH        }tK        ||«      }tM        ||jN                  «      \  }}dCdAddJœ}|jP                  d7k7  rÄ||jP                     }dK|jR                  v r‘|dK   jT                  |k(  }t        |jW                  «       «      }||z  }t        |jW                  «       «      tY        dC|«      z  dLz  } |dM|jP                  › dN|› dOt        |jW                  «       «      › dP|dQ›dR�	«       n |dS|jP                  › dT�«       t[        ||||d?   |j                   |j$                  |j\                  ||||jN                  ¬U«      \  }}|dV   }i |¥|jN                  t^        t`        t/        |«      t/        |«      gdWœ¥|j                  tc        jd                  tg        |j                  dX«      ji                  «       «      jk                  «       t/        |d?   j*                  d   j1                  «       «      t/        |d?   j*                  dA   j1                  «       «      g|j\                  |jP                  tm        jn                  tp        jr                  «      ju                  dY¬Z«      d[œ}tw        ||«      }ty        jz                  ty        j|                  |d\«      ty        j|                  |d]«      ty        j|                  |d^«      d_g«      } |d`|j#                  «       da›db|jY                  «       da›dc|d   da›dd|dC   da›de|df   da›�
«       |j~                  �s°t�        |«      }ty        j‚                  ||t„        z  g«      }t‡        ||||||	|
|jˆ                  |jŠ                  «	      } ||«      \  }} }! |dg|dh›di| D �"cg c]  }"t�        |"df«      ‘Œ c}"› �«       t�        |||j�                  |j(                  |j&                  |j\                  ||j@                  «      }#t-        |«      }$t“        |#dj   d |$ |«      }|#dk   }|j(                  |j�                  |j&                  |jˆ                  |#j•                  dl|j@                  «      |jŠ                  |#dm   |#dn   t	        ty        j–                  |#dn   «      «      t	        ty        j"                  |#dn   «      «      doœ
|dp<   |jŠ                  dqk(  r|#j•                  dri «      |dp   ds<   t	        |d   «      t	        |dC   «      t	        |df   «      t	        |dt   «      dudvdwœ|dx<   |j˜                  xs) tš        jœ                  jŸ                  dydzd{d||› d}|› d~�«      }%t¡        |%|||||¬«        |d€|%› d�t        j                  «       |z
  dQ›d‚�«        |dƒ|dx   › �«       y c c}"w )„NzTwo-phase MLP trainer)Údescriptionz--dataT)Úrequiredz--hiddenÚ+é   é   )ÚtypeÚnargsÚdefaultz
--target-kr'   )r•  r—  z--phase1-epochsi,  z--es-generationsz--es-popsizeé    z
--es-sigmar   z--l2gü©ñÒMbP?z--fold-objective)rÑ   rÒ   rÓ   r   rÑ   zÚPhase-2 fold aggregation: mean matches legacy behavior; min emphasizes worst fold; mean_min blends 70%% mean / 30%% min; robust subtracts drawdown, P&L/DD, trade-count, negative-fold, and threshold-fragility penalties.)Úchoicesr—  Úhelpz--es-workersr   zžWorker processes for parallel CMA-ES population evaluation. Use 0 for auto, currently 50%% of logical CPUs capped by popsize; use 1 for sequential evaluation.)r•  r—  rš  z--worker-fractionz.Logical CPU fraction used when --es-workers=0.z--seedé*   z--smokeÚ
store_truez/Tiny run on recent bars for plumbing validation)Úactionrš  z--skip-phase2)r�  z--outzArtifact path override)rš  z--assetzHAsset override (e.g. COINBASE_BTCUSD) when filename format doesn't matchz--tfz?Timeframe override (e.g. 4H) when filename format doesn't matchz--approach-bzÃProbe: inject in_long_position + bars_held_norm (cols 50-51) computed from the current winner artifact's position state (one-cycle circularity per roadmap). Output artifact will have 52 features.z--approach-b-paramszMWinner CSV to derive position state from (default: auto-detect from asset/tf)z--regime)ÚbullÚbearÚsidewaysÚallr¡  z‚Filter Phase-1 supervised training to MVRV regime bars only (requires mvrv_regime column). Phase-2 CMA-ES always uses all IS bars.c                 óP   — t        dt        j                  d«      › d| › �d¬«       y )NÚ[z%H:%M:%Sz] T)Úflush)Úprintr#   Ústrftime)Úmsgs    r   rK   zmain.<locals>.log0  s#   € Ü�”$—-‘- 
Ó+Ð,¨B¨s¨eÐ4¸DÖAr!   i   r*   é   r}   râ   r#   g      è?éÿÿÿÿ)r   r   r   zasset=z tf=z bars=z window=r   z hidden=)rž  rŸ  r   Úmvrv_regimer{  zregime=z: Phase-1 training bars u    â†’ z (r|  z%)zWARNING: --regime=z0 requested but mvrv_regime not in data; ignoring)rk   r€   )Útarget_kÚ
vol_windowÚtarget_scaleÚval_spanÚrbÚseconds)Útimespec)Úphase1Ú	data_fileÚdata_sha256Útrain_windowr‰   Úregime_filterÚcreatedr   éK   é   rã   zphase2: score range [z.1fz, z], seed thresholds entry=z exit=z conf=r   z"phase2: pretrain baseline fitness=rM  rN  rË   rA  rB  r:  rÕ   )
Ú
es_popsizeÚes_sigmaÚes_generationsÚ	l2_anchorÚ
es_workersr  Úbest_fitnessÚfold_calmarsÚfold_mean_calmarÚfold_min_calmarÚphase2r   r.  Úrobust_diagnosticsrÙ   r   F)r  r  r  r  r  r  Úrecommended_thresholdsÚ
strategiesr)  ÚmlpÚmlp_weights_r*  z.json)r‚  Ú	timeframeÚtrainingÚfeature_colszartifact written: z  (zs total)zrecommended thresholds: )QÚargparseÚArgumentParserÚadd_argumentr§   r    r   Ú
parse_argsr#   r‚  rƒ  r    ÚdatarE   ÚsmokeÚtailr?   r¨   rÒ   Úphase1_epochsr¼  rº  r  r;   r/   Údater9   Ú	WFO_FOLDSÚWFO_MIN_OOS_TRADESÚWFO_MIN_VALID_FOLDSr,   r8   r   r¾  Úworker_fractionÚ
approach_brŽ  r   r   rb   r«  Úregimer.   rL   r“   rñ   rÀ   r‰   rR   rX   ÚhashlibÚsha256ÚopenÚreadÚ	hexdigestr   Únowr   r&   Ú	isoformatr
   rJ   ÚarrayÚ
percentileÚskip_phase2rÈ   rÃ   r#  r<  r  r  rR  rr  r»  rÏ   ró   rÑ   r]  r   r   Újoinr   )&Úpr„  Út0rK   r‚  rƒ  r@   Út75r  rø   r  rj   rª   rË  rx   r`   ra   Ú_REGIME_INTÚ
regime_intÚregime_maskÚbeforeÚpctrÅ   Úp1_metar€   Útraining_metaÚscores0rÝ   r  rs  r;  Úf0Úcalmars0r*  rW  rI  r'  r]  s&                                         r   Úmainró    s	  € Ü×ÑÐ,CÔD€AØ‡N�N�8 d€NÔ+Ø‡N�N�:¤C¨s¸RÀ¸G€NÔDØ‡N�N�<¤c°2€NÔ6Ø‡N�NÐ$¬3¸€NÔ<Ø‡N�NÐ%¬C¸€NÔ=Ø‡N�N�>¬°R€NÔ8Ø‡N�N�<¤e°T€NÔ:Ø‡N�N�6¤¨t€NÔ4Ø‡N�NÐ%Ò/TØ!ð=ð ô >ð ‡N�N�>¬°Qð;ð ô <ð ‡N�NÐ&¬UÔ<SØHð ô Jà‡N�N�8¤#¨r€NÔ2Ø‡N�N�9 \ØIð ô Kà‡N�N�?¨<€NÔ8Ø‡N�N�7Ð!9€NÔ:Ø‡N�N�9Ð#m€NÔnØ‡N�N�6Ð#d€NÔeØ‡N�N�>¨,ðOð ô Pð ‡N�NÐ(Øgð ô ià‡N�N�:Ò'JÐTYðað ô bð �<‰<‹>€Dä	�‰‹€BòBð ‡z‚z�d—g’gØ—J‘J §¡ˆr‰ä# D§I¡IÓ.‰	ˆˆrÜ	�4—9‘9Ó	€Bà‡z‚zØ�W‰W�S‹\×%Ñ%¨4Ð%Ó0ˆØ˜!�fˆŒÜ  ×!3Ñ!3°RÓ8ˆÔÜ! $×"5Ñ"5°qÓ9ˆÔÜ˜dŸo™o¨qÓ1ˆŒà�‰j�o‰oœc¤# b£'¨D¡.Ó1Ñ2ˆØœ˜CŸH™H›J›¬¨R°©Z¯_©_¸RÑ-@×-EÑ-EÓ-GÓ)HÐIÐJˆØ+/Ñ(ˆ˜Ø‰	ä× Ñ ˆÜ ×3Ñ3ˆÜ ×4Ñ4ˆÜ—L‘L  r¡¨1¡Ó.ˆ	Ü*¨4¯?©?¸D¿O¹OÈT×MaÑMaÓb€D„Oà�‰j�o‰o˜bÑ!€GÙˆ&���t˜B˜4˜v¤c¨"£g Y¨hØˆf‰:�?‰?˜1Ñ×"Ñ"Ó$Ð
% R¨¨6©
¯©¸Ñ(;×(@Ñ(@Ó(BÐ'CÀ8ÈDÏKÉKÈ=ð	Zô [ð ‡‚Ü0°°U¸BÀÀcÓJ‰ä#ˆä˜"˜lÓ+€AÜ˜B §¡Ó.�H€A€uð  b°aÑ8€KØ‡{�{�eÒØ  §¡Ñ-ˆ
Ø˜BŸJ™JÑ&Ø˜]Ñ+×2Ñ2°jÑ@ˆKÜ˜Ÿ™›Ó%ˆFØ˜KÑ'ˆEÜ�e—i‘i“kÓ"¤S¨¨F£^Ñ3°cÑ9ˆCÙ�'˜$Ÿ+™+˜Ð&>¸v¸hÀeÌCÐPU×PYÑPYÓP[ÓL\ÐK]Ð]_Ð`cÐdgÐ_hÐhjÐkÕláÐ$ T§[¡[ MÐ1aÐbÔcô ˜q ! U¨B¨v©J¸¿¹Ø#×1Ñ1°4·9±9¸iÈÐRUØ.2¯m©mô=�O€FˆGð �6‰?€Dð?�Wð ?¨$¯-©-Ü!+¼\Ü # I£´°G³Ð=ò?ð —Y‘YÜ—~‘~¤d¨4¯9©9°dÓ&;×&@Ñ&@Ó&BÓC×MÑMÓOÜ˜R ™ZŸ_™_¨QÑ/×4Ñ4Ó6Ó7¼¸RÀ¹Z¿_¹_ÈRÑ=P×=UÑ=UÓ=WÓ9XÐYØ—	‘	ØŸ™Ü—<‘<¤§¡Ó-×7Ñ7ÀÐ7ÓKñ
€Mô ˜!˜VÓ$€GÜ—‘Ü
�‰�g˜rÓ"Ü
�‰�g˜rÓ"Ü
�‰�g˜rÓ"Øð	ó €Jñ Ð
 §¡£¨cÐ2°"°W·[±[³]À3Ð4Gð H!Ø!+¨A¡¨sÐ 3°6¸*ÀQ¹-ÈÐ9Lð MØ˜1‘˜cÐ"ð	$ô %ð
 ×ÓÜ! &Ó)ˆÜ—‘ ¨:¼Ñ+GÐ HÓIˆÜ˜r 1 d¨H°eØ.°ÀÇÁØ#×2Ñ2ó4ˆñ " &›/‰ˆˆH�aÙÐ0°°C°ð 9Ù2:Ó;±(¨QœU 1 a�[°(Ñ;Ð<ð>ô 	?ä�w ¨¯©°t·±Ø×*Ñ*¨D¯I©I°s¸D¿O¹OóMˆä�(‹mˆÜ! $ w¡-°°Ð"5°tÓ<ˆØ˜%‘[ˆ
àŸ/™/°t·}±}Ø"×1Ñ1ÀÇÁØŸ(™( 9¨d¯o©oÓ>Ø"×1Ñ1Ø  ™KØ  ™OÜ %¤b§g¡g¨d°9©oÓ&>Ó ?Ü$¤R§V¡V¨D°©OÓ%<Ó=ñ	#
ˆ�hÑð ×Ñ (Ò*Ø<@¿H¹HÀ]ÐTVÓ<WˆM˜(Ñ#Ð$8Ñ9ô .3°:¸a±=Ó-AÜ,1°*¸Q±-Ó,@Ü9>¸zÈ!¹}Ó9MÜ%*¨:°a©=Ó%9Ø(+Ø).ñ/€MÐ*Ñ+ð �(‰(ò E”b—g‘g—l‘l <°¸5Ø%1°%°¸¸"¸¸UÐ#CóE€Cä�c˜6¨¸"Ø,¸<õIáÐ
˜S˜E ¤T§Y¡Y£[°2Ñ%5°cÐ$:¸(ÐCÔDÙÐ
" =Ð1IÑ#JÐ"KÐLÕMùòC <s   ß'g(Ú__main__)r   )rÑ   )r   )?Ú__doc__rÌ  Úconcurrent.futuresrm  rÛ  ÚjsonÚmultiprocessingrk  r   r   Úsysr#   r   r   r¤   rJ   Úpandasr,   r   r�   Úabspathrå  ÚdirnameÚ__file__r9   r}  r   r   r   r	   r
   r   Ú%strategies.strategy_activation_scoresr   Útools.worker_utilsr   r   rR   rX   r#  rô   rõ   rö   r3  r    rE   rb   rm   rÀ   rÈ   rÏ   r×   rà   r  r  r1  r4  r6  r<  rr  rŽ  ró  Ú__name__© r!   r   Ú<module>r     s,  ðñó@ Û Û Û Û Û 	Û 	Û 
Û ß 'ã Û à ‡�‡��—‘—‘ §¡§¡¨R¯W©W¯_©_¸XÓ-FÈÓ MÓNÔ OÛ ÷÷ õ Dß Là€
Ø€Ø€ØÐ Ø $Ð Ø"Ð ØÐ ò"ò	/òó$oó<9òFWòò=ò&ò/%ðf )/óò&E?òPò
3ð
 !'óó"Iò`-AòhhNðV ˆzÒÙ…Fð r!   