
    էj                        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ej        
                    ej                            e                               ddlZddlmZmZ ddlmZ d Zd Zedk    r e             dS dS )uy  键脆弱度分析（Mac 侧）：为每个 (code,buy_date) 键算出"最紧约束余量"，
用于跨机键集合差异（对端 5786 vs 本端 5776: 11/1）的归因。

做法: 对每个键复走 chain_for_buy 的判定链，记录各约束的**相对余量**:
  m_t0    = pct[t0] - (涨停阈值 - 0.05)                 非负即为 t0 成立（0 附近 = 脆弱）
  m_tb    = close[tb]/(p0*(1+bs)) - 1                   >0 即突破成立
  m_ta    = (次低合格 ta 的 close - 选中 close)/选中 close   越小 = ta 选择越不稳（数据微动即换日）
  m_vol   = 各量能过滤(t0_vol_min/max, tb_vol_min/max, shrink)的归一化余量最小者
  m_min   = 上述最小值（越小越脆弱）
输出: --out csv（code,pool,buy_date,tb,t0,m_t0,m_tb,m_ta,m_vol,m_min）+ 脆弱榜 topN 打印

用法: python chk_key_fragility.py --out /tmp/key_fragility.csv [--top 25]
    N)COMBO
SELL_COMBO)chain_for_buyc                 2   |                      d                              d          } | d                             t                    j        }| d                             t                    j        }| d                             t                    j        }| d         j        }|                    d          rd}n|                    d	          rd
}nd}|d         |d         |d         }}
}	t          |d                   t          |d                   t          |d                   }}}|                    d|                    dd                    }|                    dd          }|                    dd          }|                    dd          }|                    dd          }|                    dd          }t          | ||t          |                    \  }}}|d S ||         }||         }t          ||         |dz
  z
            }t          ||         |d|z   z  z  dz
            }g }t          |dz   t          ||z   dz   t          |                               D ]}d}|	dv r||         ||
z  k     rd}|	dv rf||k    r-|t          d||z
            |                                         n|d |                                         }|dk    r||         ||
z  k     rd}|r)||         |k     r|                    ||         |f           |                                 t          |          d k    r:t          |d         d         |d         d         z
  |d         d         z            } nt"          j        } g }!|dk    r|d!k    r-|t          d|d!z
            |                                         n|d |                                         }"|dk    r$|"dk    r|!                    ||"|z  z  dz
             |dk    r$|"dk    r|!                    d||"|z  z  z
             ||dz   k    r||dz   |                                         n||         }#|dk    r$|!                    ||         ||z  z  dz
             |dk    r$|!                    d||         ||z  z  z
             |dk    r*|#dk    r$|!                    ||         |#|z  z  dz
             |dk    r*|#dk    r$|!                    d||         |#|z  z  z
             |!                    |	d"k    rd||         ||
z  z  z
  n;d||         |t          d||z
            |                                         |
z  z  z
             |!r!t          t#          j        |!                    nt"          j        }$d# ||| |$fD             }%t          ||                   t          ||                   ||| |$|%rt          t          |%                    nt"          j        d$S )%N
trade_dateT)droppct_chg	hfq_closevol)6000g#@)3068gfffff3@gfffff=@vol_base
vol_shrinkbreak_strength
shrink_winbreak_upma_n
t0_vol_maxzt_vol_filterr   
t0_vol_ming        	tb_t0_min	tb_t0_max
tb_vol_min
tb_vol_maxg?   F)ztor)maNr      
   r   c                 h    g | ]/}|t          |t                    rt          j        |          -|0S )N)
isinstancefloatnpisnan).0xs     //Users/xpresso/zt_app/code/chk_key_fragility.py
<listcomp>zmargins.<locals>.<listcomp>X   s:    
p
p
p1=*UVX]J^J^=cecklmcncn=1===    )tbt0m_t0m_tbm_tam_volm_min)sort_valuesreset_indexastyper%   values
startswithintgetr   strrangeminlenmaxmeanappendsortr&   nannanmin)&dcodebpbuy_datepctcloser   datesbtvbvsbsswbumnztvt0mintbt0_mintbt0_maxtbmintbmaxt0itaitbip0v0r/   r0   candsj	shrink_okmr1   volsma10zcbr2   arrs&                                         r*   marginsrf      s   	l##//T/::A
I,

e
$
$
+CkN!!%((/E
E(//%
 
 
'ClO"E|$$ 		&	& JL!126F3GBBR%&&BzN(;(;SF__BB
&&rvvoq99
:
:CFF<%%Evvk3''Hvvk3''HFF<%%EFF<%%E!!T2s8}}==MCc
{t	sB	SBSR$Y'((DsrQV}-122DE37Cb1c!ff5566 	( 	(	#a&27"2"2I01RC1r6NN1$%**,,,S!W\\^^A1uuQ!b& 	 	(qBLL%(A'''	JJLLL
5zzQeAhqkE!HQK/58A;>??vD	Avv472IIC38$$S()..0003tt9>>CSCS199KKeem,q011177uqyyKKB%#+..///(+cAgSq""$$$3s8a<<KKCBM2Q6777a<<KKCHX66777199aKKCBJ/!3444199aKKCHU
33444d

ACBG,,,CHPSTWXY[^ac[cTdTdehThPiPnPnPpPpsuPuDv@vwww&*6E")D//"""E
p
ptT4/
p
p
pCeCj//U3Z$PT^b%GU3s88___I I Ir,   c                     t          j                    } |                     dd           |                     dt          d           |                     dd d	           |                                 }d
d l}g }t          D ]}t          |         }t          |         }t          j	        |          \  }}t          j
        ||          }	|                    ||||	|d         |d         |d         |d         |d         d
  
        }
|
D ]c}t          ||d                  |d         ||d                   }|/|                    |d         |t          |d                   d|           dt          | dt!          |           dd           t#          j        |                              d          }|                    |j        d           t          dt!          |           d|j                    t          d           t          |                    |j                                      d                     d S )Nz--outz/tmp/key_fragility.csv)defaultz--top   )typerh   z--keys-fromu0   只分析该 csv 里的键(code,buy_date[,pool]))rh   helpr   profitddmodestophold20240201)rn   ro   rp   startrF   rH   )rF   poolrH   z: u    键已算余量T)flushr3   F)indexu   
共 u    键 -> uH   
最脆弱 25 键（m_min 越小越易因跨机数据微动而增减）:)argparseArgumentParseradd_argumentr9   
parse_argsideal_enginer   r   g	load_pool	build_sigideal_backtestrf   rA   r;   printr>   pd	DataFramer4   to_csvoutheadtop	to_string)apaierowsrs   rG   scmembersdailiessigtradestra   dfs                 r*   mainr   ]   s@   		 	"	"BOOG%=O>>>OOG#rO222OOM46hOiii
AD B B4[z$/";t,,k'2&&""4'38bQUh(*6
F"V*\f # h h 	` 	`A&	*AfIr1Z=IIAyKK6Dc!J-FXFX^^\]^____44T444DAAAAA	d			'	'	0	0BIIae5I!!!	
+3r77
+
+AE
+
+,,,	
UVVV	"''!%..
"
"
"
/
/00000r,   __main__)__doc__rv   ossysnumpyr&   pandasr   pathinsertdirnameabspath__file__grid_orr{   scan_daily_tbr   r   plot_ideal_top10r   rf   r   __name__ r,   r*   <module>r      s                         27??27??8#<#<== > > >     + + + + + + + + * * * * * *AI AI AIH1 1 16 zDFFFFF r,   