
    }kj=                         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 d dlmZmZmZmZmZ dd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 d Z!y)    N)Path)AdaptiveLagCorrelationEngineLagCorrelationConfigSelectionMode	Transformalign_to_regular_gridc           	      n    t        j                  | t        j                  |t        |       d            S )ND)periodsfreqindex)pdSeries
date_rangelen)valuesstarts     N/Users/jameslopez/projects/TradingBot25/tests/test_adaptive_lag_correlation.py_seriesr      s%    99V2==FRU#VWW    c                 4   t         j                  j                  |      }|j                  |       j	                         }t        j
                  | t         j                        }|d |  |j                  || |z
        z   ||d  t        |      t        |      fS )Nsizescaler   )nprandomdefault_rngnormalcumsumfullnanr   )nlagnoiseseedrngsourcetargets          r   _leading_pairr+      s    
))


%CZZQZ&&(FWWQF%C4=3::EC:#HHF34L6?GFO++r   c                      t        dddddt        j                        }|j                  |        t	        di |}t        |      S )N   d         )min_lagmax_laglag_stepwindowmin_observations	transform )dictr   LEVELSupdater   r   )	overridessettingsconfigs      r   _enginer>      sJ    ""H OOI!-H-F'//r   c            
       
   t        d      \  } }t               j                  | ||j                  d         }|j                  }d}||k(  }|st        j                  d|fd||f      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}}|j                  }d
}||kD  }|st        j                  d|fd||f      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}}|j                  d   }|j                  }	t         j"                  }
|j                  } |
|      }|	|k(  }|s2t        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                  |
      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}
x}}|j$                  }|j&                  }d}
||
kD  }|st        j                  d|fd||
f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |
      dz  }dd|iz  }t        t        j                  |            d x}x}x}}
|j(                  }d}||k(  }|st        j                  d|fd||f      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}}y )N-   r%   ==z0%(py2)s
{%(py2)s = %(py0)s.best_lag
} == %(py5)sresultpy0py2py5assert %(py7)spy7Gz?>)z7%(py2)s
{%(py2)s = %(py0)s.best_correlation
} > %(py5)s)z%(py3)s
{%(py3)s = %(py1)s.correlation
} == %(py12)s
{%(py12)s = %(py7)s
{%(py7)s = %(py5)s.approx
}(%(py10)s
{%(py10)s = %(py8)s.best_correlation
})
}pytest)py1py3rJ   rL   py8py10py12assert %(py14)spy14r   )z_%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.confidence
}.relative_peak_separation
} > %(py7)srH   rI   py4rL   assert %(py9)spy9r0   z4%(py2)s
{%(py2)s = %(py0)s.observations
} == %(py5)s)r+   r>   estimate_atr   best_lag
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationbest_correlationspectrumcorrelationrP   approx
confidencerelative_peak_separationobservations)r)   r*   rF   @py_assert1@py_assert4@py_assert3@py_format6@py_format8@py_assert0@py_assert2@py_assert6@py_assert9@py_assert11@py_format13@py_format15@py_assert5@py_format10s                    r   5test_recovers_known_positive_source_lead_and_spectrumr|   )   s   "r*NFFY""666<<3CDF?? b ?b    ?b      6   6   ?   b       "")T)"T))))"T))))))6)))6)))")))T)))))))??2T**TfmmTF<S<STm<S.TT*.TTTTT*.TTTTTTT*TTTTTTfTTTfTTTmTTTTTTFTTTFTTT<STTT.TTTTTTTTT955995999959999996999699999959999999999%#%#%%%%#%%%%%%6%%%6%%%%%%#%%%%%%%r   c                     t        dd      \  } }| }t               j                  | ||j                  d         }t        t        j
                        j                  | ||j                  d         }t        t        j                        j                  | ||j                  d         }|j                  }d}||k7  }|st        j                  d|fd||f      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}}|j                  }d}||k(  }|st        j                  d|fd||f      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}}|j                   }d}| }
||
k  }|st        j                  d|fd||
f      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}}
|j                  }d}||k(  }|st        j                  d|fd||f      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}}y )Nr@           )r%   r&   rB   )selection_mode)!=)z0%(py2)s
{%(py2)s = %(py0)s.best_lag
} != %(py5)spositiverG   rK   rL   rC   rE   negativerM   )<)z8%(py2)s
{%(py2)s = %(py0)s.best_correlation
} < -%(py5)szassert %(py8)srS   absolute)r+   r>   r]   r   r   STRONGEST_NEGATIVESTRONGEST_ABSOLUTEr^   r_   r`   ra   rb   rc   rd   re   rf   rg   )r)   r*   r   r   r   rn   ro   rp   rq   rr   ru   @py_format7@py_format9s                r   :test_selection_mode_is_explicit_for_negative_relationshipsr   5   sa   "r5NFFWFy$$VVV\\"5EFHm&F&FGSSR(H m&F&FGSSR(H """"""""""""8"""8"""""""""""""""""""""""""8"""8"""""""""""""$$,,u,$u,,,,$u,,,,,,8,,,8,,,$,,,,,,,,,,""""""""""""8"""8"""""""""""""r   c            
      H   t        t        j                  dt                    } | j	                         }t        t        dddd            j                  | ||j                  d         }|j                  }d}||k(  }|st        j                  d|fd	||f      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}}|j$                  }|j&                  }t(        j*                  }d}	 ||	      }
||
k(  }|s2t        j                  d|fd||
f      d
t        j                         v st        j                  |      rt        j                  |      nd
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}	}
|j$                  }|j,                  }t(        j*                  }d}	 ||	      }
||
k(  }|s2t        j                  d|fd||
f      d
t        j                         v st        j                  |      rt        j                  |      nd
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}	}
y )N,  dtyper/      r.   )r1   r2   r4   r5   rB   rC   rE   rF   rG   rK   rL   r~   z%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.confidence
}.margin
} == %(py12)s
{%(py12)s = %(py8)s
{%(py8)s = %(py6)s.approx
}(%(py10)s)
}rP   rH   rI   rY   py6rS   rT   rU   rV   rW   )z%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.confidence
}.relative_peak_separation
} == %(py12)s
{%(py12)s = %(py8)s
{%(py8)s = %(py6)s.approx
}(%(py10)s)
})r   r   arangefloatcopyr   r   r]   r   r^   r_   r`   ra   rb   rc   rd   re   rf   rk   marginrP   rj   rl   r)   r*   rF   rn   ro   rp   rq   rr   @py_assert7rv   rw   rz   rx   ry   s                 r   @test_equal_scores_choose_smallest_lag_and_report_zero_separationr   G   st   RYYs%01F[[]F)Q#PSTk&&&,,r"23  ??a?a?a66?a9##9v}}9S9}S'99#'99999#'999999969996999999#999999v999v999}999S999'999999999K55KKsKs9KK59KKKKK59KKKKKKK6KKK6KKKKKK5KKKKKKKKKKKKKKKsKKK9KKKKKKKKKr   c            
         t        t        j                  dt                    } | j	                         }|j
                  dxx   dz  cc<   t        t        ddddd	            j                  | ||j                  d         }|j                  }d}||k(  }|st        j                  d
|fd||f      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}}|j&                  }|j(                  }t*        j,                  }d}	 ||	      }
||
k(  }|s2t        j                  d
|fd||
f      dt        j                         v st        j                  |      rt        j                   |      nd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}	}
y )Nr   r   rB   g-q=r/   r   r.   gư>)r1   r2   r4   r5   tie_tolerancerC   rE   rF   rG   rK   rL   r~   r   rP   r   rV   rW   )r   r   r   r   r   ilocr   r   r]   r   r^   r_   r`   ra   rb   rc   rd   re   rf   rk   r   rP   rj   r   s                 r   7test_scores_within_tie_tolerance_report_zero_separationr   T   s   RYYs%01F[[]F
KKOuO)Q#PScghk&&&,,r"23  ??a?a?a66?a9##9v}}9S9}S'99#'99999#'999999969996999999#999999v999v999}999S999'999999999r   c            	      
   t         j                  j                  d      } d}| j                  |      }t        j                  |t         j
                        }t        d|      D ]8  }||dz
     d||dz
     z  z   d||dz
     z  z   | j                  d	
      z   ||<   : t        |      t        |      }}t        t        ddddd            }|j                  |||j                  d         }|j                  }	d}
|	|
k(  }|st        j                  d|fd|	|
f      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}}
|j*                  }	|	j,                  }d}||k(  }|st        j                  d|fd||f      dt        j                          v st        j"                  |      rt        j$                  |      ndt        j$                  |	      t        j$                  |      t        j$                  |      dz  }dd|iz  }t'        t        j(                  |            d x}	x}x}}|j*                  }	|	j.                  }d}||k(  }|st        j                  d|fd||f      dt        j                          v st        j"                  |      rt        j$                  |      ndt        j$                  |	      t        j$                  |      t        j$                  |      dz  }dd|iz  }t'        t        j(                  |            d x}	x}x}}|j*                  }	|	j0                  }d}||kD  }|st        j                  d|fd||f      dt        j                          v st        j"                  |      rt        j$                  |      ndt        j$                  |	      t        j$                  |      t        j$                  |      dz  }dd|iz  }t'        t        j(                  |            d x}	x}x}}|j*                  }	|	j2                  }d }||kD  }|st        j                  d|fd!||f      dt        j                          v st        j"                  |      rt        j$                  |      ndt        j$                  |	      t        j$                  |      t        j$                  |      dz  }dd|iz  }t'        t        j(                  |            d x}	x}x}}y )"N     r   H   r@   gffffff?.   g333333?gQ?)r   r-   r.   r         r1   r2   r4   r5   distinct_peak_exclusion_radiusrB   rC   rE   rF   rG   rK   rL   )zU%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.confidence
}.runner_up_lag
} == %(py7)srX   rZ   r[   )zY%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.confidence
}.distinct_peak_lag
} == %(py7)sg?rN   )z`%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.confidence
}.distinct_peak_correlation
} > %(py7)sr   )z[%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.confidence
}.distinct_peak_margin
} > %(py7)s)r   r   r   r    r"   r#   ranger   r   r   r]   r   r^   r_   r`   ra   rb   rc   rd   re   rf   rk   runner_up_lagdistinct_peak_lagdistinct_peak_correlationdistinct_peak_margin)r(   r$   source_valuestarget_valuespositionr)   r*   enginerF   rn   ro   rp   rq   rr   ru   rz   r{   s                    r   Dtest_reports_a_distant_local_peak_separately_from_adjacent_runner_upr   a   s   
))


#CAJJAJ&MGGArvv&M"aL(R-(]8b=112]8b=112 jjtj$% 	h ! ]+W]-CFF) +,	
F R0@AF?? b ?b    ?b      6   6   ?   b       0**0b0*b0000*b00000060006000000*000b00000004..4"4."4444."44444464446444444.444"4444444<66<<6<<<<6<<<<<<6<<<6<<<<<<6<<<<<<<<<<5115A51A55551A555555655565555551555A5555555r   c            	      b   t        d      \  } }t        t        ddddd            j                  | ||j                  d         }|j
                  }|j                  }d }||u }|st        j                  d	|fd
||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}}y )Nr@   rA   r-   <   r0   r.   r   rB   is)zY%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.confidence
}.distinct_peak_lag
} is %(py7)srF   rX   rZ   r[   )r+   r   r   r]   r   rk   r   r_   r`   ra   rb   rc   rd   re   rf   )	r)   r*   rF   rn   rp   ru   rz   rr   r{   s	            r   ;test_distinct_peak_respects_the_configured_exclusion_radiusr      s    "r*NFF) +-	
 k&&&,,r"23  6..6$6.$6666.$66666666666666666.666$6666666r   c            	         t         j                  j                  d      } d\  }}}}| j                  |      j	                         }t        j
                  |t         j                        }|d ||z
   ||| ||||z
   |||z   d  || j                  d|      z  }t        |      t        |      }}t        d      }	|	j                  |||j                  |dz
           }
|	j                  |||j                  d	         }|
j                  }||z
  }t        |      }d
}||k  }|sKt        j                  d|fd||f      dt        j                          v st        j"                  t              rt        j$                  t              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t        j$                  |      t        j$                  |      dz  }dd|iz  }t'        t        j(                  |            d x}x}x}x}}|j                  }||z
  }t        |      }d
}||k  }|sKt        j                  d|fd||f      dt        j                          v st        j"                  t              rt        j$                  t              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t        j$                  |      t        j$                  |      dz  }dd|iz  }t'        t        j(                  |            d x}x}x}x}}y )N   )i  i  r@   r   r   g{Gz?r      )r4      rB   r/   )<=)z[%(py7)s
{%(py7)s = %(py0)s((%(py3)s
{%(py3)s = %(py1)s.best_lag
} - %(py4)s))
} <= %(py10)sabsearly	first_lag)rH   rQ   rR   rY   rL   rT   zassert %(py12)srU   late
second_lag)r   r   r   r    r!   r"   r#   r   r>   r]   r   r^   r   r_   r`   ra   rb   rc   rd   re   rf   )r(   r$   changer   r   r   r   r)   r*   r   r   r   rt   rz   ru   rv   @py_assert8@py_format11rx   s                      r   )test_estimates_lag_that_changes_over_timer      s   
))


"C'7$Avy*JJAJ&--/MGGArvv&M&34Hfy6H&IM)F#+8!j.+QM&:%'(SZZdZ33M]+W]-CFFC Fvvv||FRK/HIEfffll2.>?D~~/~	)/3)*/a/*a////*a//////3///3//////u///u///~//////	///	///*///a///////}}/}z)/3)*/a/*a////*a//////3///3//////t///t///}//////z///z///*///a////////r   c                     t        d      \  } }t        j                  | j                  dd t        j                  |j                  dd t	        d      j                  | ||j                  d	         }t	        d
      j                  | ||j                  d	         }|j                  }d}||k(  }|st        j                  d|fd||f      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}}|j                   }d}||k(  }|st        j                  d|fd||f      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}}|j                  }d }||u }|st        j                  d|fd||f      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}}|j"                  }| }|syddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }	t        t        j                  |	            d x}}y )Nr@   rA   iiir.   )r5   rB      rC   rE   rF   rG   rK   rL      r\   r   )z0%(py2)s
{%(py2)s = %(py0)s.best_lag
} is %(py5)sinsufficientz0assert not %(py2)s
{%(py2)s = %(py0)s.spectrum
}rH   rI   )r+   r   r#   r   r>   r]   r   r^   r_   r`   ra   rb   rc   rd   re   rf   rm   rh   )
r)   r*   rF   r   rn   ro   rp   rq   rr   @py_format4s
             r   Ftest_missing_observations_are_dropped_pairwise_and_minimum_is_enforcedr      s!   "r*NFFFFFKKS&&FKKBc*66vvv||TVGWXFC0<<VVV\\Z\M]^L?? b ?b    ?b      6   6   ?   b       %#%#%%%%#%%%%%%6%%%6%%%%%%#%%%%%%%  (D( D(((( D((((((<(((<((( (((D((((((($$$$$$$$$$$$|$$$|$$$$$$$$$$r   c                     t        dd      \  } }|j                  d   }t               }|j                  | ||      }d| j                  | j                  |kD  <   d|j                  |j                  |kD  <   |j                  | ||      }||k(  }|st        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 }y )Nr   r@   )r$   r%     i@B irC   )z%(py0)s == %(py2)safterbeforer   zassert %(py4)srY   )r+   r   r>   r]   locr_   r`   ra   rb   rc   rd   re   rf   )	r)   r*   evaluation_timer   r   r   rn   @py_format3@py_format5s	            r   /test_estimates_are_invariant_to_future_mutationr      s    "Sb1NFFll3'OYF@F1:FJJv||o-.1;FJJv||o-.vv?EF?5F55FFr   c                     t        j                  t        d      5  t        dd       d d d        t        j                  t        d      5  t        ddd	       d d d        t	               \  } }| j
                  d d d   | _        t        j                  t        d
      5  t               j                  | ||j
                  d          d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)Nr1   )matchrB      )r1   r2   r3   r/   r   )r1   r2   r3   	monotonic)rP   raises
ValueErrorr   r+   r   r>   r]   )r)   r*   s     r   ?test_invalid_configuration_and_non_monotonic_index_are_rejectedr      s    	z	3R3 
4	z	4QA> 
5 #_NFF<<"%FL	z	5	fffll2.>? 
6	5 
4	3	4	4
 
6	5s#   CC!#)C-C!C*-C6c                     t        j                  ddgd      } t        j                  ddg|       }t        j                  dd	g|       }t        ||d
      \  }}|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   } |
|      }|sddt        j                         v st        j                  t               rt        j                  t               ndt        j                  |
      t        j                  |      t        j                  |      dz  }	t        t        j                  |	            d x}
x}}y )Nz2020-01-01 12:00z2020-01-03 12:00T)utcg      $@g      >@r   g      Y@g     r@1D)	frequencyz
2020-01-02rC   )z%(py1)s == %(py4)s)rQ   rY   zassert %(py6)sr   zFassert %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.isna
}(%(py4)s)
}r   )rH   rI   rY   r   )r   to_datetimer   r   r   r_   r`   rd   re   rf   isnara   rb   rc   )r   r)   r*   source_gridtarget_gridrs   rp   rt   r   r   rn   rz   s               r   Ctest_regular_grid_forward_fills_only_source_from_prior_observationsr      s!   NN.0BCNEYYd|51FYYu~U3F4VVtTK??<(0D0(D0000(D000(000D0000000771;??<01701111111121112111711101111111111r   c                  ^   t        d      j                         } d}|| v }|st        j                  d|fd|| f      t        j                  |      dt        j                         v st        j                  |       rt        j                  |       nddz  }dd|iz  }t        t        j                  |            d	x}}d
}|| v }|st        j                  d|fd|| f      t        j                  |      dt        j                         v st        j                  |       rt        j                  |       nddz  }dd|iz  }t        t        j                  |            d	x}}d}|| v }|st        j                  d|fd|| f      t        j                  |      dt        j                         v st        j                  |       rt        j                  |       nddz  }dd|iz  }t        t        j                  |            d	x}}d}|| v}|st        j                  d|fd|| f      t        j                  |      dt        j                         v st        j                  |       rt        j                  |       nddz  }dd|iz  }t        t        j                  |            d	x}}y	)z@Prevent a zero-length candidate array from reaching array.get().z,libraries/LibraryAdaptiveLagCorrelation.pinez!candidateCount = array.size(lags))in)z%(py1)s in %(py3)slibrary)rQ   rR   zassert %(py5)srJ   Nz?if candidateCount == 0
        [na, na, na, na, na, na, na, na]zlastIndex = candidateCount - 1z%for index = 0 to array.size(lags) - 1)not in)z%(py1)s not in %(py3)s)
r   	read_textr_   r`   rd   ra   rb   rc   re   rf   )r   rs   rt   r   rq   s        r   >test_pine_estimator_short_circuits_an_empty_candidate_spectrumr      s   ABLLNG.9.'9999.'999.999999'999'9999999MXMQXXXXXMQXXXXMXXXXXXQXXXXQXXXXXXXX+6+w6666+w666+666666w666w66666662A2'AAAA2'AAA2AAAAAA'AAA'AAAAAAAr   )z
2020-01-01)r   r@   g{Gz?r   )"builtinsra   _pytest.assertion.rewrite	assertionrewriter_   numpyr   pandasr   rP   pathlibr   #strategies.adaptive_lag_correlationr   r   r   r   r   r   r+   r>   r|   r   r   r   r   r   r   r   r   r   r   r   r7   r   r   <module>r      sp           X,0	&#$
L
:6@70$%
	@2Br   