Ë
    WM±jE  ã                   ó8  — 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 d dlmZ d dlmZ dd„Zd„ Zdd„Ze
j,                  j/                  dd	d
g«      e
j,                  j/                  dd dg«      d„ «       «       Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z d„ Z!y)é    N)Úevent_studyÚreplay_stopÚ
volatility)Ú_score_to_signals)Úwindow_metricsc                 ó2  — t        j                  t        j                  d| d¬«      t        j                  | d«      t        j                  | d«      t        j                  | d«      t        j                  | d«      t        j
                  g d¢| «      dœ«      S )Nú
2020-01-01Ú4h©ÚperiodsÚfreqg      Y@)g      i@ç        r   r   )ÚtimeÚopenÚhighÚlowÚcloseÚactivation_score)ÚpdÚ	DataFrameÚ
date_rangeÚnpÚfullÚresize)Úns    úI/Users/jameslopez/projects/TradingBot25/tests/test_mlp_volatility_stop.pyÚframer   
   so   € Ü�<‰<¤§¡¨|ÀQÈTÔ!RÜ!#§¡¨¨DÓ!1¼2¿7¹7À1ÀdÓ;KÜ "§¡¨¨4Ó 0¼2¿7¹7À1ÀdÓ;KÜ-/¯Y©YÒ7IÈ1Ó-MñOó Pð Pó    c           	      óØ   — t        | j                  «       |t        j                  t	        | «      «      | j
                  j                  «       | j                  j                  «       d¬«      S )NT)Úreturn_opportunities)r   Úcopyr   ÚonesÚlenr   Úto_numpyr   )ÚfÚparamss     r   Úopportunitiesr'      sH   € Ü˜QŸV™V›X v¬r¯w©w´s¸1³v«ÀÇÁ×@PÑ@PÓ@RØŸV™VŸ_™_Ó.ÀTôKð Kr   c                 ó"   — t        | |dd|¬«      S )Nr	   ú
2020-01-31)ÚstartÚendÚwidths)r   )r%   Úor,   s      r   Úrunr.      s   € Ü�q˜! <°\È&ÔQÐQr   Úwindowé   é   Útrailé   c                 ó~  — t        d«      }t        j                  j                  d«      }|j	                  ddt        |«      «      |_        t        j                  |j                  d«      |_        |j                  ddt        |«      «      |_
        | |ddd	œ}t        |j                  «       |t        j                  t        |«      «      |j                  j                  «       |j                  j                  «       «      }t        |t!        |fi |¤Ž«      \  }}d
D ](  }t        j"                  j%                  ||   ||   «       Œ* d}	d}
t'        ||	|
«      }d}d}t'        |||«      }||k(  }|�sÐt)        j*                  d|fd||f«      dt-        j.                  «       v st)        j0                  t&        «      rt)        j2                  t&        «      nddt-        j.                  «       v st)        j0                  |«      rt)        j2                  |«      ndt)        j2                  |	«      t)        j2                  |
«      t)        j2                  |«      dt-        j.                  «       v st)        j0                  t&        «      rt)        j2                  t&        «      nddt-        j.                  «       v st)        j0                  |«      rt)        j2                  |«      ndt)        j2                  |«      t)        j2                  |«      t)        j2                  |«      dœ
z  }dd|iz  }t5        t)        j6                  |«      «      ‚d x}	x}
x}x}x}x}}|rlt        |t!        |fi |¤Žt        j8                  t        |«      d«      «      \  }}t        j"                  j%                  |j:                  |j:                  «       y y )Ni,  éG   éP   éx   ç     €[@r   r	   z2020-01-31 23:59:59)Úi_exit_score_windowÚi_trailing_stop_thresholdÚ_pine_time_startÚ_pine_time_end)ÚpositionÚexecute_entryÚexecute_exitr)   ©ú==)zw%(py7)s
{%(py7)s = %(py0)s(%(py1)s, %(py3)s, %(py5)s)
} == %(py16)s
{%(py16)s = %(py9)s(%(py10)s, %(py12)s, %(py14)s)
}r   ÚexpectedÚactual)
Úpy0Úpy1Úpy3Úpy5Úpy7Úpy9Úpy10Úpy12Úpy14Úpy16zassert %(py18)sÚpy18çš™™™™™©?)r   r   ÚrandomÚdefault_rngÚuniformr#   r   Úmaximumr   Únormalr   r   r!   r"   r$   r.   r'   ÚtestingÚassert_array_equalr   Ú
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationr   r=   )r/   r2   r%   Úrngr&   rB   rC   Ú_ÚcÚ@py_assert2Ú@py_assert4Ú@py_assert6Ú@py_assert11Ú@py_assert13Ú@py_assert15Ú@py_assert8Ú@py_format17Ú@py_format19Úcontrols                      r   Ú$test_disabled_matches_engine_exactlyrl      sw  € ô 	ˆc‹
€AÜ
�)‰)×
Ñ
 Ó
#€CØ�k‰k˜"˜c¤3 q£6Ó*€A„GÜ�Z‰Z˜Ÿ™ Ó&€A„FØŸ™ A s¬C°«FÓ3€AÔØ%+È%Ø".ÐBWñY€Fä  §¡£¨6´2·7±7¼3¸q»6³?ÀAÇGÁG×DTÑDTÓDVÐXY×X^ÑX^×XgÑXgÓXiÓj€HÜ�A”} QÑ1¨&Ñ1Ó2�I€FˆAÛ:ˆÜ
�
‰
×%Ñ% h¨q¡k°6¸!±9Õ=ð ;à$0Ðu°,ÐuŒ>˜( L°,Ó?ÐuÐZfÐuÐhtÐuÄ>ÐRXÐZfÐhtÓCuÐuÐ?ÐCuÑu×u×uÖuÐ?ÐCu×u×u×u×u×uÑuŒ>×u×uÓuŒ>×u×u×u×u×uÒu˜(×u×uÓu˜(×u×uÔu L×u×uÒu°,×u×uÒuÐ?×u×u×u×u×uÐuÄ>×u×uÓuÄ>×u×u×u×u×uÒuÐRX×u×uÓuÐRX×u×uÔuÐZf×u×uÒuÐht×u×uÒuÐCu×u×u×u×u×u×u×uÓuÙÜ˜œM¨!Ñ6¨vÑ6¼¿¹ÄÀAÃÈÓ8LÓM‰
ˆ�Ü
�
‰
×%Ñ% g×&6Ñ&6¸¿¹ÕHð r   c                 óP   — t        | d¬«      }d|d   d d  d|d   d d  d|d   d<   |S )Nr3   ©r:   FÚentryÚexitTr   )r'   )r%   r-   s     r   Ú
manual_opsrq   .   s:   € Ü�a°1Ô5€AØ€A€g�J‰q€MØ€A€f�I‰a€LØ€A€g�Jˆq�MØ€Hr   c                  óŒ  — t        d«      } d| j                  d<   ddg| j                  dddgf<   d	d
g| j                  dddgf<   t        | «      }dx|d   d<   |d   d<   t        | |t	        j
                  g d¢«      «      \  }}|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}}|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}}|j                  j                  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}
}|j                  j                  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}
}g }|j$                  j                  d   }|}|r|j&                  j                  d   }| }|}|s–ddt        j                  |«      iz  }|j)                  |«       |r+d dt        j                  «      iz  }|j)                  |«       t        j*                  |d«      i z  }d!d"|iz  }t        t        j                  |«      «      ‚d x}x}x}x}}g }|d   d#   }d$}||k(  }	|	}|	r
|d   d%   }|}|sÊt        j                  d|	fd&||f«      t        j                  |«      t        j                  |«      d'œz  }d(d)|iz  }|j)                  |«       |	r+d*dt        j                  «      iz  }|j)                  |«       t        j*                  |d«      i z  }d+d,|iz  }t        t        j                  |«      «      ‚d x}x}x}x}	x}}y )-Nr3   éÈ   )r0   r   én   él   é   r   r   ém   éh   é   Trp   ro   )rO   rO   çš™™™™™¹?rz   rz   r   é_   r@   ©z%(py1)s == %(py4)s©rE   Úpy4úassert %(py6)sÚpy6r0   g      Z@©zL%(py1)s == %(py9)s
{%(py9)s = %(py5)s
{%(py5)s = %(py3)s.approx
}(%(py7)s)
}Úpytest©rE   rF   rG   rH   rI   úassert %(py11)sÚpy11ú%(py3)srF   znot %(py6)súassert %(py10)srJ   ÚreasonÚtrailing_stopÚ
score_exit©z%(py3)s == %(py6)s©rF   r€   ú%(py8)sÚpy8z%(py11)szassert %(py14)srL   )r   Úlocrq   r.   r   ÚarrayÚ
stop_priceÚilocrW   rX   r\   r]   r^   r‚   ÚapproxrY   rZ   r[   r?   r>   ÚappendÚ_format_boolop)r%   r-   ÚoutÚeventsÚ@py_assert0Ú@py_assert3rb   Ú@py_format5Ú@py_format7rc   rd   rh   Ú@py_format10Ú@py_format12Ú@py_assert1Ú@py_assert5Ú@py_assert7Ú@py_format4Ú@py_format8Ú@py_format9Ú@py_format11Ú@py_assert10Ú@py_format13Ú@py_format15s                           r   Ú0test_fill_bar_ratchet_floor_and_score_precedencer¨   6   s¾  € Üˆa‹€AØ€A‡E�Eˆ)ÑØ#&¨ *€A‡E�Eˆ!ˆf�gÐÐ
ÑØ#&¨ *€A‡E�Eˆ!ˆf�gÐÐ
ÑÜ�1‹€AØ#'Ð'€A€f�Iˆa�L�1�W‘:˜a‘=Ü�a˜œBŸH™HÒ%;Ó<Ó=�K€CˆØ�>‰>×Ñ˜qÑ!Ð' RÐ'Ð! RÑ'×'×'Õ'Ð! R×'×'Ó'Ð!×'×'Ò' R×'×'×'×'×'×'Ó'Ø�>‰>×Ñ˜qÑ!Ð' RÐ'Ð! RÑ'×'×'Õ'Ð! R×'×'Ó'Ð!×'×'Ò' R×'×'×'×'×'×'Ó'Ø�>‰>×Ñ˜qÑ!Ð9¤V§]¡]Ð9°5Ð9¡]°5Ó%9Ð9Ð!Ð%9Ñ9×9×9Õ9Ð!Ð%9×9×9Ó9Ð!×9×9×9×9×9Ð9¤V×9×9Ó9¤V×9×9Ô9 ]×9×9Ò9°5×9×9Ò9Ð%9×9×9×9×9×9×9×9Ø�>‰>×Ñ˜qÑ!Ð9¤V§]¡]Ð9°5Ð9¡]°5Ó%9Ð9Ð!Ð%9Ñ9×9×9Õ9Ð!Ð%9×9×9Ó9Ð!×9×9×9×9×9Ð9¤V×9×9Ó9¤V×9×9Ô9 ]×9×9Ò9°5×9×9Ò9Ð%9×9×9×9×9×9×9×9ÙEˆ3×Ñ× Ñ  Ñ#ÐEÐ#ÐEÑ#¨C×,=Ñ,=×,BÑ,BÀ1Ñ,EÐEÐ,EÐ(EÐEÐ(E×E×EÓEÐ#×E×E×EÐEÑ#×E×EÐEÐ,E×E×E×E×E×E×E×E×E×E×E×E×EÐEÙMˆ6�!‰9�XÑÐM /ÐMÐ /Ñ1ÔM°f¸Q±iÀÑ6MÐMÐ6M×M×MÕMÐ /×M×MÓMÐ×M×MÒM /×M×M×M×M×M×MÓMÐ6M×M×M×M×M×M×M×M×M×M×M×M×MÓMr   c                  ó	  — t        d«      } d| j                  dd …df<   t        | t        | «      t	        j
                  dd«      «      \  }}|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}}|j                  j                  d   }|s8ddt        j                  |«      iz  }t        t        j                  |«      «      ‚d }|j                  j                  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}
x}}|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}
}t)        |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}
x}}y )Nry   éZ   r0   r   rz   r   r{   r@   r|   r}   r   r€   úassert %(py1)srE   g)\�Âõ(¼?)zO%(py1)s == %(py10)s
{%(py10)s = %(py5)s
{%(py5)s = %(py3)s.approx
}(-%(py7)s)
}r‚   )rE   rF   rG   rH   rJ   zassert %(py12)srK   Úthreshold_overshoot_pctg      @r�   rƒ   r„   r…   r	   r)   Úpnl_pctg      &@)r   r�   r.   rq   r   r   r‘   r’   rW   rX   r\   r]   r^   r?   Ústrategy_returnr‚   r“   rY   rZ   r[   r   )r%   r–   r—   r˜   r™   rb   rš   r›   Ú@py_format2rc   rd   rh   Ú@py_assert9r¤   r¦   rœ   r�   s                    r   Ú)test_entry_floor_close_overshoot_and_feesr±   F   sÚ  € Üˆa‹€AØ€A‡E�Eˆ!‰"ˆgˆ+ÑÜ�aœ A›¬¯©°°2«Ó7�K€CˆØ�>‰>×Ñ˜qÑ!Ð' RÐ'Ð! RÑ'×'×'Õ'Ð! R×'×'Ó'Ð!×'×'Ò' R×'×'×'×'×'×'Ó'Ø×Ñ× Ñ  Ñ#Ð#Ñ#×#×#Ð#Ð#×#×#×#×#×#Ø×Ñ×#Ñ# AÑ&Ð=¬&¯-©-Ð=¸Ð=¸¸Ð=©-¸Ó*=Ð=Ð&Ð*=Ñ=×=×=Õ=Ð&Ð*=×=×=Ó=Ð&×=×=×=×=×=Ð=¬&×=×=Ó=¬&×=×=Ô=¨-×=×=Ò=¸×=×=Ò=Ð*=×=×=×=×=×=×=×=Ñ=Ø�!‰9Ð.Ñ/ÐD´6·=±=ÐDÀÐD±=ÀÓ3DÐDÐ/Ð3DÑD×D×DÕDÐ/Ð3D×D×DÓDÐ/×D×D×D×D×DÐD´6×D×DÓD´6×D×DÔD°=×D×DÒDÀ×D×DÒDÐ3D×D×D×D×D×D×D×DÜ˜#˜|¨\Ó:¸9ÑEÐ\ÌÏÉÐ\ÐX[Ð\ÐX[ÐW[Ð\ÉÐW[ÓI\Ð\ÐEÐI\Ñ\×\×\Õ\ÐEÐI\×\×\Ó\ÐE×\×\×\×\×\Ð\Ì×\×\Ó\Ì×\×\Ô\È×\×\Ò\ÐX[×\×\Ò\ÐI\×\×\×\×\×\×\×\Ò\r   c                  óÖ  — t        d«      } d| j                  d<   t        | «      }t        | |«      \  }}|j                  j
                  d   }|s8ddt        j                  |«      iz  }t        t        j                  |«      «      ‚d }d|d   dd  t        | |«      \  }}g }|j                  j
                  d	   }d}	||	k(  }
|
}|
r$|j                  }|j                  } |«       }| }|}|�s3t        j                  d
|
fd||	f«      t        j                  |«      t        j                  |	«      dœz  }dd|iz  }|j                  |«       |
r”ddt        j                  «       v st        j                   |«      rt        j                  |«      ndt        j                  «      t        j                  «      t        j                  «      dœz  }|j                  |«       t        j"                  |d«      i z  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}x}
x}	x}x}x}}t        | «      }d|d   d d  d|d   d	<   t        | |«      \  }}g }|j$                  j
                  d	   }|}|r(|j&                  }|j(                  } |«       }d}||k(  }|}|�s3ddt        j                  |«      iz  }|j                  |«       |rÈt        j                  d
fd|f«      dt        j                  «       v st        j                   |«      rt        j                  |«      ndt        j                  «      t        j                  «      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}x}}y ) Nr1   r{   )r0   r   r0   r«   rE   FÚtime_okéÿÿÿÿr@   r‹   rŒ   r�   rŽ   zdnot %(py16)s
{%(py16)s = %(py14)s
{%(py14)s = %(py12)s
{%(py12)s = %(py10)s.execute_exit
}.any
}()
}Úheld)rJ   rK   rL   rM   r   zassert %(py20)sÚpy20ro   Tr†   rF   )zj%(py11)s
{%(py11)s = %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s.strategy_return
}.sum
}()
} == %(py14)sÚterminal)rG   rH   rI   r…   rL   z%(py16)srM   zassert %(py19)sÚpy19)r   r�   rq   r.   r?   r’   rW   r\   r]   r^   r=   ÚanyrX   r”   rY   rZ   r[   r•   r>   r®   Úsum)r%   r-   r–   r`   r˜   r¯   rµ   rž   rb   rŸ   rc   re   rf   rg   Ú@py_assert17r›   r£   Ú@py_format18rj   Ú@py_format21r·   rd   rh   r¥   Ú@py_assert12r¡   r§   ri   Ú@py_format20s                                r   Ú.test_equality_and_terminal_entry_and_time_gaterÀ   Q   sœ  € Üˆa‹€AØ€A‡E�Eˆ*ÑÜ�1‹€AÜ��A‹Y�F€CˆØ×Ñ× Ñ  Ñ#Ð#Ñ#×#×#Ð#Ð#×#×#×#×#×#Ø€A€i�L��ÐÜ�!�Q‹i�G€Dˆ!ÙFˆ4�=‰=×Ñ˜bÑ!ÐF QÐFÐ! QÑ&ÔF¨t×/@Ñ/@ÐFÐ/@×/DÑ/DÐFÑ/DÓ/FÐFÐ/FÐ+FÐFÐ+F×F×FÖFÐ! Q×F×FÓFÐ!×F×FÒF Q×F×F×F×F×F×F×F×F×FÐF¨t×F×FÓF¨t×F×FÔFÐ/@×F×FÒFÐ/D×F×FÒFÐ/F×F×F×F×F×F×F×F×F×F×F×F×F×FÑFÜ�1‹€AØ€A€g�J‰q€MØ€A€g�Jˆr�NÜ�a˜“)�K€HˆaÙRˆ8×!Ñ!×&Ñ& rÑ*ÐRÐ*ÐRÑ*¨x×/GÑ/GÐRÐ/G×/KÑ/KÐRÑ/KÓ/MÐRÐQRÐRÐ/MÐQRÑ/R×R×RÖRÐ*×R×R×RÐRÑ*×R×RÒRÐ/MÐQR×R×R×R×R×RÑR¨x×R×RÓR¨x×R×RÔRÐ/G×R×RÒRÐ/K×R×RÒRÐ/M×R×RÒRÐQR×R×R×R×R×R×R×R×R×R×R×R×R×R×Rr   c            	      ó2	  — t        d«      } d| _        d| _        t        | «      }|j                  j
                  d d }|j                  } |«       }|j                  } |«       }|sˆdt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }t        t        j                  |«      «      ‚d x}x}x}x}}|j                  j
                  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}}t$        j&                  j)                  |j
                  d d t        | j
                  d d «      «       t+        | «      }	d|	d   d<   d|	d   d<   |j                  j-                  «       dz  }
t/        | |	|
«      \  }}|	j1                  «       D ��ci c]'  \  }}|t3        |t4        j6                  «      r|d d n|“Œ) }}}t/        | j
                  d d ||
d d «      \  }}dD ]+  }t4        j&                  j9                  ||   d d ||   «       Œ- d|
dd  t/        | |	|
«      \  }}t4        j&                  j9                  |j:                  d d |j:                  d d «       t        d«      }dt5        j<                  t5        j>                  d«      «      dz  z   |_         t5        jB                  |jD                  |j@                  «      dz   |_        t5        jF                  |jD                  |j@                  «      dz
  |_        t        |«      }|jH                  dd …g d¢fxx   dz  cc<   t$        j&                  j)                  |j
                  d d t        |«      j
                  d d «       y c c}}w )Néd   ç     €Y@ç     €X@é   zoassert %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.isna
}()
}.all
}()
}rƒ   g{®Gáz¤?r@   r�   r‚   r„   r…   é2   Fro   r   Té   rv   )r=   r‘   r®   gš™™™™™™?ry   ©r   r   r   r   r3   )%r   r   r   r   Ú	atr_pricer’   ÚisnaÚallrW   r\   r]   r^   r‚   r“   rX   rY   rZ   r[   r   rU   Úassert_frame_equalrq   r$   r.   ÚitemsÚ
isinstancer   ÚndarrayrV   r‘   ÚsinÚaranger   rS   r   Úminimumr�   )r%   Úvr˜   rb   rc   rd   rh   rœ   r�   r-   r,   r   r`   ÚkÚvalueÚshort_oÚprefixÚcolÚchangedÚvaryingÚfirsts                        r   Ú)test_volatility_seed_and_prefix_causalityrÜ   a   sn  € Üˆc‹
€AØ€A„FØ€A„EÜ�1‹€AØ�;‰;×Ñ˜C˜RÐ Ð-Ð ×%Ñ%Ð-Ñ%Ó'Ð-Ð'×+Ñ+Ð-Ñ+Ó-Ð-Ñ-×-×-Ð ×-×-Ò-Ð%×-×-Ò-Ð'×-×-Ò-Ð+×-×-Ò-Ð-×-×-×-×-×-×-Ð-Ø�;‰;×Ñ˜BÑÐ5¤6§=¡=Ð5°Ð5¡=°Ó#5Ð5ÐÐ#5Ñ5×5×5Õ5ÐÐ#5×5×5Ó5Ð×5×5×5×5×5Ð5¤6×5×5Ó5¤6×5×5Ô5 =×5×5Ò5°×5×5Ò5Ð#5×5×5×5×5×5×5×5Ü‡J�J×!Ñ! !§&¡&¨¨" +¬z¸!¿&¹&ÀÀ"¸+Ó/FÔGÜ�1‹€AØ€A€g�Jˆq�MØ€A€g�Jˆr�NØ�[‰[×!Ñ!Ó# AÑ%€FÜ�!�Q˜Ó�G€Dˆ!ØYZ×Y`ÑY`ÔYbÔcÑYbÉXÈQÐPUˆq¤
¨5´"·*±*Ô =�%˜˜‘*À5ÑHÐYb€GÑcÜ�A—F‘F˜3˜B�K ¨&°°"¨+Ó6�I€FˆAÛ<ˆÜ
�
‰
×%Ñ% d¨3¡i°° n°f¸S±kÕBð =à€Fˆ2ˆ3€KÜ�Q˜˜6Ó"�J€GˆQÜ‡J�J×!Ñ! $§/¡/°#°2Ð"6¸×8JÑ8JÈ3ÈBÐ8OÔPÜ�C‹j€GØœŸ™œrŸy™y¨›~Ó.¨qÑ0Ñ0€G„MÜ—:‘:˜gŸl™l¨G¯M©MÓ:¸1Ñ<€G„LÜ—*‘*˜WŸ\™\¨7¯=©=Ó9¸!Ñ;€G„KÜ�wÓ€EØ‡K�K�‘Ò5Ð5Ó6¸!Ñ;Ó6Ü‡J�J×!Ñ! %§*¡*¨S¨b /´:¸gÓ3F×3KÑ3KÈCÈRÐ3PÕQùó ds   Ê7,Rc            
      ó\  — t        «       } t        j                  t        d¬«      5  t	        | t        | «      t        j                  t        | «      t        j                  «      «       d d d «       t        j                  t        d¬«      5  t	        | t        | «      t        j                  d«      «       d d d «       t        j                  | j                  d<   t        j                  t        d¬«      5  t        | «       d d d «       y # 1 sw Y   Œ£xY w# 1 sw Y   ŒbxY w# 1 sw Y   y xY w)NÚwidth)ÚmatchÚlengthry   )r3   r   Úfinite)r   r‚   ÚraisesÚ
ValueErrorr.   rq   r   r   r#   Únanr"   r�   r   )r%   s    r   Ú1test_bad_prices_and_active_missing_width_rejectedrå   ~   s²   € Ü‹€AÜ	�‰”z¨Ö	1ÜˆAŒz˜!‹}œbŸg™g¤c¨!£f¬b¯f©fÓ5Ô6÷ 
2ä	�‰”z¨Ö	2ÜˆAŒz˜!‹}œbŸg™g a›jÔ)÷ 
3äŸ™€A‡E�Eˆ*ÑÜ	�‰”z¨Ö	2Ü�1Œ÷ 
3Ð	2÷ 
2Ð	1úç	2Ð	2ú÷ 
3Ð	2ús$   ¦AD
Â*DÃ5D"Ä
DÄDÄ"D+c            
      óÖ  — t        d«      } dD ��cg c]  \  }}|dd|ddœ‘Œ }}}t        | |t        | «      dd«      }|j                  }|j                  } |«       }g d	¢}||k(  }	|	sÕt        j                  d
|	fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }
dd|
iz  }t        t        j                  |«      «      ‚d x}x}x}x}	}|j                  }|j                  } |«       }g d¢}||k(  }	|	sÕt        j                  d
|	fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }
dd|
iz  }t        t        j                  |«      «      ‚d x}x}x}x}	}| j                  dd …dfxx   t        j                   d¬«      z  cc<   t        | |t        | «      dd«      }|j                  }|j"                  } |«       }| }	|	s¡ddt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      dœz  }t        t        j                  |«      «      ‚d x}x}x}}	y c c}}w )NrÇ   ))é   r‰   )é   rŠ   )é   r‰   r   rp   F©ÚbarÚ	entry_barÚactionrˆ   rŠ   r)   ©é   )TTFr@   )z`%(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.valid
}.tolist
}()
} == %(py9)sÚe)rD   Úpy2r~   r€   rI   r„   r…   )TFF)ze%(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.nonoverlap
}.tolist
}()
} == %(py9)sé   r   r1   )Úhoursz]assert not %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.valid
}.any
}()
})rD   rñ   r~   r€   )r   r   r   ÚvalidÚtolistrW   rX   rY   rZ   r[   r\   r]   r^   Ú
nonoverlapr�   r   Ú	Timedeltar¹   )r%   Útrˆ   Ú	decisionsrð   rž   r™   rŸ   rh   r    rœ   r�   r¢   s                r   Ú4test_event_censoring_gaps_and_overlap_across_reasonsrú   ‰   s@  € Üˆb‹	€Aá"dôfÙ"d‘Y�Q˜ð ¨°fÈÐ^cÓdØ"dð ñ fä�A�y¤*¨Q£-°¸tÓD€AØ�7‰7Ð2ˆ7�>‰>Ð2‰>ÓÐ2Ò2Ð2ÐÐ2Ñ2×2×2Õ2ÐÐ2×2×2×2×2×2Ñ2ˆ1×2×2Ó2ˆ1×2×2Ô2ˆ7×2×2Ò2ˆ>×2×2Ò2Ð×2×2Ò2Ð2×2×2×2×2×2×2×2Ø�<‰<Ð8ˆ<×ÑÐ8ÑÓ Ð8Ò$8Ð8Ð Ð$8Ñ8×8×8Õ8Ð Ð$8×8×8×8×8×8Ñ8ˆ1×8×8Ó8ˆ1×8×8Ô8ˆ<×8×8Ò8Ð×8×8Ò8Ð ×8×8Ò8Ð$8×8×8×8×8×8×8×8Ø‡E�Eˆ"‰#ˆvˆ+Óœ"Ÿ,™,¨QÔ/Ñ/ÓÜ�A�y¤*¨Q£-°¸tÓD€AØ�w‰wÐˆw�{‰{Ð‰{‹}Ðˆ}ÐÐÑ××××Õˆq××Óˆq××Ôˆw××Òˆ{××Òˆ}××××××ùófs   ‘M%c                  ó†  — t        d«      } d| j                  dd …df<   d| j                  dd …df<   t        j                  | j                  | j
                  «      | _        ddd	d
ddœg}t        | |t        | «      dd«      j                  d   }|j                  }t        j                  }d}d}d}||z  }d}	||	z
  }
||
z  } ||«      }||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}x}	x}
x}}y )NrÇ   r8   é   r   g     @^@rò   rç   r   rp   r‰   Frê   r)   rî   rÂ   gš™™™™™ñ?g…ëQ¸…ñ?g×£p=
×ï?r@   )z�%(py2)s
{%(py2)s = %(py0)s.hold_advantage_pct
} == %(py19)s
{%(py19)s = %(py6)s
{%(py6)s = %(py4)s.approx
}((%(py8)s * ((%(py10)s * %(py12)s) - %(py15)s)))
}Úeventr‚   )	rD   rñ   r~   r€   rŽ   rJ   rK   Úpy15r¸   zassert %(py21)sÚpy21)r   r�   r   rS   r   r   r   r   r   r’   Úhold_advantage_pctr‚   r“   rW   rX   rY   rZ   r[   r\   r]   r^   )r%   rù   rý   rž   rŸ   r    r°   re   rf   Ú@py_assert14Ú@py_assert16r»   Ú@py_assert18r™   r¿   Ú@py_format22s                   r   Ú5test_event_hold_advantage_uses_canonical_additive_feer  •   s˜  € Üˆb‹	€AØ€A‡E�Eˆ"‰#ˆwˆ,ÑØ€A‡E�Eˆ"‰#ˆwˆ,ÑÜ�Z‰Z˜Ÿ™ §¡Ó(€A„FØ¨!°vØ+¸5ñBð C€Iä˜˜9¤j°£m°\À4ÓH×MÑMÈaÑP€EØ×#Ñ#ÐJ¤v§}¡}ÐJ°SÐJ¸#ÐJ¸eÐJ¸#¸e¹)ÐJÀDÐJ¸)ÀD¹.ÐJ°S¸.Ñ5IÐJ¡}Ð5IÓ'JÐJÐ#Ð'JÑJ×J×JÖJÐ#Ð'J×J×J×J×J×JÑJˆ5×J×JÓJˆ5×J×JÔJÐ#×J×J×J×J×JÐJ¤v×J×JÓJ¤v×J×JÔJ }×J×JÒJ°S×J×JÒJ¸#×J×JÒJ¸e×J×JÒJÀD×J×JÒJÐ'J×J×J×J×J×J×J×J×JÔJr   c                  ó˜  — ddl m} m}m} t	        d«      }t        j                  ddd¬«      |_        t        j                  ddd¬«      |j                  d d	…d
f<   d|_	        d|_
        t        |d¬«      } | ||t        |«      «      \  }}|j                  t        j                  d«      k\  }|j                  |g d¢fxx   dz  cc<    | ||t        |«      «      \  }}||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$                  |«      rt        j&                  |«      nddœz  }
dd|
iz  }t)        t        j*                  |«      «      ‚d }	t-        d«      D ��cg c]/  }dg|¢d‘d‘D ]!  }dt/        |«      |||v rdnd||v rdndd dd!œ‘Œ# Œ1 }}}t        j0                  |«      } ||«      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        j2                  ||j5                  d(d)¬*«      g«      } ||«      } ||«      }||k(  }|�spt        j                  d|fd+||f«      d,t!        j"                  «       v st        j$                  |«      rt        j&                  |«      nd,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,d.t!        j"                  «       v st        j$                  |«      rt        j&                  |«      nd.t        j&                  |«      d/œz  }d0d1|iz  }t)        t        j*                  |«      «      ‚d x}x}}y c c}}w )2Nr   )Ú	calibrateÚnominateÚ	ATR_NAMESrÂ   z
2020-12-20r
   r   z
2017-11-01rò   é   r   rÃ   rÄ   r3   rn   z
2021-01-01rÈ   ry   r@   )z%(py0)s == %(py2)srÛ   Úsecond)rD   rñ   zassert %(py4)sr~   ÚbaselineÚfixed_atr_5Úfixed_atr_7_5Ú
validationé
   rv   r0   éûÿÿÿ)Ústager/   Úvariantr­   ÚcalmarÚdd_pctÚentriesÚ	nominatedÚatr_5r|   r}   r   r€   Úhistorical_evaluationiüÿÿ)r  r­   )zN%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py8)s
{%(py8)s = %(py5)s(%(py6)s)
}r  ÚleakedÚoriginal)rD   rE   rF   rG   r€   rŽ   r‡   rJ   )Ú(tools.run_mlp_volatility_stop_experimentr  r  r	  r   r   r   r   r�   r   r   r'   r   Ú	TimestamprW   rX   rY   rZ   r[   r\   r]   r^   ÚrangeÚstrr   ÚconcatÚassign)r  r  r	  r%   r-   r`   rÛ   Úfuturer  rž   Ú@py_format3rš   ÚyearÚnameÚrowsr  r˜   r™   rb   r›   r  r    rc   r£   r¤   s                            r   Ú1test_calibration_and_selection_ignore_future_datar'      sÿ  € ßWÑWÜˆc‹
€AÜ�]‰]˜<°¸4Ô@€A„FÜŸ™ |¸RÀdÔK€A‡E�Eˆ#ˆ2ˆ#ˆvˆ+ÑØ€A„FØ€A„EÜ�a°1Ô5€AÙ˜˜Aœz¨!›}Ó-�H€A€uØ�V‰V”r—|‘| LÓ1Ñ1€FØ‡E�Eˆ&Ò2Ð
2Ó3°qÑ8Ó3Ù˜!˜Q¤
¨1£Ó.�I€A€vØ�F‰?××Õˆ5�F×××××Ñˆ5××Óˆ5×××××Ò�F××Ó�F××××××Ñô 7<¸A´hôRá6>¨dØ#ÐP iÐP°ÐPÀÓP�ð #¬c°$«iÀDØ" iÑ/™°QÀtÈyÑGXÁ!Ð^_Ø bó*ð Qð*à6>ð 	ñ Rô �|‰|˜DÓ!€HÙ�HÓ˜kÑ*Ð5¨gÐ5Ð*¨gÑ5×5×5Õ5Ð*¨g×5×5Ó5Ð*×5×5Ò5¨g×5×5×5×5×5×5Ó5Ü�Y‰Y˜ (§/¡/Ð8OÐY] /Ó"^Ð_Ó`€FÙ�FÓÐ1™x¨Ó1Ð1ÐÐ1Ñ1×1×1Ö1ÐÐ1×1×1×1×1×1Ñ1ˆ8×1×1Ó1ˆ8×1×1×1×1×1Ò1�F×1×1Ó1�F×1×1Ô1Ð×1×1×1×1×1Ð1˜x×1×1Ó1˜x×1×1×1×1×1Ò1¨×1×1Ó1¨×1×1Ô1Ð1×1×1×1×1×1×1Ô1ùóRs   Æ=4Q)rÂ   )N)"ÚbuiltinsrY   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterW   Únumpyr   Úpandasr   r‚   Ústrategies.mlp_volatility_stopr   r   r   Ústrategies.strategy_mlp_scoresr   Ú%tools.run_mlp_state_policy_experimentr   r   r'   r.   ÚmarkÚparametrizerl   rq   r¨   r±   rÀ   rÜ   rå   rú   r  r'  © r   r   Ú<module>r4     s«   ðß  „ Ó Û Û ç OÑ OÝ <Ý @óPòKó
Rð ‡�×Ñ˜ A q 6Ó*Ø‡�×Ñ˜ 1 a &Ó)ñIó *ó +ðIò$òNò ]òSò Rò:ò	òKó2r   