a
    Í�jr  ã                   @   sª   d 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
ZddlmZmZ dZdd„ Zd	d
„ Zdd„ ZddddœZdd„ Zedkr¦eƒ  dS )až  What do the books that DON'T complete actually cost?

The ratchet backtest scores completed books only (+10.7c queue-aware over ~2.5
weeks) and treats the other ~96% as free. They are not free: every filled leg of
an incomplete book is an unhedged short carried to settlement, worth
(price collected - 1) if that outcome wins and (price collected) if it does not.

And there is a reason to expect them to be biased. Favourites fill at 49.6% and
draws at 17.7%, so the leg we are left holding is systematically the one buyers
wanted -- which is the classic shape of adverse selection.

This adds settlement P&L on every partial to the completion P&L, for the real
total.
é    NzE:\soccer\mainzE:\soccer\research)Ú	load_legsÚCACHEzE:\soccer\live_datac              	   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_partial_pnl.pyÚ_f   s    
r   c               	   C   sØ   i } t dddd��²}t |¡D ]–}| d¡}|r|| v s| d¡pDd ¡ sLqt| d¡ƒ}|rd	|  k rrd
k svq q|| d¡p„d ¡ | d¡p”ddd… | d¡| d¡f| |< qW d  ƒ n1 sÊ0    Y  | S )z?{leg_ticker: (touch, side, gd, home, away)} at the first quote.z&E:\soccer\research\mm_paper_quotes.csvúutf-8Úreplace©ÚencodingÚerrorsZ
leg_tickerZask_sizeÚ Zk_askr   é   ÚsideZkickoffNé
   ÚhomeÚaway)ÚopenÚcsvÚ
DictReaderÚgetÚstripr   Úlower)ÚoutÚfhÚrÚtÚar	   r	   r
   Ú	load_meta!   s     ÿ
$ÿ(r"   c               
   C   s¬   i } t dd„ t t¡D ƒƒD ]Š}ttj t|¡ddd��^}t |¡D ]B}| 	d¡pTd 
¡  ¡ }|dv rD|| | 	d	¡| 	d
¡| 	d¡f< qDW d  ƒ q1 sœ0    Y  q| S )z@{(gd, home, away): 'H'|'D'|'A'} from live_data's backfilled ftr.c                 s   s   | ]}|  d ¡r|V  qdS )z.csvN)Úendswith)Ú.0Úfr	   r	   r
   Ú	<genexpr>5   ó    zload_results.<locals>.<genexpr>r   r   r   Zftrr   ©ÚHÚDÚAZ	game_dater   r   N)ÚsortedÚosÚlistdirÚLIVE_DIRr   ÚpathÚjoinr   r   r   Úupperr   )ÚresÚfnr   r   Úvr	   r	   r
   Úload_results2   s    ÿBr6   r   Údrawr   r(   c            '         s
  t ƒ tƒ  } ‰ tƒ }t ttdd�¡}t t	¡}|  
¡ D ](\}}|ˆ v r8||| dd¡d  |< q8d }}d }}	d}
d}t dd„ ¡}| 
¡ D �]l\}}t|ƒd	kr¨q�‡ fd
d„|D ƒ}t |i ¡d dkrÐq�i }| 
¡ D ]ì\}}|› d|d  ¡ › �}||v�rd } �qÊd\}}|| D ] \}}}t |¡}|�s> �qÀ|d }|jd u |jd u k�rz|j�rl| ¡ n|j|jd�}||k�rŠ �qÀ||| d k�r||7 }||d k�rd} �qÀ�q|||< qÜ|d u �rÖq�t| ¡ ƒ�r t| ¡ ƒ}tdd„ | ¡ D ƒƒ}|d7 }||| d 7 }q�dd„ | 
¡ D ƒ}|�s:q�ˆ |d  \}}}}}| |||f¡} | d u �rt|d7 }q�|d7 }|D ]|}ˆ | d ˆ | d  }!}"|!t |!¡ t|  |"k�r¼dnd }#|	|#7 }	|
d7 }
||" }$|$d  d7  < |$d  |#7  < �q€q�td|d›d|d d›d �ƒ td!|d›d|	d d›d"|
› d#�ƒ td$d%›d&�ƒ td'd(›d)||	 d d›d �ƒ |�r’td*|	| d d+›d �ƒ |�rªtd,|d-›d.�ƒ td/ƒ d0D ]N}%||% \}&}|&�r¶td1|%d2›d3|&d4›d5|d d›d6||& d d+›d7�	ƒ �q¶d S )8Nr   )r   ú-r   r   ç        c                   S   s   ddgS )Nr   r9   r	   r	   r	   r	   r
   Ú<lambda>P   r'   zmain.<locals>.<lambda>é   c                    s   i | ]}|ˆ | d  “qS )r   r	   )r$   r    ©Úmetar	   r
   Ú
<dictcomp>U   r'   zmain.<locals>.<dictcomp>ZdecisionZgateú|Úts)r9   FÚko)Útzinfog•Ö&è.>ZqueueTc                 s   s   | ]}t  |¡V  qd S r   )ÚMLÚ	maker_fee)r$   r!   r	   r	   r
   r&   s   r'   zmain.<locals>.<genexpr>g      ð?c                 S   s   g | ]\}}|r|‘qS r	   r	   )r$   r    Úhr	   r	   r
   Ú
<listcomp>x   r'   zmain.<locals>.<listcomp>zcompleted books : z>4.0fz   P&L éd   z>+8.1fÚczpartial books   : zc   (z stranded legs)r   Z16z          ------------ZTOTALz>16z
          z
per partial book: z+.2fú(z.0fz, partial books dropped -- no settled result)z
stranded legs by side:)r   r7   r   z  z>5ú z>4z legs  zc  (zc each))r   r"   r6   ÚjsonÚloadr   r   ÚcollectionsÚdefaultdictÚdictÚitemsÚrsplitÚlenrC   Zbook_budgetZ	isoformatÚSZ_ptrB   Z
astimezoner   ÚallÚvaluesÚsumr   rD   ÚWINSÚprint)'Zlegsr3   ZtradesZbooksr    r5   Zcomp_nZcomp_pnlZpart_nZpart_pnlZ	part_legsZ	no_resultZby_sideZevZlsZasksZfilledÚkeyZcumZhitZts_sÚprH   r@   rA   ZcollZfeesÚhitsÚ_Úgdr   r   r   Zpxr   ZpnlÚbÚsÚnr	   r<   r
   ÚmainB   s¤    







$ÿ
  ÿra   Ú__main__)Ú__doc__r   rM   rK   r-   Úsysr0   ÚinsertZ	mm_settlerS   Zmm_maker_liverC   Zmm_volatility_cleanr   r   r/   r   r"   r6   rW   ra   Ú__name__r	   r	   r	   r
   Ú<module>   s   (Y