Ë
    äR±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 dd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)é    N)Únet_returnsÚwindow_metricsc                 ó‚   — t        j                  t        t        j                  ddd¬«      | | g d¢g d¢g d¢¬«      «      S )	Nú
2020-01-01é   Ú6h©ÚperiodsÚfreq)é   r   r   )TFF)FFT)ÚtimeÚcloseÚlowÚpositionÚexecute_entryÚexecute_exit)ÚpdÚ	DataFrameÚdictÚ
date_range)Úpricess    új/Users/jameslopez/projects/TradingBot25/.worktrees/mlp-comparable-measurement/tests/test_mlp_accounting.pyÚsignalsr      s9   € Ü�<‰<œ¤"§-¡-°ÀaÈdÔ"SØ˜&ª9Ú*Ò9MôOó Pð Pó    c            	      óp  — t        «       } t        j                  j                  t	        | «      g d¢«       t        | «      }|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
   }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   }||k(  }d}||k(  }
|r|
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   }t        j                  }d}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                  |«      dœz  }	dd|	iz  }t        t        j                  |«      «      ‚d x}x}x}x}x}x}}y )N)g        gáz®Gáº¿g{®Gázt¿Úpnl_pctç…ëQ¸å%@©ú==©zO%(py1)s == %(py10)s
{%(py10)s = %(py5)s
{%(py5)s = %(py3)s.approx
}(-%(py7)s)
}Úpytest©Úpy1Úpy3Úpy5Úpy7Úpy10úassert %(py12)sÚpy12Údd_pctÚentriesÚexitsr   ©r   r   ©z%(py1)s == %(py5)sz%(py5)s == %(py7)s©r#   r%   r&   úassert %(py9)sÚpy9Úexposure_pctéÈ   r   )zZ%(py1)s == %(py12)s
{%(py12)s = %(py5)s
{%(py5)s = %(py3)s.approx
}((%(py7)s / %(py9)s))
})r#   r$   r%   r&   r1   r)   úassert %(py14)sÚpy14)r   ÚnpÚtestingÚassert_allcloser   r   r!   ÚapproxÚ
@pytest_arÚ_call_reprcompareÚ	_safereprÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚAssertionErrorÚ_format_explanation)ÚframeÚresultÚ@py_assert0Ú@py_assert4Ú@py_assert6Ú@py_assert8Ú@py_assert9Ú@py_assert2Ú@py_format11Ú@py_format13Ú@py_assert3Ú@py_format8Ú@py_format10Ú@py_assert10Ú@py_assert11Ú@py_format15s                   r   Ú)test_initial_capital_and_exact_fee_timingrR      s©  € Ü‹I€EÜ‡J�J×Ñœ{¨5Ó1Ò3EÔFÜ˜EÓ"€FØ�)ÑÐ7¤§¡Ð7¨wÐ7¨w¨hÐ7¡¨hÓ 7Ð7ÐÐ 7Ñ7×7×7Õ7ÐÐ 7×7×7Ó7Ð×7×7×7×7×7Ð7¤×7×7Ó7¤×7×7Ô7 ×7×7Ò7¨w×7×7Ò7Ð 7×7×7×7×7×7×7×7Ñ7Ø�(ÑÐ6œvŸ}™}Ð6¨gÐ6¨g¨XÐ6™}¨XÓ6Ð6ÐÐ6Ñ6×6×6Õ6ÐÐ6×6×6Ó6Ð×6×6×6×6×6Ð6œv×6×6Ó6œv×6×6Ô6˜}×6×6Ò6¨g×6×6Ò6Ð6×6×6×6×6×6×6×6Ñ6Ø�)ÑÐ4  w¡Ð4Ð Ñ4Ð4°1Ð4 °1Ñ4×4×4×4Ð4Ð °1×4×4Ó4Ð×4×4Ò4 ×4×4Ò4°1×4×4×4×4×4×4×4Ø�.Ñ!Ð;¤V§]¡]Ð;°3Ð;¸Ð;°3¸±7Ð;¡]°7Ó%;Ð;Ð!Ð%;Ñ;×;×;Õ;Ð!Ð%;×;×;Ó;Ð!×;×;×;×;×;Ð;¤V×;×;Ó;¤V×;×;Ô; ]×;×;Ò;°3×;×;Ò;¸×;×;Ò;Ð%;×;×;×;×;×;×;×;Ô;r   c                  ó6  — t        d«      } t        | «      }t        j                  ddd¬«      | _        t        | «      }|d   }d}||z  }t
        j                  }|d   } ||«      }||k(  }	|	sñt        j                  d|	fd	||f«      t        j                  |«      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}x}}d}|d   }d}||z  }||z   }t
        j                  }d}|d   }d}||z  }||z   }d}||z  } ||«      }||k(  }|�sAt        j                  d|fd||f«      t        j                  |«      t        j                  |«      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}x}x}x}x}}y )N)ç      Y@g     €Y@g     @Y@r   r   ÚDr	   Úyearsé   r   )z[(%(py1)s * %(py3)s) == %(py12)s
{%(py12)s = %(py8)s
{%(py8)s = %(py6)s.approx
}(%(py10)s)
}r!   )r#   r$   Úpy6Úpy8r'   r)   r4   r5   r   Úcagr_pctéd   )z‘(%(py1)s + (%(py3)s / %(py5)s)) == %(py24)s
{%(py24)s = %(py11)s
{%(py11)s = %(py9)s.approx
}(((%(py13)s + (%(py15)s / %(py17)s)) ** %(py21)s))
})
r#   r$   r%   r1   Úpy11Úpy13Úpy15Úpy17Úpy21Úpy24zassert %(py26)sÚpy26)r   r   r   r   r   r!   r9   r:   r;   r<   r=   r>   r?   r@   rA   )rB   ÚintradayÚdailyrD   rI   rE   Ú@py_assert7rH   rP   Ú@py_assert5rK   rQ   rF   rO   Ú@py_assert12Ú@py_assert14Ú@py_assert16Ú@py_assert18Ú@py_assert19Ú@py_assert20Ú@py_assert22Ú@py_assert23rG   Ú@py_format25Ú@py_format27s                            r   Ú#test_calendar_duration_changes_cagrrq      s.  € ÜÐ&Ó'€EÜ˜eÓ$€HÜ—‘˜|°Q¸SÔA€E„JÜ˜5Ó!€EØ�GÑÐA˜qÐAÐ˜qÑ ÐA¤F§M¡MÐA°%¸±.ÐA¡M°.Ó$AÐAÐ Ð$AÑA×A×AÕAÐ Ð$A×A×AÓAÐ×A×AÒA˜q×A×A×A×A×AÐA¤F×A×AÓA¤F×A×AÔA M×A×AÒA°.×A×AÒAÐ$A×A×A×A×A×A×A×AÓAØÐ^ˆx˜
Ñ#Ð^ cÐ^Ð# cÑ)Ð^ˆ1Ð)Ñ)Ð^¬V¯]©]Ð^¸AÐ^ÀÀjÑ@QÐ^ÐTWÐ^Ð@QÐTWÑ@WÐ^¸AÐ@WÑ<WÐ^Ð\]Ð^Ð<WÐ\]Ñ;]Ð^©]Ð;]Ó-^Ð^Ð)Ð-^Ñ^×^×^Ö^Ð)Ð-^×^×^Ó^ˆ1×^×^Ò^Ð#×^×^Ò^ c×^×^×^×^×^Ð^¬V×^×^Ó^¬V×^×^Ô^¨]×^×^Ò^¸A×^×^Ò^Ð@Q×^×^Ò^ÐTW×^×^Ò^Ð\]×^×^Ò^Ð-^×^×^×^×^×^×^×^×^×^Ô^r   c                  ó  — t        d«      } d| _        d| _        t        | 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}}|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}}
g }|d   }|}|r|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}}t        | «      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}}y ) N©rT   g      i@g     Àb@r   Fú2020-01-01 12:00:00©Ústartr   é   r   r    r!   r"   r(   r)   r+   r   ©z%(py1)s == %(py4)s©r#   Úpy4úassert %(py6)srX   Úcarry_inÚopen_at_endú%(py3)sr$   ú%(py6)sr0   r1   g     ÐH@©zL%(py1)s == %(py9)s
{%(py9)s = %(py5)s
{%(py5)s = %(py3)s.approx
}(%(py7)s)
}©r#   r$   r%   r&   r1   úassert %(py11)sr\   )r   r   r   r   r!   r9   r:   r;   r<   r=   r>   r?   r@   rA   ÚappendÚ_format_boolop)rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   Ú@py_format5Ú@py_format7Ú@py_assert1rf   Ú@py_format4rM   rN   Ú@py_format12s                      r   Ú4test_carry_in_and_terminal_open_are_marked_to_marketrŠ   !   s5  € ÜÐ&Ó'€EØ€E„NØ€EÔÜ˜EÐ)>Ô?€FØ�)ÑÐ2¤§¡Ð2¨rÐ2¨r¨cÐ2¡¨cÓ 2Ð2ÐÐ 2Ñ2×2×2Õ2ÐÐ 2×2×2Ó2Ð×2×2×2×2×2Ð2¤×2×2Ó2¤×2×2Ô2 ×2×2Ò2¨r×2×2Ò2Ð 2×2×2×2×2×2×2×2Ñ2Ø�)ÑÐ! Ð!Ð Ñ!×!×!Õ!Ð ×!×!Ó!Ð×!×!Ò! ×!×!×!×!×!×!Ó!Ù7ˆ6�*ÑÐ7ÐÐ7Ñ &¨Ñ"7Ð7Ð"7×7×7Ó7Ð×7×7×7Ð7Ñ×7×7Ð7Ð"7×7×7×7×7×7×7×7×7×7×7×7Ö7Ü˜%Ó  Ñ+ÐD¬v¯}©}ÐD¸VÐD©}¸VÓ/DÐDÐ+Ð/DÑD×D×DÕDÐ+Ð/D×D×DÓDÐ+×D×D×D×D×DÐD¬v×D×DÓD¬v×D×DÔD¨}×D×DÒD¸V×D×DÒDÐ/D×D×D×D×D×D×D×DÐDr   c            	      ó  — t        «       } t        | 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x| _        | _	        t        | «      }|d   }|d   }||k(  }|d   }||k(  }d
}	||	k(  }
|r|r|
s˜t        j                  d|||
fd||||	f«      t        j                  |«      t        j                  |«      t        j                  |«      t        j                  |	«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}x}
x}x}}	|d   }d }||u }|slt        j                  d|fd||f«      t        j                  |«      t        j                  |«      dœz  }dd	|iz  }t        t        j                  |«      «      ‚d x}x}}y )Nr   ©Úendr,   r   r   rx   ry   r{   rX   r   Fr   r*   r+   ©r   r   r   )ú%(py1)s == %(py6)sú%(py6)s == %(py8)sz%(py8)s == %(py10)s©r#   rX   rY   r'   r(   r)   Úcalmar)Úis)z%(py1)s is %(py4)s)
r   r   r:   r;   r<   r@   rA   r   r   r   )rB   rD   rL   rI   r…   r†   rC   rf   re   rH   rE   rJ   rK   s                r   ÚDtest_date_end_includes_every_intraday_bar_and_inactivity_is_retainedr”   ,   sw  € Ü‹I€EÜ˜% \Ô2°7Ñ;Ð@¸qÐ@Ð;¸qÑ@×@×@Õ@Ð;¸q×@×@Ó@Ð;×@×@Ò@¸q×@×@×@×@×@×@Ó@Ø€E„NØ/4Ð4€EÔ˜%Ô,Ü˜EÓ"€FØ�)ÑÐJ  xÑ 0ÐJÐÐ 0ÑJÐJ°F¸9Ñ4EÐJÐ 0Ð4EÑJÐJÈÐJÐ4EÈÑJ×J×J×JÓJÐÐ 0Ð4EÈ×J×JÓJÐ×J×JÒJÐ 0×J×JÒJÐ4E×J×JÒJÈ×J×J×J×J×J×J×JÓJØ�(ÑÐ#˜tÐ#Ð˜tÐ#×#×#Õ#Ð˜t×#×#Ó#Ð×#×#Ò#˜t×#×#×#×#×#×#Ô#r   c                  óX  — t        «       } t        | t        j                  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}||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   rŒ   r+   r   r   rx   ry   r{   rX   r2   r   )	r   r   r   Ú	Timestampr:   r;   r<   r@   rA   )rB   rC   rD   rL   rI   r…   r†   s          r   Ú(test_lagged_exposure_and_first_bar_entryr—   6   sÂ   € Ü‹I€EÜ˜E¤r§|¡|°LÓ'AÔB€FØ�)ÑÐ! Ð!Ð Ñ!×!×!Õ!Ð ×!×!Ó!Ð×!×!Ò! ×!×!×!×!×!×!Ó!Ø�.Ñ!Ð& QÐ&Ð! QÑ&×&×&Õ&Ð! Q×&×&Ó&Ð!×&×&Ò& Q×&×&×&×&×&×&Ô&r   c                  óÊ  — ddl m}  ddlm} t	        «       }t        |«      } | |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   }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   }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   } ||«      }	||	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}}	y )Nr   ©Úcalculate_metrics©Úrun_backtest©Ú
min_tradesúMax Drawdown %r*   r   r€   r!   r�   r‚   r\   úTotal Tradesr   rx   ry   r{   rX   Úpnlr   Úmax_dd)Ú%strategies.strategy_activation_scoresrš   Útools.mlp_results_tablerœ   r   r   r!   r9   r:   r;   r<   r=   r>   r?   r@   rA   )rš   rœ   rB   ÚresearchÚsharedÚreportrD   rE   rF   rG   rI   rN   r‰   rL   r…   r†   s                   r   Ú2test_shared_metrics_and_report_use_same_accountingr¨   =   sm  € ÝGÝ4Ü‹I€EÜ˜eÓ$€HÙ˜u°Ô3€FÙ˜%Ó €FØÐ"Ñ#ÐH¤v§}¡}ÐH°X¸hÑ5GÐH¡}Ð5GÓ'HÐHÐ#Ð'HÑH×H×HÕHÐ#Ð'H×H×HÓHÐ#×H×H×H×H×HÐH¤v×H×HÓH¤v×H×HÔH }×H×HÒHÐ5G×H×HÒHÐ'H×H×H×H×H×H×H×HØ�.Ñ!Ð& QÐ&Ð! QÑ&×&×&Õ&Ð! Q×&×&Ó&Ð!×&×&Ò& Q×&×&×&×&×&×&Ó&Ø�%‰=Ð>œFŸM™MÐ>¨(°9Ñ*=Ð>™MÐ*=Ó>Ð>ˆ=Ð>Ñ>×>×>Õ>ˆ=Ð>×>×>Ó>ˆ=×>×>×>×>×>Ð>œF×>×>Ó>œF×>×>Ô>˜M×>×>Ò>Ð*=×>×>Ò>Ð>×>×>×>×>×>×>×>Ø�(ÑÐ@œvŸ}™}Ð@¨X°hÑ-?Ð@™}Ð-?Ó@Ð@ÐÐ@Ñ@×@×@Õ@ÐÐ@×@×@Ó@Ð×@×@×@×@×@Ð@œv×@×@Ó@œv×@×@Ô@˜}×@×@Ò@Ð-?×@×@Ò@Ð@×@×@×@×@×@×@×@Ð@r   c                  ó*  — ddl m}  t        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}x}}|d   }|d   }||k(  }d}||k(  }|r|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}}g }|d   }|}|r|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}}y )Nr   r›   rs   r   Frt   ru   r¡   g      9@r   r    r!   r"   r(   r)   ÚtotalÚwinsr-   r.   r/   r0   r1   r|   r}   r~   r$   r   rX   )r¤   rœ   r   r   r   r!   r9   r:   r;   r<   r=   r>   r?   r@   rA   rƒ   r„   )rœ   rB   r§   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   r‡   rf   rˆ   r†   s                     r   Ú@test_report_keeps_carry_in_and_excludes_open_trade_from_win_rater¬   J   s®  € Ý4ÜÐ&Ó'€EØ€E„NØ€EÔÙ˜%Ð'<Ô=€FØ�%‰=Ð/œFŸM™MÐ/¨3Ð/¨3¨$Ð/™M¨$Ó/Ð/ˆ=Ð/Ñ/×/×/Õ/ˆ=Ð/×/×/Ó/ˆ=×/×/×/×/×/Ð/œF×/×/Ó/œF×/×/Ô/˜M×/×/Ò/¨3×/×/Ò/Ð/×/×/×/×/×/×/×/Ñ/Ø�'‰?Ð1˜f V™nÐ1ˆ?˜nÑ1Ð1°Ð1˜n°Ñ1×1×1×1Ð1ˆ?˜n°×1×1Ó1ˆ?×1×1Ò1˜n×1×1Ò1°×1×1×1×1×1×1×1Ù7ˆ6�*ÑÐ7ÐÐ7Ñ &¨Ñ"7Ð7Ð"7×7×7Ó7Ð×7×7×7Ð7Ñ×7×7Ð7Ð"7×7×7×7×7×7×7×7×7×7×7×7×7r   c            	      ó  — ddl m}   | t        «       d¬«      }|d   }|d   }||k(  }|d   }||k(  }d}| }||k(  }	|r|r|	s˜t        j                  d	|||	fd
||||f«      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}}|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   }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 )Nr   r™   é   r�   zCalmar RatiozSharpe RatiozSortino Ratiog      $@rŽ   )r�   r�   z%(py8)s == -%(py10)sr‘   zassert %(py13)sr]   úTotal P&L %r   r   r    r!   r"   r(   r)   rŸ   ©r£   rš   r   r:   r;   r<   r@   rA   r!   r9   r=   r>   r?   )rš   rC   rD   rf   rI   re   rL   rH   rP   rE   r‰   Ú@py_format14rF   rG   rJ   rK   s                   r   ÚDtest_optimizer_trade_floor_still_penalizes_ratios_but_reports_lossesr²   U   s  € ÝGÙœw›y°QÔ7€FØ�.Ñ!Ð^ V¨NÑ%;Ð^Ð!Ð%;Ñ^Ð^¸vÀoÑ?VÐ^Ð%;Ð?VÑ^Ð^Ð[^Ð^Ð[^ÐZ^Ð^Ð?VÐZ^Ñ^×^×^×^Ó^Ð!Ð%;Ð?VÐZ^×^×^Ó^Ð!×^×^Ò^Ð%;×^×^Ò^Ð?V×^×^Ò^Ð[^×^×^×^×^×^×^×^Õ^Ø�-Ñ Ð;¤F§M¡MÐ;°7Ð;°7°(Ð;¡M°(Ó$;Ð;Ð Ð$;Ñ;×;×;Õ;Ð Ð$;×;×;Ó;Ð ×;×;×;×;×;Ð;¤F×;×;Ó;¤F×;×;Ô; M×;×;Ò;°7×;×;Ò;Ð$;×;×;×;×;×;×;×;Ñ;ØÐ"Ñ#Ð>¤v§}¡}Ð>°gÐ>°g°XÐ>¡}°XÓ'>Ð>Ð#Ð'>Ñ>×>×>Õ>Ð#Ð'>×>×>Ó>Ð#×>×>×>×>×>Ð>¤v×>×>Ó>¤v×>×>Ô> }×>×>Ò>°g×>×>Ò>Ð'>×>×>×>×>×>×>×>Ò>r   c                  ó^  — ddl m}  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}}|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}||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   r™   z2020-01-01 06:00:00)Úscore_startrž   r    r   rx   ry   r{   rX   r¯   r   r    r!   r"   r(   r)   z% In MarketrT   r°   )rš   rB   rC   rD   rL   rI   r…   r†   rE   rF   rG   rH   rJ   rK   s                 r   Ú6test_shared_start_keeps_prior_interval_and_entry_countrµ   ]   sg  € ÝGÜ‹I€EÙ˜uÐ2GÐTUÔV€FØ�.Ñ!Ð& QÐ&Ð! QÑ&×&×&Õ&Ð! Q×&×&Ó&Ð!×&×&Ò& Q×&×&×&×&×&×&Ó&Ø�-Ñ Ð;¤F§M¡MÐ;°7Ð;°7°(Ð;¡M°(Ó$;Ð;Ð Ð$;Ñ;×;×;Õ;Ð Ð$;×;×;Ó;Ð ×;×;×;×;×;Ð;¤F×;×;Ó;¤F×;×;Ô; M×;×;Ò;°7×;×;Ò;Ð$;×;×;×;×;×;×;×;Ñ;Ø�-Ñ Ð( DÐ(Ð  DÑ(×(×(Õ(Ð  D×(×(Ó(Ð ×(×(Ò( D×(×(×(×(×(×(Ô(r   c                  óÚ   — t        «       } | j                  j                  d   | j                  d<   t	        j
                  t        d¬«      5  t        | «       d d d «       y # 1 sw Y   y xY w)Nr   )r   r   zstrictly increasing)Úmatch)r   r   ÚilocÚlocr!   ÚraisesÚ
ValueErrorr   )rB   s    r   Útest_duplicate_times_rejectedr¼   f   sH   € Ü‹I€EØ Ÿ:™:Ÿ?™?¨1Ñ-€E‡I�IˆiÑÜ	�‰”zÐ)>Ö	?Ü�uÔ÷ 
@×	?Ñ	?ús   ÁA!Á!A*c                 ó"  ‡‡— dd l m} t        «       }t        j                  ddd¬«      D �cg c]  }t        |j                  «       «      ‘Œ c}|_        | dz  Š|j                  ‰d¬«       | d	z  Št        j                  d
dgi«      j                  ‰d¬«       |j                  |dˆfd„«       |j                  |dˆfd„«       |j                  |j                  dd„ «       |j                  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   }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 c c}w )!Nr   r   r   r   r	   zbars.csvF)Úindexz
winner.csvÚunusedr   Ú_tf_mapc                 ó   •— dt        ‰«      iS )NÚ4H)Ústr)ÚassetÚ	data_paths    €r   Ú<lambda>z2test_report_parses_epoch_seconds.<locals>.<lambda>v   s   ø€ ¸$ÄÀIÃÑ9Or   Úwinner_pathc                 ó   •— ‰S ©N© )ÚtfrÄ   rÇ   s     €r   rÆ   z2test_report_parses_epoch_seconds.<locals>.<lambda>w   s   ø€ Ár   Úgenerate_signalsc                 ó   — | S rÉ   rÊ   )ÚdfÚparamss     r   rÆ   z2test_report_parses_epoch_seconds.<locals>.<lambda>x   s   € Érr   rÂ   )rv   r�   Úlatest_dater   rx   ry   r{   rX   r¡   r   r    r!   r"   r(   r)   )r¤   Úmlp_results_tabler   r   r   ÚintÚ	timestampr   Úto_csvr   ÚsetattrÚstratÚevaluate_tfr:   r;   r<   r@   rA   r!   r9   r=   r>   r?   )Útmp_pathÚmonkeypatchr§   rB   ÚstamprC   rD   rL   rI   r…   r†   rE   rF   rG   rH   rJ   rK   rÅ   rÇ   s                    @@r   Ú test_report_parses_epoch_secondsrÛ   m   sÖ  ù€ Ý,Ü‹I€Eä68·m±mÀLÐZ[ÐbfÕ6gÓhÑ6g¨U”#�e—o‘oÓ'Õ(Ð6gÑh€E„JØ˜:Ñ%€IØ	‡L�L� %€LÔ(Ø˜\Ñ)€KÜ‡L�L�(˜Q˜C�Ó!×(Ñ(¨¸EÐ(ÔBØ×Ñ˜ 	Ó+OÔPØ×Ñ˜ Ó/LÔMØ×Ñ˜Ÿ™Ð&8Ñ:QÔRØ×Ñ ¨L¸lÐÓK€FØ�-Ñ Ð0 LÐ0Ð  LÑ0×0×0Õ0Ð  L×0×0Ó0Ð ×0×0Ò0 L×0×0×0×0×0×0Ó0Ø�%‰=Ð3œFŸM™MÐ3¨7Ð3¨7¨(Ð3™M¨(Ó3Ð3ˆ=Ð3Ñ3×3×3Õ3ˆ=Ð3×3×3Ó3ˆ=×3×3×3×3×3Ð3œF×3×3Ó3œF×3×3Ô3˜M×3×3Ò3¨7×3×3Ò3Ð3×3×3×3×3×3×3×3Ò3ùò is   ­ Jc                 óþ  ‡— dd l m} t        «       }t        j                  g d¢«      |_        g Š| j                  |dˆfd„«       |j                  |«       dg}‰|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}}y )Nr   )r   z
2021-01-01z
2022-01-01Úget_min_tradesc                 ó.   •— ‰j                  | «      xs dS )Nr   )rƒ   )rV   Úobserveds    €r   rÆ   zKtest_selection_floor_uses_legacy_span_not_return_duration.<locals>.<lambda>ƒ   s   ø€ À(Ç/Á/ÐRWÓBXÒB]Ð\]ÐB]r   gE^¶Í @r   )z%(py0)s == %(py3)srß   )Úpy0r$   zassert %(py5)sr%   )r£   Ústrategy_activation_scoresr   r   Úto_datetimer   rÕ   rš   r:   r;   r=   r>   r?   r<   r@   rA   )rÙ   ÚstrategyrB   rI   r‡   rˆ   Ú@py_format6rß   s          @r   Ú9test_selection_floor_uses_legacy_span_not_return_durationrå   ~   s    ø€ Ý<Ü‹I€EÜ—‘Ò JÓK€E„JØ€HØ×Ñ˜Ð"2Ó4]Ô^Ø×Ñ˜uÔ%Ø$�~Ð%ˆ8�~Ñ%×%×%Õ%ˆ8�~×%×%×%×%×%Ñ%ˆ8×%×%Ó%ˆ8×%×%Ô%�~×%×%×%×%×%×%Ò%r   ))rT   ç     €V@ræ   )Úbuiltinsr=   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter:   Únumpyr6   Úpandasr   r!   Ústrategies.mlp_accountingr   r   r   rR   rq   rŠ   r”   r—   r¨   r¬   r²   rµ   r¼   rÛ   rå   rÊ   r   r   Ú<module>rî      s[   ðß  „ Ó Û Û ç AóPò<ò_òEò$ò'ò
Aò8ò?ò)òò4ó"&r   