
    bAj[                     n    d Z ddlmZ ddlmZ ddlZddlZddl	m
Z
  e
e      Z G d d      Z e       Zy)z2Statistical and quantitative finance calculations.    )Decimal)AnyN)
get_loggerc                   *   e Zd ZdZdej
                  dej
                  fdZdej
                  dej
                  fdZdej
                  defdZ	dej
                  defdZ
dej
                  defd	Zdej
                  defd
ZdededefdZdej
                  deeef   fdZdej
                  dej
                  defdZdej
                  deeef   fdZdej
                  defdZd-dej
                  dededefdZd-dej
                  dededefdZdee   defdZdee   defdZdee   defdZd.deded ed!edef
d"Zd#ed$ej
                  defd%Zd/d$ej
                  d&edeeef   fd'Zdee   d(ee   d)ed*edeeef   f
d+Zy,)0StatisticsServicez<Mathematical and statistical formulas for trading decisions.pricesreturnc                 >    |j                         j                         S N)
pct_changedropnaselfr   s     IC:\xampp\htdocs\tradingbinance\backend\app\services\statistics_service.pycalculate_returnsz#StatisticsService.calculate_returns   s      "))++    c                 l    t        j                  ||j                  d      z        j                         S )N   )nplogshiftr   r   s     r   log_returnszStatisticsService.log_returns   s'    vvfv||A./6688r   datac                 4    t        |j                               S r   )floatmeanr   r   s     r   r   zStatisticsService.mean   s    TYY[!!r   c                 4    t        |j                               S r   )r   medianr   s     r   r   zStatisticsService.median   s    T[[]##r   c                 4    t        |j                               S r   )r   stdr   s     r   std_devzStatisticsService.std_dev       TXXZ  r   c                 4    t        |j                               S r   )r   varr   s     r   variancezStatisticsService.variance    r#   r   startendc                 $    |dk(  ry||z
  |z  dz  S )Nr           d    )r   r'   r(   s      r   
pct_returnzStatisticsService.pct_return#   s     A:eu$s**r   returnsc                     |j                   rdddS |dkD  j                         t        |      z  }t        |      t        d|z
        dS )Ng      ?)updownr   r   )emptysumlenr   )r   r.   r0   s      r   up_down_probabilityz%StatisticsService.up_down_probability(   sF    ==s++k 3w</Biq2v77r   series_aseries_bc                     t        j                  ||gd      j                         }t        |      dk  ryt	        |j
                  d d df   j                  |j
                  d d df               S )Nr   )axis   r*   r   )pdconcatr   r4   r   iloccorr)r   r6   r7   aligneds       r   correlationzStatisticsService.correlation.   s_    ))Xx0q9@@Bw<!W\\!Q$',,W\\!Q$-?@AAr   c                    |j                   ri S t        |j                               t        |j                               t        |j	                               t        |j                               t        |j                               t        |j                               t        |j                  d            t        |j                  d            dS )Ng?gffffff?)r   r!   skewkurtosisminmaxpercentile_5percentile_95)	r2   r   r   r!   rB   rC   rD   rE   quantile)r   r.   s     r   return_distributionz%StatisticsService.return_distribution4   s    ==I',,.)'',,.)g..01''!'"2"24"89"7#3#3D#9:	
 		
r   equity_curvec                     |j                   ry|j                         }||z
  |z  }t        t        |j	                               dz        S )Nr*   r+   )r2   cummaxr   absrD   )r   rJ   rolling_maxdrawdowns       r   max_drawdownzStatisticsService.max_drawdownB   sF    "))+ ;.+=S(3.//r   risk_free_rateperiodsc                     |j                   s|j                         dk(  ry|||z  z
  }t        |j                         |j                         z  t	        j
                  |      z        S Nr   r*   r2   r!   r   r   r   sqrt)r   r.   rQ   rR   excesss        r   sharpe_ratiozStatisticsService.sharpe_ratioI   sR    ==GKKMQ.>G33V[[]VZZ\1BGGG4DDEEr   c                     |j                   ry|||z  z
  }||dk     }|j                   s|j                         dk(  ryt        |j                         |j                         z  t	        j
                  |      z        S )Nr*   r   rU   )r   r.   rQ   rR   rW   downsides         r   sortino_ratiozStatisticsService.sortino_ratioO   sj    ==>G33&1*%>>X\\^q0V[[]X\\^3bggg6FFGGr   pnlsc                 N    |syt        d |D              }|t        |      z  dz  S )Nr*   c              3   ,   K   | ]  }|d kD  s	d  yw)r   r   Nr,   .0ps     r   	<genexpr>z-StatisticsService.win_rate.<locals>.<genexpr>[   s     ,da!e1d   
r+   r3   r4   )r   r\   winss      r   win_ratezStatisticsService.win_rateX   s,    ,d,,c$i#%%r   c                     t        d |D              }t        t        d |D                    }|dk(  r|dkD  rt        d      S dS ||z  S )Nc              3   ,   K   | ]  }|d kD  s	|  ywr   Nr,   r_   s     r   rb   z2StatisticsService.profit_factor.<locals>.<genexpr>_   s     4da!e1drc   c              3   ,   K   | ]  }|d k  s	|  ywri   r,   r_   s     r   rb   z2StatisticsService.profit_factor.<locals>.<genexpr>`   s     61AQrc   r   infr*   )r3   rM   r   )r   r\   gross_profit
gross_losss       r   profit_factorzStatisticsService.profit_factor^   sO    4d446667
?#/!#35<<<j((r   c                 6    |syt        |      t        |      z  S )Nr*   rd   )r   r\   s     r   expected_valuez StatisticsService.expected_valuee   s    4y3t9$$r   win_rate_pctavg_winavg_losscapc                     |dk(  s|dk  ry|dz  }d|z
  }t        ||z        }|||z  z
  }t        dt        ||            }|S )z+Adjusted Kelly fraction, capped for safety.r   r*   r+   r   )rM   rE   rD   )	r   rq   rr   rs   rt   win_prob	loss_probwin_loss_ratiokellys	            r   kelly_criterionz!StatisticsService.kelly_criterionj   s[    q=LA-#%L	Wx/0I67CUC)r   valueseriesc                     |j                         dk(  ryt        ||j                         z
  |j                         z        S rT   )r!   r   r   )r   r{   r|   s      r   z_scorezStatisticsService.z_scoreu   s4    ::<1efkkm+vzz|;<<r   	thresholdc                     | j                  |j                  d   |      }t        |      |kD  }||||kD  rd|dS || k  rd|dS d|dS )Nhighlownormal)r~   
is_anomaly	directionr   )r~   r=   rM   )r   r|   r   zr   s        r   detect_anomaliesz"StatisticsService.detect_anomaliesz   st    LLR&1Vi'
$#$y="	
 	
 @AI:~e"	
 	
 T\"	
 	
r   
trade_pnlsinitial_capitalbuy_hold_returnc                    t        j                  |      }|j                         j                         }t	        |      dkD  r|j
                  d   n|}| j                  ||      }|D 	cg c]
  }	|	dkD  s	|	 }
}	|D 	cg c]
  }	|	dk  s	|	 }}	|| j                  |      | j                  |      | j                  |      | j                  |      | j                  |      | j                  |      | j                  | j                  |      |
rt        j                  |
      nd|rt        j                  |      nd      |||kD  t	        |      dS c c}	w c c}	w )Nr   r   r   )total_return_pctrP   rX   r[   rf   rn   rp   kelly_fractionr   beats_buy_holdtotal_trades)r;   Seriesr   r   r4   r=   r-   rP   rX   r[   rf   rn   rp   rz   r   r   )r   rJ   r   r   r   equityr.   finaltotal_returnra   re   lossess               r   compute_backtest_metricsz*StatisticsService.compute_backtest_metrics   s;    <(##%,,.#&v;?B>%/:aQ:/'1Z1q5!Z1 !- --f5 --g6!//8j1!//
;"11*="22j)!%1#)q
  /*_<
O
 	
 01s   )
E4E>
E	EN)r*   im  )g      ?)g       @) __name__
__module____qualname____doc__r;   r   r   r   r   r   r   r"   r&   r-   dictstrr5   r@   rI   rP   intrX   r[   listrf   rn   rp   rz   r~   r   r   r   r,   r   r   r   r      s   F,		 ,bii ,9")) 9		 9" "u "$299 $ $!BII !% !!RYY !5 !+ +E +e +
8299 8c5j9I 8BBII B Bu B
299 
c5j9I 
0 0u 0FBII Fu FUX Fch FHRYY H HVY Hdi H&T%[ &U &)$u+ )% )%4; %5 %
	E 	E 	U 	Y^ 	jo 	=U =BII =% =

ryy 
U 
TRUWZRZ^ 

5k
 K
 	

 
 
c3h
r   r   )r   decimalr   typingr   numpyr   pandasr;   app.core.loggingr   r   loggerr   statistics_servicer,   r   r   <module>r      s9    8     '	H	U
 U
p '( r   