
    ϧjA-                        d Z ddlZddlZddlZddlZddlZ ej        d           ddl	m
Z g dej        d<   dej        d<   ej                            dd           ddlZdd	lmZmZ dd
lmZ ddlmZ ej        Z ej        e d          Z e eed         ed                             Z e eed         ed                             Z ej         e e d                    Z!e!d         Z"e!d         Z#d Z$d Z%i Z&d Zi Z'eD ]RZ( ee(          \  Z)Z* e+  e,            j-        d e*.                                D                        Z/e/d         e'e(<   S e0e'.                                          Z1 e2de1 d           ddlm3Z3 d Z4g Z5 ej6        e dde7i          Z8d  eD             Z9eD ]Z(ee(         Z: ee(          \  Z)Z* ej;        e)e1          Z<dxZ=Z>d!Z?e*@                                D ]i\  ZAZBeBeBd"         e1k             ZC eDeC          dk    r' eEeCjF        d         d#                   ZG ejH        eG          rTe>d$z  Z>e?eGz  Z?eGd%k    re=d$z  Z=je=d&z  e>re?e>z  nejI        cZJZKe*@                                D ]\  ZLZMeLe<vr
eMN                    d"          O                    d'          ZB e3eBeLe:e1          ZPePsDePD ]ZQeQd         ZR e4eBeQd(                   ZS e4eBeQd)                   ZT e4eBe1          ZUeSeTeUA eeBeSeTeUd          ZVe5W                    e(eLeReSeTeUeVeX                    eLd*          eX                    eLd*          d+	            eYd, e5D                       ZZd- e5D             D ]ZQeQd.         ZVeZ e0d/e9e(                   z  eVd0<   eJeVd1<   eKeVd2<    e%e(eV          eQd3<   e*eQd4                  N                    d"          O                    d'          Z[e[e[d"         e1k             Z[ eDe[          r' eEe[jF        d         d5                   d$ej\        z   z  ndeQd6<    eEe*eQd4                  N                    d"          d7         jF        d                   eQd8<    e2ee(          d9eZ d:d           i Z]e5D ]3ZQeQd;         eQd4         fZ^e^e]vseQd3         e]e^         d3         k    reQe]e^<   4 e_e].                                          Z5i Z`eD ]_Z( e+d< e5D             d= d>          dd?         Zaeae`e(<   ear5 e2ee(          d@ead         d3         dAdBead         d3         dAd           `dC Zb ejc        dDE          Zdede                    d?dFdGdHI          Zf ege          D ]0\  ZhZ(edi                    dJehdKz   dLz  z   dMee(         dNdOdPdQR           1 ege          D ]?\  ZhZ( ejd?          D ],ZkekehcZlZmek eDe`e(                   k     r_e`e(         ek         ZQe&e(         d$         eQd4                  N                    d"          O                    d'          Zn ebefelemeQen           |edo                    efelemf                   Zpepi                    dKdKee(          dS eDe`e(                    dTdPdPdUdVdOW           epq                    g            epr                    g            epjs        .                                D ]Ztetu                    d           .AddXlvmwZw  ewdgdgdYdZdQd[d\]           ewdgdgd^d_d`a           ewdgdgdbd_dca           ewdgdgddd_dea          gZxedy                    exdfdFdgdhdij           edz                    dkdldmn            eDe5          Z{ eYdo e5D                       Z| eYdp e5D                       Z} eYdq e5D                       Z~e8dr                                         Ze8j        ej        dsf         Zedi                    dKdtdue1 dve{ dwe| dxe} dye~ dz eDe           d{eed|k                                             d}z  d~deed|k             dk                                    d}z  dAdeedk    ed|k     z                                           d}z  d~deedk    ed|k     z           dk                                    d}z  dAdeedk                                              d}z  d~deedk              dk                                    d}z  dAdddP eddVdd                     ed                    ddJdJddGdH           e dZ ej        ed            e2de d           dS )u  今日TB突破信号(明日开盘买入)按强度top10/池 交易详情图(40格模板v3)
与plot_holdings.py同布局: 列=池(左→右hs300/zz500/zz1000/zz2000), 行=强度(上→下递减)
只画 bd==最新交易日 的信号(明日买入), 非持仓图
    NAgg)STHeitizNoto Sans CJK SCzWenQuanYi Zen HeiSimHeizDejaVu Sanszfont.sans-serifFzaxes.unicode_minusz/Users/xpresso/zt_app/code)COMBOPN)chain_for_buy)featsz/stock_basic.pklts_codenameindustryz/strength_model.jsonweightspoolsc                     t           |          d         |         }|+|)t          |t                    rt          j        |          rdS t          t          j        ||          dz            S )Npercentiles      ?g      Y@)pools_m
isinstancefloatnpisnansearchsorted)poolfcvqss       0/Users/xpresso/zt_app/code/plot_signals_today.pypctr      s\    	}	%b	)B	zQY:a#7#7YBHQKKYsQ''%/000    c                      t           fdt          D                       }t                    d         }t          t	          j        ||          t          |          z  dz            S )Nc              3   b   K   | ])}t           |         t          ||                   z  V  *d S N)wr   ).0r   fdictr   s     r   	<genexpr>zstrength_of.<locals>.<genexpr>#   s<      ;;2aec$E"I...;;;;;;r   
raw_scoresd   )sumr"   r   r   r   r   len)r   r$   rawrss   ``  r   strength_ofr,   "   sa    
;;;;;;;;
;
;C	|	$BS))CGG3c9:::r   c                 f    | t           vrt          j        |           t           | <   t           |          S r!   )cacheg	load_poolr   s    r   loadr2   (   s*    5k$''d;r   c                 8    g | ]}t          |d                    S )
trade_date)set)r#   ds     r   
<listcomp>r7   1   s$     P P P!Q|_!5!5 P P Pr   u   目标交易日(最新): T)flush)find_tb_todayc                     |d S t          j        | d         j        t          |          k              d         }t	          |          rt          |d                   nd S )Nr4   r   )r   wherevaluesstrr)   int)d2date_strposs      r   idx_ofrC   8   sS    t
(2l#*c(mm;
<
<Q
?Cc((,3s1v;;;,r   z/strength_baseline.csvbuy_date)dtypec                     i | ]V}|t           t           d          |k                                 d                                                                          WS )r   rD   )bdf_refgroupbysizemean)r#   ps     r   
<dictcomp>rL   A   sO    bbbWX776?a/088DDIIKKPPRRbbbr   g        r4   pct_chg   g#@g      4@dropt0_dateta_date?)	r   coderD   t0itaitbifeatr   indc              #   <   K   | ]}|d          t           k    dV  dS )r   rN   Nr1   r#   hs     r   r%   r%   h   s0      >>1AfI,=,=Q,=,=,=,=>>r   c                 4    g | ]}|d          t           k    |S r1   r1   r[   s     r   r7   r7   i   s&    777AQvY$%6%6a%6%6%6r   rX   g      ?f12_crowd_poolf13_pool_ztf14_pool_avgretstdrT   raw_openbuy_px	raw_closecuru   : 今日突破信号u   只r   c                 4    g | ]}|d          t           k    |S r1   r1   r[   s     r   r7   r7      s&    :::q&	T(9(9(9(9(9r   c                     | d         S )Nra    )xs    r   <lambda>rj      s
    !E( r   )keyreverse
   u    top10: 强度.0f~c                   $ |d         |d         |d         }}}|d         }|dk    rdn	|dk    rdnd	}	d
ddd|	         }
| ||f                              ddddgd          }t                              |d                   }t                              |d         |          }t          j        |d         j        |                   }|t          j        d          z
  }t          j        |d                   |k    }||                             d          }t          j
        t          |                    }|                                D ]\  }}|d         |d         |d         |d         f\  }}}}||k    }|rdnd}|                    ||g||g|d d!           |                    t          j        |d"z
  t#          ||          fd t%          t'          ||z
            d#          ||d$d%&                     |                    ||d'         |d d (           |                                d         }|                                d         }|dd)f|d*d+f|dd,ffD ]\  }}}t-          |d         j        |                   }t          j        |d         j        |k              d         } t          |           r}|                    | d         |d-d.d/0           |                    | d         |d-d.d/0           |                    | d         |||z
  d1z  z   |d2|d3d4t7          d5d d6d78          9           |d:         }!|                    |!|d;         d<d=d>d?d5d/@           |                    dA|d;         dB|!|d;         fdCdDd2d3d=d4E           |                    |dF          dG|dH          dI|dJ         d dK          dLt>          |dM                   dNdOd4P           |                    dQdRdS|dTdG|	 |j         dUd4dVdW|
t7          d5dX|
d/dYZ          [
  
         g }"|||fD ]w}t-          |d         j        |                   }t          j        |d         j        |k              d         } t          |           r|"!                    | d         |f           x|"!                    |!|j        d:         d         f           tE          tG          d\ |"D                                 }#t7          |"          $|$                    |#           |$                    |#           |%                    $fd]|#D             d?d^_           |&                    d`a           |&                    dbc           |&                    dc           |'                    ddde           |'                    ddde           d S )fNrU   rV   rW   ra   U      强      中   弱z#E91E63#FF8F00z#7f8c8d)rr   rt   ru      rN   g@gQ?)height_ratioshspacer   )sharexr4      )daysTrO   rb   raw_highraw_lowrd   #e74c3cz#2ecc71gffffff?)color	linewidthzordergffffff?g{Gz?g333333?   )	facecolor	edgecolorr   r   vol)r   alphawidthT0#1565C0tatb--?皙?)r   	linestyler   r   g
ףp=
?   centerboldwhitenoneg333333?)r   r   r   pad)fontsizer   ha
fontweightbboxr8   re   o#2c3e502      )markerr   sr   
edgecolors
linewidthsu   今收z.2fzoffset points)r   i)
textcoordsxytextr   r   r   r   r      ·rY   
rT   	    r   u    明日开盘买入g      !@)r   r   g\(\?g{Gz?u   强度rn   g      @rightbottomg333333?g      ?)r   r   r   r   r   )	transformr   r   r   var   r   c              3       K   | ]	\  }}|V  
d S r!   rh   )r#   rK   _s      r   r%   zdraw_holding.<locals>.<genexpr>   s&      //TQq//////r   c           	      x    g | ]6}|         d d          d|         dd          d|         dd          7S )rw   r{   -r   Nrh   )r#   rK   labss     r   r7   z draw_holding.<locals>.<listcomp>   sS    WWWADGAaCLGG471Q3<GG$q'!""+GGWWWr   -   )r   rotationF)labelbottom   )	labelsizegQ?)r   )(subgridspecfigadd_subplotpd	Timestampiloc	Timedeltato_datetimereset_indexr   aranger)   iterrowsplot	add_patchplt	Rectangleminmaxabsbarget_ylimr>   r<   r=   axvlinetextdictscatterannotate	set_titler   	transAxesappendsortedr5   
set_xticksset_xticklabelstick_paramsgrid)%gsrowcolr\   r6   rU   rV   rW   ra   tiertier_cgssaxaxvt0d	win_startmasksubri   xirr   hiloc_upr   ymaxyminidxtxtdt_srB   xlast	key_ticksticksr   s%                                       @r   draw_holdingr      sd   eHah%cC
E(C2II55SBYYEEEDyCCDIF
S#X,
"
"1aQx
"
M
MC	Q	 	 B
//#a&/
,
,C
,q+C0
1
1Cbl****I>!L/**i7D
D'

4

(
(C
	#c((A A AA*q}a	lAkNR2r21W.		Y
R2r(%3qIII
S]BIs1bzz#:CSa[[RVAWAWchty  FI  RS  T  T  T  	U  	U  	UAeHEC@@@@;;==D;;==D )T2S)T4JSR[]aLbc X XUC1\?',--hs<(/4788;s88 	XJJs1vUdcQTJUUUKKAetsRUKVVVGGCFDD4K4#77qPUZbousfRUVVV  X X X bEEJJuahs)r!X_loJpppKK'5'''%5):_grs  yA  IR  _eK  f  f  fLLAfI__5__QvYrr]__R&	]___jm  {AL  B  B  BGGD$2222D22blUXek86wVZflx{  BE  9F  9F  9F  G G G IS# - -1\?',--hs<(/4788;s88 	-c!fd^,,,eQVBZ567773//Y/////00E	??DMM%NN5WWWWQVWWWbcnpqqqNNuN%%%NNQNOOaO   GGDGHHTHr   )      )figsizer{   g(\?g)\(?)ry   wspaceg?r   gQ?gI+?   r   r   r   )r   r   r   r   u   
今日无信号
(当前u   只)   z#999)r   r   r   r   r   )Line2Dr   r"   r   u   今日收盘(参照))r   r   markerfacecolor
markersizelabelr   r   u   T0涨停日)r   r   r   r   u   ta缩量回调日rv   u   tb突破日zlower center   r   )r   g~jt?)handleslocncolr   
framealphabbox_to_anchorub   四池今日TB突破信号(明日开盘买入)强度Top10共40只: 强度v6分档标注(右上角)   gCl?)r   yc              #   2   K   | ]}|d          dk    dV  dS )ra   rq   rN   Nrh   r[   s     r   r%   r%      s*      55Qah"nnqnnnn55r   c              #   F   K   | ]}d |d         cxk    rdk     n ndV  dS )rs   ra   rq   rN   Nrh   r[   s     r   r%   r%      sG      77!25#6#6#6#6B#6#6#6#6#6A#6#6#6#677r   c              #   2   K   | ]}|d          dk     dV  dS )ra   rs   rN   Nrh   r[   s     r   r%   r%      s*      221AeHrMMQMMMM22r   strengthretgK?u   今日(u   )TB突破信号共u   只: 强u    中u    弱u      |   分档(全u   笔): 强≥85均rq   r'   z+.1fu   %胜u   % 中30-85均rs   u   % 弱<30均u%   %   |   买入门槛=强档线: ≥85g      '@z#f8f8f8r   zround,pad=0.4)r   r   r   boxstyle)r   r   r   g=
ףp=?gQ?)topr   leftr   ry   r   z$/backtest_zt_signals_today_top10.png   )dpiu   今日信号top10图: )__doc__pandasr   numpyr   jsonsys
matplotlibusematplotlib.pyplotpyplotr   rcParamspathinsertgrid_orr/   scan_daily_tbr   r   plot_ideal_top10r   build_strength_modelr	   BASEread_picklesbr   zipname_mapind_mapr2   openmodelr"   r   r   r,   r.   	all_datesr   membersdailiesr   r5   unionr=   datesr   targetprintr:   rC   holdingsread_csvr>   rG   pool_avg_sigbpactive_membersactivepzpcpsitemscode2r@   rows2r)   r   r   ppr   nanp_ztp_avgrT   d0sort_valuesr   hitsr\   bdrU   rV   rW   fr   getr(   
n_sig_poolrowsSLIPdedupklistsamplesphr   figurer   add_gridspecr   	enumeratepir   rangejr   r   r6   r   r   r   
set_yticksspinesspset_visiblematplotlib.linesr   leglegendsuptitlen_totaln_strongn_midn_weakdropnabs_r   indexrt_rJ   subplots_adjustoutsavefigrh   r   r   <module>re     s                        
u         "o"o"o %*! " / 0 0 0     # # # # # # # # * * * * * * & & & & & &vR^t---..4ByM2f:..//
$ss2i="Z.11
2
2	$$$4445566	)
.1 1 1; ; ;
 	   	    DtDzzGWF;3355; P Pw~~?O?O P P PQRREBiIdOO	Y	 	  *&**$ 7 7 7 7 ' ' ' ' ' '- - - 
"+555j#=N
O
O
Obb\abbb 1H 1HD	tBtDzzGWQgv..FKB	B]]__ 
 
	r2l#v-.3u::??U5:a=+,,28B<< 	
a
b99!GBt)7b2ggKD%MMOO i ibv^^L))5545@@}Rr622 	 		i 		iA:B&Qy\**C&Qy\**C&V$$C{ckS[b#sC..AOOT4RPS\_hk%&T30G0GPWP[P[\`bePfPfh h i i i i		i >>>>>>>J77777 	] 	]fI(33sL4F+G+GG
-$
;tQ''%qy!--l;;GGTGRRD&&01HKD		[eeDIaL455QVDDW[(56+77EEkRWXZ[\\%	ERX
:
::
:
:
:$GGGGG 		  A	
6AfIA~~5E!HUO33a4  ] ]D	::H:::@R@R\`	a	a	abecebe	fBGDM	 ]DOOAuOOOBrF5MOOOW[\\\\8 8 8t cj"""b!D66	%   } }HBHHTR#X),,eRXW]bjr{H||||	%   & &HBU2YY & &bSss74=!!!!a AdAqy)55lCCOOUYOZZALS#q!,,,,CH..BGGCD]]SSQUEWEW]]]HrTZ  \ \ \MM"r}}R000i&&(( & &u%%%%&& $ # # # # #vqcA3s#yUV^tuuuvqcA3i4}MMMvqcA3i4?RSSSvqcA3i4}MMMO 

3NRC`l
 m m m r}  DI  J  J  J
#h--355(5555577x77777	22222	2	2j  ""k#)U"# e  rv  r  r  r  r(  r  rX]  r  rci  r  r||  AD  }E  }E  r  r  X[  \_  ac  \c  Xd  Xi  Xi  Xk  Xk  lo  Xo  r  r  r  {~  B  DF  F  {G  HI  {I  zO  zO  zQ  zQ  RU  zU  r  r  r  hk  mp  rt  mt  wz  {}  w}  l~  h  hD  hD  hF  hF  GJ  hJ  r  r  r  VY  [^  `b  [b  eh  ik  ek  Zl  Vm  no  Vo  Uu  Uu  Uw  Uw  x{  U{  r  r  r  LO  PS  TV  PV  LW  L\  L\  L^  L^  _b  Lb  r  r  r  nq  ru  vx  rx  ny  z{  n{  mA  mA  mC  mC  DG  mG  r  r  r  r8$$f`cn}*~*~*~ 	 @ @ @   dU4X\  ] ] ]	333 CS     $s$$D 1 1 1 1 1 1r   