Ë
    ¾£j”  ã                  ó8  — d dl mZ d dlmZ d dlmZ d dlmZ d dlZd dlZd dl	Z
dZ ej                  d«      ZdZd	Z ej                   d
«      Z ej                   d«      Z ed¬«       G d„ d«      «       Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zd d„Zy)!é    )Úannotations)Ú	dataclass)Údatetime)ÚPathNé    z	<IIIIIfIIé2   ih  z#sh(?:600|601|603|605|688|689)\d{3}$z#sz(?:000|001|002|003|300|301)\d{3}$T)Úfrozenc                  ó|   — e Zd ZU ded<   ded<   ded<   ded<   ded	<   ded
<   ded<   ded<   ded<   ded<   ded<   y)ÚDayFileMetadataÚstrÚsource_coder   ÚpathÚintÚ	file_sizeÚrecord_countú
str | NoneÚ
first_dateÚ	last_datezfloat | NoneÚlatest_closeÚavg_amount_20z
int | NoneÚlatest_volumeÚboolÚrecord_size_validÚlatest_ohlc_validN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© ó    ú2C:\FundamentalWorkbench\src\fundamental_mvp\tdx.pyr   r      sB   … àÓØ
ƒJØƒNØÓØÓØÓØÓØÓØÓØÓØÔr    r   c                ól   — t        t        j                  | «      xs t        j                  | «      «      S )N)r   ÚSH_STOCKÚ	fullmatchÚSZ_STOCK©r   s    r!   Úis_stock_coder'   #   s(   € Ü”×"Ñ" ;Ó/ÒR´8×3EÑ3EÀkÓ3RÓSÐSr    c                ó8   — | d d j                  «       › d| dd  › �S )Né   Ú.)Úupperr&   s    r!   Úcanonical_idr,   '   s*   € Ø˜"˜1ˆo×#Ñ#Ó%Ð& a¨°A°B¨Ð'8Ð9Ð9r    c                ó¤   — 	 t        j                  t        | «      d«      j                  «       j	                  «       S # t
        t        f$ r Y y w xY w)Nz%Y%m%d)r   Ústrptimer   ÚdateÚ	isoformatÚ	TypeErrorÚ
ValueError)Úvalues    r!   Ú
_date_textr4   +   sG   € ðÜ× Ñ ¤ U£¨XÓ6×;Ñ;Ó=×GÑGÓIÐIøÜ”zÐ"ò Ùðús   ‚:= ½AÁAc                óv  — | j                  «       j                  }|dkD  xr |t        z  dk(  }|r	|t        z  nd}|dk(  rt        | j                  | |dd d d d d |d«      S | j                  d«      5 }|j                  t        «      }t        d|«      }|j                  | t        z  d«       |j                  |t        z  «      }d d d «       t        j                  «      }t        «      D �	cg c]  }	t        j                  |	t        z  «      ‘Œ! }
}	|
d   }t        j                  |
D �cg c]  }|d   ‘Œ	 c}t        ¬«      }|t        j                   |«      |dk\  z     }|d	   d
z  |d   d
z  |d   d
z  |d   d
z  f\  }}}}t        ||||«      dkD  xr" |t#        |||«      k\  xr |t        |||«      k  }t        | j                  | ||t%        |d   «      t%        |d   «      ||j&                  rt        |j)                  «       «      nd t+        |d   «      ||¬«      S # 1 sw Y   �ŒbxY wc c}	w c c}w )Nr   FÚrbé   r)   éÿÿÿÿé   ©Údtypeé   g      Y@é   é   é   )r   r   r   r   r   r   r   r   r   r   r   )ÚstatÚst_sizeÚDAY_RECORD_SIZEr   ÚstemÚopenÚreadÚminÚseekÚ
DAY_STRUCTÚunpackÚrangeÚunpack_fromÚnpÚarrayÚfloatÚisfiniteÚmaxr4   ÚsizeÚmeanr   )r   rQ   Ú
valid_sizeÚcountÚhandleÚ	first_rawÚ
tail_countÚtail_rawÚfirstÚiÚtailÚlastÚrowÚamountsÚoÚhÚlowÚcloseÚ
ohlc_valids                      r!   Úread_day_file_metadatard   2   s(  € Ø�9‰9‹;×Ñ€DØ˜‘Ò9˜d¤_Ñ4¸Ñ9€JÙ'1ˆD”OÒ#°q€EØ�‚zÜ˜tŸy™y¨$°°a¸¸tÀTÈ4ÐQUÐWaÐchÓiÐià	�‰�4Œ˜FØ—K‘K¤Ó0ˆ	Ü˜˜U“^ˆ
Ø�‰�Z�K¤/Ñ1°1Ô5Ø—;‘;˜z¬OÑ;Ó<ˆ÷	 
ô ×Ñ˜iÓ(€EÜKPÐQ[ÔK\Ó]ÑK\ÀaŒJ×"Ñ" 8¨Q´Ñ-@ÕAÐK\€DÐ]Ø�‰8€DÜ�h‰h©$Ó/©$ 3˜˜A›¨$Ñ/´uÔ=€GØ”b—k‘k 'Ó*¨g¸©lÑ;Ñ<€GØ˜Q™ %™¨¨a©°5©¸$¸q¹'ÀE¹/È4ÐPQÉ7ÐUZÉ?Ð[Ñ€A€qˆ#ˆuÜ�Q˜˜3 Ó&¨Ñ*Òb¨q´C¸¸5À#Ó4FÑ/FÒbÈ3ÔRUÐVWÐY^Ð`aÓRbÑKb€JÜØ—I‘IØØØÜ˜e A™hÓ'Ü˜T !™WÓ%ØØ/6¯|ª|”e˜GŸL™L›NÔ+ÀÜ˜$˜q™'“lØ$Ø$ôð ÷ 
‰üò ^ùâ/s   Á0AH$Ã.$H1Ä,H6È$H.c                óî   — g }dD ]m  }| dz  |z  dz  }|j                  «       sŒt        |j                  d«      «      D ]2  }t        |j                  «      sŒ|j                  t        |«      «       Œ4 Œo |S )N)ÚshÚszÚvipdocÚldayz*.day)ÚexistsÚsortedÚglobr'   rC   Úappendrd   )Útdx_rootÚresultsÚmarketÚfolderr   s        r!   Úscan_stock_day_filesrr   U   sn   € Ø%'€GÛˆØ˜HÑ$ vÑ-°Ñ6ˆØ�}‰}ŒØÜ˜6Ÿ;™; wÓ/Ö0ˆDÜ˜TŸY™YÕ'Ø—‘Ô5°dÓ;Õ<ñ 1ð	 ð €Nr    c                ó¼  — | j                  «       j                  }|dk(  s	|t        z  rt        d| › �«      ‚t	        j
                  | t	        j                  g d¢«      ¬«      }t	        j                  |d   D �cg c]?  }t        t        |«      «      sŒt	        j                  t        t        |«      «      d«      ‘ŒA c}«      }t	        j                  |«      S c c}w )Nr   u!   æ— æ•ˆçš„é€šè¾¾ä¿¡æ—¥çº¿æ–‡ä»¶ï¼š))r/   ú<u4)rD   rt   )Úhighrt   )ra   rt   )rb   rt   )Úamountz<f4)Úvolumert   )Úreservedrt   r:   r/   ÚD)r@   rA   rB   r2   rL   Úfromfiler;   rM   r4   r   Ú
datetime64Úunique)r   rQ   Úrawr3   Úparseds        r!   Úread_day_datesr   a   s°   € Ø�9‰9‹;×Ñ€DØˆq‚y�Dœ?Ò*ÜÐ<¸T¸FÐCÓDÐDÜ
�+‰+�d¤"§(¡(ò ,ó #ô €Cô �X‰XÈsÐSYÊ{ÓuÉ{ÀeÔ^hÔilÐmrÓisÕ^t”r—}‘}¤Z´°E³
Ó%;¸SÕAÈ{ÑuÓv€FÜ�9‰9�VÓÐùò vs   Á9CÂ*Cc                óÖ   — | dz  }i }|j                  dd¬«      j                  «       D ]=  }d|vrŒ|j                  dd«      \  }}|j                  «       ||j                  «       <   Œ? |S )Nz	incon.datÚgb18030Úreplace©ÚencodingÚerrorsÚ|r<   )Ú	read_textÚ
splitlinesÚsplitÚstrip)rn   r   ÚresultÚlineÚcodeÚnames         r!   Úload_industry_namesr�   m   sm   € Ø�kÑ!€DØ€FØ—‘¨	¸)�ÓD×OÑOÖQˆØ�d‰?ØØ—Z‘Z  QÓ'‰
ˆˆdØ#Ÿz™z›|ˆˆt�z‰z‹|Òð	 Rð
 €Mr    c                óÚ  — i }| dz  dz  }dD ]Û  \  }}||z  }|j                  «       sŒ|j                  «       }|t        d }t        |«      t        z  dk7  rŒKt        dt        |«      t        «      D ]t  }|||t        z    }	|	dd j                  dd¬	«      }
||
z   }t        |«      sŒ6|	d
d j                  dd«      d   j                  dd¬	«      j                  «       }|sŒp|||<   Œv ŒÝ |S )z=Read the current SH/SZ security names from TDX market tables.ÚT0002Úhq_cache))rf   zshs.tnf)rg   zszs.tnfNr   r?   ÚasciiÚignore)r…   é   é'   ó    r<   r�   r‚   )
rj   Ú
read_bytesÚTNF_HEADER_SIZEÚlenÚTNF_RECORD_SIZErJ   Údecoder'   r‰   rŠ   )rn   r‹   rq   rp   Úfilenamer   r}   ÚpayloadÚoffsetr]   r�   r   rŽ   s                r!   Úload_tdx_security_namesr    x   s  € à€FØ˜Ñ *Ñ,€FÛBÑˆ�Ø˜Ñ ˆØ�{‰{Œ}ØØ�o‰oÓˆØ”oÐ&Ð'ˆÜˆw‹<œ/Ñ)¨QÒ.ØÜ˜Aœs 7›|¬_Ö=ˆFØ˜& ¬/Ñ!9Ð:ˆCØ�r˜�7—>‘> '°(�>Ó;ˆDØ  4™-ˆKÜ  Ô-ØØ�r˜"�:×#Ñ# G¨QÓ/°Ñ2×9Ñ9¸)ÈIÐ9ÓV×\Ñ\Ó^ˆDÚØ&*��{Ò#ñ >ð Cð" €Mr    c           	     óP  — t        | «      }| dz  dz  dz  }i }|j                  dd¬«      j                  «       D ]é  }|j                  d«      }t	        |«      dk  s|d	   d
vrŒ*|d   j                  «       }|d   j                  «       }t        j                  d|«      r|j                  d«      sŒx|d	   dk(  rdnd|z   }t	        |«      dk\  r|d d n|}	t	        |«      dk\  r|d d n|}
|	|j                  |	«      |
|j                  |
«      ||j                  |«      dœ||<   Œë |S )Nr‘   r’   z	tdxhy.cfgr�   r‚   rƒ   r†   r?   r   >   Ú0Ú1r<   r9   z\d{6}ÚXr£   rf   rg   r=   )Úindustry_l1_codeÚindustry_l1_nameÚindustry_l2_codeÚindustry_l2_nameÚindustry_l3_codeÚindustry_l3_name)
r�   r‡   rˆ   r‰   rš   rŠ   Úrer$   Ú
startswithÚget)rn   ÚnamesÚcfgr‹   rŒ   ÚpartsÚraw_codeÚindustryr   Úl1Úl2s              r!   Úload_tdx_research_industryrµ   �   s.  € Ü Ó)€EØ
�WÑ
˜zÑ
)¨KÑ
7€CØ/1€FØ—‘ y¸�ÓC×NÑNÖPˆØ—
‘
˜3“ˆÜˆu‹:˜Š>˜U 1™X¨ZÑ7ØØ˜‘8—>‘>Ó#ˆØ˜‘8—>‘>Ó#ˆÜ�|‰|˜H hÔ/°x×7JÑ7JÈ3Ô7OØØ$ Q™x¨3š‘t°D¸HÑDˆÜ  ›]¨aÒ/ˆX�b�q‰\°XˆÜ  ›]¨aÒ/ˆX�b�q‰\°Xˆà "Ø %§	¡	¨"£Ø "Ø %§	¡	¨"£Ø (Ø %§	¡	¨(Ó 3ñ
ˆˆ{Òð Qð& €Mr    )r   r   Úreturnr   )r   r   r¶   r   )r3   r   r¶   r   )r   r   r¶   r   )rn   r   r¶   zlist[DayFileMetadata])r   r   r¶   z
np.ndarray)rn   r   r¶   zdict[str, str])rn   r   r¶   z dict[str, dict[str, str | None]])Ú
__future__r   Údataclassesr   r   Úpathlibr   r«   ÚstructÚnumpyrL   rB   ÚStructrH   r™   r›   Úcompiler#   r%   r   r'   r,   r4   rd   rr   r   r�   r    rµ   r   r    r!   Ú<module>r¾      sª   ðÝ "å !Ý Ý Û 	Û ã ð €ØˆV�]‰]˜;Ó'€
Ø€Ø€Øˆ2�:‰:Ð<Ó=€Øˆ2�:‰:Ð<Ó=€ñ �$Ô÷ð ó ðóTó:óó óF	ó	óóô0r    