Ë
    =I±jš  ã                   óˆ  — d dl Zd dlmc mZ d dlZd dlZ	d dl
Z
d dlmZmZmZmZmZmZmZ d dlmZ dd„Zd„ Zd„ Zd„ Zd„ Ze
j4                  j7                  d	d
dg«      e
j4                  j7                  dd dg«      d„ «       «       Zd„ Ze
j4                  j7                  dddg«      d„ «       Zd„ Zd„ Z d„ Z!d„ Z"d„ Z#d„ Z$d„ Z%y)é    N)Ú	ValueHeadÚcontinuation_targetÚfit_headÚmarket_featuresÚreplayÚstate_featuresÚtraining_records)Ú_score_to_signalsc                 ó^  — t        j                  t        j                  d| d¬«      t        j                  | «      dz  t        j                  | «      dz  t        j
                  g d¢| «      t        j                  | «      t        j                  | «      t        j                  | «      dœ«      S )Nú
2020-01-01Ú6h)ÚperiodsÚfreqéd   )g      i@ç        r   r   )ÚtimeÚcloseÚhighÚactivation_scoreÚmvrv_regimeÚ	rvol_normÚfed_net_liq_sign)ÚpdÚ	DataFrameÚ
date_rangeÚnpÚonesÚresizeÚzeros)Úns    úF/Users/jameslopez/projects/TradingBot25/tests/test_mlp_learned_exit.pyÚframer"   
   ss   € Ü�<‰<¤§¡¨|ÀQÈTÔ!RÜ"$§'¡'¨!£*¨S¡.¼"¿'¹'À!»*ÀS¹.Ü-/¯Y©YÒ7IÈ1Ó-MÜ(*¯©°«Ä"Ç(Á(È1Ã+Ü-/¯X©X°a«[ñ	:ó ;ð ;ó    c           	      óØ   — t        | j                  «       |t        j                  t	        | «      «      | j
                  j                  «       | j                  j                  «       d¬«      S )NT)Úreturn_opportunities)r
   Úcopyr   r   Úlenr   Úto_numpyr   )ÚdataÚparamss     r!   Úopsr+      sK   € Ü˜TŸY™Y›[¨&´"·'±'¼#¸d»)Ó2DÀdÇjÁj×FYÑFYÓF[Ø!ŸY™Y×/Ñ/Ó1ÈôNð Nr#   c                 ó’   — t        dt        j                  d«      t        j                  d«      t        j                  d«      | «      S )NÚstateé   )r   r   r   r   )Úvalues    r!   Úheadr0      s-   € Ü�WœbŸh™h q›k¬2¯7©7°1«:´r·x±xÀ³{ÀEÓJÐJr#   c            	      óD  — t        «       } t        | t        | «      ddt        d«      d¬«      \  }}t        | t        | «      ddt        d«      d¬«      \  }}t	        j
                  |j                  «      d   }d}||k(  }|slt        j                  d	|fd
||f«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}}t	        j
                  |j                  «      d   }d}||k(  }|slt        j                  d	|fd
||f«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}}t        d„ |D «       «      d   }d}||k(  }|slt        j                  d	|fd
||f«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}}y )Nr   ú
2020-02-01ç{®Gáz„?Úveto©ÚstartÚendr0   Úmodeç{®Gáz„¿r   é   ©ú==©z%(py1)s == %(py4)s©Úpy1Úpy4úassert %(py6)sÚpy6é   c              3   ó2   K  — | ]  }|d    dk(  sŒ|–— Œ y­w)ÚactionÚexitN© ©Ú.0Úds     r!   Ú	<genexpr>zQtest_constant_positive_head_holds_until_cap_and_negative_exits.<locals>.<genexpr>!   s   è ø€ Ð<™9�a¨¨(©°VÓ(;”™9ùó   ‚�ÚreasonÚextension_cap)r"   r   r+   r0   r   ÚflatnonzeroÚexecute_exitÚ
@pytest_arÚ_call_reprcompareÚ	_safereprÚAssertionErrorÚ_format_explanationÚnext)
r)   ÚheldÚ	decisionsÚbaselineÚ_Ú@py_assert0Ú@py_assert3Ú@py_assert2Ú@py_format5Ú@py_format7s
             r!   Ú>test_constant_positive_head_holds_until_cap_and_negative_exitsr`      sp  € Ü‹7€DÜ˜T¤3 t£9°LÀlÔY]Ð^aÓYbÐioÔp�O€Dˆ)Ü˜œs 4›y°À,ÔUYÐZ^ÓU_ÐflÔm�K€HˆaÜ�>‰>˜$×+Ñ+Ó,¨QÑ/Ð5°2Ð5Ð/°2Ñ5×5×5Õ5Ð/°2×5×5Ó5Ð/×5×5Ò5°2×5×5×5×5×5×5Ó5Ü�>‰>˜(×/Ñ/Ó0°Ñ3Ð8°qÐ8Ð3°qÑ8×8×8Õ8Ð3°q×8×8Ó8Ð3×8×8Ò8°q×8×8×8×8×8×8Ó8ÜÑ<™9Ó<Ó<¸XÑFÐWÈÐWÐFÈÑW×W×WÕWÐFÈ×W×WÓWÐF×W×WÒWÈ×W×W×W×W×W×WÔWr#   c            	      ó>  — t        «       } d| j                  dd …df<   t        | t        | d¬«      ddt	        d«      d	¬
«      \  }}|j
                  j                  d   }|s8ddt        j                  |«      iz  }t        t        j                  |«      «      ‚d }|d   d   }d}||k(  }|slt        j                  d|fd||f«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}y )NéP   rC   r   é
   )Úi_trailing_stop_thresholdr   r2   r3   r4   r5   zassert %(py1)sr?   r   rM   Útrailing_stopr;   r=   r>   rA   rB   )r"   Úlocr   r+   r0   rP   ÚilocrQ   rS   rT   rU   rR   )	r)   ÚresultrX   r[   Ú@py_format2r\   r]   r^   r_   s	            r!   Útest_stop_cannot_be_vetoedrj   $   sÑ   € Ü‹7€DØ€D‡H�HˆQ‰R�ˆ[ÑÜ˜t¤S¨ÈÔ%LÐT`Ø$0´t¸C³yÀvôOÑ€FˆIà×Ñ×#Ñ# AÑ&Ð&Ñ&×&×&Ð&Ð&×&×&×&×&×&Ø�Q‰<˜Ñ!Ð2 ?Ð2Ð! ?Ñ2×2×2Õ2Ð! ?×2×2Ó2Ð!×2×2Ò2 ?×2×2×2×2×2×2Ô2r#   Úwindowé   é   Útrailrc   c           	      óP  — t        d«      }t        j                  j                  d«      }|j	                  ddt        |«      «      |_        |j                  ddt        |«      «      |_        | |dddœ}t        |j                  «       |t        j                  t        |«      «      |j                  j                  «       |j                  j                  «       «      }t        |t        |fi |¤Ždd	d
¬«      \  }}dD ](  }t        j                   j#                  ||   ||   «       Œ* y )NéÈ   é*   r   rb   r   z
2020-01-05z2020-02-01 23:59:59)Úi_exit_score_windowrd   Ú_pine_time_startÚ_pine_time_endr2   Úmanage)r6   r7   r8   )ÚpositionÚexecute_entryrP   )r"   r   ÚrandomÚdefault_rngÚnormalr'   r   Úuniformr   r
   r&   r   r(   r   r   r+   ÚtestingÚassert_array_equal)	rk   rn   r)   Úrngr*   Ú	canonicalÚactualrZ   Únames	            r!   Ú(test_replay_abstention_matches_canonicalr‚   -   sî   € ô �‹:€DÜ
�)‰)×
Ñ
 Ó
#€CØŸJ™J q¨#¬s°4«yÓ9€DÔØ—‘˜R ¤c¨$£iÓ0€D„JØ%+È%Ø".ÐBWñY€Fä! $§)¡)£+¨v´r·w±w¼sÀ4»yÓ7IÈ4Ï:É:×K^ÑK^ÓK`Ðbf×bkÑbk×btÑbtÓbvÓw€IÜ�tœS Ñ0¨Ñ0¸È,Ð]eÔf�I€FˆAÛ=ˆÜ
�
‰
×%Ñ% f¨T¡l°I¸d±OÕDñ >r#   c            
      óè  — t        t        j                  g d¢«      t        j                  g d¢«      dddd«      \  } }d}||k(  }|s™t        j                  d|fd||f«      d	t        j                  «       v st        j                  |«      rt        j                  |«      nd	t        j                  |«      d
œz  }dd|iz  }t        t        j                  |«      «      ‚d x}}t        j                  }d}d}||z  }	d}
|	|
z
  } ||«      }| |k(  }|�s2t        j                  d|fd| |f«      dt        j                  «       v st        j                  | «      rt        j                  | «      nddt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |
«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}x}x}	x}
x}}t        t        j                  g d¢«      t        j                  d«      dz  dddd«      \  } }d}||k(  }|s™t        j                  d|fd||f«      d	t        j                  «       v st        j                  |«      rt        j                  |«      nd	t        j                  |«      d
œz  }dd|iz  }t        t        j                  |«      «      ‚d x}}t        j                  }d}| } ||«      }| |k(  }|�s
t        j                  d|fd| |f«      dt        j                  «       v st        j                  | «      rt        j                  | «      nddt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}x}}y )N)ç      Y@én   éy   r†   r†   r   éþÿÿÿr„   r   rm   r;   )z%(py0)s == %(py3)sr7   )Úpy0Úpy3zassert %(py5)sÚpy5g\�Âõ(\ó?g×£p=
×ï?)zg%(py0)s == %(py14)s
{%(py14)s = %(py4)s
{%(py4)s = %(py2)s.approx
}(((%(py6)s * %(py8)s) - %(py11)s))
}r/   Úpytest)rˆ   Úpy2r@   rB   Úpy8Úpy11Úpy14zassert %(py16)sÚpy16)r„   rb   r   r   r   é   r   çš™™™™™¹?rl   gš™™™™™É?)zM%(py0)s == %(py9)s
{%(py9)s = %(py4)s
{%(py4)s = %(py2)s.approx
}(-%(py6)s)
}©rˆ   rŒ   r@   rB   Úpy9úassert %(py11)srŽ   )r   r   ÚarrayrQ   rR   Ú@py_builtinsÚlocalsÚ_should_repr_global_namerS   rT   rU   r‹   Úapproxr   )r/   r7   r]   Ú@py_assert1Ú@py_format4Ú@py_format6r\   Ú@py_assert5Ú@py_assert7Ú@py_assert9Ú@py_assert10Ú@py_assert12Ú@py_assert13Ú@py_format15Ú@py_format17Ú@py_assert8Ú@py_format10Ú@py_format12s                     r!   Ú*test_target_wealth_costs_and_stop_endpointr©   <   sn  € Ü$¤R§X¡XÒ.HÓ%IÌ2Ï8É8ÒTnÓKoØ%&¨¨D°"ó6�J€Eˆ3à€Oˆ3�!‰8‡O‡O…Oˆ3�!‡O‡O‡O‡O‡O�Oˆ3‡O‡OƒOˆ3‡O‡O„O�!‡O‡O‡O‡O‡O‡O�OÜ—M‘MÐ1 $Ð1 tÐ1 $ t¡)Ð1¨DÐ1 )¨D¡.Ð1‘M .Ó1Ð1ˆ5Ð1Ñ1×1×1Ö1ˆ5Ð1×1×1×1×1×1Ñ1ˆ5×1×1Ó1ˆ5×1×1×1×1×1Ò1”F×1×1Ó1”F×1×1Ô1�M×1×1Ò1 $×1×1Ò1 t×1×1Ò1¨D×1×1Ò1Ð1×1×1×1×1×1×1×1Õ1Ü$¤R§X¡XÒ.GÓ%HÌ"Ï'É'ÐRSË*ÐUXÉ.ÐZ[Ð]_ÐaeÐgiÓj�J€Eˆ3Ø€Oˆ3�!‰8‡O‡O…Oˆ3�!‡O‡O‡O‡O‡O�Oˆ3‡O‡OƒOˆ3‡O‡O„O�!‡O‡O‡O‡O‡O‡O�OÜ—M‘MÐ& 2Ð& 2 #Ð&‘M #Ó&Ð&ˆ5Ð&Ñ&×&×&Ö&ˆ5Ð&×&×&×&×&×&Ñ&ˆ5×&×&Ó&ˆ5×&×&×&×&×&Ò&”F×&×&Ó&”F×&×&Ô&�M×&×&Ò& 2×&×&Ò&Ð&×&×&×&×&×&×&×&Ð&r#   Ú
model_typeÚridgeÚtreec           	      ót  — t        j                  dd¬«      }t        d«      D �cg c]<  }||dz   t        j                  d«      |z  t        j                  d«      |z  d|z  dœ‘Œ> }}t        |||d	   d
| «      \  }}|d   }d}||k(  }|slt        j                  d|fd||f«      t        j                  |«      t        j                  |«      dœz  }	dd|	iz  }
t        t        j                  |
«      «      ‚d x}x}}t         j                  }|d   } ||«      }|d	   }||k  }|sÝt        j                  d|fd||f«      dt        j                  «       v st        j                  t         «      rt        j                  t         «      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}x}}|dd  D ]  }d|d<   d|d   d d  Œ t        |||d	   d
| «      \  }}t        j                  j!                  |j"                  |j"                  «       t        j                  j!                  |j$                  |j$                  «       |j&                  }|j&                  }||k(  }|sît        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      d œz  }
d!d"|
iz  }t        t        j                  |«      «      ‚d x}x}}y c c}w )#Nr   é2   ©r   é(   rl   r.   r3   ©Ú	entry_barÚ	label_endÚmarketr-   Útargeté   ÚcombinedÚtradesé   r;   r=   r>   rA   rB   Úmax_label_end©Ú<)zN%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.Timestamp
}(%(py4)s)
} < %(py9)sr   r“   r•   rŽ   g     @�Àrµ   g     @�@r´   )zF%(py2)s
{%(py2)s = %(py0)s.tree
} == %(py6)s
{%(py6)s = %(py4)s.tree
}ÚfittedÚsecond)rˆ   rŒ   r@   rB   zassert %(py8)sr�   )r   r   Úranger   r   r   rQ   rR   rS   rT   rU   Ú	Timestampr—   r˜   r™   r|   r}   ÚcoefficientsÚmeanr¬   )rª   ÚtimesÚiÚrecordsr½   Úauditr[   r\   r]   r^   r_   r›   rž   r¦   rŸ   r§   r¨   Úrr¾   rZ   Ú@py_format9s                        r!   Ú9test_purge_and_training_only_scaler_ignore_future_recordsrÉ   F   s‚  € ä�M‰M˜,°Ô3€EäAFÀrÄóLÙAJ¸Að ¨Q¨q©S¼B¿G¹GÀA»JÀq¹LÜŸ™ › A™°°Q±ó8ØAJð ð Lä˜W e¨U°2©Y¸
ÀJÓO�M€FˆEØ�‰?Ð˜BÐˆ?˜BÑ××Õˆ?˜B××Óˆ?××Ò˜B××××××ÓÜ�<‰<Ð;˜˜oÑ.Ð;‰<Ð.Ó/Ð;°%¸±)Ð;Ð/°)Ñ;×;×;Õ;Ð/°)×;×;×;×;×;Ñ;Œ2×;×;Ó;Œ2×;×;Ô;ˆ<×;×;Ò;Ð.×;×;Ò;Ð/×;×;Ò;°)×;×;×;×;×;×;×;Ø�R�S‹\ˆØˆˆ(‰Øˆˆ(‰‘A‰ð ô ˜ %¨¨r©°JÀ
ÓK�I€FˆAÜ‡J�J×!Ñ! &×"5Ñ"5°v×7JÑ7JÔKÜ‡J�J×!Ñ! &§+¡+¨v¯{©{Ô;Ø�;‰;Ð%˜&Ÿ+™+Ð%ˆ;˜+Ñ%×%×%Õ%ˆ;˜+×%×%×%×%×%Ñ%ˆ6×%×%Ó%ˆ6×%×%Ô%ˆ;×%×%×%×%×%Ð%˜&×%×%Ó%˜&×%×%Ô%˜+×%×%×%×%×%×%Ô%ùòLs   ¥AN5c                  ó`  — ddt        j                  d«      t        j                  d«      ddœgdz  } t        | t        j                  dd¬	«      d
d«      \  }}g }d }||u }|}|r|d   }d}||k(  }	|	}|�s+t        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dœz  }
dd|
iz  }|j                  |«       |r_t        j                  d	fdf«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }|j                  |«       t        j                  |d«      i z  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}x}x}x}	}y )Nr   rl   r.   r   r±   iè  r   é   r¯   z
2020-01-03r-   r¸   )Úis)z%(py2)s is %(py5)sr½   )rŒ   rŠ   z%(py7)sÚpy7r;   )z%(py10)s == %(py13)s)Úpy10Úpy13z%(py15)sÚpy15úassert %(py18)sÚpy18)r   r   r   r   r   rQ   rR   r—   r˜   r™   rS   ÚappendÚ_format_booloprT   rU   )rÅ   r½   rÆ   r›   Ú@py_assert4r\   r[   r    r¢   Ú@py_assert11r�   Ú@py_format8Ú@py_format14Ú@py_format16r¥   Ú@py_format19s                   r!   Ú0test_minimum_independent_trades_not_sample_countrÛ   W   s
  € Ø¨Q¼"¿(¹(À1»+ÔPR×PXÑPXÐYZÓP[ÐgiÑjÐkÐnrÑr€GÜ˜W¤b§m¡m°LÈ!Ô&LÈlÐ\cÓd�M€FˆEÙ0�TÐ0ˆ6�Tˆ>Ô0˜e H™oÐ0¨qÐ0˜o¨qÑ0×0×0×0Ð0ˆ6�T×0×0×0×0×0Ñ0ˆ6×0×0Ó0ˆ6×0×0Ô0�T×0×0×0×0×0×0Õ0˜o¨q×0×0Ó0˜o×0×0Ò0¨q×0×0×0×0×0×0×0×0×0×0×0×0×0Õ0r#   c            	      ó  — t        «       } t        | t        | «      ddt        d«      d¬«      \  }}t        | j                  d d j                  «       t        | j                  d d «      ddt        d«      d¬«      \  }}t        j                  j                  |j                  d d |j                  «       t        d„ |D «       «      d   }d	}||k(  }|slt        j                  d
|fd||f«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}}t        j                  j                  t!        | «      d d t!        | j                  d d «      «       y )Nr   r2   r3   r4   r5   rc   c              3   ó2   K  — | ]  }|d    dk(  sŒ|–— Œ y­w)Úbarrc   NrG   rH   s     r!   rK   zCtest_prefix_causality_and_actual_candidate_state.<locals>.<genexpr>b   s   è ø€ Ð3™7�a a¨¡h°£l”™7ùrL   r²   rl   r;   r=   r>   rA   rB   )r"   r   r+   r0   rg   r&   r   r|   r}   rv   rV   rQ   rR   rS   rT   rU   r   )
r)   ÚfullÚactionsÚprefixrZ   r[   r\   r]   r^   r_   s
             r!   Ú0test_prefix_causality_and_actual_candidate_staterâ   ]   s(  € Ü‹7€DÜ˜4¤ T£°,ÀLÔW[Ð\_ÓW`ÐgmÔn�M€Dˆ'Ü�t—y‘y  "�~×*Ñ*Ó,¬c°$·)±)¸C¸R°.Ó.AÈÐ[gÔnrÐsvÓnwð  Eô  F�I€FˆAÜ‡J�J×!Ñ! $§-¡-°°Ð"4°f·o±oÔFÜÑ3™7Ó3Ó3°KÑ@ÐCÀ!ÐCÐ@À!ÑC×C×CÕCÐ@À!×C×CÓCÐ@×C×CÒCÀ!×C×C×C×C×C×CÓCÜ‡J�J×!Ñ!¤/°$Ó"7¸¸Ð"<¼oÈdÏiÉiÐX[ÐY[ÈnÓ>]Õ^r#   c                  ó  — t        «       } t        | t        | «      «      }t        d„ |D «       «      }|d   d   }d}||k(  }|slt	        j
                  d|fd||f«      t	        j                  |«      t	        j                  |«      dœz  }dd	|iz  }t        t	        j                  |«      «      ‚d x}x}}|d   d
   }d}d}||z  }	||	k(  }|s€t	        j
                  d|fd||	f«      t	        j                  |«      t	        j                  |«      t	        j                  |«      dœz  }
dd|
iz  }t        t	        j                  |«      «      ‚d x}x}x}x}}	d„ |D «       }t        |«      }|s•ddt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndt	        j                  |«      t	        j                  |«      dœz  }t        t	        j                  |«      «      ‚d x}}y )Nc              3   óD   K  — | ]  }|d    dk(  sŒ|d   dk(  sŒ|–— Œ y­w)r²   rl   rÞ   rc   NrG   ©rI   rÇ   s     r!   rK   zPtest_training_rows_include_post_exit_state_and_purged_horizon.<locals>.<genexpr>i   s&   è ø€ ÐN¡˜1¨1¨[©>¸1Ó+<ÀÀ5ÁÈ2Ã”Q¡ùs   ‚ � ™ r-   r   g
×£p=
·?r;   r=   r>   rA   rB   rË   é   é   )z%(py1)s == (%(py4)s / %(py6)s))r?   r@   rB   úassert %(py9)sr”   c              3   óT   K  — | ]   }|d    |d   cxk  xr |d    dz   k  nc –— Œ" y­w)rÞ   r³   rm   NrG   rå   s     r!   rK   zPtest_training_rows_include_post_exit_state_and_purged_horizon.<locals>.<genexpr>l   s.   è ø€ ÐHÁ¸1ˆq�‰x˜!˜K™.Ö6¨A¨e©H°Q©J×6Ð6Áùs   ‚&(z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}Úall)rˆ   rŒ   r@   )r"   r	   r+   rV   rQ   rR   rS   rT   rU   rê   r—   r˜   r™   )r)   rÅ   Ú	continuedr[   r\   r]   r^   r_   rž   rŸ   r×   r§   r›   s                r!   Ú=test_training_rows_include_post_exit_state_and_purged_horizonrì   f   sO  € Ü‹7€DÜ˜t¤S¨£YÓ/€GÜÑN¡ÓNÓN€IØ�WÑ˜aÑ Ð' CÐ'Ð  CÑ'×'×'Õ'Ð  C×'×'Ó'Ð ×'×'Ò' C×'×'×'×'×'×'Ó'Ø�WÑ˜aÑ Ð( AÐ( bÐ( A b¡DÐ(Ð  DÑ(×(×(Õ(Ð  D×(×(Ó(Ð ×(×(Ò( A×(×(Ò( b×(×(×(×(×(×(×(ÙHÁÓHÐHŒ3ÐHÓHÐHÑH×H×H×H×HÕHŒ3×H×HÓHŒ3×H×HÔHÐH×H×HÒHÐH×H×H×H×H×HÓHr#   c            
      ó|  — t        dddddd«      } | d   }t        j                  }d} ||«      }||k(  }|sÝt        j                  d	|fd
||f«      t        j
                  |«      dt        j                  «       v st        j                  t        «      rt        j
                  t        «      ndt        j
                  |«      t        j
                  |«      t        j
                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}x}}| d   }t        j                  }d}d}||z  }d}	||	z
  }
 ||
«      }||k(  }|�st        j                  d	|fd||f«      t        j
                  |«      dt        j                  «       v st        j                  t        «      rt        j
                  t        «      ndt        j
                  |«      t        j
                  |«      t        j
                  |«      t        j
                  |	«      t        j
                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}x}x}x}x}	x}
}t        j                  t        d¬«      5  t        t        «       j                  d¬«      «       d d d «       y # 1 sw Y   y xY w)Nrc   r   r   éx   r…   éÿÿÿÿrl   r’   r;   )zL%(py1)s == %(py9)s
{%(py9)s = %(py5)s
{%(py5)s = %(py3)s.approx
}(%(py7)s)
}r‹   )r?   r‰   rŠ   rÍ   r”   r•   rŽ   rC   )zg%(py1)s == %(py15)s
{%(py15)s = %(py5)s
{%(py5)s = %(py3)s.approx
}(((%(py7)s / %(py9)s) - %(py12)s))
})r?   r‰   rŠ   rÍ   r”   Úpy12rÐ   zassert %(py17)sÚpy17ÚMissing©Úmatchr   )Úcolumns)r   r‹   rš   rQ   rR   rS   r—   r˜   r™   rT   rU   ÚraisesÚ
ValueErrorr   r"   Údrop)r-   r[   rÕ   Ú@py_assert6r¦   r]   r§   r¨   r¡   rÖ   r£   Ú@py_assert14rÙ   Ú@py_format18s                 r!   Ú0test_position_features_and_missing_market_inputsrü   o   s¬  € Ü˜2˜q # s¨C°Ó4€EØ�‰8Ð(”v—}‘}Ð( RÐ(‘} RÓ(Ð(ˆ8Ð(Ñ(×(×(Õ(ˆ8Ð(×(×(Ó(ˆ8×(×(×(×(×(Ð(”v×(×(Ó(”v×(×(Ô(�}×(×(Ò( R×(×(Ò(Ð(×(×(×(×(×(×(×(Ø�‰8Ð/”v—}‘}Ð/ SÐ/¨Ð/ S¨¡WÐ/¨QÐ/ W¨Q¡YÐ/‘} YÓ/Ð/ˆ8Ð/Ñ/×/×/Ö/ˆ8Ð/×/×/Ó/ˆ8×/×/×/×/×/Ð/”v×/×/Ó/”v×/×/Ô/�}×/×/Ò/ S×/×/Ò/¨×/×/Ò/¨Q×/×/Ò/Ð/×/×/×/×/×/×/×/×/Ü	�‰”z¨Ö	3Üœ›Ÿ™¨[˜Ó9Ô:÷ 
4×	3Ñ	3ús   Ê$J2Ê2J;c                  ó  — t        d«      D � cg c]S  } | | dz   t        j                  d«      t        j                  t	        | «      ddddddg«      d| cxk  rdk  rn ndndd	œ‘ŒU }} t        |t        j                  d
d¬«      ddd«      \  }}|j                  }t        j                  }d} ||«      }|d   d   } |||«      }	d}
|	|
k  }|�sZt        j                  d|fd|	|
f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      t        j                  |	«      t        j                  |
«      dœ	z  }dd|iz  }t        t        j                   |«      «      ‚d x}x}x}x}x}x}	x}}
|j                  }t        j                  }d} ||«      }|d   d   } |||«      }	d}
|	|
kD  }|�sZt        j                  d|fd|	|
f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      t        j                  |	«      t        j                  |
«      dœ	z  }dd|iz  }t        t        j                   |«      «      ‚d x}x}x}x}x}x}	x}}
|j                  }t        j                  }d} ||«      }|d   d   } |||«      }	d}
|	|
k  }|�sZt        j                  d|fd|	|
f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      t        j                  |	«      t        j                  |
«      dœ	z  }dd|iz  }t        t        j                   |«      «      ‚d x}x}x}x}x}x}	x}}
|j"                  d   }t%        |«      }d}||k  }|sÉt        j                  d|fd||f«      dt        j                  «       v st        j                  t$        «      rt        j                  t$        «      ndt        j                  |«      t        j                  |«      t        j                  |«      dœz  }d d!|iz  }t        t        j                   |«      «      ‚d x}x}x}}y c c} w )"Nr°   rl   r.   r   rc   r¶   r3   r9   r±   r   r®   r¯   ú
2021-01-01r-   r¬   r»   )z’%(py13)s
{%(py13)s = %(py2)s
{%(py2)s = %(py0)s.predict
}(%(py9)s
{%(py9)s = %(py5)s
{%(py5)s = %(py3)s.zeros
}(%(py7)s)
}, %(py11)s)
} < %(py16)sr½   r   )	rˆ   rŒ   r‰   rŠ   rÍ   r”   rŽ   rÏ   r�   rÑ   rÒ   é   )Ú>)z’%(py13)s
{%(py13)s = %(py2)s
{%(py2)s = %(py0)s.predict
}(%(py9)s
{%(py9)s = %(py5)s
{%(py5)s = %(py3)s.zeros
}(%(py7)s)
}, %(py11)s)
} > %(py16)sé'   Úleft)ú<=)z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} <= %(py7)sr'   )rˆ   rŒ   r@   rÍ   rè   r”   )r¿   r   r   r–   Úfloatr   r   r   ÚpredictrQ   rR   r—   r˜   r™   rS   rT   rU   r¬   r'   )rÄ   rÅ   r½   rZ   r›   rÕ   rù   r¦   r¡   r¢   Ú@py_assert15rú   r¥   rÚ   r\   rž   r×   r§   s                     r!   Ú3test_tree_portable_predictor_learns_nonlinear_stater  w   s  € ô CHÈÄ)óMáBK¸Qð ¨Q¨q©S¼B¿H¹HÀQ»KÜŸ™¤5¨£8¨Q°°1°a¸¸AÐ">Ó?Ø!# q¤¨2¥™#°4ó9àBKð ð Mô ˜¤"§-¡-°ÀbÔ"IÈ<ÐY`ÐbhÓi�I€FˆAØ�>‰>Ð?œ"Ÿ(™(Ð? 1Ð?™( 1›+Ð? w¨q¡z°'Ñ':Ð?‰>˜+Ð':Ó;Ð?¸aÐ?Ð;¸aÑ?×?×?Ö?Ð;¸a×?×?×?×?×?Ñ?ˆ6×?×?Ó?ˆ6×?×?Ô?ˆ>×?×?×?×?×?Ð?œ"×?×?Ó?œ"×?×?Ô?˜(×?×?Ò? 1×?×?Ò?˜+×?×?Ò?Ð':×?×?Ò?Ð;×?×?Ò?¸a×?×?×?×?×?×?×?Õ?Ø�>‰>Ð@œ"Ÿ(™(Ð@ 1Ð@™( 1›+Ð@ w¨r¡{°7Ñ';Ð@‰>˜+Ð';Ó<Ð@¸qÐ@Ð<¸qÑ@×@×@Ö@Ð<¸q×@×@×@×@×@Ñ@ˆ6×@×@Ó@ˆ6×@×@Ô@ˆ>×@×@×@×@×@Ð@œ"×@×@Ó@œ"×@×@Ô@˜(×@×@Ò@ 1×@×@Ò@˜+×@×@Ò@Ð';×@×@Ò@Ð<×@×@Ò@¸q×@×@×@×@×@×@×@Õ@Ø�>‰>Ð@œ"Ÿ(™(Ð@ 1Ð@™( 1›+Ð@ w¨r¡{°7Ñ';Ð@‰>˜+Ð';Ó<Ð@¸qÐ@Ð<¸qÑ@×@×@Ö@Ð<¸q×@×@×@×@×@Ñ@ˆ6×@×@Ó@ˆ6×@×@Ô@ˆ>×@×@×@×@×@Ð@œ"×@×@Ó@œ"×@×@Ô@˜(×@×@Ò@ 1×@×@Ò@˜+×@×@Ò@Ð';×@×@Ò@Ð<×@×@Ò@¸q×@×@×@×@×@×@×@Õ@Ø�{‰{˜6Ñ"Ð(Œ3Ð"Ó#Ð( qÐ(Ð# qÑ(×(×(Õ(Ð# q×(×(×(×(×(Ñ(Œ3×(×(Ó(Œ3×(×(Ô(Ð"×(×(Ò(Ð#×(×(Ò( q×(×(×(×(×(×(Ö(ùòMs   ŽAZc            
      óâ  — t        j                  dd¬«      } t        d«      D �cg c]<  }||dz   t        j                  d«      |z  t        j                  d«      |z  d|z  dœ‘Œ> }}t        || d	d
«      \  }}t        ||d   gdz  z   | d	d
«      \  }}t        j                  j                  |j                  |j                  d¬«       |j                  }t        j                  }|j                  } ||«      }	||	k(  }
|
�s_t        j                  d|
fd||	f«      dt        j                  «       v st        j                   |«      rt        j"                  |«      ndt        j"                  |«      dt        j                  «       v st        j                   t        «      rt        j"                  t        «      ndt        j"                  |«      dt        j                  «       v st        j                   |«      rt        j"                  |«      ndt        j"                  |«      t        j"                  |	«      dœz  }dd|iz  }t%        t        j&                  |«      «      ‚d x}x}
x}x}}	y c c}w )Nr   r®   r¯   r°   rl   r.   r3   r±   rþ   r-   r   r   g›+¡†›„=)Úatolr;   )zŒ%(py2)s
{%(py2)s = %(py0)s.intercept
} == %(py11)s
{%(py11)s = %(py6)s
{%(py6)s = %(py4)s.approx
}(%(py9)s
{%(py9)s = %(py7)s.intercept
})
}Úfirstr‹   r¾   )rˆ   rŒ   r@   rB   rÍ   r”   rŽ   zassert %(py13)srÏ   )r   r   r¿   r   r   r   r|   Úassert_allcloserÁ   Ú	interceptr‹   rš   rQ   rR   r—   r˜   r™   rS   rT   rU   )rÃ   rÄ   rÅ   r
  rZ   r¾   r›   rž   r¦   r¡   r\   r¨   rØ   s                r!   Ú=test_each_trade_keeps_equal_weight_when_identical_rows_repeatr  ‚   s«  € Ü�M‰M˜,°Ô3€EäAFÀrÄóLÙAJ¸Að ¨Q¨q©S¼B¿G¹GÀA»JÀq¹LÜŸ™ › A™°°Q±ó8ØAJð ð Lä˜ ¨°gÓ>�H€Eˆ1Ü˜ G¨A¡J <°Ñ#3Ñ3°U¸LÈ'ÓR�I€FˆAÜ‡J�J×Ñ˜u×1Ñ1°6×3FÑ3FÈUÐÔSØ�?‰?Ð=œfŸm™mÐ=¨F×,<Ñ,<Ð=™mÐ,<Ó=Ð=ˆ?Ð=Ñ=×=×=Ö=ˆ?Ð=×=×=×=×=×=Ñ=ˆ5×=×=Ó=ˆ5×=×=Ô=ˆ?×=×=×=×=×=Ð=œf×=×=Ó=œf×=×=Ô=˜m×=×=×=×=×=Ð=¨F×=×=Ó=¨F×=×=Ô=Ð,<×=×=Ò=Ð=×=×=×=×=×=×=×=Ð=ùòLs   ¥AI,c            
      óX  — t        j                  dd¬«      } t        d«      D �cg c]<  }||dz   t        j                  d«      t        j                  d«      t        d«      dœ‘Œ> }}t        j                  t        d	¬
«      5  t        || dd«       d d d «       y c c}w # 1 sw Y   y xY w)Nr   r®   r¯   r¶   rl   r.   Únanr±   Ú	Nonfiniteró   rþ   r-   )
r   r   r¿   r   r   r  r‹   rö   r÷   r   )rÃ   rÄ   rÅ   s      r!   Ú*test_nonfinite_training_values_fail_closedr  Œ   s�   € Ü�M‰M˜,°Ô3€EäGLÈRÄyóRÙGPÀ!ð ¨Q¨q©S¼B¿H¹HÀQ»KÜŸ™ !›´°e³ó>ØGPð ð Rä	�‰”z¨Ö	5Ü�˜% ¨wÔ7÷ 
6Ð	5ùòRç	5Ð	5ús   ¥ABÂB Â B))r¶   )&Úbuiltinsr—   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterQ   Únumpyr   Úpandasr   r‹   Ústrategies.mlp_learned_exitr   r   r   r   r   r   r	   Ústrategies.strategy_mlp_scoresr
   r"   r+   r0   r`   rj   ÚmarkÚparametrizer‚   r©   rÉ   rÛ   râ   rì   rü   r  r  r  rG   r#   r!   Ú<module>r     sÝ   ðß  „ Ó Û Û ÷?÷ ?ñ ?å <ó;òNò
KòXò3ð ‡�×Ñ˜ A q 6Ó*Ø‡�×Ñ˜ 1 b 'Ó*ñ
Eó +ó +ð
Eò'ð ‡�×Ñ˜¨°Ð'8Ó9ñ&ó :ð&ò 1ò_òIò;ò)ò>ó8r#   