o
    ÇUjä  ã                   @  s„   d Z ddlmZ ddlmZ ddlmZ eG dd„ dƒƒZeG dd„ dƒƒZd!dd„Z	d!dd„Z
d"d#dd„Zd$dd„Zd%dd„Zd S )&zÛShared scoring primitives.

Strategies express each signal as a 0..1 "sub-score" and combine them with
weights. These helpers turn raw metrics into 0..1 signals in a readable way
so the strategy files stay declarative.
é    )Úannotations)Ú	dataclass)ÚOptionalc                   @  s:   e Zd ZU ded< ded< ded< ded< dZded	< d
S )ÚSignalÚstrÚnameúOptional[float]ÚvalueÚfloatÚscoreÚweightÚ ÚnoteN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r   © r   r   úLC:\Users\cheed\OneDrive\Desktop\Claude work\finance-tool\screener\scoring.pyr      s   
 r   c                   @  s8   e Zd ZU ded< ded< ded< ded< dd
d„ZdS )ÚStrategyResultr   Ústrategyr
   r   úlist[Signal]ÚsignalsZverdictÚreturnÚdictc                 C  s,   dt | jdƒi}| jD ]}|j||j< q|S )Nr   é   )Úroundr   r   r	   r   )ÚselfÚrowÚsr   r   r   Úas_row   s   
zStrategyResult.as_rowN)r   r   )r   r   r   r   r    r   r   r   r   r      s   
 r   r	   r   Úlor
   Úhir   c                 C  s8   | du rdS ||kr| |krdS dS t | | ||  ƒS )zL1.0 when value >= hi, 0.0 when <= lo, linear between. None -> 0.5 (neutral).Nç      à?ç      ð?ç        ©Ú_clamp©r	   r!   r"   r   r   r   Úhigher_better$   s
   r)   c                 C  s<   | du rdS ||kr| |krdS dS t d| | ||   ƒS )z<1.0 when value <= lo, 0.0 when >= hi. None -> 0.5 (neutral).Nr#   r$   r%   r&   r(   r   r   r   Úlower_better-   s
   r*   r%   r$   Úxc                 C  s   t |t|| ƒƒS ©N)ÚmaxÚmin)r+   r!   r"   r   r   r   r'   6   s   r'   r   r   c                 C  s<   t dd„ | D ƒƒ}|dkrdS t dd„ | D ƒƒ}d| | S )z3Weighted average of sub-scores, rescaled to 0..100.c                 s  s   � | ]}|j V  qd S r,   )r   ©Ú.0r   r   r   r   Ú	<genexpr><   s   € zcombine.<locals>.<genexpr>r   r%   c                 s  s   � | ]	}|j |j V  qd S r,   )r   r   r/   r   r   r   r1   ?   s   € g      Y@N)Úsum)r   Ztotal_wÚweightedr   r   r   Úcombine:   s
   r4   r   r   c                 C  s(   | dkrdS | dkrdS | dkrdS dS )NéK   z
Strong fité<   zGood fité-   ZMixedzWeak fitr   )r   r   r   r   Úverdict_fromC   s   r8   N)r	   r   r!   r
   r"   r
   r   r
   )r%   r$   )r+   r
   r!   r
   r"   r
   r   r
   )r   r   r   r
   )r   r
   r   r   )Ú__doc__Ú
__future__r   Údataclassesr   Útypingr   r   r   r)   r*   r'   r4   r8   r   r   r   r   Ú<module>   s    

		
	