
    j                         d Z ddlZddlZddlZddlZej                            dd           ddl	Z
ddlZddlmZmZ ddlmZ e
j        Zdddd	d
Zd Zd Zedk    r e             dS dS )up   重建基准池v4: v2定稿四池回测交易 → 11特征CSV → 强度模型(4768笔rho权重+分池百分位)    Nz/tmp)COMBO
SELL_COMBO)chain_for_buyu	   沪深300u	   中证500u
   中证1000u
   中证2000)hs300zz500zz1000zz2000c                    | d                              t                    j        }| d                              t                    j        }| d                              t                    j        }t          j        |                              d                                          j        }t          j        |                              d                                          j        }	t          j        |                              d                                          j        }
||         }|dk    r-|t          d|dz
            |                                         n|d|                                         }|dk    r-|t          d|dz
            |                                         n|d|                                         }t          ||                   |dk    rt          ||z            nt          j	        |dk    rt          ||         |z            nt          j	        t          ||         ||         z  d	z
            t          ||z
            t          ||         ||         z  d	z
            t          ||z
            t          |d	z   |z
            |dk    rt          ||         |z            nt          j	        |d
k    r<||d
z
           dk    r-t          ||         ||d
z
           z
  ||d
z
           z            nt          j	        t          ||         |	|         cxk    r|
|         k    rn nd	n%||         |	|         cxk     r|
|         k     rn ndnd          d}|S )u.   11特征, 与scan_daily_tb.find_tb_today一致	hfq_closevolpct_chg   
      r   N      )	f1_t0_pctf2_t0_vol_ratiof3_ta_shrinkf4_ta_drawdown	f5_ta_gapf6_tb_strength	f7_tb_gapf8_chain_len	f9_tb_volf10_tb_ma5_slopef11_tb_ma_align)
astypefloatvaluespdSeriesrollingmeanmaxnpnan)dt0itaitbit0dcloser   pctma5ma10ma20v0m10_t0m10_tbfs                  //Users/xpresso/zt_app/code/build_strength_v4.pyfeatsr8      s)   kN!!%((/E
E(//%
 
 
'C
I,

e
$
$
+C
)E


"
"1
%
%
*
*
,
,
3C9U##B'',,..5D9U##B'',,..5D	SB14SQb!!#%&++---DSD	@P@PF14SQb!!#%&++---DSD	@P@PF3s8__17!5f---02Qc#hm,,,BFc
U3Z 7! ;<<39%%c
U3Z 7! ;<<39%%cAgm,,17!U3s8f,---ORVWxx\_`cfg`g\hkl\l\lE3s8c#'l#:c#'l"JKKKrtrx s3x$s)'G'G'G'Gd3i'G'G'G'G'GVYZ]V^aefiajVvVvVvVvmqrumvVvVvVvVvVvrr}~  A  A	 	A H    c                  @  )*+, g } i }t           D ]}t           |         }t          |         }||vrt          j        |          ||<   ||         \  }}t          j        ||          }t          j        |||||d         |d         |d         |d         |d         d
  
        }|D ]}	||	d                                      d	                              d
          }
t          |
|	d         |t          |	d                             \  }}}|it          |
|||d           }|                     |	d         |t          |	d                   t          |	d                   |	d         d|           t          t          |          dt          |           dd
           t!          j        |           }t          dt          |           d           |                    t&           dd           d t)          dd          D             )d |j        D             )ddlm} t          d           )D ]}g }t           D ]}||d         |k                                 |dg           }t          |          d!k    rH|                    t3          |                    ||         |d                   j        d"                     t          | d#|                    ||                                         |d         ||                                                            j        d$d%|            i ,)D ]o}||                                         |d                                         z  }|                    |j        ||f         |j        |df                   j        ,|<   pi *t           D ]}||d         |k             }i })D ][}|||                                                  |         +t          +          d"k    r+fd&t)          d'          D             nd ||<   \t          |          |d d(*|<   )*,fd)}|                    |d*          |d+<   t           D ]D}t?          ||d         |k             d+                                                    }|*|         d,<   E*fd-}|                    |d*          |d.<   d/d0d1d2}t          d3           g }|!                                D ]\  }\  }}||d.         |k    |d.         |k     z           }t          |          r| t          |           d4tE          j#        |d                   d5z  d6d7tE          j$        |d                   d5z  d6d8tE          j%        |d                   d5z  d6d9|d         dk    #                                d5z  d:d;}|                    |           t          |           dd l&}dd l'} t&           d<}!| j(        )                    |!          rd=|j*        vr	 t!          j+        |!          }"d|"j        v r9tY          |"d         -                                .                                          nd}#n# t^          $ r d}#Y nw xY w|#rt          d>|! d?|# d@|! dA|! dB	           d S ,*t          |          |dC}$ta          j1        |$te          t&           dDdE          dt          F           t          |          }%|                    d.dG          3                    ddgdHI          }t          |          |%k    r#t          dJ|%t          |          z
   dK           |                    |!d           t          dL           t           D ]}||d         |k             }|                    |d.         |d                   j        }&|d.         dMk    4                                r*||d.         dMk             d         #                                nd}'|d.         d!k     4                                r*||d.         d!k              d         #                                nd}(t          t          |          dN|&d$dO|'d5z  d6dP|(d5z  d6dQt          |           dR
           d S )SNprofitddmodestophold20240201)r=   r>   r?   startcode
trade_dateT)dropbuy_date	sell_dateret_net)rB   poolrE   rF   retz: u   笔)flushu   总交易: z/ideal_signal_features_v2.csvF)indexc                     g | ]}d | d	S )r6   _ ).0is     r7   
<listcomp>zmain.<locals>.<listcomp>A   s     ,,,!XXXX,,,r9   r      c                 <    g | ]}|                     d           |S )r6   )
startswith)rO   cs     r7   rQ   zmain.<locals>.<listcomp>B   s)    8881all3&7&78Q888r9   r   )statsu!   
特征 | 整体rho | (池内rho)rH   rI   )subset   r   u   : 整体z+.3fu    池内c                 T    g | ]$}t          t          j        |                    %S rN   )r    r'   nanpercentile)rO   qqs2s     r7   rQ   zmain.<locals>.<listcomp>W   s.    JJJ!eB,S!4455JJJr9   e   )npercentiles
raw_scoresc                     d}D ]f}t          j        | |                   r| d                  d         |         }|:t          j        || |                   dz  }||         |z  z  }g|S )Ng        rH   r_   g      Y@)r'   isnansearchsorted)rowsrU   qspfcolspools_mweightss        r7   	raw_scorezmain.<locals>.raw_scoreZ   s     	  	 AxA V%m4Q7BzCF++e3AaAAr9   )axisrk   r`   c                     | d                  d         }dt          j        || d                   z  t          |          z  S )NrH   r`   d   rk   )r'   rc   len)rd   distri   s     r7   final_scorezmain.<locals>.final_scorej   s=    s6{#L1R_T3{+;<<<s4yyHHr9   strength)F   rn   )rX   rs   )r   rX   )u   强u   中u   弱u   
分档统计(4768笔):u   笔 均rn   z+.1fu   % 高u   % 低u   % 胜z.0f%z/strength_baseline.csvz--forceu   
❌ 拒绝覆盖 u   : 现有文件含 uk    行未平仓(每日 scan 追加的近端信号)。
   覆盖会抹掉模拟盘信号源 —— 请先 `cp  u   .bak-$(date +%Y%m%d%H%M)` 并
   对 buy_date>=追加区间的行做回补(参考 2026-09-13 处置: 取旧文件该区间行按 (code,buy_date) 去重回补),
   确认无误再加 --force。)rj   poolsn_tradesrV   z/strength_model.jsonw)ensure_asciidefault)	ascendingfirst)rW   keepu    (去重) (code,buy_date) 重复 u    行已按强度保留u   
池内强度-收益rho:rs   z: rho=u    强均u   % vs 弱均z% (n=))5r   r   g	load_pool	build_sigieideal_backtestsort_valuesreset_indexr   strr8   appendprintPNro   r"   	DataFrameto_csvBASErangecolumnsscipyrV   dropnaround	spearmanrcorrelationnotnalocapplysortedtolistitemsr'   r%   r&   minsysospathexistsargvread_csvintisnasum	Exceptionjsondumpopendrop_duplicatesany)-rowscacherH   bpscmembersdailiessigtradestr)   r*   r+   r,   r6   dfrV   rU   rhossubokperrk   rp   rq   tiers	stats_txtnamelohire   _sys_os_bl_prev_openmodeln0rhostrongweakrh   ri   r\   rj   s-                                            @@@@r7   mainr   )   s
   DE ; ;4[z$/"u+d++E$K ;k'2&&"4'38bQUh]_`f]gnpqwnx  @B  CI  @J  R\  ]  ]  ] 	 	A&	"..|<<HHdHSSA)!QvYC*<N<NOOMCc{ac3--AKK6Dc!J-FXFX&)!K.&9&9!I,      	D--S[[---T:::::	d		B	
$B
$
$
$%%%II444EIBBB,,uQ||,,,E88
888E	
./// w w 	W 	WDRZ4'(//5z/BBC3xx"}}E%//#a&#e*"E"E"QSTUUVVVuuEOOBqELLNNBuIbekkmm<TUUauuuosuuvvvvG S SU[[]]RY__...__RVBE]BF2u94EFFR

G P PFt#$ 	e 	eAc!fllnn%a(CNQRUhhYZllJJJJuSzzJJJJ`dCFF!#hhs$OO
 
 
 
 
 
 
 hhyqh11B{O + +bFt+,[9@@BBCC&*l##I I I I I XXkX22BzNhw??E	
$%%%I++--  hr2"Z.B&2j>B+>?@s88 	  rS  r  r"'#e**=*=c*A  r  r  rRVTWX]T^M_M_`cMc  r  r  roqouvyz  wA  pB  pB  CF  pF  r  r  r  SV  W\  S]  ^_  S_  Re  Re  Rg  Rg  hk  Rk  r  r  r  rAQ!HHH
 "!!!!!!!
)
)
)C
xs 	 : :	K$$E6;u}6L6LCe))++//11222RSEE 	 	 	EEE	 	 8 8 8u 8 8NQ8 8TW8 8 8 9 9 9 F's2wwQZ[[EIeTT777==E[^____ 
RB	
e	4	4	D	DVU_L`gn	D	o	oB
2ww"}}SCGGSSSTTTIIcI	
%&&& o oFt#$ooc*os5z::F>A*oQS>S=X=X=Z=ZaS_*+E277999`a;>z?R;O:T:T:V:V]s3z?R'(/44666\]Dmmmmm&*mmmdSVhmmmbefibjbjmmmnnnno os   AY4 4ZZ__main__)__doc__pandasr"   numpyr'   r   r   r   insertgrid_orr   ideal_enginer   scan_daily_tbr   r   plot_ideal_top10r   r   r   r8   r   __name__rN   r9   r7   <module>r      s    v v                 6            + + + + + + + + * * * * * *v[LT`aa  4qo qo qof zDFFFFF r9   