a
    ÍÁ�jÆ  ã                   @   s´   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¡ ej 	dd¡ ddl
ZdZdddd	œZd
ddd	œZdZddd„Zdd„ Zdd„ Zdd„ Zdd„ Zedkr°eƒ  dS )a  What predicts a book's volatility BEFORE we have to quote it?

Pre-quote movement raises the queue-aware fill rate from 7.4% to 20.5%
(mm_volatility_clean.py), so selecting volatile books is worth real money. That
is only usable if volatility can be known in advance.

Two ways it could be:

  PERSISTENCE -- volatility measured in an early window predicts volatility in a
                 later one. If it holds, no model is needed: watch the book for
                 an hour and let it select itself.
  FEATURES    -- league, price level, liquidity, market age, or Pinnacle's own
                 movement predict it from the start.

Volatility is measured from live_data throughout, the feed the xlow/xhigh
strategies run on, so nothing here depends on the maker's own logs.
é    NzE:\soccer\mainzE:\soccer\researchzE:\soccer\live_dataZkalshi_home_midZkalshi_draw_midZkalshi_away_mid)ÚhomeZdrawÚawayZpin_homeZpin_drawZpin_awayé(   ç        ç      ð?c              	   C   sH   z*t | ƒ}||  k r|k r&n n|nd W S  ttfyB   Y d S 0 d S )N©ÚfloatÚ	TypeErrorÚ
ValueError)ÚxÚloÚhiÚv© r   ú+E:\soccer\research\mm_volatility_predict.pyÚ_f   s
    "r   c              	   C   sH   z*t | ƒ}d|  k rdk r&n n|nd W S  ttfyB   Y d S 0 d S )Ng)\�Âõ(ð?éÈ   r   )r   r   r   r   r   Ú_odds'   s
    "r   c                  C   sx  t dd„ t t¡D ƒƒt d… } t dd„ ¡}| D �]<}ttj 	t|¡ddd���}t
 |¡D ]ð}t | d	¡¡}| d
¡}|du s`|dv r�q`zt|ƒdkr¢W q`W n tyº   Y q`Y n0 | d¡| d¡| d¡| d¡f}t ¡ D ]f\}}	t| |	¡ƒ}
|
du �r
qè|||f  }|d  ||
f¡ t| t| ¡ƒ}|rè|d  |¡ qèq`W d  ƒ q41 �sh0    Y  q4|S )zF[{league, side, series:[(ts, mid)], pins:[odds], ko}] per fixture-leg.c                 s   s   | ]}|  d ¡r|V  qdS )z.csvN)Úendswith)Ú.0Úfr   r   r   Ú	<genexpr>1   ó    zload.<locals>.<genexpr>Nc                   S   s
   g g dœS )N)ÚseriesÚpinsr   r   r   r   r   Ú<lambda>2   r   zload.<locals>.<lambda>zutf-8Úreplace)ÚencodingÚerrorsZ	timestampÚelapsed)NÚ r   Z	game_dateÚleaguer   r   r   r   )ÚsortedÚosÚlistdirÚLIVE_DIRÚDAYSÚcollectionsÚdefaultdictÚopenÚpathÚjoinÚcsvZ
DictReaderÚSZ_ptÚgetr   r
   ÚSIDESÚitemsr   Úappendr   ÚPIN)ÚfilesÚlegsÚfnZfhÚrZtsZelÚbaseÚsideÚcolÚmÚdÚpr   r   r   Úload/   s<    "
ÿ

ÿ
4r=   c                 C   s$   t | ƒdkr t dd„ | D ƒ¡S d S )Né   c                 S   s   g | ]\}}|‘qS r   r   ©r   Ú_r:   r   r   r   Ú
<listcomp>O   r   zvol.<locals>.<listcomp>)ÚlenÚ
statisticsÚpstdev)r   r   r   r   ÚvolN   s    rE   c                     sˆ  t ƒ } g ‰|  ¡ D ]Ä\}}t|d ƒ}t|ƒdk r4qt|ƒd }t|d |… ƒt||d … ƒ }}|d u s|d u rtqdd„ |D ƒ}|d }ˆ |d |d ||t |¡t|ƒt|ƒdkrÌt d	d„ |D ƒ¡nd d
œ¡ qt	tˆƒ› d�ƒ tˆƒdk �rt	dƒ d S t	dƒ tdd„ ˆD ƒƒ‰ ‡ fdd„dD ƒ}	t	ddd›ddd›ddd›�ƒ d|	d df|	d |	d df|	d dd ffD ]l\‰‰}
‡‡fd!d„ˆD ƒ}t|ƒd"k �r¬�q|t	d|
d›dt|ƒd›dt d#d„ |D ƒ¡d d$›d%�ƒ �q|tt
tˆƒƒ‡fd&d'„d(�}d)d*„ t|ƒD ƒ‰tt
tˆƒƒ‡fd+d'„d(�}d,d*„ t|ƒD ƒ‰tˆƒ}t‡‡fd-d„t
|ƒD ƒƒ}dd.| ||| d    }t	d/|d0›d1t|ƒd2k�r¤d3nt|ƒd4k�r¶d5nd6› d7�ƒ t	d8ƒ t t¡}ˆD ]$}||d9   |d: |d;  ¡ �qØd<d„ | ¡ D ƒ}|jd=d'„ d(� t	dd9d>›ddd›dd?d@›�ƒ |d d.… D ]2\}}}t	d|d>›d|d›d|d dA›d%�ƒ �qLt	dBƒ |dCd … D ]2\}}}t	d|d>›d|d›d|d dA›d%�ƒ �q”|�r"t	dD|d d d dE›dF|d d d dE›dG|d d tdH|d d ƒ dI›dJ�ƒ t	dKƒ dLD ]r\‰‰‡‡fdMd„ˆD ƒ}t|ƒd"k �r\�q.t	dNˆdE›dOˆdE›dt|ƒdP›dQt dRd„ |D ƒ¡d dS›d%�	ƒ �q.dTd„ ˆD ƒ}t|ƒdUk�r„t	dVƒ tdWd„ |D ƒƒ‰‡fdXd„dD ƒ}d|d dYf|d |d dZf|d dd[ffD ]l\‰‰}
‡‡fd\d„|D ƒ}t|ƒd"k �rF�qt	dN|
d]›dt|ƒdP›d^t d_d„ |D ƒ¡d dS›d%�ƒ �qd S )`Nr   r   r>   c                 S   s   g | ]\}}|‘qS r   r   r?   r   r   r   rA   ]   r   zmain.<locals>.<listcomp>r   é   é   c                 S   s   g | ]}d | ‘qS )r   r   ©r   r<   r   r   r   rA   d   r   )r!   r8   ÚearlyÚlateÚpriceÚnÚpin_movez. fixture-legs with >=40 pre-kickoff snapshots
éd   ztoo few to analysez:=== 1. Does early volatility predict later volatility? ===c                 s   s   | ]}|d  V  qdS )rI   Nr   ©r   r6   r   r   r   r   n   r   zmain.<locals>.<genexpr>c                    s    g | ]}ˆ t |tˆ ƒ ƒ ‘qS r   ©ÚintrB   rH   )Úer   r   rA   o   r   )ç      à?g      è?z  zearly-window bucketz>22ú r4   z>6zmedian LATE volz>17éÿÿÿÿr   z	calm halfz3rd quartileé	   zwildest 25%c                    s,   g | ]$}ˆ|d    kr ˆ k rn q|‘qS )rI   r   rO   ©r   r   r   r   rA   s   r   é   c                 s   s   | ]}|d  V  qdS )rJ   Nr   rO   r   r   r   r   w   r   z>16.2fÚcc                    s   ˆ |  d S )NrI   r   ©Úi©Úrowsr   r   r   y   r   zmain.<locals>.<lambda>)Úkeyc                 S   s   i | ]\}}||“qS r   r   ©r   Úkr[   r   r   r   Ú
<dictcomp>z   r   zmain.<locals>.<dictcomp>c                    s   ˆ |  d S )NrJ   r   rZ   r\   r   r   r   {   r   c                 S   s   i | ]\}}||“qS r   r   r_   r   r   r   ra   |   r   c                 3   s"   | ]}ˆ | ˆ|  d  V  qdS )r>   Nr   )r   r[   )Úre_Úrlr   r   r   ~   r   é   z
  Spearman rho(early, late) = z+.3fz   (rS   Zstrongç333333Ó?ZmoderateZweakú)z-
=== 2. What is volatile, from the start? ===r!   rI   rJ   c                 S   s0   g | ](\}}t |ƒd kr|t |¡t |ƒf‘qS )é   )rB   rC   Úmedian)r   Úlgr   r   r   r   rA   ˆ   s   ÿc                 S   s
   | d  S )NrF   r   )r   r   r   r   r   Š   r   z>10z
median volz>12z>11.2fz  ...éüÿÿÿz  -> spread across leagues: z.2fzc vs zc (g•Ö&è.>z.1fzx)z9
  by price level (a leg near 50c has more room to move):))r   ç333333Ã?)rk   re   )re   çÍÌÌÌÌÌÜ?)rl   çffffffæ?)rm   r   c                    s,   g | ]$}ˆ|d    kr ˆ k rn q|‘qS )rK   r   rO   rW   r   r   rA   —   r   z    ú-z>5z legs  median vol c                 s   s   | ]}|d  |d  V  qdS ©rI   rJ   Nr   rO   r   r   r   r   ›   r   z>6.2fc                 S   s   g | ]}|d  dur|‘qS ©rM   Nr   rO   r   r   r   rA   �   r   éP   zL
  by PINNACLE movement (does the sharp book moving predict Kalshi moving?):c                 s   s   | ]}|d  V  qdS rp   r   rO   r   r   r   r   ¡   r   c                    s    g | ]}ˆ t |tˆ ƒ ƒ ‘qS r   rP   )r   r   )r<   r   r   rA   ¢   r   zpin calm halfz	pin 3rd qzpin wildest 25%c                    s,   g | ]$}ˆ|d    kr ˆ k rn q|‘qS )rM   r   rO   rW   r   r   rA   ¦   r   z>16z legs  kalshi vol c                 s   s   | ]}|d  |d  V  qdS ro   r   rO   r   r   r   r   ª   r   )r=   r0   r"   rB   rE   r1   rC   rh   rD   ÚprintÚrangeÚ	enumerateÚsumÚabsr'   r(   ÚlistÚsortÚmax)r4   r^   r;   ÚsZhalfZv_earlyZv_lateZmidsr   ÚqÚnameZselZranksZranks2rL   Zd2ZrhoZby_lgr6   Zlgsri   r:   r`   ZpmZpqr   )rR   r   r   r<   rb   rc   r]   r   ÚmainR   s²    "
ÿú
 ÿÿ&ÿ

" **ÿÿ
 ÿþÿr}   Ú__main__)r   r   )Ú__doc__r,   r'   r#   rC   ÚsysZdatetimeZdtr*   ÚinsertZ	mm_settler-   r%   r/   r2   r&   r   r   r=   rE   r}   Ú__name__r   r   r   r   Ú<module>   s"   0ÿ
[