}L iGddlmZddlmZddlZddlZddlZddl Z ddl Z ddl Z ddlZddlZddlmZmZddlmZmZmZddlmZmZmZmZGddZy) )requests)iscloseN)sharedutils) _BASE_URL__PRICE_COLNAMES_ _SENTINEL_)YFInvalidPeriodErrorYFPricesMissingErrorYFTzMissingErrorYFRateLimitErrorceZdZdefdZej ddddddddddedddfdejfdZ ddejfd Z efde fd Z d efdejfd Zd efdejfd Zd efdejfdZd efdejfdZddejfdZej ddZdZddZej dZej dZej dZej dZej dZej dZej ddZy) PriceHistoryNc>||_|j|_||_|tur7t j dtd|jj||xstjd|_ i|_ d|_ d|_d|_y)N=Set proxy via new config function: yf.set_config(proxy=proxy) stacklevelchrome) impersonateF)_datauppertickertzr warningswarnDeprecationWarning _set_proxyrSessionsession_history_cache_history_metadata_history_metadata_formatted_reconstruct_start_interval)selfdatarrr proxys _/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/yfinance/scrapers/history.py__init__zPriceHistory.__init__s lln   " MMY[mz{ | JJ ! !% (H("2"2x"H  !%+0(,0(1dFT returnc -tj}| tur7tjdt d|j j| |}|}| r|dvr|dk(r td|~|{|x|j}|t|j}t|}tjtj|j<|j!dd d tj"|j<|r||j%|tjS|d k(rMt'j(t*j,j/j1|j2d d }nlt*j,j/j1|j)}|tj4|z}|t'j6d z}|}d}d }|}|}|s|s|r|j9dk(r|j}|t|j}t|}tjtj|j<|j!dd d tj"|j<|r||j%|tjS|r/tj:|}t=|j?}|r/tj:|}t=|j?}||s|sd}nG|s3tj4dz }t=|j?}n|st*j,j/j1}t=|j?}n|j9dk(rK|t=tAjB}||dk(r|dz }n|dvr|dz }n|dvr|dz }n|dz }|dz }nj|r |r tEd|s|rWtj4|}||z}t=|j?}||z }t=|j?}d}|s|r||d}n|j9}d|i}|j9|d<||d<|ddk(rd|d<d|d<tG|}|j}dD]K}||vstt+j,||d !jId"j1|||<M|jK|jd#t|tLd$|j}d}|j jN}|xt+j,|d !jId"}t*j,j/} t'j6d%&}!||!z| kr|j jP} |||| '}d(|jRvs| tUd)|jW} |d*d+d,d-|_-|dd.d/v}"d0}#|s||j9dk(r0|#d1|dd2z }#||#|z }#n|"sH|#t+j,|d !jId"j1|j)z }#n9|#t+j,|d !jId"j1|z }#|#d3z }#| |#|d4z }#n|"sJ|#t+j,|d !jId"j1|j)d4z }#nE|#t+j,|d !jId"j1|d4z }#n |#d5|d4z }#d6}$|t]|tFst_|j|#}d7}$nt]|tFr)d8|vr%|#d9|d8d4z }#t_|j|#}d7}$nd*|vr5|d*d:r-|#d;|d*d:d<zd=zz }#t_|j|#}d7}$nd*|vs$|d*d+|d*d+r|d*d+d,d>d?d,st_|j|#}d7}$n]|r[||jZd@vrJtj`|s5tc|j|dAje|jZd@}d7}$|$rt}tjtj|j<|j!dd d tj"|j<|r||j%||jf|jf|k(rd|_3tjS|jZdB}%|%dCv}&|jZdD}'|jZdE}(|r||jZjOd@gvrt=tAjB}t+j,|d !jId"}t&j(ji|}|tj4|z}|t'j6d z}tjj|d*d+d,})|rZ|)jlsN|)jnd.j1d"jIdk\r|)jq|)jnd.})|)jlr|jdF}*n\ts|)d k(r |jdG|)jnd,dH}*n.|jdG|)jnd,d3|)jnd.}*|jK|*|j9dk(r|jK|jdI|)judJ}+t+jv|+jyjn|+dKj{|+dLj}|+dMj|+dNjy|+dOjy|+dPjdQR}) |+dSj}|)dS<|+dTj}|)dT<tj|)|d|'})tj|)|d})|dd.d/v}"|s|"rdU|jZvr|jZdU},t]|,t*jvsr=zdiv,splits,capitalGainseventss)unitUTCz: Yahoo GET parameters: z/v8/finance/chart/)minutes)urlparamstimeoutzWill be right backz~*** YAHOO! FINANCE IS CURRENTLY DOWN! *** Our engineers are working quickly to resolve the issue. Thank you for your patience.chartresultrmetamh (  -> )z (period=FT status_codez(Yahoo status_code = errorz (Yahoo error = " descriptionz") indicatorsquote validRanges, instrumentType) MUTUALFUNDETFexchangeTimezoneNamecurrencyz$: yfinance received OHLC data: EMPTYz: yfinance received OHLC data: z onlyz: resampling 30m OHLC from 15m30minOpenHighLowClose Adj CloseVolume)rirjrkrlrmrn)indexr& Dividends Stock SplitstradingPeriods)tradingPeriodsOnlyz: OHLC after cleaning: EMPTYz: OHLC after cleaning: axisD shift_forward) ambiguous nonexistent Capital Gainsz$: OHLC after combining events: EMPTYz: OHLC after combining events: )repairrg)PriceTime lastTradefirst)keepz: checking OHLC for repairs ... Repaired?zauto_adjust failed with %szback_adjust failed with %s priceHintDatetimeDate)rprqr{ignore)columnserrorsz : yfinance returning OHLC: EMPTYz: yfinance returning OHLC: )fr get_yf_loggerr rrrrr Exceptionrr rstrempty_dfr_DFSsplit_ERRORSr] _datetimedatepd Timestamputcnow tz_convertyear_interval_to_timedelta timedeltalower_parse_user_dtint timestamp_timetime ValueErrordict tz_localizedebugrget cache_gettext RuntimeErrorjsonr r" isinstancer is_valid_period_formatr joinr$ fromtimestamp parse_quotesemptyrodroplenresample DataFramelastrr9minsum set_df_tzfix_Yahoo_dst_issueformat_history_metadatar#'fix_Yahoo_returning_prepost_unrequested parse_actionsranyastype_dividends_convert_fxfloorloc Timedelta to_datetimeshape sort_indexsafe_merge_dfsisna!fix_Yahoo_returning_live_separatename duplicated_standardise_currency_fix_bad_div_adjust _fix_zeroesilocconcat_fix_unit_mixups_fix_bad_stock_splits auto_adjust back_adjustnproundfillnaint64rall _resample);r%periodrEstartendprepostactionsrrr|keepnar'roundingrO raise_errorslogger interval_user period_userr _exceptionerr_msg start_userend_userstart_dtend_dt period_tdrN params_prettykrMr&get_fndt_now data_delayintraday_price_data_debugfail quote_typeexpect_capital_gains tz_exchangergquotesmsgquotes2tps dividendssplits capital_gainsprice_currencyf_currency_mismatchstart_d end_dt_sub1df last_tradedf_laste data_colnamescmask_nan_or_zeros; r(historyzPriceHistory.history!s^$$&  " MMY[mz{ | JJ ! !% (  h"==4 ^__}1CWW:!1$++!>J!*oG/4~~/?FKK ,29--a2H2KFNN4;;/#(( W- >>++U?%NN2<<+>+>+@+K+KB+O+T+TVWYZ[ELL//1<Bz-dkk: j/+0>>+; DKK(.5mmD!.DQ.Gt{{+$$LL)~~'' ++E26H**,-E ))#r2Ff&&()C >S!E$@$@$GGH..01,,.99"=&**,-||~&;ejjl+C=4' #f !%FF #g !]2 #h #j 0QJE3 !dee#!88@ ;% 1Ff..01C=% 1H 2 2 45E C!&37F\\^Fv&F%^^-z#*  *  &!&F: 5xV WW' lAM!#&r||F1IC'H'T'TUZ'['f'fgi'j#k a  l   }$># #++,<= )-BB,,-CD ))*5 fD$:$:$>$>}b$QQejjl#C\\#C0<? v||||B6#4#4U#;#G#G#MMV\\"%56 <<[[M!EFC [A [[M!@a@QQVWC[[M!@a@QQUV\VbVbceVfUghC S >> u $ LLDKK=(FG Hoog.G\\ (<(<--/++-u~))+ )..0$[1668!(+//1 DF &-k&:&>&>&@{#)0)@)D)D)F~&  );[I**66*3EF*%b)Z78(8DBB66R\K]_bcF <<[[M!=>C [A [[M!8a8IOC[[M!8a8Ifll[]N^M_`C S,1+>+>tG}X?VWX?Y+Z( 6=# M  __VX{CF   8[IIY...!%!7!7 !C!)%'N&/ &;~&M#&**,!^r%91:;1G1N1Ns1SVY1Y\efp\q1q +.%)$>$>y.Z`$a %j1^CHHJ5>{5K5R5RSV5WZ]5]`ijt`u5uIk2%NN:AN>  $!OOM8[QM  << ,,q///4( ) gh 7I ,$1$5$5gh$?M%#ZZ1F ? 2<<?2K$%l{3 ( -l{ ; ! -*%b)Z7>>&,,*;*;<HH`dsBHCFLq!A%"$..1E1E"F"R"RS^jn}L"R#M ||A"!~~fll.?.?@LL[dhwFL G     ??1  !%%b)X>B "** $:;BFF2k?'');6 7!B{O <<?Q %%b&(;B RZZ '@ABFF2n%**,n< =!$B~  ""1%)))"mXF"**,FGr/*//1?BC&)?# 88[[M!EFC W\[[M!@! USC[[M!@! TRTRZRZ[]R^Q_`C S@@VJEWYdfmv|HPQJ  !;Eg;NWaWfWf2gD " "; / $$'$22 3  LLDKK=(GH IB  55b(CLB19D " ": .))"hAB88**27723<;PWXbjj0&+B{OYY 5w?@&&r8['JB++B+FB!!"h WEBB @&&r*&&r* "d7mH5a8@MNB(|**1-44RXX>8 &BHHM"BHHM!OX`aB,z9?? @4Jsv96AW0AW4,AX O/AXR.A[SA[WAW1W0AW1W4AXXAXX AXXAXX A[X$BAZ?Z?A[r9c||f}||jvr|j|S|j||d}||j|<|S)NT)rrEr)r!r)r%rrE cache_keyrs r(_get_history_cachezPriceHistory._get_history_cache sTv& ++ +&&y1 1 \\(D\ I)+I& r*cd|tur7tjdtd|jj ||j d|j vr|jdd|jdur+tj|j |_d |_|j S) Nrrrrr/r@)rrEFT) r rrrrrr"r r#rr)r%r's r(get_history_metadataz!PriceHistory.get_history_metadatas  " MMY[mz{ | JJ ! !% (  ! ! )-=TE[E[-[  # #4$ # ?  + +u 4%*%B%B4CYCY%ZD "/3D ,%%%r*c|tur7tjdtd|jj ||j |}d|jvr |d}||dk7StjS)Nrr rrrpr r rrrrrr rrSeries)r%rr'rrs r( get_dividendszPriceHistory.get_dividends#sr  " MMY[mz{ | JJ ! !% (  $ $F $ 3 "** $;IY!^, ,yy{r*c|tur7tjdtd|jj ||j |}d|jvr |d}||dk7StjS)Nrr rrr{rr)r%rr'rrs r(get_capital_gainszPriceHistory.get_capital_gains.st  " MMY[mz{ | JJ ! !% (  $ $F $ 3 bjj (/M !!34 4yy{r*c|tur7tjdtd|jj ||j |}d|jvr |d}||dk7StjS)Nrr rrrqrr)r%rr'rrs r( get_splitszPriceHistory.get_splits9ss  " MMY[mz{ | JJ ! !% (  $ $F $ 3 RZZ ''F&A+& &yy{r*c|tur7tjdtd|jj ||j |}g}d|jvr|jdd|jvr|jdd|jvr|jd|r,||}||dk7jd jdStjS) Nrr rrrprqr{rr)how) r rrrrrr rappenddropnarrr)r%rr'raction_columnsrs r( get_actionszPriceHistory.get_actionsDs  " MMY[mz{ | JJ ! !% (  $ $F $ 3 "** $  ! !+ . RZZ '  ! !. 1 bjj (  ! !/ 2 (G7a<(//E/:AA!D Dyy{r*c6||k(r|Sd}|dk(rd}no|dk(rd}ng|dk(rd}n_|dk(rKd}|d k(rd }n;tjjjd j }d |}nt d |ddddddddd}d|j vrd|d<d|j vr|d|d<d|j vrd|d<d|j|ddk(df<|j|dd|j|} d| j| ddk(df<| S) Nr0zW-MONr/5Dr1MSr2QSr5JANz%bzQS-z(Not implemented resampling to interval ''rrr9rrprod)rirkrjrlrnrprqrrrmrlr{?rqrzleft)labelclosedoffset) rdatetimenowstrftimerrrrragg) r%r df_intervaltarget_intervalrr'resample_period align_month resample_mapdf2s r(rzPriceHistory._resampleXs` / )I e #%O  $"O  %"O  %"O# '00446??EKKM #K=1OFFWWXYZ ZE56%  "** $(-L % "** $(4W(=L % bjj (,1L ):=r.!3&67kk/vkVZZ[gh|d/vr:tjHjW|(z tjd0 kDrd})|)rd1|r|'n|(d2}|j%||tjd }*|d"vr|(|z }+|d'jI|z},n+|d#k(r|(}+|d'jI|z},n |d}+|d'|z},|+|*z}+|,|*z },|r#|+jI}+|,jI|*z},|tY|jI|+}+|j9d3|d4|d5|+d6|,|tj}t[|d7r+|j\}-|j_t`jb|je|+|,|dd|dd8}.t[|d7r|j_-|. |.jfrd1|r|'n|(d2}|j%||m|.jh|d|d'| |ztjd9z j?}.|.jfr"d:|d;|r|'n|(d<}|j%||d|.d=<|d"k(rjgd>}/|/|&j2djkd?zdz d?z}0|.j2jmdjod@|0zjp|.dA<dA}1n|d#k(r/t jr|.j2jH|.dB<dB}1n_d|.jh|.j2jS|&j2d=f<|.d=ju|.dC<|.jwd=d}.dC}1|.|.| dDgzjAjCd}.|.jy|1}2|2j{dEdFdGdHdIdJdKLj}dMdNiO}3|1dPvr5|3j2jm|.j2j4|3_nb|.dCj|.dQ<t;jJ|.j2dg|.j2|.dCjdkD}4|4|3_|j9dRtU|3zt;j|&j2|3j2}5t|5dk(rdS|dT|(dU}|j%||V|d#k(r |3|3j2jS|5}6|&|&j2jS|5}7|7dN|k(}8|8j+r|7dN|7dVz }9t:j|9|8<|9jAjCsz|9jj}9t;j|8dD]E}:|6j2|:}t|9};|3jh|dDfdk7rv|:|;dz kr |9j|:dz|9j|:<ZdW|6dDj|:|6dVj|:dz z z }<|9j|:dz ||9j|3j2t:jXjj}?|>j)}@|3dV|@|?|@z|3jh|@dNf<dYdVg}A|3|3j2jS|5|Aj)}6|&|&j2jS|5|Aj)}7|7|k7}B|Bt;j|6z}B|Bj+s|j%dZ|(dU| ttAD]+}CBdd|Cf}D|Dj+sd|7DCf<d|6|D|Cf<-|7B|6|Bz }E|2j}F|3j2|F_|F|Fj2jS|5j)jt}F|Fdddf}Ft;j|FtA}F|F|B}Ft;j|EdWd[\}Gt;j<|Gt|Ak(rdW}Hnt;jEF]}HtHd^z dz d_kr?|&j?}&tD]!}|jh|||k7|fxxd`zcc<#Hd`z}H|j9daHdb|tdW|Hz d}It|Hd}H|Hdk(rIdk(rnBHdkDr|3| xxHzcc<|3d xx|Hzcc<n"IdkDr|3| xxdWIz zcc<|3d xx|Izcc<|&j2|&| d gz|k(j)j+d}Jg}K|JD]"}:|:|3j2vsKjK|:$tKdkDr|j9dctUKz|JD]}:|:|3j2vr|3jh|:}L|d"k(r:|3j|3j2j|:dz }M|.jh|:d}.|jh|:}N|Nj2|N|k(j)}Odd|OvrLdd|jh|:ddf<deOvrLde|jh|:def<dYOvry|d"k(r`|:|.j2dk7rNMdV|jh|:dYf<t|jh|:dYf|jh|:def|jh|:def<nLdY|jh|:dYf<dVOvr)LdV|jh|:dVf<|LdN|jh|:dNf<ndNOvrLdN|jh|:dNf<d Ovr1Ld jjdf|jh|:d f<d|jh|:df<|%dz }% r|Scc}wcc} wcc} w)gNzprice-reconstructyf_cat yf_interval yf_symbolz#'df' must be a Pandas DataFrame notr:r4)dwkmoTFrn)r0r+r@r>r=r<r;r:ir7)r0r+r@)r>r=r<r;<rKz,Have not implemented price reconstruct for 'z' interval. Contact developersrz%Hit max depth of 2 ('{}'->'{}'->'{}')extrartrvzmin_dt=z interval=z sub_interval=z Too old (z rows tagged)rz/Nothing needs repairing (dts_to_repair[] empty)r1yearsr0r+r@rzgrp_max_size = rSzRepair groups:z- rZnearest)methodz df_block: i)r>r=;z"Cannot reconstruct block starting z9, too old, Yahoo will reject request for finer-grain dataz Fetching z prepost=rY->level)rrrErrrr|r) millisecondszCannot reconstruct z block range z3, Yahoo not returning finer-grain data within rangectr)MONTUEWEDTHUFRISATSUNzW- Week Start Day Start intervalIDrp)rir)rlr)rmr)rkr)rjr9)rpr)rnr)rirlAdjCloserkrjrprnrRrm)r)rOrPdiffzdf_new: zCan't calibrate z block starting z so aborting repairrlr# fill_valuerizCan't calibrate block starting gh㈵>)rtol)weightsg-C6?{Gz?dz Price calibration ratio (raw) = 6fz:Yahoo didn't return finer-grain data for these intervals: rjrkr)RrrrrrrrtyperrrDrrrwarningrr$formatinforto_numpyrrrrrorceilrrrcopyrr _dateutil relativedeltarr get_indexerto_listsortisinrtodayr9hasattrrDsetLevelloggingCRITICALrrrweekdayr to_period start_timercumsumrgroupbyr+renamerS intersect1dnanffillbfillwhererreindexisnansizerfloattileraverageabsrget_locr)Pr%rrErtagr log_extrasrr price_cols data_cols intervalsiitdsnexts min_lookbacks sub_intervaltd_rangerf_repair f_repair_rowsrUmin_dtf_recent dts_to_repairdf_v2f_gooddf_good dts_groups grp_max_sizedtgg0i0glilgood_dtsn_fixeddf_blockrrrejecttd_1d fetch_start fetch_end log_leveldf_fineweekdays week_end_daygrp_col df_fine_grpdf_new new_index common_index df_new_calibdf_block_calibf_tag div_adjustsidxndiv_adj f_close_badf_close_bad_newdiv_adjusts_newdiv_adjusts_new_np calib_cols calib_filterjfratiosrWnot1ratio ratio_rcpbad_dtsno_fine_data_dts df_new_row df_last_week df_bad_row bad_fieldssP r(_reconstruct_intervals_batchz)PriceHistory._reconstruct_intervals_batch{s$$& 3H[_[f[fg "bll+A48L L t I AB<, ,GHH!1=AQ"Wa= =(+ H CLMa5//99MM9>s9~PQ?Q9RSA1yQ//SS $D 8K8KQT8UV + &&(,,!,452j>224;@@a@HHV*%Q'() 5 $22@@q@IL U "$22@@q@IL T !$22@@q@IL T !$22@@q@IL T !$..A6L$..B7L |n5Z Hq#m,- (Aq!Bwwy:b>!,113lBB2%%b)!!2$'  (  %Z 8 1A LL2adV4"w/ 0 1s:' !A1 A1B**B4 *B1EBAvNgmmBF&;v&E&7==a+@+E+E+G2779+T!GB2B**B4 *B1EBCL1$$ W]]26%:%?%?%ARWWY%N!GB}}RQ/H qMX--/ /M qM    !"s A"((--*+H LLX6 7tHmmoGFt#)=)=)?')IYM`M`fiMj(j/Y^^5I5I5Kg5UYbYlYlrtYu4u:x8U\:]^WX Cz 2''Q/E5 %0 bEJJL83 T!% bEJJL83 d bEH,  5 K  I)..0 %NN,u4 !!&++-= LL9\N)G9Ak]RTU^T_`hrL s((*Fvw'"LL  0 01ll)lhmw{FMVZcglhGvw' *'--:x8U\:]^WX Cz 2kk!A$"\0B(BYEXEXfgEh(hinnpG}}+H:]x8]dBefYZ Cz 2GEN5 L'):)B)B)Dq)H1)LPQ(QR (/ (A(A$(G(Q(QRVYeRe(f(q(q %&T!')~~gmm6H6H'I $%IJ GMM..x~~>EF(/(=(=(? %!,,u1,5&wz[M'ABGGIMMSTMUUVG!//'2K __&'."$.(%*+1&*k9R&*S 55%||77 8H8HI "),"7"<"<">IIw}}Q'7&8'--P\H]HbHbHdghHh:ij ( LL)CK7 8>>(..&,,GL< A%( 2B7)K^_ Cz 24%fll&7&7 &EF !)(..*=*=l*K!L&{3s:99;"0"=w@W"WK *,K&&++-113&1&7&7&9&?&?&A #%88E?1#5\C!-!3!3C!8B #K 0A%zz"k/:a?#&Q;?HHJQQRWXGag&Ggggs:7Gl+GJJvs99Dvvd|s:. 67;5<?#d*$==?)7AIIeAhmQ./36/7  LL;E":FjL YcEk1-I%OEzi1n19:&%/&8$-$]:&# /9&8$ 1$nnhzXJ/F&G3&N%X%X%Z%^%^de%^%fgG!  1fll*%++C0  1 #$q( Y\_`p\qqzD E! fll*#ZZ_ u$#);;v||/C/CC/H1/L#ML%kk#$/GVVC[ '--jC.?@IIK Z'-7-?EIIc6k*J&,6u,=EIIc5j)Z'5(SGMM!4D-D1=g1F #v+.03EIIc6k4JEIIVY[`V`La0b #u*-1;F1C #v+.j(.8.AEIIc7l+2<[2IEIIc;./ J.2<[2IEIIc;./z)/9(/C/I/I/K/R/RSX/YEIIc8m,.2 #{*+1 C! es n S > NSs1 AP(;AP(AP-AP2c|dvr||fS|}|dk(rd}d}n|dk(rd}d}n |dk(rd}d}|d d kD}|js||fS|jtj|d d }d }|jt j jtjd z kDr, |jd|dz }t|zdz dkrd}|rtD]} || xxzcc<||jd<|ddk7} | jr|ddgj} | djj!d| djd | d<| | } | d| dz j#} t%| d kDr%tj&| dkDr |dxxzcc<||fS#t$rYwxYw)N)GBpZAcILArGBPrXrZARrILSrnrrSTrKr7regularMarketPricerlr4皙?FrgrprzrT)rrrrwrrrrrrr"r~rrrarushiftr_rr}) r%rrg currency2rUf_volumelast_rowprices_in_subunitsrrf_divdivsdiv_pctss r(rz"PriceHistory._standardise_currencys 0 0x<  u IA  IA  IAh<>||~x< 77288H-a045! ==BLL//1I4G4GR4PP Q ../CDxPWGXXa{#c)).& % 1  -6z*;$ 99;w{+,113D M//177d7mFXFXYZF[7\DM;D[)DM9CCEH8}q RZZ%9A%=;1$9}/  s1+F>> G  G c|djDcgc] }||k7s | }}gd}|D] }d}|dk(r|d}d} n+|dk(r|d}d} n||vr||vr ||d}d} n |d}d} |d}t|j||j} | j d|d j d } | rd | z } |j |d|k(d fxx| zcc<|t|j||j} | j d|d j d } |j |d|k(d fxx| zcc<||d<|Scc}w) Nrg)USDJPYEURCNYrCADr=XFTr1)rr|rlrSr4rp)uniquerrr rrr)r%rfxr|rbad_div_currenciesmajor_currenciesfx2_tkrfx_tkrreversefx_datfx_ratefx2_datfx2_rates r(rz"PriceHistory._dividends_convert_fx0s)2:)>)E)E)GSA1PR7aSSE# QAGEz4ru4r&&21A+A3rd" 3bD)!$**fdllCFnnE&nA'JOOPRSGG) MM)J/2K? @G K @"&tzz7DLLI"??%?GPUUVXY i 3Q6 CDPD? QB!# *ITs EEcp|jr|S|j|||}|j||||}|SN)r_fix_unit_switch_fix_unit_random_mixups)r%rrErrr1df3s r(rzPriceHistory._fix_unit_mixupsWs= 88I##B+>**3+wO r*cH |jr|Stj}d||jd}|jddk(rd|j vrd|d<|S|jddk(r(|j d|d|j vrd|d<|S|j}|jj!|jj||_n9|jj|k7r |jj||_dd l m }gd } | D cgc]} | |j vs| } } || dk(jd j} | jr|| } || }|| } nd} |} |jddkr(|j!d |d|j vrd|d<|S|| j}|j#|d d}||z }|dz j%dz}|dk(}d|z }|dz j%dz}|dk(|dk(z}||z}|js(|j d|d|j vrd|d<|Sd}t't)| D]!}|dd|f}| |} ||j*|| f<#||k(j-}|j/||||}|| j|k(}|| j|k(j-}|dkDr|| j|k(|z}t'|jdD]}||ddf}|js|j|}dD]<} | j| }||s|j*|| fdz|j*|| f<>d} | j| }||r0|j*|ddgfj1|j*|| f<d} | j| }||s|j*|ddgfj3|j*|| f<|| j|k(|z}t'|jdD]}||ddf}|js|j|}dD]<} | j| }||s|j*|| fdz|j*|| f<>d} | j| }||r0|j*|ddgfj1|j*|| f<d} | j| }||s|j*|ddgfj3|j*|| f<|| j|k(}|j-}n|}||z } ||z }!| dkDr*d| d|d}"|!dkDr |"d|!d z }"|j!|"||| j|k(}t't)| D]A}|dd|f}#|#js| |} | j*|#| f|j*|#| f<C| \d| j vrd| d<t5j6|| gj9}t5j:|j|_|Scc} w)!Nprice-repair-100xr3rrFr4z3Cannot check single-row table for 100x price errorsr;)ndimage)rjrirkrlrmrtz6Insufficient good data for detecting 100x price errors)r r wrap)rzmoderYr#zNo sporadic 100x errors)rirlrXrjrirlrkY@zfixed /z currency unit mixups (z crudely))rrrrrrrrarorrrscipyrrr_r^ median_filterrrDrrrrr9rrrrr)$r%rrErrrrr1_ndimagerrf_zeroes df2_zeroesdf_origdf2_datamedianr ratio_roundedrrratio_rcp_roundedf_rcpf_eitherrrfin_before df2_taggedn_afterrr n_after_crudern_fixed_crudely report_msgfjs$ r(rz$PriceHistory._fix_unit_random_mixups_s 88I$$& 3H[_[f[fg 88A;! "**,"';I 88A;!  LLNV`L a"**,"';Iggi 99<<  --k:CI YY\\[ ( ,,[9CI .A )>1Q#++-=Q> > Na',,!,4==? <<>XJxi.C(mGJG 99Q<1  KKPXbK c"**,"';Iy>**,''vF'K6!**,r1 S I &^224r9#%*;s*BCu9||~ LL2*L E"**,"';Is9~& !A!Q$B! A CGGBEN ! O((*//XwL^,,.#5 y>**,388: Q;Y((*c1Q6A1771:& Lq!tWvvxiil*@A!*A!u*,&&a.4*?Q@ OOA&a5&)ggcFG3D.D&E&I&I&KCGGCFOOOA&a5&)ggcFG3D.D&E&I&I&KCGGCFO' L*^,,.#5>E5;;q>* L1a4[vvxiil*AA!*A!u*,&&a.5*@QA OOA&a5&)ggcFG3D.D&E&I&I&KCGGCFOOOA&a5&)ggcFG3D.D&E&I&I&KCGGCFO' L*Y002c9J&NN,M#M]*!M1 Q;!'!H:5KLJ"/!2)<< KK *K 5y>**,3s9~& 4A!Q$BvvxaL!(RU!3A  4  !*"4"44*/ ;'))S*-.99;Csyy1CI e?s "Z6Zc\|jddk(rd}nd}|j||||dS)NrgKWFrYT)correct_dividend)r"_fix_prices_sudden_change)r%rrErrs r(rzPriceHistory._fix_unit_switchs>  ! !* - 6AA--b(K]a-bbr*c |jr|Stj}d||jd}|ddv}|j }|j }|j j!|j j||_n9|j j|k7r |j j||_tD cgc]} | |jvs| } } || dk(|| jz} d} |rtj| jdd j!| j j"} | j%| j'z }|j |d kD}t)j*| j j"|}||} ||}|jrd |jvrd |d <|S|j }|| dk(|| jz} |d j-|dj-k7}|jj/drd}n|d jj-|djj-z}|ddk(j-}||z|z}|sX|dj1}d|j2d<t)j4||dz }|dkDj-|z}||z}d|jvrA|ddk7j-}|jr||z}|jrd| |<| j-} | jd}|||z}|js(|j7d|d |jvrd |d <|S| j%t9| t9|zk(r(|j7d|d |jvrd |d <|S| dgz}d}t;t9| D]}| |} ||j<| dd|f| f<!|||j<|df<|dj-dk(|djj-z}||j<| jd|zdf<||j<||zdf<||j-|k(}|j%} |j |jd}!|j?||||}||j-|k(}|j%}"|j |jd}#| |"z }$|$dkDrd|jd|$d| d|d}%|$dkr4tAtCtE|!jG|#}&|%d|&z }%|j7|%|| 8d | jvrd | d <tjH|| gj }||j-|k(}'t;t9|D]A}(|'dd|(f})|)js||(} |j<|)| f|j<|)| f<C|Scc} w) Nzprice-repair-zeroesr3rSrTrzr4rtrt)r?rFrjrkrrnrrl皙?rqTzNo price=0 errors to repairr;z;No good data for calibration so cannot fix price=0 bad datarz: fixed rz value=0 errors in z price datar6r3)%rrrrrrarorrrrrrrrrrqrrcountrrgr_endswithrSrr~rrrDrrsortedlistset differencer)*r%rrErrrrrr1rr f_prices_bad df2_reservegrpnan_pctdtsf_zero_or_nan_ignoref_change f_vol_badf_high_low_good f_vol_zero close_diffclose_chg_pct_absf_bad_price_chgf_splitf_change_expected_but_missing f_bad_rowsrrrf_vol_zero_or_nanrr dts_taggedrdts_not_repairedrr dts_repairedrrr s* r(rzPriceHistory._fix_zeroes se 88I$$& 5h]a]h]hi B<:- ]]_ggi 99<<  --k:CI YY\\[ ( ,,[9CI!1FAQ#++5EaF FJ3.#j/2F2F2HH  ))L,,!,45AII,J\J\JaJabCggi#))+-G--# .C#%77<+=+=+B+BC#H 23K++,Cyybjj0&+B{O ((*C Os2c*o6J6J6LLLv;'')SZ-@-@-BB ;;   %I #F 0 0 2 ; ; ==3u:??CTC]C]C_B_`Oh-1,668J"_4x?I!\..0 %& "$&FF:G +D$E!#4t#;"E"E"G*"T%7  S[[ (>*c1;;=G{{}078)0C-0446BFL!>?$,,. !%%1%-  #i/J~~ LL6jL I"**,"';I    Z3s8!; ; LLV^hL i"**,"';I(+ s:' 1A1 A-0CGGLA&) * 1  +.CGGIx' ( ]335:s8}?Q?Q?S?\?\?^_JM   a (+<>#YYz~~1~56 //XwL^,,.#5 .."99Z^^^%;<W$ Q;[[M'!H:=PQYPZZefC{%d3z?+E+EFV+W&XY L>** LLJL /  "+"5"55+0 K())S+./::|(}'g})|#dk(jAr| d j |dk(rktjB| d dk(t| z }*|d zd!kr|)j'd"dd#n|*d$kDr|d%kDs|dkDr|)j'd&dd#n| d'j$|}+|+dk(rd},nO||+z },|,|kDr|"|'z }-n|$}-|-dkDr8t?||-z }t?|,|-z }.|.|z|kr|)j'd(|.d#|| kDr|$dkr|)j'd&dd#nt?||$z }t?||z |$z }/|,|/|z|krd|)j'd&|/d#nOt?|,|z |$z }0|/|0kr|/|z|kr1|)j'd&|/d#n|0|z|kr|)j'd)|0d#tjD|'s|"|'z }1|1dkDrt?||1z }t?||z|1z }/|,|/|z|krd|)j'd"|/d#nOt?|,|z|1z }0|/|0kr|/|z|kr1|)j'd"|/d#n|0|z|kr|)j'd*|0d#||||d+}2|"|2d,<|$|2d-<| d j ||2d.<|'|2d/<d|2d0<d|2d1<d|2d2<d|2d3<d|2d4<t|)dkDr+tG|)d56})|)d}3d|2|3d7jId8d9<tKjL|2gjOd:}4||4}|tKjP||4g}|| s|S|jD5cgc]}5|5jSd;s|5}6}5|j}dd=}7tt|D]o}|d>j |}|j"|}|d<j |}|dk(r=|| dj |dz z }| dj |dz | dj |dz z }8| dj || dj |z }9|9|8k(}:|8|9z }!d|!z };|;d!|zk}<|;d?|zkD}=|:rd}}?|>|vrhtW|?tXtjZfrd||><nBtW|?t\rd||><n,tW|?t^rd||><nta|>|?tc|?|?|j$||>f<r|6gdDz }6d|dE<t1j2dFG}@|d0dCgj dH}A|Aj rUt|dkDrFtjAd}B|j"|A}C|BD]}|j |}|jd}Dd}E|dkDr|j |dz }Fn|j |dz}F|d<|z Fd<z }G|d<|Fd<z }Ht9t?|Gdz t?|Hdz }It?D|Fjdz @kr<FdEs7Idkr2FjdCvr"|d,}"Fd,}J|"dI|JzkDr Fjd}EnD}EnD}EEsd|j$EdEf<|6D]"}5|5|jvsd|j$E|5f<$dJ}K|j}tdt|D]}|j |}|jd}Dd}Ld}M|d,}"|j |dz }N|d<|Nd<z }Ot?|D|Njdz @kr=NdEs8|dEs3t?Odz Kkr"|d,j |dz }P|"dI|PzkDrd}Mnd}LMsLsLrDn|j"|dz }Qd|j$|QdEf<|6D]"}5|5|jvsd|j$Q|5f<$|6j'dEdE|jvr|dE}R|R||6D5cgc] }5|5dEk7s |5 c}5j dHz}R|Rj r,|j"R}SdK|SDcgc]}t+|j)c}}|j-|||j"R}T|TD]}|t1j2dz }U| j$d|Udfxx|d@j$|zcc<d| j$d|Ud f<| j$d|Udfxx|d@j$|zcc<d| j$d|Ud f<d| j$|df<d} |jg|}d|j$RdEf<|jgdEdH}dE|6vr|6jidE||6j j st|dkDrtdt|D]}dL\}V}W|dkDr(|dMj |dz |dMj |z }V|t|dz kr(|dMj |dz|dMj |z }WVxsW}VWxsV}Wt?V|z dNkst?W|z dNks|j"|}Dd|j$|Dd1f<||6j j s| r| S|Stt|D]}|d>j |}|j"|}|d<j |}|dk(r=|| dj |dz z }|t1j2dOGz}Xtkjl| j"|X}Yt9|Yt| dz }Yt7d|dPz }Z| dj ||Ydzjo}[|[dkDj |[dQkj z}\|\j r0|tj\ddzdz }Y| j"|Y}Xd}]d}^tJjp}_YZkDr| j ZYdzj}`|`d|`dz |`dR<|`dR|`dz|`dS<|`dj ddj |`dj ddj z }atj&dg|a}a|a|`dT<|`dSj ddj |`dj ddj z }btj&dg|b}b|b|`dU<|`dTdUg}a|dVkDr|dkr|`dRj dz}cadU|cdWzkD}A|Aj rtjAd}B|BD]|}dadUj |d}e|edX|adTj |dzkDs/dadUzez }f|fdYk\}g| d'j$|}+|d2j$|}h|+dk(shsgj rtjgd}it|idkDrtjrti}jtt|iD]S}i|}dfj"|d}k|k|krj|xx|kz jtz cc<7j|xxd!k|z jtzz cc<Utjvj}i|}lnid}ld}^fj"l}_n%edZczkDse`dRdkj rd}]n|j$|dCf}<]r|}?|>|vrtW|?tXtjZfrd||><natW|?t\rd||><nKtW|?t^rd||><n5|>d]k(rtKjxd_`||><nta|>|?tc|?|?|j$||>f<d0|jvsd\|jvsd|j$|d\j d0f<|6d[d\gz }6|6D])}5||5j r|jg|5dH}+d]}5|5|jvr4||5jjAr|jg|5dH}|6D5cgc]}5|5|jvs|5}6}5|j{dM}|7|dMa|db<|dbj}}m|mD]}n|db|nk(}o||oj}pt|p}q|pdMgj}rt|rdkDrrdMj"jjjjdcz }s|sj d|sj$|sj"d<|s|rdd<|rdM|rddz |rde<|6D]7}5p|5j j r%pjg|5dH}p9|6D5cgc]}5|5pjvs|5}t}5|tD]}5p|5j }utjB|u}v|vdqfvr3vqz }w|5d0k(rd}xd%}yd\pjvrp|5|pd\k(jArjd[pjvrp|5|p|5|pd[zk(jArudf}xpd[j }ztjB|z}qtjBu|z}v|v|qz }w|w|xkDr'o|d[j z}Ad|j$|A|5f< dCpjvr5pdCjAr"pd/oudk(jArdg}yn/d%}xn,d[pjvrp|5|pd[k(jArdf}xndf}ywxk\rdd|j$o|5f<d\|jvrCd|j$od\f<tJjp|j$|od]f<||oj}pwykrd|j$o|5f<|5d1k(rFd}xd!}ydBpjvrdh}xdf}ywxk\rd|j$o|5f</wykrd|j$o|5f<G|5dAk(rp|5j drvdk(re|5dCk(rl|5d[k(rs|5dEk(r|jdivr|5d\k(r|5djvsd0|6vrdC|6vrdk}5d||5<tt|D]u}|j"|}|j |}4|4d0s'|4dCs-|4d<}{|4dM}||{||z }}|4d@}~d|~z |}z};|{|;z }Ot?|O||zz |k}|sed|j$||5f<w||5j s|jg|5dH}n|6j'|5d3|jvrWdlD].}5|5|vr||5|d3z||5<|d3||5<|6j'|50|jgd3dH}|6jid3|j}|||6j dH}|jr3| js%tKjP| | gj} | Si}t|dbj}D ]}n||db|nk(}p|pjdm}pd|pdn<tt|pdz ddD ]g}pj |}4|4jd}|t1j2dz }UdA|4vxr|4dA}dC|4vxr|4dC}dB|4vxr|4dB}d[|4vxr|4d[}d1|4vxr|4d1}d0|4vxr|4d0}d2|4vxr|4d2}d\|4vxr|4d\}^dk|4vxr|4dk}tjB|6D5cgc] }5|5|4vs|4|5c}5}rr dk(rd}dz}^r4rd}dpj$|d0f<dz}rd}dpj$|dCf<dz}rrd}dpj$|d[f<dz}dk(rsrrdondp}>j|>gj'|d|4dMz |4d@z }| j$dUdfxx|zcc<d| j$d|Ud f<| j$d|Udfxx|zcc<d| j$d|Ud f<dpj$|dnf<rdq}>|}|4d<|z}|| j$|df<|>drz }>dd|4d@z |zz }||4d@z }| j$dUdfxx|zcc<d| j$d|Ud f<| j$d|Udfxx|zcc<d| j$d|Ud f<dpj$|dnf<j|>gj'|rds}>d|z }|4d<|z}|| j$|df<|4dM|z}d|z }|4d@}!|>drz }>||!z }| j$dUdfxx|zcc<d| j$d|Ud f<| j$d|Udfxx|zcc<d| j$d|Ud f<dpj$|dnf<j|>gj'|nrdt}>j|>gj'|d|4dMz }| j$dUdfxx|zcc<d| j$d|Ud f<| j$d|Udfxx|zcc<d| j$d|Ud f<dpj$|dnf< ^r:du}>j|>gj'|d|4d@z }| j$dUdfxx|zcc<| j$d|Udfxx|zcc<|4d]}_| dj |4d>}|4d<}d||z z }|_t1j2dz }| j$d|dfxx|zcc<| j$d|dfxx|zcc<| j$|_dfxx|z cc<d| j$|df<d| j$d|Ud f<d| j$d|Ud f<dpj$|dnf<Grd|4dMz }|4d@}!t?||!z dz dVkDry>drz }>|!z }| j$dUdfxx|zcc<d| j$d|Ud f<| j$d|Udfxx|zcc<d| j$d|Ud f<dpj$|dnf<|jg|}pjg|}ps dv}>d| d'j$|z }|4d<|z}|| j$|df<|4dM|z}d|z }|4d@}!|>drz }>||!z }| j$dUdfxx|zcc<d| j$d|Ud f<| j$d|Udfxx|zcc<d| j$d|Ud f<dpj$|dnf<j|>gj'|dk(rrrdw}>j|>gj'|d|4dM|z z }| j$|dfxx|zcc<| j$dUdfxx|zcc<d| j$d|Ud f<| j$d|Udfxx|zcc<d| j$d|Ud f<dpj$|dnf<rcra|4d<}||4dMz }}|4d@}~| j$|dfxx|zcc<d&}>j|>gj'|dpj$|dnf< rrdx}>j|>gj'||4dM|z }d|z }||4d@z }| j$|dfxx|zcc<| j$dUdfxx|zcc<d| j$d|Ud f<| j$d|Udfxx|zcc<d| j$d|Ud f<dpj$|dnf<ss| j$|dfxx|zcc<dq}>dy|4vr{|4dyrvd}d|4dM|zz }||4d@z }| j$dUdfxx|zcc<d| j$d|Ud f<| j$d|Udfxx|zcc<d| j$d|Ud f<|>dzz }>j|>gj'|dpj$|dnf< d{k(s rrrd|}>d|z d| d'j$|z z}|4d<|z}|| j$|df<|4dM|z}d|z }|4d@}!|>drz }>||!z }| j$dUdfxx|zcc<d| j$d|Ud f<| j$d|Udfxx|zcc<d| j$d|Ud f<dpj$|dnf<j|>gj'| s s s |4d<}||4dMz }}|4d@}~d}}>||z }||}z }|| j$|df<d|z }||~z }| j$dUdfxx|zcc<d| j$d|Ud f<| j$d|Udfxx|zcc<d| j$d|Ud f<j|>gj'|dpj$|dnf< jpjs D]N}>d~|>dtG|>Dcgc]}t+|j)c}}|j-||PdR| jvr tad| js%tKjP| | gj} | Scc}wcc}5wcc}5wcc}wcc}5wcc}5wcc}5wcc}w)N)r0r1r21yzdiv-adjust-repair-badr3rprzzNo dividends to checkr;rgr r rYgQ?rFrlrr4rSrkrXrjrmr#Tz'Repaired double-adjustment on div days r=g?)rel_tol)secondsr6rnrz div-too-small)staterSg?g?z div-too-bigrqz div-pre-splitzdiv-too-big-and-pre-splitzdiv-too-small-and-pre-split)rrdiv%r drop_2Dmaxvolumevol div_too_big div_too_small div_pre_splitdiv_too_big_and_pre_splitdiv_too_small_and_pre_splitc |dS)NrS)rs r(z2PriceHistory._fix_bad_div_adjust..rs AfIr*)keyr2-_rdiv_r3cDt|}|j|}g}|jdg}||jdg}t d|D]x}|j|} ||j|} | t j |z |kr#|j| |j| b|j|| g}| g}z|j|t jdg|z} d} t|D]\}} t| }|| | | |z| |z } | S)Nrr4rS) r sort_valuesrorrDrmeanrarray enumerate)rcolumn thresholdr sorted_dfclusters current_dts currents_valsrrr3cluster_labelsrFclusterncs r(cluster_dividendsz;PriceHistory._fix_bad_div_adjust..cluster_dividendss6BAv.IH$??1-.K&v.33A67M1a[ *__Q'',,Q/"''-00I=&&r*!((-OOK0#%$K%(EM * OOK (XXrd1f-NC'1  7\-.s3r6*r  " !r*rr,z present adj adj_missingadj_exceeds_divdiv_exceeds_adj)rSrTrUphantomr7rt?g{Gz?zRemoving phantom div(s): )NNr4r#gAdjzAdj LowdeltaadjDeltarg333333?gjt?皙?g(\?adj_exceeds_pricesdiv_date_wrong div_true_dateg?zdatetime64[ns, UTC])dtype)rIrPg~~Arz avg yr yieldrgUUUUUU?gtE]t?)zKAP.ILSAND)r:r; adj_too_small)r8r: ascendingzFixed?ztoo-small div-adjustztoo-big div-adjustz too-small divz & div-adjustz too-big divzmissing div-adjustzwrong ex-div datez pre-split divz"too-big div and missing div-adjustztoo-big div & div-adjustzFX was repairedz and FX mixupr ztoo-big div & pre-splitzdiv-too-big and adj-too-smallz Repaired r3z"Adj" has snuck in df2)r3rN)Errrrr_rrr"rrarrrrwrDrrrorrrrr^rrrrGr9rrtrFr~rrryrreplacerr set_indexr startswithitemsrboolbool_rr{rr[rrremovebisect bisect_left pct_changeNaTzerosr8argminrrEr to_seriesrSr total_secondsr setdefault)r%rrErgrrrcurrency_divide div_status_dftoo_big_check_thresholdr1 df_modifiedf_nandf2_nan div_indices fixed_datesrdiv_idx prices_beforerSr3 dt_before new_close adj_afteradjr7rrdiv_pct#div_too_small_improvement_threshold!div_too_big_improvement_thresholddrop_c2l true_adjust present_adjrdropsr5rrtypical_volatilitydiffs possibilities pct_zero_volr div_postSplit_dropdiff_postSplitdiff_fxdiff_fxPostSplit drop_wo_vol div_statusprowrchecksrRpre_adjpost_adjdiv_missing_from_adjcloseimplied_div_yielddiv_adj_is_too_smalldiv_adj_exceeds_divrvphantom_proximity_thresholdrindices dts_to_checkdiv_dt phantom_dt other_divratio1ratio2 divergence drop_nextratio_thresholdthis_is_phantomlast_is_phantomlast_divr last_dropphantom_div_dt f_phantomdiv_dtsphantom_div_dtsenddtr_prer_postlookahead_date lookahead_idx lookback_idxfuture_changes f_big_changediv_adj_exceeds_pricesr`raxdeltas adjDeltasadjDivr adjDelta_droprf_near1_or_above pre_split near_indices penaltiesdti reversal_idx cluster_idscidfcrPrr time_diffscluster_checksf_failn_failpct_failtrue_thresholdfals_thresholdf_adj_exceeds_prices div_yieldpctclose adj_presentalso_correct_adj div_repairsrSrUrTr_r9r8r:rdn_failed_checksadj_correction correction correct_div target_adjtarget_div_pct close_beforetrue_adjenddt2rdiv_truepct_true adj_corrects r(rz PriceHistory._fix_bad_div_adjusts0 :I 2 2I$$& 7_c_j_jk KC'113yy{ LL0 L CI  ! !* - 6"O!O "' ]]_ggi ckk )$C  G !!#,,.e*//#5&k [!S(224yy{ LL0 L CIhhuoa(  s;')2r2 BA!!nG!|HHWQY/M '-*@@Dk"''0CaxT#XaZ- IIgai0 )'2S8  e 44mTZF[9[2;CGGIw./ #K 0 5 5g >WARARSZA[ [I#sSW1B1B7191M-M'MNC69'l6G6GPQ 6RUX6XCGGI{236:CGGI{23"&K&&syy'9'>'>'@A' B( { a ;[VVW!2!2719!=c!AB!C3w<+<+WARARSZ[\S\A]] {K5IOZ]`ah]i]m]moQoqr{sFsFOPsQpQ^RPRCGG>R 3 3A >>> KLOSCGG>R 3 3A >>> KLU13w<3D3DWQY3OPT3T`efw<,,WQY7WARARSZ[\S\A]] {K5IOZ]`ah]i]m]moQoqr{sFsFOPsQpQ^RPRCGG>R 3 3A >>> KLOSCGG>R 3 3A >>> KLw<,,WQY7#e*//':RRDS!#$G (9(9'(BSZ__U\]^U^E_(_!`aVVE] $(! C A%#c(GAI.As1u Awqy)#c(E!G,5y1}%'VV"G ))%A6??ACJOOTYZ[T[\_D`DiDiDkk%'WWRVVE]%;"Ms !c(m&8&8&A1&D!vvc(mS&89#c(B 3;$!((/#)NO#T)gn'C-!((-)LMN+//3C<$(M%(%KM$s* $'9 9 *qy"3u9~),]5-@)A*-NNSWW)00/R`1ab44!S(%,,mC-PQ"3z>2"%s?':J&F"G(0 '*K KPTT - 4 4mT[5\ ]/2M/4QS]3]/^,&)99$+.O$OTX#X$1$8$8-X_9`$a$47X$X]a#a$1$8$8B]fv9w$xxx 23#');";K"Q"3{?3"%s?':K&G"H(0 '*M MRVV - 4 4oV]5^ _/2M/4QS^3^/_,&)99$+.O$OTX#X$1$8$8/Za9b$c$47X$X]a#a$1$8$8B_hx9y$z"$GCgNJ!%Jv '1J| $#&x=#5#5g#>Jx 2Ju (-J} %*/J '*/J '6;J2 38=J4 5=!A% &}:M N !!$;? 1W:--c378,, |,66v>C$ # " =#*> ? {] @~  I*22Kall66J!KK%002  ">s=)*, -A#E*//2G$$Q'B&++A.C!|CL--gai88G+&++GAI6W9J9J7ST99UUG;',,W5G 8I8I'8RRH(0G(; %"H,K #k 1 #4G #D #4r'z"B )',$'5J(AJ} %,?J( ),@J( )!'') -!M)!!dBHH%56+0 a(#As++, a(#Au-+. a((!DG44+, !!"a%( -A, -Z GG#( i &/&9&9r&B# =*;< = A Aq A I 557s=)A-hhqk!nG(..q1L E#((+! q5 - 2 21Q3 7I - 2 21Q3 7Ie*_4 %8HHUi&66 VCZ#fSj/B vinn,-1LLU^_hUinx{n ~~5"6{$-f$5 #i-/)2J)/J%+ ?CM%%j)&;<#E 5 55?DM--j!m<E3 EB %002 q#m,- EA$$Q'CXXF#O#Ov;D$))!A#.HJ%0E6(--'(,GGPXYbPclopylz@CDIJMDM@NQ`@`)&166qs; #i-'&*O&*O/+: @S@STUVWTW@X?C !!.)";<EAM111?D )).!*;<E# E(  i   -- -%i0I!m4Y1!y.Q4Y&Z&^&^de&^&f%fgI}}'--i81G2Tb3rwwy>2T1UV Cz 2"/"5"5i"@);By221==EGG 34 m8T8X8XY[8\\47;CGG 34KK 34 m8T8X8XY[8\\47;GKK 34/0CGGB O,"&K$1$6$6r$:M;;@ !!)Y"67)..yq.AMF" i(V$((*..0=!A%q#m"45 JA$.ME61u -c 2 7 7! <}S?Q?V?VWX?Y YC .q01!.s!3!8!81!= c@R@W@WXY@Z!Z!OVE#_uF501"4VO=S9TUW9W!.!4!4Q!7EI ))&/*AB JV$((*..0  s=)*@ eA#E*//2G$$Q'B&++A.C!|CL--gai88G  3 3 <S=]=]=__L! '"((<*@*CA*F Fq H !$=!9%* ""NFFM|+HH\-/:??A[>AgJ6% x!E(2) 5qr*335' 8L8U8U8WWC5&1#' iL--ab1::gm 1U8==#33Fz*fSj9Auuw"$((1+a.#*#*C,2:,>,C,CC,HM,uVG_5I5I#5N/NN+-VJ-?*?)N393; 0),N(;(?(?(C,9/,J,N,Nr,R $)3JyGWG[G[G]3588q/C28,,s2CC/2Rx09! C 0M 09! SVMM@Q0Q )R-/IIi,@7CA 7CA 59N4:LL4NM$)%2T&[%@)*% '9'9';AE(>$)G#*L$1#4#4R9J5J#K %*>).&J/EJ+ ,+9J' (*7J '%N+//3C<%(%KM$s*-:5-A-E-Eb-I*,V488< $'9 9%2<%@%D%DR%H *qy"3u9~),]5-@)A)d3h7EIM--b/.AB!'') -!M)!!dBHH%56+0 a(#As++, a(#Au-+. a(o-+-99;P+Q a('!DG44+, !!"a%( - 5 55:JmNcNc:c_d !!-0@"A"J"J"Lm"[\A@ eD ')9:: >A #'') - 2 211 2 =  >  %% %-*:*?*?*A*E*E*G)..qq.9M#BqM,A,A'A!BB &11#6 #4]3#O i $I.557 i Cy)S0B#B'224GG Au~**,H8}q %c]00::<AACFFTTVZop 6@ooa6H z//23%/"+3C=8H;M+M( 6qz**,002%ll11l5G 6*0HA13GaHNH#Y  ,,.aV#!A: %%(N%)N'7??: gVfNg@g?l?l?n +w>GAJSZ[\S]`gh|`}S}D~DDDDDF*-/67K/L/U/U/W,FF#78!#/C(D!E#)A:#n4 "]3G%H%Q%Q%S SA6:M--ad3 (GOO;HY@Z@^@^@`$EN2.v69>>@-0N.2N-@gajRYZnRoFoEtEtEv*-*->137 ))"a%0+}/D/DDFKM--b2B.BCEGVVM--b/.AB&3B&7&B&B&DG !^338 ))"a%0 '%(N%(N(?)-),>137 ))"a%0 !^338 ))"a%0  %qzr*v{ )),, >dkk5G&G((FFsY !i V F "'8F'BA$M! 3}-. 8"((+#((+}%#.?*@ #E Ic(C%cME"%m"4K)*;(=%%&77E'*5//2Q+R'SVe'e$'37 ))"a%0 8!#'') - 2 211 2 =  a &-*?*? ?5 % %'4Q'7-Hc:d'dM!$'45P'QM!$MM!$  % *../JQR.SM MM5 6%002 &mF&;&?&?Q&?&GH   ==iig/::<J  i0779:S C#M)$2r2K 9ll1oXX9..q99+s2Is=7I "3s":"UsCT?U"3s":"UsCT?U%9S%@%^SI]E^" /3 6 O3;O +s2Is=7I /3 6 O3;O "2S!8!RSAQ=R /3 6 O3;O "$&&&)MQAH#a&)M"N#5/Q:N*/&#q(O!"&+ 9> B $56'1,&*/=B B(9$9:'1, )-2*@E B(<$<='1,"a'&/6E2K_#..q"5<K0_,%(S3}3E-E,S%T )3c-6H)HFUFK$78NJ8;?FUFK$78 FUFK$78NJ8;? FUFK$7848 BL1#..q"5<K0),SJ)>%(>%9 &)-&8 _,)3k)AFUFK$78NJ8;?FUFK$78 FUFK$78NJ8;? FUFK$7848 BL1#..q"5<,>r,BM&-ll2&6G&+%(^)<)@)@)D%D &)%j:&= 3>K0),SJ)>%(>%9 &)-&8 _,)3k)AFUFK$78NJ8;?FUFK$78 FUFK$78NJ8;? FUFK$7848 BL1#..q"5<%9 )3c-6H)HK0OC0FUFK$78NJ8;?FUFK$78 FUFK$78NJ8;? FUFK$7848 BL1&?K0OC0+,3]%^ &)%j:&= 3>K0),SJ)>%(>%9 &)-&8 _,)3k)AFUFK$78NJ8;?FUFK$78 FUFK$78NJ8;? FUFK$7848 BL1#..q"5<)C)C)E(Fd}|t(j@k(r|jCd,}tE|j dD]U}|dd|fxx|zcc<|j3t4j6s4||jFvsF|||xx|zcc<W|t(j@k(r|jCd-}|ddf|dd.fz |dd|t)j,|ddz} | j'rd|| <| r|d&k7rt)jH|d}!nt)jJ|d}!t)jL|!}"|"j'rd|!|"<|j3t4j6r+|!d/<|d/jOd(jCd0|d/<tQh| }#t)jP|!|#dz d1zdzkr=t)j |!d|#dz d1zdzz kDr|jd2| d3||St)jR|!d4d5g\}$}%|%|$z }&|$d6|&zz }'|%d6|&zz}(|!|'k\|!|(kz}t)jT|!|})t)jV|!|}*|*|)z }+|jd7|)d8d9|*dd!|+d:zd;d<|d=|+z},| r|d&k7r|,d>z},|d?vr|,d(z},tQh| d|,zkr0|jd@||jdA|+ddB|,d||S|!| z }-tQh| }#|jdC|#dDdE|,d||#dz|,zd1z}.|jdF|.dD|dG|jFvrd|dG<| r|d&k7rdH}/nd}/|/rPt)j:|d*fd}||jYd dj }|ddf|dd.fz |ddn|!}|| z }-|d|.z k}0||.kD}1t/|1j }2|2dk(r|1n|1j'd}3|3j'rIt)j*|3dD]-}4|djZ|4}5|5dk(rdn|djZ|4dz |5z }6| rJ|4dzt/|kr9|djZ|4dz}7|7dkDrtQ|6|djZ|4|7z }6|6d=kDstQd|4dIz }8t t/||4dIz}9|d jZ|8|9d k7j'r|djZ|8|4dz jU}:t)jL|:s|:dkDr |5|:z dJkr|2dk(rd|1|4<%d|1|4ddf<0|0|1z}|j3t4j6r|/s6|-dK<|0|dL<|1|dM<|dKjOd(jCd0|dK<n|tEt/|D]e}||}||vs |-dd|f|dNz<||dNzjOd(jCd0||dNz<|0dd|f||dOz<|1dd|f||dPz<g|j's|jd2| d3||SdQ};|d j d k7}<|dvr|t/|=r t/|>sy|>dddf|=z }?|?d.z}?|?dkD}@|@j'r#|?@j }Atj\||Az}Bt_|Btjjr!tjj|;R}.ntajb|;R}.t_|.tjjr]t_Btjjr9t)j*|?Ak(dd}C|j |C}D|DBz|D|.zk}EnB|.k}EEr|jedS||S|j3t4j6r|r:|jZ|-d|-d|jFjwdyfxx\zcc<|rk|jFjwd}e|jZ|-d|-d|ef]zjOjCd-|jZ|-d|-d|ef<dH|jZ|-d|-d|jFjwdGf<|-d|-ddz k(rB| r'dk| dz|j |-dj}^nwdk| dz|j |-d}^n^|j |-ddz }f|j |-d}g| r)dk| d{fjd|gjd}}^n dk| d{fd|gd}}^|j^|[|-d|-dz z }[t/Vd(krTd~}^VD]L}-^d|j |-ddz jd||j |-djz }^Nndt[ds}^|je^||r|dj#}"|"j'rG|d|"jOdjCd-|jz|"df<|jS|djOdjCd-|d<|jScc}wcc}wcc}w#1swY xYwcc}Wwcc}4w)Nzprice-change-repairr3r#rr)rrXz 100x errorrr4z bad splitzprice-repair-splitrqrzr4r>z start_min=z change=rz (rcp=r[r;)rirjrkrlr^g?z(Split ratio too close to 1. Won't repairFrerrnrtzappears_suspended=z, idx_latest_active=rX)rmrnrprqrr)rurrlr+)rrYgMbP?r=rir6rmr{rrSz1D %rrzNo z s detectedKrXz+Estimation of true 1D change stats: mean = z.2fz , StdDev = rz.1fz % of mean)rr )r1r2z>Split ratio too close to normal price volatility. Won't repairz sd_pct = z largest_change_pct = z split_max=z.3fz largest_change_pct=z threshold=rTr,g@rdownup_r_down_uprKr7z<100x changes are too soon after stock split events, abortingri_revzdisplay.max_rowszdisplay.max_columnsz display.widthr z!price-repair-split: my workings: cd|drNtj|}d|d<tj|}d|d<tj|}d|d<|jsgStj|d}g}t t |dz D]F}|dzdk(s dkDr |||rdnd}n |||rdnd}|j ||||dz|fHt |dzdk7r>dkDr ||drdnd}n ||drdnd}|j |dt ||f|S) NrFr4r=r#rz 1.0/splitrS)rrarrwrDrr)rf_upf_down true_indicesrangesrrrs r(map_signals_to_rangeszEPriceHistory._fix_prices_sudden_change..map_signals_to_ranges sHtGGAJ!wwt}Q!q 557 88A;q>LF3|,q01 Oq5A:s{)/ Q)@gk-3LO-Dk'MM<?LQ4G"MN  O< 1$)3;%+L,<%=';C)/ R0@)A+wC |B/Q=>Mr*zidx_latest_active=z, idx_rev_latest_active=)NNNNzcolumn 'z ' ranges: zPruning z range rCz because too old.z Potential z detected only in column z(, so treating as false positive (ignore))rrrrrz Corrected z on col=z range=[:z] m=rWrb=rz Corrected: zPruning range zrange=z m=)rirjrkrlrmrpz on interval z across intervals rZz (inclusive)z Corrected:rY)>rrrrr_rorrbrcrrrarrrrrrrrrrwrollrr isEnabledForrkDEBUGrfullonesrbrrrDrr}rryrr9 percentilerFstdrgrrrrrr^rroption_contextrflipextendrrGr logical_xorr)ir%rrErchangerrrr split_rcprmultidayfix_type start_minrOHLCr1r f_no_activityappears_suspendedf_activeidx_latest_activelog_msgdf_debug debug_colsr _1d_change_x price_dataf_zerordf_dtyperf_zero_num_denom_1d_change_minxf_na split_maxq1q3iqr lower_bound upper_boundavgsdsd_pctlargest_change_pctrrJcorrect_columns_individuallyrr f_up_ndims f_up_shiftsrrvol_change_pctnext_vlookback lookahead avg_vol_afterthreshold_daysf_splits indices_A indices_Bgapsf_posgap_mingap_tdrrwithin_thresholdrridx_rev_latest_active f_corrected f_open_fixed f_close_fixedOHLC_correct_ranges idx_first_fr f_upjf_downj ranges_before f_rev_downj f_rev_upjf_revj ranges_afterrrridxscol n_correctedrUm_rcpr counts_prettyf_open_and_closed_fixedf_open_xor_closed_fixed f_rev_downf_rev_upf_revcol_locrrrsi @r(rz&PriceHistory._fix_prices_sudden_change s 88I$$& 5h]a]h]hi %K ::44 ] "#H#6Jx I"H#7Jx >"++-4A!*Y-D-D-R-RYZ-R-[[aacI z)HVCLs6zRUFVVWX`j k/    LLC:L VIggi""U"3 99<<  --k:CI YY\\[ ( ,,[9CI IIaLH q( %D (8(<(HHX!0D%DEaH  !Q & " 21 5   !Q & $  #$5a$8 9 &'8&99MN_M`a  ( CII&78==?@B BG WJ /   w}} -xxzH}}%fmnw}AH!J}}%MA*9La%MTU^f}gHJ D(U:M-M77Aq63/LfW-.779J3&F77Aq63/LT++-J3&F ::>    !-0L) * D( jjA>O!ii 1=Oxx( 88:$'OD !   w}} -.HV '/55a8??FHV y) 66/ "i!ms%:Q%> >266/CZ]`enqrervydy|}d}]~C~ LL3xj 3:L FIR9B2g39n 39n  +;0N Oggoa() VVOA& 'c B3s);WYZ]V^^`aghmamnq`rr|}FP QZ D( ! # >)"a'" ui 3);#; ; LLYakL l LL9VCL0GHZ[^G_`hrL sI i 'y)  z)C0DEWX[D\]eo p_'99S@  z)C1 D ckk )$C  D(,0 (+0 ( '77Aq63/LT**34==?J)!"#/*SbST2CCL *L 9 $i/i'_ (!mdq1A ?? XXk*1- *M&&q)&'1f#h-2D2DQqS2IA2M1s3x ]//!4Fz),^S]=O=OPQ=RU[=[)\!A% #1ad|H #CHad 3IN+00)DcINNP!$'M$6$6x!$D$I$I$KM88M2}q7HQ}__bMb!!Q"'Q$)QqS 1 *2 TM   w}} -/ ! #) !% ( 3 3A 6 = =e D s4y)9AQAJ-.q!tWT*-5a$h-?-E-Ea-H-O-OPU-VT*06q!t W-.21a4jU+ 9uuw LL3xj 3:L FI~&//1S8 ] "x||~*1-I AIy>YQW% 1D BJD1HEyy{u+//+55h?'Ifi&=&=&K&KL ) 7 7 E E> E ZI ) 3 3 HIi)@)@)N)NOT^_egpg~g~hMhMUN((4=1!4Q7C3B(*V Y'G$'- '9$#KK ^fpKqI   w}} - q(..*;!<=HSM (q 1! 3hsm CHW +# $C1QwY$CDHHaHPS[nx\yij]^_d]d\ySzS~S~EFS~TGG#F+htn<"''(B"77"''(A:NNQSQXQXYaceQffikipipqy{|i}}H""#5t=RTVXgimn b FXV^M_I``a b B  ($&HHQK!O6G$G ! LL-.?-@@XYnXopyCL D '''!U+K "wwq%0 "5 1 ": 3t9%- 4G hhqk!nQ/ $*;*GL]alLl 1a4B AJE$QTlG$9"=N=O:PRWXiXjRkmtvGvHnI%JM=)A-!&s='9!:jA -a 0A01!7H0H!A$QbJbdefgdh/iM!,j#%''"''%*<"=K "(< =I&4F#8@U@V9WYbcxcyYz}HI^I_}`$aL<(1,!&s<'8!9qA ,QA/0t6K/KQqTTiMiklmnko.pLOq"'s<'8!9EA ,QA/01vq1vqt.DLOE+FMM,/21QT7DAJqRSt UF xs*VH=Z P("3v;q="b9*"1I99QqT?//1I="LL8A3gcii!o=NbQTQZQZ[\]^[_`a[aQbPcct)u~HLI &q * v;?-3'*[- 4^ QqT!A$ 7!"g;? ad1Q4 815 AaD1.-6 68{#a'$&M"3t9-L&q>Q.,2 - 5 )Qy+a.9I-KKM L ( 7CKK:K6*6*F'*,..}*U'*..0BE''JackJkBlotBtA{A{A}BEBEFKBLCGG3X=>*..0BE''JackJkBlorBruzBzBBBBBDBKBKLQBRCGG3X=>04CGGK, -K((1+a.+K &7&CHY]hHh !6a8I8J6KTRcRdMegmnoAhB!C }%)"3}#56f)!,,-aD3D,DadM^F^`abc`d+e a(f WWRWWT2%67 7727762#67 :-4U;P;Q5RT\]r]sTtwABWBXwY Z |$q("3|#45m(O+,Q42G+G1PeIeghijgk*l Qm#3|#45A(O+,QqT61QqT61Q4*@ QA' l+.q$?$s6{1}b"5&Aq Ayy1++- 9 ~cii!o5FbSTUVSWXYSYIZH[[l%mu A"1I &  +Q47?A%E!A!E vaSA3/z BFEAHHQqT!A$Y (;(;A(>>?1D?E#HHQqT!A$Y (;(;K(HHIQNI!!kk11(;G47HHQqT!A$Y=O4PSX4X3_3_3a3h3hin3oCHHQqT!A$Y/0HL1adCKK$7$7 $DDEQ41Q4!8# *8*M#))AaD/BVBVBXAYZ *8*M#))AaD/ARS IIadQh/E))AaD/C *8*4Fuzz|nTXY\YaYaYcXddpq *8*4FugTRUQVVbc S 3qtad{* = +@6{a"VAQsyy1a05578SYYqt_=Q=Q=S*D*DQ*G*N*Nu*Uh'~~!$H 3 3A 6 = =e DH ~~U&Nb%D\y b bFQ Ws; AfAf Af 0 Af!AfC Af!DAf&fAf)r9r+r)rS)F)FF)__name__ __module__ __qualname__r r)rlog_indent_decoratorrrrr rr rrrrrrrrrrrrrrrrr>r*r(rrs15Z0  !DeT eE% 5"" g(*|| g gR*4 & &$) ryy (-J 299 !&Z BII "'jRYY(!",,!F { {z 5n%N   X Xt c c  @ @D y yv : :x K  K r*r) curl_cffirmathrrnr(rdateutilrbrknumpyrpandasrrrryfinancerryfinance.constrrr yfinance.exceptionsr r r r rr>r*r(rds> "CCnnC/ C/ r*