a
    ^sOj&                     @   s:   d Z ddlZddlZdd Zdd Zdd Zdd	d
ZdS )u.  
财报质量风险信号（豆包高确定性规则）。

从豆包 36 条量化规则中筛选出 8 条数据可得、确定性较高的信号，
单独作为 layer6（豆包风控层）。

8 条信号：
1. 应收增速持续大幅超过营收增速
2. 长期股权投资占净资产过高（当前数据库缺少该明细，暂按 0 处理并留痕）
3. 连续 2 年流动比率 < 1
4. 现金比率极低
5. 连续 3 年经营现金流 < 0
6. 有息负债持续大幅扩张
7. 核心资产持续剥离出售
8. 大额商誉一次性全额计提减值
    Nc                 C   s0   t |dkt| @ t|@ | | | t jS )u-   计算同比增速，基期 <=0 返回 nan。r   )npwherepdnotnanan)curprev r	   7/Users/admin/quant_ocf/ocf/signals/financial_quality.py
_yoy_ratio   s    r   c                 C   sZ   | j r
dS || t}| dkr(dS d}d}|D ] }|rP|d7 }t||}q4d}q4|S )u/   计算满足 condition 的最大连续年数。r      )emptyastypeintsummax)series	conditionmask
max_streakstreakvr	   r	   r
   _max_consecutive   s    r   c                 C   s   | j rtjddgt| dS | | d |  } | djg ddd} | jddgdddd	}|D ]}||j	vrft
j||< qf| S )
ui   把长格式财报明细 pivot 成宽格式，并对同一 code+year 的重复项取第一个非空值。codeyearcolumns	item_namevalue)r   r   r   first)keep)indexr   valuesaggfunc)r   r   	DataFramelistisincopysort_valuesdrop_duplicatespivot_tabler   r   r   reset_index)dfZ
item_namesZwidecolr	   r	   r
   _pivot_statement-   s    
r.   c           #      C   s"  g d}dd dd |D  d}tj|| dtid}|d	 tjd
d t|d< g d}dd dd |D  d}tj|| dtid}|d	 tjd
d t|d< d}tj|| dtid}	|	d	 tjd
d t|	d< t||}
|
d |
d |
d< |
d |
d |
d< |
d d|
d d |
d d |
d d |
d< t||}|d d|d d |d< |d  |d! |d"< t|	d#g}|jd#d$id%}|
j	|ddgd&d'}|j	|ddgd&d'}|
ddg}t|d |dd d(|d)< t|d* |dd* d(|d+< |d) |d+  |d,< t|d- dk|d. |d-  tj|d/< t|d- dk|d0 |d-  tj|d1< t|d |dd d(|d2< t|d3 dk|d |d3  tj|d4< |dd5 d(|d5  |d6< |dd" d(|d7< g }|dD ]\}}|
d}|jd8 }t|d, d9d: }t|d;kot|d$ o|d$ dk }tj}d}d(}t|d< rt|d r|d dkrt|d< |d  }t|d=k}d}d}t|d;krNt|jd8 d/ rN|jd8 d/ d>k rNt|jd? d/ rN|jd? d/ d>k rNd(}tt|d1 oj|d1 d@k }t|d$ dAd: }t|dBk}d}t|dBkr|jd8 d2 }|jd? d2 }|jd8 d+ }t|r|dCkrt|r|dCkrt|r|dDk rd(}d}t|d;krD|jd?d
 d4 } | dEk rDd(}d}!|jd8 }"t|"d6 r|"d6 dkrt|"d7 r|"d6 t|"d7 krd(}!|||||||t|d/ r|d/ ntj|t|d1 r|d1 ntj|||||t|"d6 r|"d6 ntj|!dF q*t|S )Gu'   计算 8 条财报质量风险信号。)   应收账款   应收票据及应收账款   流动资产合计   流动负债合计   货币资金   短期借款   长期借款   应付债券!   一年内到期的非流动负债   商誉   长期股权投资$   归属于母公司股东权益合计&   所有者权益(或股东权益)合计z
    SELECT code, report_date, item_name, value::double precision AS value
    FROM financial_reports
    WHERE statement_type='balance_sheet' AND report_date LIKE '%1231'
      AND item_name IN (z, c                 S   s   g | ]}d | d qS 'r	   .0xr	   r	   r
   
<listcomp>I       z1fetch_financial_quality_flags.<locals>.<listcomp>z)
    r   )dtypereport_dateN   r   )   营业收入   利润总额   资产处置收益   投资收益'   归属于母公司所有者的净利润   归属于母公司的净利润z
    SELECT code, report_date, item_name, value::double precision AS value
    FROM financial_reports
    WHERE statement_type='profit' AND report_date LIKE '%1231'
      AND item_name IN (c                 S   s   g | ]}d | d qS r<   r	   r>   r	   r	   r
   rA   T   rB   u   
    SELECT code, report_date, item_name, value::double precision AS value
    FROM financial_reports
    WHERE statement_type='cashflow' AND item_name='经营活动产生的现金流量净额' AND report_date LIKE '%1231'
    r/   r0   arr:   r;   equityr4   r   r5   r6   r7   interest_debtrH   rI   Zdispose_gainrJ   rK   Znet_profit_parentu'   经营活动产生的现金流量净额ocfr   outer)onhowr   Zar_yoyrF   Zrev_yoyZar_rev_diffr2   r1   Zcurrent_ratior3   
cash_ratioZdebt_yoyrG   Zdispose_profit_ratior8   goodwill_impair_proxyZnet_profit_prevc                 S   s   | dkS )N333333?r	   sr	   r	   r
   <lambda>   rB   z/fetch_financial_quality_flags.<locals>.<lambda>   r9   g?g      ?g?c                 S   s   t | | dk @ S )Nr   )r   r   rW   r	   r	   r
   rY      rB      rV   g?g      ?)r   ar_growth_over_rev_flagar_growth_over_rev_yearslong_inv_ratiolong_inv_high_flaglong_inv_data_missing_flagcurrent_ratio_latestcurrent_ratio_low_flagcash_ratio_latestcash_ratio_low_flagocf_negative_consec_flagocf_negative_yearsdebt_expand_flagcore_asset_sell_flagrT   goodwill_one_time_impair_flag)joinr   read_sqlstrr   r   r.   fillnarenamemerger(   r   groupbyshiftr   r   r   ilocr   r   floatlenallabsappendr$   )#connindustry_mapZbs_itemsbs_sqlbsZpl_itemspl_sqlplZcf_sqlcfZbs_wideZpl_wideZcf_widemergedresultsr   glatestr^   r]   r_   r`   ra   rc   re   rg   rf   rh   Zlatest_debt_yoyZprev_debt_yoyZlatest_rev_yoyri   Zratiosrj   Z
impair_rowr	   r	   r
   fetch_financial_quality_flags:   s   """

 """ 



.

r   )N)	__doc__numpyr   pandasr   r   r   r.   r   r	   r	   r	   r
   <module>   s   