a
    OD�jr  ã                   @   sv   d Z ddlZddlZddlZddlZddlZdZdZdd„ Z	dd„ Z
d	d
„ Zdd„ Zdd„ Zdd„ Zedkrreƒ  dS )ap  Why every completed book collected less than $1.00.

Today's live maker completed three books and every one of them came in under
the dollar it owed: SLAUNI 0.98, ALAGET 0.99, EXCPSV 1.00. The books were quoted
when their three asks summed to ~1.02. So the money did not vanish at quote
time, it vanished BETWEEN the first fill and the last.

Two candidate explanations, and they have opposite remedies:

  DRIFT     -- the overround decays with time-to-kickoff for everyone. Fixable
               by quoting later, closer to KO, where the decay is already spent.
  SELECTION -- a leg fills precisely when the market moves through it, and that
               same move makes the remaining legs worth less. Fixable ONLY by
               quoting wider than the expected move; waiting does nothing.

This measures both, then prices the premium needed to survive whichever is real.
é    Nz&E:\soccer\research\mm_paper_quotes.csvgìQ¸…ë‘?c                 C   s   t |  d|   S )Nç      ð?)ÚMAKER_FEE_RATE)Úp© r   ú*E:\soccer\research\mm_adverse_selection.pyÚ	maker_fee   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 )Nr   é   )ÚfloatÚ	TypeErrorÚ
ValueError)ÚxÚvr   r   r   Ú_f   s
    "r   c              
   C   sF   dD ]<}z t j t| ƒd d… |¡W   S  ttfy>   Y q0 qd S )N)z%Y-%m-%d %H:%M:%Sz%Y-%m-%dT%H:%M:%Sz%Y-%m-%d %H:%Mé   )ÚdtÚdatetimeÚstrptimeÚstrr   r
   )ÚsÚfr   r   r   Ú_ts$   s     r   c            	      C   sÖ   t  dd„ ¡} i }ttddd��ž}t |¡D ]‚}| d¡| d¡pDd ¡  }}t| d	¡ƒ}t	| d
¡ƒ}|r,|r,|r,|s|q,|| | | |< ||vr,t	| d¡ƒ}|r,|||< q,W d  ƒ n1 sÄ0    Y  | |fS )z2{event: {ts: {side: ask}}} plus kickoff per event.c                   S   s
   t  t¡S ©N)ÚcollectionsÚdefaultdictÚdictr   r   r   r   Ú<lambda>/   ó    zload.<locals>.<lambda>zutf-8Úreplace)ÚencodingÚerrorsZeventÚsideÚ Zk_askZtsZkickoffN)
r   r   ÚopenÚQUOTESÚcsvZ
DictReaderÚgetÚlowerr   r   )	ÚbooksÚkosZfhÚrÚevr    ÚaÚtÚkr   r   r   Úload-   s    (r.   c           
      C   s’   g }|   ¡ D ]€\}}| |¡}|  ¡ D ]d\}}t|ƒdkr<q&t| ¡ ƒ}d|  k r\dk s`q& q&|rt||  ¡ d nd}	| |||	|f¡ q&q|S )zJ(event, ts, hours_to_ko, sum_of_three_asks) for snapshots with all 3 legs.é   gš™™™™™é?gffffffö?g      ¬@N)Úitemsr%   ÚlenÚsumÚvaluesÚtotal_secondsÚappend)
r'   r(   Úoutr*   ÚsnapsZkor,   Úlegsr   Úhr   r   r   Úcomplete_snaps@   s    
r:   c                     sü  t ƒ \} }t| |ƒ}tt| ƒd›dt|ƒd›dt|ƒd›d�ƒ tdƒ g d¢}tdd›d	d
d›d	dd›d	dd›d	dd›�	ƒ |D ]€\‰‰ }t‡ ‡fdd„|D ƒƒ}t|ƒdk r²q‚t|ƒ}t|d›d	|d›d	t |¡d›d	||d  d›d	|d| d  d›�	ƒ q‚tdƒ g g  }}|  ¡ D ]ò\}	}
tdd„ |
 ¡ D ƒƒ}t||dd … ƒD ]¾\}}||  	¡ dk�rl�qN|
| |
|  ‰‰‡‡fdd„ˆD ƒ}t|ƒdk�r¤�qN|d ‰‡fdd„ˆD ƒ}t
‡fd d„|D ƒƒ}t
‡fd!d„|D ƒƒ}| || ¡ | t
ˆ ¡ ƒ¡ �qN�q|�rêt|ƒ}t|ƒ}td"|d›�ƒ td#t |¡d$ d%›d&�ƒ td't |¡d$ d%›d&�ƒ td(||d  d$ d%›d)|d| d  d$ d%›d&�ƒ t
d*d„ |D ƒƒ}td+d,| | d-›d.�ƒ td/ƒ td0ƒ td1ƒ td2ƒ |�røt |¡ }t d3d„ |D ƒ¡}dt|d4 ƒ }td5|d6›�ƒ td7|d$ d8›d&�ƒ td9|d$ d%›d&�ƒ d:| | ‰td;ˆd6›d<�ƒ t
‡fd=d„|D ƒƒ}td>|d›d?t|ƒd›d@d,| t|ƒ d-›dA�ƒ tdBˆ| d$ d%›dCˆ| d d$ d%›dD�ƒ d S )ENú,z books, z  snapshots with all three legs, z with a kickoff
z;=== 1. Is the overround decaying as kickoff approaches? ===))é   iç  z>24h)é   r<   z12-24h)é   r=   z6-12h)r/   r>   z3-6h)r   r/   z1-3h)ç      à?r   z30-60m)r   r?   z<30mZwindowz>8ú Únz>7z
median sumz>11Zp25Zp75c                 3   s:   | ]2\}}}}|d urˆ|  kr*ˆ k rn q|V  qd S r   r   )Ú.0Ú_r9   r   )ÚhiÚlor   r   Ú	<genexpr>]   r   zmain.<locals>.<genexpr>é2   z>7,z>11.4fé   z>7.4fr/   zC
=== 2. After one leg trades up, what happens to the other two? ===c                 s   s"   | ]\}}t |ƒd kr|V  qdS )r/   N)r1   )rB   r,   r8   r   r   r   rF   k   r   r   i„  c                    s$   g | ]}ˆ| ˆ |  d kr|‘qS )g{®Gáz„?r   ©rB   r   )ÚlaÚlbr   r   Ú
<listcomp>p   r   zmain.<locals>.<listcomp>r   c                    s   g | ]}|ˆ kr|‘qS r   r   rI   )Úhitr   r   rL   t   r   c                 3   s   | ]}ˆ | V  qd S r   r   rI   )rJ   r   r   rF   u   r   c                 3   s   | ]}ˆ | V  qd S r   r   rI   )rK   r   r   rF   v   r   z
  events: z'  median change in the other two legs: éd   z+.2fÚcz'  mean                               : z'  p25 / p75                          : zc / c                 s   s   | ]}|d k rdV  qdS )r   r   Nr   )rB   r   r   r   r   rF   �   r   z'  share where the rest got CHEAPER   : g      Y@z.1fú%z>
  -> a maker who has sold one leg must now sell the other twoz?     into this. Negative means the book is worth less than whenz@     it was quoted, and that gap is the loss per completed book.z3
=== 3. Premium required to complete profitably ===c                 S   s   g | ]\}}}}|‘qS r   r   ©rB   rC   r   r   r   r   rL   ‹   r   g      @z  median quoted sum          : z.4fz  fees on three legs         : z.2fz  adverse move after 1st fill: r   z  sum needed AT QUOTE TIME   : z (= 1.00 + fees + the move)c                 3   s"   | ]\}}}}|ˆ krd V  qdS )r   Nr   rQ   )Úneedr   r   rF   “   r   z  snapshots clearing that bar: ú/z (z%)z  premium over the touch     : zc (z
c per leg))r.   r:   Úprintr1   ÚsortedÚ
statisticsZmedianr0   Úzipr4   r2   r5   r3   Zmeanr   )r'   r(   r7   ZbucketsZlblr   rA   ZdeltasZ	base_sumsr*   Z
snaps_by_tÚtimesr+   ÚbZmovedÚrestZbeforeZafterÚdZworseZadverseZmed_sumZfee3Zokr   )rD   rM   rJ   rK   rE   rR   r   ÚmainP   sˆ    

ÿ
. ÿÿ

ÿÿ
ÿ
ÿr\   Ú__main__)Ú__doc__r$   r   rV   Úsysr   r   r#   r   r   r   r   r.   r:   r\   Ú__name__r   r   r   r   Ú<module>   s   (	J