
    mAj                        d Z ddl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dlZej        ddej        fdZd Zd Zd Zed	k    rddlZd
dddddddddddddd
dddddddddddddddd ddd!d"ddd#d$d%ddd
dd&d'ddd(dd)d)dd*d+dd,Zi Ze                                D ]*\  ZZeevr ej        e          ee<   ee         \  ZZed-         Z ej        ee          Z  ej!        eeed.         ed/         ed0         ed1         ed2         e e3	  	        \  Z"Z# eeeee ed.         ed/         ed0         ed1         ed2         4	  	        Z$ ej%        e#          Z& ee$          Z' e(e d5 e)e"           d6e&d7         d8z  d9d:e'd;          d6e'd7         d8z  d9d<e'd=         d8z  d>d?e'd@         d8z  dAdBe'dC         dD           *dS dS )Eu{   
理想收益率引擎: 无限子弹, 所有信号都执行, 每笔交易收益率连乘
ideal_ret = prod(1+ret_net_i) - 1
    Nz/tmpmergec
                 	   t           t                      j        d |                                D                        }
fd|
D             }
t          |
          }i }|                                D ]<\  }}|D ]4\  }}||v r+|                    |g                               ||f           5=g }g }|
D ]}t          ||          }|dd         D ]}||d                  }||d         |k             }t          |          dk    r7|j	        d         }t          |d                   }|dxx         d	z  cc<   d}|d
k    rS||d         z  d	z
  |k    rd}nnt          |d                   |d         d	||n|z
  z  k    rd}nA|d         |	k    rd}n1|dk    rdt          |d                   |d         d	|z
  z  k    rd}nt          |d                   |d         d	||n|z
  z  k    rd}n|d         |	k    rd}n|dk    rvt          |d                   |d         d	|z
  z  k    rd}n|(t          |d                   |d         d	|z
  z  k    rd}no||d         z  d	z
  |k    rd}nZ|d         |	k    rd}nKt          |d                   |d         d	|z
  z  k    rd}n#||d         z  d	z
  |k    rd}n|d         |	k    rd}t          |d         |          |d<   |r||d         z  d	z
  t          j        t          j        z   dt          j        z  z   z
  }t          |d                   }|                    |d         |d         ||d         |||d         |d           |                    |           t          |                    |g           d           }d |D             }|D ]\  }}||vr
||v r||         }||d         |k             }t          |          dk    r=t          |j	        d         d                   }t          |j	        d         d                   } |dk    s| dk    r|                    |||d	t          j        z   z  |d	t          j        z   z  | d	t          j        z   z  | dd           ؐ|S ) uY   无限子弹版: 不限制仓位, 所有信号都买入, 每笔独立卖出, 返回tradesc                 8    g | ]}t          |d                    S )
trade_date)set).0ds     ideal_engine.py
<listcomp>z"ideal_backtest.<locals>.<listcomp>   s$    $T$T$TaS<%9%9$T$T$T    c                      g | ]
}|k    |S  r   )r   xstarts     r
   r   z"ideal_backtest.<locals>.<listcomp>   s    444qer   Ncoder   r   	hfq_closehold_n   Abuy_jprofithfq_lowstoptimeoutB
high_sincetrailCdd   	raw_closebuy_datefill_px)r   r"   	sell_date	buy_price
sell_priceret_net	hold_daysreasonc                     | d         S )Nr   r   )r   s    r
   <lambda>z ideal_backtest.<locals>.<lambda>J   s
    ! r   )keyc                     h | ]
}|d          S )r   r   )r   ps     r
   	<setcomp>z!ideal_backtest.<locals>.<setcomp>K   s    333Aai333r   raw_openhfq_open)r   r"   r%   r#   r   r   r   )sortedr   unionvaluesitems
setdefaultappendactive_memberslenilocfloatmaxgCOST_BUY	COST_SELLSLIPremoveget)!poolmembersdailiessigr   r   r   moder   hold	all_datesdate_setsig_by_dater   bsbdt0d	positionstradesdateactiveposr	   rowsrcursellnet_retfillcands
held_codesr#   r   s!         `                          r
   ideal_backtestr\      sv   {suu{$T$T7>>CSCS$T$T$TUVVI4444I444I9~~HKIIKK C Cb 	C 	CIRX~~&&r2..55tSkBBB	C IF CA CA..QQQ< .	& .	&CF$AQ|_,-D4yyA~~	!A+''CMMMQMMMDs{{W%)V33#DD1Y<((CLAIY_a<b,ccc!DD]d**$D9&&#l*;q6z*JJJ"DD1Y<((CLAIY_a<b,ccc!DD]d**$D9&&#l*;q2v*FFFDD%%)*=*=WQRUYQYAZ*Z*Z!DD3w<'!+v55#DD]d**$D9&&#l*;q2v*FFFDD3w<'!+v55#DD]d**$D #C$5s ; ;C &W-1aj1;6NQRUVU[Q[6[\Q{^,,s6{J^b,/	N$*1HY]_ _ ` ` `   %%%{tR00nnEEE33333
 	A 	AID#6!!z!!AQ|_,-D4yyA~~DIaL455G$)A,z233E!||uzzd7VWZ[Z`V`Ka)0AJ)?%STWXW]S]J^,1Q@ @ A A A A	A  Mr   c                     |d d         }d }t          |                                           D ]}|d d         |k    r|}|r"|                     |t                                nt                      S )N   )r2   keysrB   r   )rD   date_strymbestms        r
   r8   r8   ^   sp    	"1"BDGLLNN##  RaR5B;;D'+67;;tSUU###6r   c                 >    | sdS d}| D ]}|d|d         z   z  }|dz
  S )u%   理想收益率 = prod(1+ret_net) - 1        g      ?r   r'   r   )rP   rU   ts      r
   	ideal_retrg   f   sA     sA    	a!I,s7Nr   c                    d | D             }t          |          }|dk    rddddddS d |D             }d |D             }|rNt          j        |          dk    r6t          j        |          t          t          j        |                    z  nt	          d          }|t          |           t          |          |z  t	          t          j        |                    t	          |          dS )Nc                     g | ]
}|d          S )r'   r   )r   rf   s     r
   r   z full_metrics.<locals>.<listcomp>p   s    )))QAiL)))r   r   )rP   	total_retwin_rateavg_retpl_ratioc                     g | ]
}|d k    |S r   r   r   r   s     r
   r   z full_metrics.<locals>.<listcomp>t   s    %%%!q1uuAuuur   c                     g | ]
}|d k    |S ro   r   rp   s     r
   r   z full_metrics.<locals>.<listcomp>u   s    (((Aaar   inf)r9   npmeanabsr;   rg   )rP   retsnwinslossespls         r
   full_metricsr{   o   s    ))&)))DD		AAvv!qVWXXX%%t%%%D(((((F17	bBGFOOq<P<PRWV__--	-	-V[\aVbVbBi&7&7SYYQR]RWT]]++rD D Dr   __main__maNr    g333333?      re   g      @)vol_basema_n
vol_shrink
shrink_winbreak_upbreak_strengthzt_vol_filterg?g333333?gffffff?
   r   )bpr   r   r   rH   rG      g?   g{Gz?g      @g333333?-   org?g{Gz?g      @gQ?g?   g      ?   g      ?gGz?   r   )hs300zz500zz1000zz2000r   r   r   rG   r   rH   )rG   r   rH   rF   cache)rG   r   rH   u	   : 实盘 u   笔 收rj   d   z+.1fu   % | 理想 rP   u   % 胜rk   z.0fu   % 均rl   z+.2fu   % 盈亏比rm   z.2f)*__doc__pandaspdnumpyrs   jsonossystimepathinsertgrid_orr=   
START_DATEMAX_HOLDr\   r8   rg   r{   __name__	verify_orvfCOMBOSr   r5   rC   c	load_poolrD   rE   r   	build_sigrF   full_backtesttrades_requitytrades_imetricsmrmiprintr9   r   r   r
   <module>r      s                            6       BC,U\cgnonx P P P Pd7 7 7  	D 	D 	D z%*ASXYgi  ~A  TW  X  X  dh  pt  ~B  LN  X[  \  \%*BcYZhj  C  VY  Z  Z  fj  rv  @D  NP  Z]  ^  ^&*BdZ[ij  C  VY  Z  Z  fj  rv  @D  NP  Z]  ^  ^&+RsZ[ij  B  UX  Y  Y  ei  qu  C  MO  Y\  ]  ]	 F E<<>> e eau%!+d++E$K ;tWak'2&&+2+D"ak1T7QRSYQZabciajqrsyqz  AD  LQ  R  R  R&!>$#q{AdGZ[\bZcjklrjsz{  }C  {D  E  E  ERZ\(##  d  dH  d  dboc6I  d  d  d[]^f[g  d  dprs~p  AD  qD  d  d  d  PR  S]  P^  _b  Pb  d  d  d  mo  py  mz  {~  m~  d  d  d  PR  S]  P^  d  d  d  	e  	e  	e  	e- e er   