
    di                    @    S r SSKJr  SSKJr  SSKJr   " S S5      rg)u   Value bet finder — identifies betting opportunities where model
probabilities exceed market-implied probabilities.

Uses Kelly criterion sizing and confidence filtering to surface
actionable betting recommendations.
    )annotations)Decimal)Anyc                      \ rS rSrSr   S       SS jjr\" S5      4     SS jjr      SS jr  S       SS jjr	    SS	 jr
S
rg)ValueBetFinder   zIdentifies value bets by comparing model vs market probabilities.

A "value bet" exists when the model's estimated win/place probability
exceeds the market-implied probability by a configurable threshold.
c                (    Xl         X l        X0l        g)a  Initialize the value bet finder.

Args:
    min_edge: Minimum edge (model_prob - market_prob) to
        consider a value bet. Default 0.05 (5%).
    min_confidence: Minimum model confidence (probability) to
        consider. Filters out very low-probability bets.
        Default 0.3.
    max_kelly_fraction: Maximum fraction of bankroll to
        stake per bet (Kelly cap). Default 0.25 (25%).
N)min_edgemin_confidencemax_kelly_fraction)selfr
   r   r   s       @/root/tipsharks/tipsharks-elo-api/packages/betting/value_bets.py__init__ValueBetFinder.__init__   s    " !,"4    1000c                    [         e)a)  Find value bets from model-vs-market comparisons.

Args:
    comparisons: List of comparison dicts from
        OddsComparisonClient.compare_to_model().
    bankroll: Current bankroll for Kelly stake sizing.

Returns:
    List of value bet dicts, sorted by edge descending, with keys:
    - runner_name: str
    - starter_id: int | None
    - model_prob: float
    - market_prob: float
    - edge: float
    - kelly_stake: float (fraction of bankroll)
    - recommended_stake: Decimal (in bankroll units)
    - confidence: str ("high", "medium", "low")
)NotImplementedError)r   comparisonsbankrolls      r   find_value_betsValueBetFinder.find_value_bets*   s
    . "!r   c                4   US::  d  US:  a  gX::  a  g[        S5      [        [        U5      5      -  [        S5      -
  n[        [        U5      5      U-  [        S5      [        [        U5      5      -
  -
  U-  n[        [        U5      U R                  5      $ )a  Calculate Kelly stake fraction.

f* = (p * b - q) / b
where p = model_prob, q = 1-p, b = (1/market_prob) - 1

Args:
    model_prob: Model's estimated win probability.
    market_prob: Market-implied win probability.

Returns:
    Kelly fraction (0 to max_kelly_fraction).
r              1)r   strminfloatr   )r   
model_probmarket_probbf_stars        r   kelly_criterionValueBetFinder.kelly_criterionC   s    " !{a/$S\GC$455E#j/*Q.'#,ZAY2YZ^__5=$"9"9::r   Nc                    Ub  UOU R                   nUb  UOU R                  nU Vs/ s H5  nUR                  SS5      U:  d  M  UR                  SS5      U:  d  M3  UPM7     sn$ s  snf )zFilter value bets by minimum edge and probability thresholds.

Args:
    bets: List of value bet dicts.
    min_edge: Override default min_edge.
    min_prob: Override default min_confidence.

Returns:
    Filtered list of value bet dicts.
edger   r    )r
   r   get)r   betsr
   min_probr'   probr"   s          r   filter_by_confidence#ValueBetFinder.filter_by_confidence]   su      $/xT]]#/xT5H5H
!uuVQ4' ,-EE,,Bd,J t
 	
 
s   A&A&A&c           	        U(       d  S[        S5      SSSSS.$ [        U5      [        S U 5       5      [        S U 5       5      [        U5      -  [        S U 5       5      [        S U 5       5      [        S	 U 5       5      S.$ )
zGenerate a summary of value bet opportunities.

Args:
    bets: List of value bet dicts.

Returns:
    Summary dict with count, total stake, average edge, etc.
r   0r   )
total_betstotal_stakeavg_edgehigh_confidencemedium_confidencelow_confidencec              3  V   #    U  H  oR                  S [        S5      5      v   M!     g7f)recommended_staker/   N)r(   r   .0r"   s     r   	<genexpr>+ValueBetFinder.summarize.<locals>.<genexpr>   s$      BFQ)73<88$s   ')c              3  D   #    U  H  oR                  S S5      v   M     g7f)r'   r   Nr(   r8   s     r   r:   r;      s     ;dEE&!,,ds    c              3  R   #    U  H  oR                  S 5      S:X  d  M  Sv   M     g7f)
confidencehighr   Nr=   r8   s     r   r:   r;      s#      #a55#6&#@4   '	'c              3  R   #    U  H  oR                  S 5      S:X  d  M  Sv   M     g7f)r?   mediumr   Nr=   r8   s     r   r:   r;      s#      %a55#6(#B4rA   c              3  R   #    U  H  oR                  S 5      S:X  d  M  Sv   M     g7f)r?   lowr   Nr=   r8   s     r   r:   r;      s#      "a55#6%#?4rA   )r   lensum)r   r)   s     r   	summarizeValueBetFinder.summarizet   s     &s|#$%&"#  d) BF  ;d;;c$iG" ##   "% %% " " "" 
 	
r   )r   r   r
   )g?g333333?g      ?)r
   r   r   r   r   r   returnNone)r   list[dict[str, Any]]r   r   rJ   rL   )r    r   r!   r   rJ   r   )NN)r)   rL   r
   float | Noner*   rM   rJ   rL   )r)   rL   rJ   zdict[str, Any])__name__
__module____qualname____firstlineno____doc__r   r   r   r$   r,   rH   __static_attributes__ r   r   r   r      s      #$(	55 5 "	5
 
50 $FO")" " 
	"2;; ; 
	;: "&!%	
"
 
 	

 

.%
"%
 
%
r   r   N)rR   
__future__r   decimalr   typingr   r   rT   r   r   <module>rX      s!    #  K
 K
r   