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dlmZmZmZ dd„ Zdd	„ Zd
d„ Zdd„ Zedkršeƒ  dS )a¦  Is the volatility effect just illiquidity wearing a disguise?

Volatile legs fill 20.5% against 7.4% for calm ones (mm_volatility_clean.py).
But the leagues that top the volatility table -- CN1, NWSL, CAN, PE1 -- are
plausibly the THIN ones, and a thin book moves further per trade simply because
less volume is needed to shift it. Volume independently predicts fills at AUC
~0.66, and a book nobody trades cannot complete however much it swings.

So the +13pp may be measuring books that are cheap to move and impossible to
finish. This splits the two:

    volatility  from live_data, measured strictly BEFORE the first quote
    volume      from the Kalshi market at post time (volume_24h / open interest)
    fill        real trade prints, queue-aware

and reports the 2x2. If volatility only works in the low-volume cell, it is
illiquidity and worthless. If it works within BOTH volume halves, it is a real
and separable signal.
é    NzE:\soccer\mainzE:\soccer\research)Ú	load_legsÚload_movementÚCACHEc              	   C   s(   z
t | ƒW S  ttfy"   Y d S 0 d S )N)ÚfloatÚ	TypeErrorÚ
ValueError)Úx© r	   ú&E:\soccer\research\mm_vol_vs_volume.pyÚ_f   s    
r   c                  C   s    i } t dddd��z}t |¡D ]^}| d¡}|r|| v r:q| d¡pFd ¡ sNqt| d¡ƒt| d	¡ƒt| d
¡ƒdœ| |< qW d  ƒ n1 s’0    Y  | S )zE{leg_ticker: (volume_24h, open_interest, volume)} at its first quote.z&E:\soccer\research\mm_paper_quotes.csvúutf-8Úreplace)ÚencodingÚerrorsZ
leg_tickerZask_sizeÚ Z
volume_24hZopen_interestZvolume)Úv24ÚoiÚvolN)ÚopenÚcsvZ
DictReaderÚgetÚstripr   )ÚoutZfhÚrÚtr	   r	   r
   Úload_volume#   s     ÿ
þ*r   c              	   C   sV   | s|d›d�S t dd„ | D ƒƒ}|d›dt| ƒd›d|d›d	d
| t| ƒ d›d�S )Nz>18z      -        -c                 s   s   | ]}|d  V  qdS ©ÚfilledNr	   ©Ú.0r   r	   r	   r
   Ú	<genexpr>7   ó    zcell.<locals>.<genexpr>ú z>5z legs z>4z filled ç      Y@z>6.1fú%)ÚsumÚlen)ÚrowsZlabelÚfr	   r	   r
   Úcell4   s    ÿr)   c                      s
  t ƒ } t| ƒ}tƒ }t ttdd�¡}g ‰|  ¡ D �]4\}}||vs2||vrNq2|› d|d  ¡ › �}||vrnq2|| }|d d urŠ|d n|d }|d u rœq2d\}	}
|| D ]–\}}}t	 
|¡}|sÊ �qD|d }|jd u |jd u k�r|jrö| ¡ n|j|jd	�}||k�r �qD||d
 d kr¬|	|7 }	|	|d kr¬d}
 �qDq¬ˆ || d |t|
ƒ|d dœ¡ q2tˆƒdk �r�tdtˆƒ› d�ƒ d S dtdd„ ˆD ƒƒ tˆƒ }ttˆƒ› d|d›d�ƒ tˆƒ}tt|ƒ‡fdd„d�}dd„ t|ƒD ƒ‰tt|ƒ‡fdd„d�}d d„ t|ƒD ƒ‰t‡‡fd!d„t|ƒD ƒƒ}d"d#| ||| d"    }td$|d%›�ƒ td&ƒ td't|ƒd(›d)t|ƒd*k�r–d+nt|ƒd,k�r¨d-nd.› d/�ƒ t d0d„ ˆD ƒ¡‰t d1d„ ˆD ƒ¡‰ td2ˆd3 d(›d4ˆ d5›d/�ƒ td6ƒ i }d7‡fd8d„fd9‡fd:d„ffD ]n\}‰d;‡ fd<d„fd=‡ fd>d„ffD ]B\}‰‡‡fd?d@„ˆD ƒ}||||f< tt||› dA|› �ƒƒ �qN�q&tdBƒ dCD ]ª}|d7|f |d9|f  }}t|ƒdDk �s¢t|ƒdDk �rà�q¢dtdEd„ |D ƒƒ t|ƒ }dtdFd„ |D ƒƒ t|ƒ }td'|dG›dH|dI›dJ|dI›dK|| dL›dM�	ƒ �q¢tdNƒ dOD ]ª}||d;f ||d=f  }}t|ƒdDk �sZt|ƒdDk �r˜�qZdtdPd„ |D ƒƒ t|ƒ }dtdQd„ |D ƒƒ t|ƒ }td'|dR›dS|dI›dT|dI›dK|| dL›dM�	ƒ �qZd S )UNr   )r   ú|Útsr   r   )g        FÚko)ÚtzinfoZour_askg•Ö&è.>ZqueueTÚsdr   )r.   Úliqr   r   éP   zonly z legs join -- too fewr#   c                 s   s   | ]}|d  V  qdS r   r	   r   r	   r	   r
   r    b   r!   zmain.<locals>.<genexpr>z= legs with movement, volume AND queue-aware fills; base fill z.1fz%
c                    s   ˆ |  d S ©Nr.   r	   ©Úi©r'   r	   r
   Ú<lambda>h   r!   zmain.<locals>.<lambda>)Úkeyc                 S   s   i | ]\}}||“qS r	   r	   ©r   Úkr3   r	   r	   r
   Ú
<dictcomp>i   r!   zmain.<locals>.<dictcomp>c                    s   ˆ |  d S ©Nr/   r	   r2   r4   r	   r
   r5   j   r!   c                 S   s   i | ]\}}||“qS r	   r	   r7   r	   r	   r
   r9   k   r!   c                 3   s"   | ]}ˆ| ˆ |  d  V  qdS )é   Nr	   )r   r3   )Úrk_lqÚrk_sdr	   r
   r    l   r!   é   é   z#Spearman rho(volatility, volume) = z+.3fzE  strongly NEGATIVE would mean volatile == thin, i.e. the same thing.z  z.2fz is g      à?z'strong -- they are largely one variableg333333Ó?Zmoderatezweak -- they are separableÚ
c                 s   s   | ]}|d  V  qdS )r.   Nr	   r   r	   r	   r
   r    s   r!   c                 s   s   | ]}|d  V  qdS )r/   Nr	   r   r	   r	   r
   r    t   r!   zsplitting at median volatility éd   zc and median 24h volume z,.0fz=== the 2x2 ===Úcalmc                    s   | d ˆ kS r1   r	   ©r   ©Úsd_medr	   r
   r5   z   r!   ÚVOLATILEc                    s   | d ˆ kS r1   r	   rC   rD   r	   r
   r5   {   r!   Úthinc                    s   | d ˆ kS r:   r	   rC   ©Úlq_medr	   r
   r5   |   r!   ÚLIQUIDc                    s   | d ˆ kS r:   r	   rC   rH   r	   r
   r5   }   r!   c                    s    g | ]}ˆ|ƒrˆ |ƒr|‘qS r	   r	   r   )ÚlselÚvselr	   r
   Ú
<listcomp>~   r!   zmain.<locals>.<listcomp>z + z<
=== does volatility still help WITHIN each volume half? ===)rG   rJ   é   c                 s   s   | ]}|d  V  qdS r   r	   r   r	   r	   r
   r    ‡   r!   c                 s   s   | ]}|d  V  qdS r   r	   r   r	   r	   r
   r    ˆ   r!   z>7z: calm z>5.1fz%  ->  volatile z%   z+.1fZppz@
=== and does volume still help WITHIN each volatility half? ===)rB   rF   c                 s   s   | ]}|d  V  qdS r   r	   r   r	   r	   r
   r    �   r!   c                 s   s   | ]}|d  V  qdS r   r	   r   r	   r	   r
   r    ‘   r!   z>8z: thin z%  ->  liquid )r   r   r   ÚjsonÚloadr   r   ÚitemsZ	isoformatÚSZ_ptr-   Z
astimezoner   ÚappendÚintr&   Úprintr%   ÚsortedÚrangeÚ	enumerateÚabsÚ
statisticsZmedianr)   ) ZlegsZmvZvolsZtradesr   Úvr6   Zvvr/   Zcumr   Zts_sÚpÚcr+   r,   ÚbaseÚnZrsZrs2Zd2ZrhoZquadZvlabZllabZselZrcÚrvZt_Zl_ZrtZrlr	   )rI   rK   r<   r=   r'   rE   rL   r
   Úmain<   s°    

ÿ
ÿ
&ÿ
ÿ
ÿÿ ÿÿra   Ú__main__)Ú__doc__r   ÚcollectionsrO   ÚosrZ   ÚsysÚpathÚinsertZ	mm_settlerR   Zmm_volatility_cleanr   r   r   r   r   r)   ra   Ú__name__r	   r	   r	   r
   Ú<module>   s   0Z