a
    KÀ�j¹  ã                   @   sˆ   d Z ddlZddlZddlZddlZdZdZddlZeej	 
dd¡ƒZdd„ Zd	d
„ Zdd„ Zdd„ Zdd„ Zdd„ Zedkr„eƒ  dS )aŽ  Do legs on wildly-swinging games fill more often?

The hypothesis is a good one and the fill model cannot answer it: of its 24
features not one measures price movement. It has spread, overround, volume,
depth, time -- all snapshots of a moment, nothing about how much the price
travels.

The mechanism would be simple. A resting ask fills when a buyer crosses it. A
leg whose fair value wanders re-tests our price repeatedly; a leg pinned at one
number never does. So movement should buy fills.

CIRCULARITY IS THE WHOLE DIFFICULTY. Measuring a leg's volatility over its full
quoting life and correlating that with whether it filled is close to measuring
the fill itself: the move that lifted us is inside the window. So volatility is
measured over an EARLY window only -- the leg's first `EARLY_N` snapshots -- and
the fill outcome is taken from the whole life. Legs whose price history is
shorter than the early window are dropped rather than scored on a partial one.

That still leaves a leg that filled inside the early window contaminating its
own predictor, which is why the split is reported both ways: all legs, and legs
that survived past the early window.
é    Nz&E:\soccer\research\mm_paper_quotes.csvz'E:\soccer\research\mm_paper_results.csvÚEARLY_Né´   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 )Nr   é   )ÚfloatÚ	TypeErrorÚ
ValueError)ÚxÚv© r
   ú(E:\soccer\research\mm_volatility_fill.pyÚ_f$   s
    "r   c                  C   sÆ   t  t¡} t  t¡}ttddd��d}t |¡D ]H}| d¡t| d¡ƒ| d¡  }}}|r.|r.|r.||  	||f¡ q.W d  ƒ n1 sŒ0    Y  | 
¡ D ]"\}}| ¡  dd	„ |D ƒ| |< qž| S )
z#{leg_ticker: [k_ask in time order]}úutf-8Úreplace©ÚencodingÚerrorsÚ
leg_tickerZk_askÚtsNc                 S   s   g | ]\}}|‘qS r
   r
   )Ú.0Ú_Úar
   r
   r   Ú
<listcomp>7   ó    zload_prices.<locals>.<listcomp>)ÚcollectionsÚdefaultdictÚlistÚopenÚQUOTESÚcsvÚ
DictReaderÚgetr   ÚappendÚitemsÚsort)ÚseqÚrowsÚfhÚrÚtr   r   Zrsr
   r
   r   Úload_prices,   s    

&2r)   c                  C   sˆ   i } t tddd��b}t |¡D ]F}| d¡}|s2qt| d¡p@dƒ ¡ dv }|  |d¡p^t|ƒ| |< qW d	  ƒ n1 sz0    Y  | S )
z{leg_ticker: filled 0/1}r   r   r   r   ÚfilledÚ0)Ú1ÚTrueÚtruer   N)r   ÚRESULTSr   r   r    ÚstrÚstripÚint)Úoutr&   r'   r(   Úfr
   r
   r   Ú
load_fills;   s    
8r5   c                 C   sb   | dt … }t|ƒt k rdS t |¡}t|ƒt|ƒ }tdd„ t||dd… ƒD ƒƒ}|||dœS )zAMovement in the early window: stdev, range and number of changes.Nc                 s   s&   | ]\}}t || ƒd krdV  qdS )g•Ö&è.>r   N)Úabs)r   r   Úbr
   r
   r   Ú	<genexpr>O   r   zvol_of.<locals>.<genexpr>r   )ÚsdÚrangeÚchanges)r   ÚlenÚ
statisticsZpstdevÚmaxÚminÚsumÚzip)ÚpricesZearlyr9   Úrngr;   r
   r
   r   Úvol_ofH   s    
 rD   c           
         s:  t d|› d�ƒ t ddd›ddd›dd	d
›ddd›�ƒ g }|D ]š\‰‰ }‡ ‡‡fdd„| D ƒ}t|ƒdk rnq@tdd„ |D ƒƒ}| |t|ƒd| t|ƒ f¡ t d|d›dt|ƒd›d|d
›dd| t|ƒ d›d�	ƒ q@t|ƒdk�r6|d d |d d  }}	t d|d d › d|d d › d|	| d›d�ƒ d S )Nz
  by ú:z    Zbucketz>14ú Zlegsz>6r*   z>7z	fill ratez>10c                    s,   g | ]$}ˆ|ˆ   kr ˆ k rn q|‘qS r
   r
   ©r   r'   ©ÚhiÚloÚmetricr
   r   r   X   r   zreport.<locals>.<listcomp>é   c                 s   s   | ]}|d  V  qdS ©r*   Nr
   rG   r
   r
   r   r8   [   r   zreport.<locals>.<genexpr>ç      Y@z>9.1fú%é   r   éÿÿÿÿz    -> z vs z: z+.1fz percentage points)Úprintr<   r@   r!   )
r%   rK   ZlabelZbucketsZgotÚnameZselr4   Zlo_rZhi_rr
   rH   r   ÚreportS   s    ( <rT   c            
   
      s  t ƒ tƒ  } }g }|  ¡ D ]B\}}||vr,qt|ƒ}|s:q|| |d< t|ƒ|d< | |¡ q|sntdƒ d S dtdd„ |D ƒƒ t|ƒ }tt|ƒ› dt› d|d	›d
�ƒ t	dd„ |D ƒƒ‰‡fdd„dD ƒ}td|d d d›d|d d d›d|d d d›d�ƒ t
|ddt d|d df|d |d df|d |d df|d ddfgƒ t
|ddg d ¢ƒ d!d„ |D ƒ}t|ƒd"k�r td#t|ƒ› d$�ƒ t	d%d„ |D ƒƒ‰ ‡ fd&d„dD ƒ}	t
|dd'd|	d df|	d |	d df|	d |	d df|	d ddfgƒ d S )(Nr*   Úlifez!no legs with enough price historyrN   c                 s   s   | ]}|d  V  qdS rM   r
   rG   r
   r
   r   r8   t   r   zmain.<locals>.<genexpr>z legs with >= z& snapshots of history, base fill rate z.1frO   c                 s   s   | ]}|d  V  qdS ©r9   Nr
   rG   r
   r
   r   r8   x   r   c                    s    g | ]}ˆ t |tˆ ƒ ƒ ‘qS r
   ©r2   r<   ©r   Úp)Úsdsr
   r   r   y   r   zmain.<locals>.<listcomp>)g      Ð?g      à?g      è?z
early-window stdev quartiles: r   éd   z.2fzc / r   rP   Úcr9   z'price stdev over the first %d snapshotszcalmest 25%Z2ndZ3rdé	   zwildest 25%r;   znumber of price changes))r   r   znever moved)r   é   z1-2)r^   é   z3-5)r_   éc   z6+c                 S   s    g | ]}|d  t d kr|‘qS )rU   rP   )r   rG   r
   r
   r   r   „   r   é<   z/
=== legs that survived past the early window (z0, so the measured move came BEFORE any fill) ===c                 s   s   | ]}|d  V  qdS rV   r
   rG   r
   r
   r   r8   ˆ   r   c                    s    g | ]}ˆ t |tˆ ƒ ƒ ‘qS r
   rW   rX   )Úsr
   r   r   ‰   r   zprice stdev (uncontaminated))r)   r5   r"   rD   r<   r!   rR   r@   r   ÚsortedrT   )
r$   Zfillsr%   r(   rB   r	   ÚbaseÚqZ	survivorsZqqr
   )rb   rZ   r   Úmaind   s^    ÿ
ÿÿÿ
ÿÿÿÿ
ÿÿrf   Ú__main__)Ú__doc__r   r   r=   Úsysr   r/   Úosr2   Úenvironr    r   r   r)   r5   rD   rT   rf   Ú__name__r
   r
   r
   r   Ú<module>   s    +