o
    i0F                     @   s   d Z ddlZddlZddlmZ ddlZddlmZ	 zddl
mZmZ ddlmZ ddlmZ ddlmZ W n# eyY   ddlmZ ddlmZmZ ddlmZ ddlmZ Y nw dd	d
ZdddZdddZdddZdddZdddZdS )uF   
Created on 2017年06月04日
@author: debugo
@contact: me@debugo.com
    N)BeautifulSoup)domestic_cons)urlopenRequest)	urlencode)	HTTPError)IncompleteReadc              
   C   s  | dur	t | ntj }z ttt j|d|d|df t j	d
 dd}W n, tyZ } z |jdkrOtt j|d|d|df | W Y d}~dS d}~ww |d	d
krddS dd |ddd D }|d
 d
 dkr|dS t }|d}|dd D ]W}t j|d
 }|sq||d
 |dd}tt jD ]*\}	}
||	d  dkrd||
< q|
dv rt||	d  ||
< qt||	d  ||
< q|d |d  |d< || qt|t j S )u  
        获取中金所日交易数据
    Parameters
    ------
        date: 日期 format：YYYY-MM-DD 或 YYYYMMDD 或 datetime.date对象 为空时为当天
    Return
    -------
        DataFrame
            中金所日交易数据(DataFrame):
                symbol        合约代码
                date          日期
                open          开盘价
                high          最高价
                low          最低价
                close         收盘价
                volume        成交量
                open_interest   持仓量
                turnover      成交额
                settle        结算价
                pre_settle    前结算价
                variety       合约类别
        或 None(给定日期没有交易数据)
    Nz%Y%m%d%Y%m%dheadersgbkignore  u   网页错误r   c                 S   .   g | ]}|d  d  dkr| dddqS )r      小  ,replacesplit.0i r   K/opt/alphahud/venv/lib/python3.10/site-packages/tushare/futures/domestic.py
<listcomp>?      . z#get_cffex_daily.<locals>.<listcomp>
u   合约代码   datesymbolvarietyr           )volumeopen_interestoi_chgclosechange1
pre_settle)ctconvert_datedatetimer#   todayr   r   CFFEX_DAILY_URLstrftimeSIM_HAEDERSreaddecoder   codeprintfindr   listFUTURE_SYMBOL_PATTERNmatchgroup	enumerateCFFEX_COLUMNSintfloatappendpd	DataFrameOUTPUT_COLUMNS)r#   dayhtmlreason	dict_data	day_constrowmrow_dictr   fieldr   r   r   get_cffex_daily   sP   


rN   futurec              
   C   s@  |dkrt j}t j}t j}n|dkrt j}t j}t j}n
td| d  dS | dur/t | nt	j
 }ztt||d|df t jd d	d
}W n( tyw } z|jdkrltt j|d|df | W Y d}~dS d}~ww |ddks|ddkrdS dd |ddd D }|d d dvrdS t }t|d}	|dd D ]h}
t j|
d }|sq|	|
d |dd}t|D ]F\}}|
|d  dkrd||< q|dv r|
|d  dd|
|d < t|
|d  ||< q|
|d  dd|
|d < t|
|d  ||< q|| qt || S )ub  
        获取郑商所日交易数据
    Parameters
    ------
        date: 日期 format：YYYY-MM-DD 或 YYYYMMDD 或 datetime.date对象 为空时为当天
        type: 数据类型, 为'future'期货 或 'option'期权二者之一
    Return
    -------
        DataFrame
            郑商所每日期货交易数据:
                symbol        合约代码
                date          日期
                open          开盘价
                high          最高价
                low           最低价
                close         收盘价
                volume        成交量
                open_interest 持仓量
                turnover      成交额
                settle        结算价
                pre_settle    前结算价
                variety       合约类别
        或 
        DataFrame
           郑商所每日期权交易数据
                symbol        合约代码
                date          日期
                open          开盘价
                high          最高价
                low           最低价
                close         收盘价
                pre_settle      前结算价
                settle         结算价
                delta          对冲值  
                volume         成交量
                open_interest     持仓量
                oi_change       持仓变化
                turnover        成交额
                implied_volatility 隐含波动率
                exercise_volume   行权量
                variety        合约类别
        None(类型错误或给定日期没有交易数据)
    rO   optioninvalid type :z+,type should be one of "future" or "option"N%Yr
   r   r   r   r   u   您的访问出错了r   u!   无期权每日行情交易记录c                 S   r   )r   r   r   r   |r   r   r   r   r   r      r   z"get_czce_daily.<locals>.<listcomp>r   r!   )u   品种月份u   品种代码   r"   r&   )r'   r(   r)   exercise_volumer   r   )!r-   CZCE_DAILY_URLCZCE_COLUMNSrD   CZCE_OPTION_URLCZCE_OPTION_COLUMNSOPTION_OUTPUT_COLUMNSr7   r.   r/   r#   r0   r   r   r2   r3   r4   r5   r   r6   r8   r   r9   r?   r:   r;   r<   r=   r   r@   rA   rB   rC   )r#   typeurllisted_columnsoutput_columnsrE   rF   rG   rH   rI   rJ   rK   rL   r   rM   r   r   r   get_czce_dailyY   sf   ,

ra   c              
   C   s   | dur	t | ntj }ztttt j	|
d t jd d}W n# tyJ } z|jdkr?tt j|
d | W Y d}~dS d}~ww t|d dkrUdS t|d }|d j |d< |d	 d
 |jt jdtt j  S )u  
        获取上期所日成交均价数据
    Parameters
    ------
        date: 日期 format：YYYY-MM-DD 或 YYYYMMDD 或 datetime.date对象 为空时为当天
    Return
    -------
        DataFrame
            郑商所日交易数据(DataFrame):
                symbol        合约代码
                date          日期
                time_range    vwap时段，分09:00-10:15和09:00-15:00两类
                vwap          加权平均成交均价
        或 None(给定日期没有数据)
    Nr
   r   utf8r   o_currefpricer   INSTRUMENTIDz:B1int16)columns)r-   r.   r/   r#   r0   jsonloadsr   r   SHFE_VWAP_URLr2   r3   r4   r5   r   r6   r7   SHFE_DAILY_URLlenrB   rC   strstripastyperenameSHFE_VWAP_COLUMNSr9   values)r#   rE   	json_datarG   dfr   r   r   get_shfe_vwap   s&   

rt   c              
   C   sr  | dur	t | ntj }ztttt j	|
d t jd d}W n# tyJ } z|jdkr?tt j	|
d | W Y d}~dS d}~ww t|d dkrUdS tdd	 |d D }|jjdd
j |d< |d |d  |d< |
d|d< t|}|durtj|||jdk ddgdd}|j|j |d< ntd|
d d|d< |jt jdd |t j S )u  
        获取上期所日交易数据
    Parameters
    ------
        date: 日期 format：YYYY-MM-DD 或 YYYYMMDD 或 datetime.date对象 为空时为当天
    Return
    -------
        DataFrame
            上期所日交易数据(DataFrame):
                symbol        合约代码
                date          日期
                open          开盘价
                high          最高价
                low           最低价
                close         收盘价
                volume        成交量
                open_interest 持仓量
                turnover      成交额
                settle        结算价
                pre_settle     前结算价
                variety       合约类别
        或 None(给定日期没有交易数据)
    Nr
   r   rb   r   o_curinstrumentr   c                 S   s(   g | ]}|d  dkr|d  dkr|qS )DELIVERYMONTH   小计r   r   )r   rJ   r   r   r   r      s   ( z"get_shfe_daily.<locals>.<listcomp>ir%   rv   r$   r#   z
9:00-15:00left)onhowturnoverzFailed to fetch SHFE vwap.r&   T)rf   inplace) r-   r.   r/   r#   r0   rg   rh   r   r   rj   r2   r3   r4   r5   r   r6   r7   rk   rB   rC   	PRODUCTIDrl   sliceupperrt   merge
time_rangevwapVOLUMEro   SHFE_COLUMNSrD   )r#   rE   rr   rG   rs   vwap_dfr   r   r   get_shfe_daily   s6   

 
r   c              
   C   sJ  | dur	t | ntj }|dkrtd|d dS |dkrGt jd t|d|dt	t
|dd	 |d
d }t j}t j}n6|dkrst jd t|d|dt	t
|dd	 |d
dd }t j}t j}n
td| d  dS ztt|dt jd d}W nJ ty } zt||d	 dW  Y d}~S d}~w ty } z%|jdkrt||d	 dW  Y d}~S |jdkrtt j| W Y d}~dS d}~ww d|v rt||d	 dS d|v rdS t|dd}	t|	dkrdS t }
t }|	d	d D ]}d|jv sd|jv rq|d}|dkrzdt j|d j  i}|d |d	 j  |d < t|D ]4\}}||d!  j }d"|v rVd||< q>|d#v rgt
| d$d%||< q>t!| d$d%||< q>|
"| qt|d&krt j#$|d	 j }|sq|d	 j |%d	& |%dd'}t|D ]4\}}||d!  j }d"|v rd||< q|d#v rt
| d$d%||< qt!| d$d%||< q|
"| qt|d!kr|"|d j t!|d	 j d( qt'(|
}|d|d)< |dkr|| S t'j)|t'(|d*d+d,d-| S ).u  
        获取大连商品交易所日交易数据
    Parameters
    ------
        date: 日期 format：YYYY-MM-DD 或 YYYYMMDD 或 datetime.date对象 为空时为当天
        type: 数据类型, 为'future'期货 或 'option'期权二者之一
        retries: int, 当前重试次数，达到3次则获取数据失败
    Return
    -------
        DataFrame
            大商所日交易数据(DataFrame):
                symbol        合约代码
                date          日期
                open          开盘价
                high          最高价
                low           最低价
                close         收盘价
                volume        成交量
                open_interest   持仓量
                turnover       成交额
                settle        结算价
                pre_settle    前结算价
                variety       合约类别
        或 
        DataFrame
           郑商所每日期权交易数据
                symbol        合约代码
                date          日期
                open          开盘价
                high          最高价
                low           最低价
                close         收盘价
                pre_settle      前结算价
                settle         结算价
                delta          对冲值  
                volume         成交量
                open_interest     持仓量
                oi_change       持仓变化
                turnover        成交额
                implied_volatility 隐含波动率
                exercise_volume   行权量
                variety        合约类别
        或 None(给定日期没有交易数据)
    N   z%maximum retires for DCE market data: r
   rO   ?rR   z%mr!   r	   )currDateyearmonthrE   rP   1)r   r   r   rE   zdayQuotes.trade_typerQ   z', should be one of "future" or "option"POST)methodr   rb   )retriesi  r   u3   错误：您所请求的网址（URL）无法获取u   暂无数据zhtml.parsertrr   rw   u   总计tdr%   r$   rU   -)r'   r(   r   r      )r$   r%   contract_id)r   implied_volatilityr#   r   rx   F)ry   rz   	indicator)*r-   r.   r/   r#   r0   r7   r2   DCE_DAILY_URLr   rl   r?   DCE_COLUMNSrD   DCE_OPTION_COLUMNSr\   r   r   DCE_HEADERSr4   r5   r   get_dce_dailyr   r6   r   find_allrk   r9   textDCE_MAPrm   r=   r   r@   rA   r:   r;   r<   r   rB   rC   r   )r#   r]   r   rE   r^   r_   r`   responserG   datarH   implied_dataidataxrL   r   rM   field_contentrK   rs   r   r   r   r     s   -

"





&

(

r   CFFEXc                 C   s   |  dkr	t}n!|  dkrt}n|  dkrt}n|  dkr$t}ntd dS | dur3t| ntj	
 } |durAt|ntj	
 }t }| |krf|| }|durZ|| | tjdd7 } | |ksMt|d	krqt|S dS )
u  
        获取中金所日交易数据
    Parameters
    ------
        start: 开始日期 format：YYYY-MM-DD 或 YYYYMMDD 或 datetime.date对象 为空时为当天
        end: 结束数据 format：YYYY-MM-DD 或 YYYYMMDD 或 datetime.date对象 为空时为当天
        market: 'CFFEX' 中金所, 'CZCE' 郑商所,  'SHFE' 上期所, 'DCE' 大商所 之一。默认为中金所 
    Return
    -------
        DataFrame
            中金所日交易数据(DataFrame):
                symbol      合约代码
                date       日期
                open       开盘价
                high       最高价
                low       最低价
                close      收盘价
                volume      成交量
                open_interest 持仓量
                turnover    成交额
                settle     结算价
                pre_settle   前结算价
                variety     合约类别
        或 None(给定日期没有交易数据)
    r   CZCESHFEDCEzInvalid market.Nr!   )daysr   )r   rN   ra   r   r   r7   r-   r.   r/   r#   r0   r9   rA   	timedeltark   rB   concat)startendmarketfdf_listrs   r   r   r   get_future_daily  s,   

r   )N)NrO   )NrO   r   )NNr   )__doc__rg   r/   bs4r   pandasrB   tushare.futuresr   r-   urllib.requestr   r   urllib.parser   urllib.errorr   http.clientr   ImportErrorurlliburllib2httplibrN   ra   rt   r   r   r   r   r   r   r   <module>   s0   

?
^
#
4 