Ë
    Ð�£jÄ(  ã                  ó  — d dl mZ d dlmZ d dlmZ d dlZd dlmZ d dl	Z	d dl
Zd dlZd dlZd dlmZ ddlmZ ddlmZ dZ ej0                  g 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d„Z dd„Z!y)é    )Úannotations)Ú	dataclass)ÚdateN)ÚPathé   )ÚSettings)Úis_stock_code))r   ú<u4)Úopenr
   )Úhighr
   )Úlowr
   )Úcloser
   )Úamountz<f4)Úvolumer
   )Úreservedr
   T)Úfrozenc                  ó6   — e Zd ZU ded<   ded<   ded<   ded<   y)	ÚPriceBuildResultÚboolÚrebuiltÚintÚrowsÚstocksr   Úoutput_pathN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© ó    ú4C:\FundamentalWorkbench\src\fundamental_mvp\price.pyr   r      s   … àƒMØ
ƒIØƒKØÔr    r   c                óž   — | dz  }t        j                  |dk\  t        j                  |dz   «      t        j                  |dz
  «      «      dz  S )Nç      Y@r   g      à?)ÚnpÚwhereÚfloorÚceil)ÚvaluesÚscaleds     r!   Ú_round_half_up_2r*   !   sB   € Ø�e‰^€FÜ�8‰8�F˜a‘K¤§¡¨&°3©,Ó!7¼¿¹ÀÈ#ÁÓ9NÓOÐRWÑWÐWr    c                ó²  — |j                   r=t        j                  t        | «      «      t        j                  t        | «      «      dfS |j                  d«      j                  «       }g }|j                  d¬«      D ]Ð  }t        |j                  «      }t        |j                  «      }t        |j                  «      }t        |j                  «      }d|z   |z   dz  }	|||z  z
  dz  }
t        j                  |	«      sŒƒt        j                  |
«      sŒ™|	dkD  sŒŸ|j                  t        j                  |j                   d«      |	|
f«       ŒÒ |s=t        j                  t        | «      «      t        j                  t        | «      «      dfS t        j"                  |D �cg c]  }|d   ‘Œ	 c}d¬«      }t        j                  t        |«      t        ¬«      }t        j                  t        |«      t        ¬«      }d	\  }}t%        t        |«      d
z
  dd«      D ]"  }||   \  }}	}
||	z  }|||
z  z
  }|||<   |||<   Œ$ t        j&                  || d¬«      }t        j                  t        | «      t        ¬«      }t        j                  t        | «      t        ¬«      }|t        |«      k  }|||      ||<   |||      ||<   ||t        |«      fS c c}w )zBBuild affine QFQ coefficients: adjusted_price = A * raw_price + B.r   Ú
event_dateF)Úindexg      $@ÚDúdatetime64[D]©Údtype)ç      ð?ç        r   éÿÿÿÿÚright)Úside)Úemptyr$   ÚonesÚlenÚzerosÚsort_valuesÚcopyÚ
itertuplesÚfloatÚbonus_shares_per_10Úrights_shares_per_10Úcash_dividend_per_10Úrights_priceÚisfiniteÚappendÚ
datetime64r,   ÚarrayÚrangeÚsearchsorted)Útrade_datesÚeventsÚorderedÚ
valid_rowsÚrowÚbonusÚrightsÚdividendrB   ÚmÚcÚevent_datesÚsuffix_aÚsuffix_bÚaÚbr-   Ú_Ú	positionsÚoutput_aÚoutput_bÚmasks                         r!   Úqfq_coefficientsr]   &   sj  € à‡|‚|Ü�w‰w”s˜;Ó'Ó(¬"¯(©(´3°{Ó3CÓ*DÀaÐGÐGØ× Ñ  Ó.×3Ñ3Ó5€GØ€JØ×!Ñ!¨Ð!Ö.ˆÜ�c×-Ñ-Ó.ˆÜ�s×/Ñ/Ó0ˆÜ˜×1Ñ1Ó2ˆÜ˜S×-Ñ-Ó.ˆØ�E‰\˜FÑ" dÑ*ˆØ˜ Ñ-Ñ-°Ñ5ˆÜ�;‰;�q�>œbŸk™k¨!�n°°Q³Ø×ÑœrŸ}™}¨S¯^©^¸SÓAÀ1ÀaÐHÕIð /ñ Ü�w‰w”s˜;Ó'Ó(¬"¯(©(´3°{Ó3CÓ*DÀaÐGÐGä—(‘(©jÓ9©j s˜C ›F¨jÑ9ÀÔQ€KÜ�w‰w”s˜:“¬eÔ4€HÜ�x‰xœ˜J›¬uÔ5€HØ�D€A€qÜ”s˜:“¨Ñ*¨B°Ö3ˆØ˜UÑ#‰ˆˆ1ˆaØ�‰EˆØ��A‘‰IˆØˆ�‰Øˆ�Šð 4ô —‘ ¨[¸wÔG€IÜ�w‰w”s˜;Ó'¬uÔ5€HÜ�x‰xœ˜KÓ(´Ô6€HØ”s˜:“Ñ&€DØ˜i¨™oÑ.€HˆT�NØ˜i¨™oÑ.€HˆT�NØ�Xœs :›Ð.Ð.ùò! :s   Æ"Kc                ó¦  — t        | j                  «      t        j                  vr2t        j                  j	                  t        | j                  «      «       	 ddlm}  |«       j                  t        | j                  «      «      }|j                  |d   j                  d«         j                  «       }t        j                  |d   j                  d«      |d   j                  d«      gd|d   j!                  t         «      z   d	|d   j!                  t         «      z   gd ¬
«      |d<   ||d   j#                  d«      j%                  t&        «         }t)        j*                  |d   j!                  t         «      dd¬«      |d<   |j-                  dg¬«      }|j/                  dddddœ¬«      g d¢   S # t        $ r}t        d«      |‚d }~ww xY w)Nr   )Ú
GbbqReaderuC   ç¼ºå°‘é¡¹ç›®å†… pytdx è¯»å�–å™¨ï¼Œæ— æ³•è§£æž�é€šè¾¾ä¿¡ gbbq æ–‡ä»¶Úcategoryr   ÚmarketÚszÚcodeÚsh)ÚdefaultÚsource_codeÚ Údatetimeú%Y%m%dÚcoerce©ÚformatÚerrorsr,   )ÚsubsetrA   rB   r?   r@   )Úhongli_panqianliutongÚpeigujia_qianzonggubenÚsonggu_qianzonggubenÚpeigu_houzongguben)Úcolumns)rf   r,   rA   rB   r?   r@   )ÚstrÚ
vendor_dirÚsysÚpathrD   Úpytdx.readerr_   ÚImportErrorÚRuntimeErrorÚget_dfÚ	gbbq_pathÚlocÚeqr<   r$   ÚselectÚastypeÚfillnaÚmapr	   ÚpdÚto_datetimeÚdropnaÚrename)Úsettingsr_   ÚexcÚraws       r!   Ú
_load_gbbqrŠ   K   sŸ  € Ü
ˆ8×ÑÓ¤s§x¡xÑ/Ü�‰�‰œ˜H×/Ñ/Ó0Ô1ðkÝ+ñ ‹,×
Ñ
œc (×"4Ñ"4Ó5Ó
6€CØ
�'‰'�#�j‘/×$Ñ$ QÓ'Ñ
(×
-Ñ
-Ó
/€CÜŸ™Ø	ˆX‰×	Ñ	˜!Ó	˜c (™m×.Ñ.¨qÓ1Ð2Ø	��F‘×"Ñ"¤3Ó'Ñ	'¨°°F±×0BÑ0BÄ3Ó0GÑ)GÐHØô€CˆÑð
 ˆc�-Ñ ×'Ñ'¨Ó+×/Ñ/´Ó>Ñ
?€CÜŸ™ s¨:¡×'=Ñ'=¼cÓ'BÈ8Ð\dÔe€CˆÑØ
�*‰*˜\˜Nˆ*Ó
+€CØ�:‰:Ø!7Ø"0Ø 5Ø4ñ	ˆ:ó ò
7ñ8ð 8øô ò kÜÐ`ÓaÐgjÐjûðkús   ÁF6 Æ6	GÆ?GÇGc                ó¢   — g }dD ]>  }| j                   dz  |z  dz  }|j                  d„ |j                  d«      D «       «       Œ@ t        |«      S )N)rd   rb   ÚvipdocÚldayc              3  óL   K  — | ]  }t        |j                  «      sŒ|–— Œ y ­w)N)r	   Ústem)Ú.0rw   s     r!   Ú	<genexpr>z_stock_paths.<locals>.<genexpr>i   s   è ø€ ÐWÑ&:˜d¼mÈDÏIÉIÕ>V”TÑ&:ùs   ‚$�$z*.day)Útdx_rootÚextendÚglobÚsorted)r‡   Úpathsra   Úfolders       r!   Ú_stock_pathsr˜   e   sR   € Ø€EÛˆØ×"Ñ" XÑ-°Ñ6¸Ñ?ˆØ�‰ÑW f§k¡k°'Ô&:ÓWÕWð ô �%‹=Ðr    c                ó¸  — t        j                  | t        ¬«      }t        j                  |d   j                  t        «      dd¬«      }|j                  «        }||   }||   }|j                  d¬«      }|j                  «       }|j                  |d   j                  d¬«      |k     }t        ||«      \  }}	}
t        j                  | j                  ||d   j                  t        «      d	z  |d
   j                  t        «      d	z  |d   j                  t        «      d	z  |d   j                  t        «      d	z  |d   j                  d«      |d   j                  t        «      ||	dœ
«      }dD ]/  }|||› d�   j                  «       z  |	z   }t        |«      ||› d�<   Œ1 t        j                   |d«       t        j                   |	d«       z  |d<   ||
fS )Nr0   r   ri   rj   rk   r/   r,   r   r#   r   r   r   r   Úint64r   )
rf   Ú
trade_dateÚopen_rawÚhigh_rawÚlow_rawÚ	close_rawÚvolume_sharesÚamount_yuanÚqfq_aÚqfq_b)r   r   r   r   Ú_rawÚ_qfqr2   r3   Úhas_adjustment)r$   ÚfromfileÚ	DAY_DTYPErƒ   r„   r€   rt   ÚisnaÚto_numpyÚmaxr}   r]   Ú	DataFramer�   r>   r*   Úisclose)rw   rJ   r‰   rI   ÚvalidÚ
day_valuesÚlatestÚ
applicablerV   rW   ÚusedÚresultÚcolumnÚadjusteds                 r!   Ú_read_stock_pricer¶   m   sÏ  € Ü
�+‰+�d¤)Ô
,€CÜ—.‘.  V¡×!3Ñ!3´CÓ!8ÀÐRZÔ[€KØ×ÑÓÐ€EØ
ˆe‰*€CØ˜eÑ$€KØ×%Ñ%¨OÐ%Ó<€JØ�^‰^Ó€FØ—‘˜F <Ñ0×9Ñ9ÀÐ9ÓPÐTZÑZÑ[€JÜ! *¨jÓ9�J€A€qˆ$Ü�\‰\Ø—y‘yØ!Ø˜‘K×&Ñ&¤uÓ-°Ñ5Ø˜‘K×&Ñ&¤uÓ-°Ñ5Ø�u‘:×$Ñ$¤UÓ+¨eÑ3Ø˜‘\×(Ñ(¬Ó/°%Ñ7Ø˜X™×-Ñ-¨gÓ6Ø˜8‘}×+Ñ+¬EÓ2ØØñó €Fó 3ˆØ�v  ¨˜oÑ.×7Ñ7Ó9Ñ9¸AÑ=ˆÜ"2°8Ó"<ˆ�&�˜ˆÒð 3ô !#§
¡
¨1¨cÓ 2Ð2´b·j±jÀÀCÓ6HÐ5HÑH€FÐÑØ�4ˆ<Ðr    c                ó*	  — t        | «      }|st        d«      ‚| j                  }| j                  dz  }t	        |D �cg c]  }|j                  «       j                  ‘Œ c}| j                  j                  «       j                  gz   «      }|j                  «       r€|j                  «       j                  |k\  rc|j                  «       rS|sQt        j                  |j                  d¬«      «      }|j                  d«      t        k(  rt        d|d   |d   |«      S t        | «      }|j!                  d	«      D �	�
ci c]  \  }	}
|	|
“Œ
 }}	}
|j"                  j%                  d
d
¬«       | j                  j%                  d
d
¬«       d }g }d}d}d}d}d}d}d }d }	 t'        |d«      D �]à  \  }}t)        ||j                  |j*                  |j,                  dd «      «      \  }
}|
j.                  rŒJ|t1        |
«      z  }t3        |
d   j5                  «       «      }|t7        |«      z  }|t7        |
d   j9                  «       «      z  }||z  }|t7        |
g d¢   j;                  d«      j5                  d¬«      j9                  «       «      z  }|
d   j=                  «       |
d   j	                  «       }}|€|nt=        ||«      }|€|nt	        ||«      }|j?                  |
«       |t1        |
«      z  }|dk\  s|t1        |«      k(  s�Œ`tA        jB                  |d
¬«      }tD        jF                  jI                  |d¬«      }|€"tK        jL                  ||jN                  d¬«      }|jQ                  |d¬«       |jS                  «        d}�Œã 	 |�|jU                  «        	 t        tW        jX                  «       j[                  «       |t1        |«      |jW                  «       j[                  «       |jW                  «       j[                  «       t7        t1        |«      «      ||||dddddœ}|j]                  t        j^                  |dd¬«      d¬«       ta        | |«       t        d
|t1        |«      |«      S c c}w c c}
}	w # |�|jU                  «        w w xY w)Nu   æ²¡æœ‰æ‰¾åˆ°æ²ªæ·±è‚¡ç¥¨æ—¥çº¿zprice_metadata.jsonúutf-8©ÚencodingÚschema_versionFr   r   rf   T)ÚparentsÚexist_okr   r   r¦   )Úopen_qfqÚhigh_qfqÚlow_qfqÚ	close_qfq)Úaxisr›   iðI )Úignore_index)Úpreserve_indexÚzstd)Úcompression)Úrow_group_sizeÚtdx_unadjusted_dayÚtdx_gbbq_category_1Úaffine_qfq_latest_trade_anchoruc   é•¿åŽ†å�²çŽ°é‡‘åˆ†çº¢å�¯èƒ½ä½¿æ—©æœŸå‰�å¤�æ�ƒä»·ä¸ºè´Ÿï¼›æ­¤ç±»åŒºé—´ä¸�å¾—ç›´æŽ¥è®¡ç®—æ”¶ç›ŠçŽ‡ã€‚)r»   Ú
build_dater   r   Úearliest_trade_dateÚlatest_trade_dateÚgbbq_xrxd_recordsÚgbbq_events_usedÚadjusted_stocksÚadjusted_rowsÚ non_positive_adjusted_price_rowsÚprice_sourceÚadjustment_sourceÚadjustment_modelÚwarningé   )Úensure_asciiÚindent)1r˜   rz   Údaily_price_pathÚ
report_dirr«   ÚstatÚst_mtimer|   ÚexistsÚjsonÚloadsÚ	read_textÚgetÚPRICE_SCHEMA_VERSIONr   rŠ   ÚgroupbyÚparentÚmkdirÚ	enumerater¶   r�   Úilocr7   r9   r   Úanyr   ÚsumÚleÚminrD   rƒ   ÚconcatÚpaÚTableÚfrom_pandasÚpqÚParquetWriterÚschemaÚwrite_tableÚclearr   r   ÚtodayÚ	isoformatÚ
write_textÚdumpsÚ_write_price_report)r‡   Úforcer–   ÚtargetÚmetadata_pathrw   Únewest_sourceÚmetadatarJ   rc   ÚframeÚgroupedÚwriterÚbufferÚbuffer_rowsÚ
total_rowsrÑ   rÐ   Úevents_usedÚnegative_adjusted_pricesÚearliestr°   r-   r²   Úused_adjustmentÚ
first_dateÚ	last_dateÚbatchÚtables                                r!   Úbuild_daily_pricer  Š   s2  € Ü˜Ó"€EÙÜÐ;Ó<Ð<Ø×&Ñ&€FØ×'Ñ'Ð*?Ñ?€MÜ¹%Ó@¹%°$˜Ÿ™›×-Ó-¸%Ñ@ÀH×DVÑDV×D[ÑD[ÓD]×DfÑDfÐCgÑgÓh€MØ‡}�}„˜6Ÿ;™;›=×1Ñ1°]ÒBÀ}×G[ÑG[ÔG]ÑfkÜ—:‘:˜m×5Ñ5¸wÐ5ÓGÓHˆØ�<‰<Ð(Ó)Ô-AÒAÜ# E¨8°FÑ+;¸XÀhÑ=OÐQWÓXÐXä˜Ó!€FØ.4¯n©n¸]Ô.KÔLÑ.K™{˜t Uˆt�U‰{Ð.K€GÑLØ
‡M�M×Ñ ¨tÐÔ4Ø×Ñ×Ñ d°TÐÔ:Ø€FØ!#€FØ€KØ€JØ€MØ€OØ€KØ ÐØ€HØ€FðÜ$ U¨A×.‰KˆE�4Ü+¨D°'·+±+¸d¿i¹iÈÏÉÐUVÐWXÐIYÓ2ZÓ[‰KˆE�4Ø�{Š{ØØœ#˜e›*Ñ$ˆJÜ" 5Ð)9Ñ#:×#>Ñ#>Ó#@ÓAˆOØœs ?Ó3Ñ3ˆOØœS Ð'7Ñ!8×!<Ñ!<Ó!>Ó?Ñ?ˆMØ˜4ÑˆKØ$¬¨EÒ2bÑ,c×,fÑ,fÐghÓ,i×,mÑ,mÐstÐ,mÓ,u×,yÑ,yÓ,{Ó(|Ñ|Ð$Ø$)¨,Ñ$7×$;Ñ$;Ó$=¸uÀ\Ñ?R×?VÑ?VÓ?X˜	ˆJØ%-Ð%5‘z¼3¸xÈÓ;TˆHØ"( .‘Y´c¸&À)Ó6LˆFØ�M‰M˜%Ô Øœ3˜u›:Ñ%ˆKØ˜gÒ%¨´#°e³*Ô)<ÜŸ	™	 &°tÔ<�ÜŸ™×,Ñ,¨UÀ5Ð,ÓI�Ø�>Ü×-Ñ-¨f°e·l±lÐPVÔW�FØ×"Ñ" 5¸Ð"ÔAØ—‘”Ø’ñ- /ð0 ÐØ�L‰L�Nô /Ü—j‘j“l×,Ñ,Ó.ØÜ�e“*Ø'Ÿ}™}›×8Ñ8Ó:Ø#Ÿ[™[›]×4Ñ4Ó6Ü ¤ V£Ó-Ø'Ø*Ø&Ø,DØ,Ø2Ø<Øxñ€Hð" ×ÑœTŸZ™Z¨¸uÈQÔOÐZaÐÔbÜ˜ (Ô+Ü˜D *¬c°%«j¸&ÓAÐAùòG Aùó MøðL ÐØ�L‰L�Nð ús   ½!Q2Ä:Q7ÆE*Q= ÌBQ= Ñ=Rc                óÂ   — d|d   › d|d   › d|d   › d|d   › d	|d
   › d|d   › d|d   › d|d   › d|d   › d|d   › d�}| j                   dz  j                  |d¬«       y )Nu+   # M1 è¡Œæƒ…æ ‡å‡†åŒ–æŠ¥å‘Š

ç”Ÿæˆ�æ—¥æœŸï¼šrË   u     
è‚¡ç¥¨æ•°ï¼šr   u     
æ—¥çº¿è®°å½•ï¼šr   u     
æ—¥æœŸèŒƒå›´ï¼šrÌ   u    è‡³ rÍ   uü  

## 1. ä»·æ ¼å�£å¾„

- åŽŸå§‹è¡Œæƒ…ï¼šé€šè¾¾ä¿¡æœªå¤�æ�ƒæ—¥çº¿ã€‚
- é™¤æ�ƒé™¤æ�¯ï¼šé€šè¾¾ä¿¡ `gbbq` ä¸­ category=1 çš„äº‹ä»¶ã€‚
- å‰�å¤�æ�ƒæ¨¡åž‹ï¼šä»¿å°„å�˜æ�¢ `adjusted = A Ã— raw + B`ï¼Œé”šå®šæ¯�å�ªè‚¡ç¥¨æœ€æ–°äº¤æ˜“æ—¥ã€‚
- é™¤æ�ƒäº‹ä»¶å�ªå¯¹äº‹ä»¶æ—¥å‰�çš„äº¤æ˜“æ—¥ç”Ÿæ•ˆï¼›æ™šäºŽæœ€æ–°äº¤æ˜“æ—¥çš„æœªæ�¥äº‹ä»¶ä¸�ä¼šæ��å‰�æ–½åŠ ã€‚
- è¾“å‡ºå�Œæ—¶ä¿�ç•™åŽŸå§‹ OHLCã€�å‰�å¤�æ�ƒ OHLCã€�æˆ�äº¤é‡�ã€�æˆ�äº¤é¢�å�Š A/B ç³»æ•°ã€‚

## 2. è¦†ç›–ç»“æžœ

| æŒ‡æ ‡ | æ•°é‡� |
|---|---:|
| gbbq æ²ªæ·±é™¤æ�ƒäº‹ä»¶ | rÎ   u     |
| å®žé™…å�‚ä¸Žå¤�æ�ƒäº‹ä»¶ | rÏ   u&    |
| å�‘ç”Ÿè¿‡ä»·æ ¼è°ƒæ•´çš„è‚¡ç¥¨ | rÐ   u&    |
| ä½¿ç”¨é�žå�•ä½�ç³»æ•°çš„æ—¥çº¿ | rÑ   u,    |
| å‰�å¤�æ�ƒ OHLC å�«é�žæ­£æ•°çš„æ—¥çº¿ | rÒ   u   |

## 3. ä½¿ç”¨é™�åˆ¶

é•¿åŽ†å�²ç´¯è®¡çŽ°é‡‘åˆ†çº¢å�¯èƒ½ä»¤æ—©æœŸå‰�å¤�æ�ƒä»·æ ¼ä¸ºé›¶æˆ–è´Ÿæ•°ã€‚è¿™æ˜¯ä»¿å°„å‰�å¤�æ�ƒçš„æ•°å­¦ç»“æžœï¼Œä¸�æ˜¯åŽŸå§‹è¡Œæƒ…é”™è¯¯ï¼›ç›¸å…³åŒºé—´ä¸�å¾—ç›´æŽ¥è®¡ç®—æ”¶ç›ŠçŽ‡ã€‚å�Žç»­å› å­�å¼•æ“Žä¼šåœ¨ä»·æ ¼é�žæ­£æ—¶è‡ªåŠ¨ç½®ä¸ºç¼ºå¤±ã€‚
u   M1_è¡Œæƒ…æ ‡å‡†åŒ–æŠ¥å‘Š.mdr¸   r¹   )rÛ   rø   )r‡   rÿ   Úreports      r!   rú   rú   Ö   s×   € ðà˜Ñ&Ð'ð (Ø�hÑÐ ð !Ø˜Ñ Ð!ð "ØÐ.Ñ/Ð0°°hÐ?RÑ6SÐ5Tð Uð &Ð&9Ñ:Ð;ð <Ø&Ð'9Ñ:Ð;ð <$Ø$,Ð->Ñ$?Ð#@ð A$Ø$,¨_Ñ$=Ð#>ð ?*Ø*2Ð3UÑ*VÐ)Wð Xð/€Fð: ×ÑÐ8Ñ8×DÑDÀVÐV]ÐDÕ^r    )r(   ú
np.ndarrayÚreturnr  )rI   r  rJ   úpd.DataFramer  z"tuple[np.ndarray, np.ndarray, int])r‡   r   r  r  )r‡   r   r  z
list[Path])rw   r   rJ   r  r  ztuple[pd.DataFrame, int])F)r‡   r   rû   r   r  r   )r‡   r   rÿ   zdict[str, object]r  ÚNone)"Ú
__future__r   Údataclassesr   rh   r   rß   Úpathlibr   rv   Únumpyr$   Úpandasrƒ   Úpyarrowrî   Úpyarrow.parquetÚparquetrñ   Úconfigr   Útdxr	   rã   r1   r¨   r   r*   r]   rŠ   r˜   r¶   r  rú   r   r    r!   Ú<module>r     s�   ðÝ "å !Ý Û Ý Û 
ã Û Û Ý å Ý ð Ð ØˆB�H‰Hò ó €	ñ �$Ô÷ð ó ðóXó
"/óJ8ó4óô:IBôX_r    