feat: 初始提交 - 科创企业特有风险的识别与管理 (数智风控系统)
This commit is contained in:
@@ -0,0 +1,174 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
财务风控节点
|
||||
审查维度:研发资本化操纵、客户/供应商集中度、应收账款质量、现金流
|
||||
"""
|
||||
import json
|
||||
from .base_agent import BaseAgent
|
||||
|
||||
|
||||
FIN_SYSTEM_PROMPT = """你是一名精通科创板审计规则的注册会计师(CPA),同时是金融风控专家。
|
||||
|
||||
你的任务是基于提供的企业财务数据,从财务角度穿透审查以下风险:
|
||||
1. 研发资本化操纵风险:研发资本化率是否异常,是否存在美化利润嫌疑
|
||||
2. 客户/供应商集中风险:前五大客户/供应商占比是否过高
|
||||
3. 应收账款质量:应收账款周转率是否异常,是否存在坏账风险
|
||||
4. 现金流健康度:经营现金流是否能覆盖运营需求
|
||||
|
||||
评估标准参考:
|
||||
- 科创板企业研发资本化率超过30%需重点关注
|
||||
- 前五大客户占比超过50%存在集中风险
|
||||
- 应收账款周转率低于4次/年需关注回款能力
|
||||
- 经营现金流/营收比低于0.5需关注持续经营能力
|
||||
|
||||
请输出JSON格式:
|
||||
{
|
||||
"agent": "财务风控节点",
|
||||
"rd_capitalization_risk": {"score": 0-100, "level": "高/中/低", "detail": "..."},
|
||||
"concentration_risk": {"score": 0-100, "level": "高/中/低", "detail": "..."},
|
||||
"receivable_risk": {"score": 0-100, "level": "高/中/低", "detail": "..."},
|
||||
"cashflow_risk": {"score": 0-100, "level": "高/中/低", "detail": "..."},
|
||||
"overall_fin_risk": {"score": 0-100, "level": "高/中/低"},
|
||||
"key_findings": ["..."],
|
||||
"recommendations": ["..."]
|
||||
}"""
|
||||
|
||||
|
||||
class FinanceAgent(BaseAgent):
|
||||
"""财务风控节点"""
|
||||
|
||||
def __init__(self):
|
||||
super().__init__(
|
||||
name="财务风控节点",
|
||||
system_prompt=FIN_SYSTEM_PROMPT,
|
||||
role_icon="👔",
|
||||
)
|
||||
|
||||
def evaluate(self, company_data: dict) -> dict:
|
||||
"""执行财务风险评估"""
|
||||
prompt = self._build_prompt(company_data)
|
||||
result = self.infer_json(prompt)
|
||||
|
||||
if result.get("parse_error"):
|
||||
result = self._rule_based_evaluation(company_data)
|
||||
|
||||
result["agent"] = "财务风控节点"
|
||||
result["icon"] = self.role_icon
|
||||
return result
|
||||
|
||||
def _build_prompt(self, company_data: dict) -> str:
|
||||
financials = company_data.get("financials", {})
|
||||
return f"""请对以下科创企业进行财务风险穿透审查:
|
||||
|
||||
企业名称:{company_data.get('short_name', '未知')}
|
||||
行业:{company_data.get('industry', '未知')}
|
||||
|
||||
财务核心指标:
|
||||
- 营业收入: {financials.get('revenue_2024', 0):,.0f} 元
|
||||
- 净利润: {financials.get('net_profit_2024', 0):,.0f} 元
|
||||
- 研发费用: {financials.get('rd_expense_2024', 0):,.0f} 元
|
||||
- 研发资本化率: {financials.get('rd_capitalization_rate', 0):.1%}
|
||||
- 研发/营收比: {financials.get('rd_revenue_ratio', 0):.1%}
|
||||
- 前五大客户占比: {financials.get('top5_customer_ratio', 0):.1%}
|
||||
- 前五大供应商占比: {financials.get('top5_supplier_ratio', 0):.1%}
|
||||
- 应收账款周转率: {financials.get('receivable_turnover', 0):.1f} 次/年
|
||||
- 经营现金流比率: {financials.get('cash_flow_ratio', 0):.2f}
|
||||
|
||||
请输出严格的JSON评估结果。"""
|
||||
|
||||
def _rule_based_evaluation(self, company_data: dict) -> dict:
|
||||
"""基于规则的财务风险评估"""
|
||||
fin = company_data.get("financials", {})
|
||||
|
||||
# 1. 研发资本化操纵风险
|
||||
cap_rate = fin.get("rd_capitalization_rate", 0)
|
||||
if cap_rate >= 0.4:
|
||||
rd_score = 90
|
||||
rd_detail = f"研发资本化率高达{cap_rate:.0%},严重怀疑美化利润"
|
||||
elif cap_rate >= 0.3:
|
||||
rd_score = 70
|
||||
rd_detail = f"研发资本化率{cap_rate:.0%},超过行业警戒线(30%),需重点审查"
|
||||
elif cap_rate >= 0.15:
|
||||
rd_score = 45
|
||||
rd_detail = f"研发资本化率{cap_rate:.0%},处于中等水平,建议关注趋势"
|
||||
elif cap_rate > 0:
|
||||
rd_score = 25
|
||||
rd_detail = f"研发资本化率{cap_rate:.0%},处于合理范围"
|
||||
else:
|
||||
rd_score = 10
|
||||
rd_detail = "研发费用全部费用化处理,财务政策审慎"
|
||||
|
||||
# 2. 集中度风险
|
||||
customer_ratio = fin.get("top5_customer_ratio", 0)
|
||||
supplier_ratio = fin.get("top5_supplier_ratio", 0)
|
||||
max_concentration = max(customer_ratio, supplier_ratio)
|
||||
|
||||
if max_concentration >= 0.8:
|
||||
conc_score = 90
|
||||
conc_detail = f"前五大客户占比{customer_ratio:.0%},供应商占比{supplier_ratio:.0%},集中度极高"
|
||||
elif max_concentration >= 0.6:
|
||||
conc_score = 70
|
||||
conc_detail = f"前五大客户占比{customer_ratio:.0%},供应商占比{supplier_ratio:.0%},集中度偏高"
|
||||
elif max_concentration >= 0.4:
|
||||
conc_score = 45
|
||||
conc_detail = f"前五大客户占比{customer_ratio:.0%},供应商占比{supplier_ratio:.0%},中等集中度"
|
||||
else:
|
||||
conc_score = 20
|
||||
conc_detail = f"客户和供应商分布较为分散"
|
||||
|
||||
# 3. 应收账款风险
|
||||
turnover = fin.get("receivable_turnover", 8)
|
||||
if turnover < 3:
|
||||
recv_score = 80
|
||||
recv_detail = f"应收账款周转率仅{turnover:.1f}次/年,回款能力极差"
|
||||
elif turnover < 5:
|
||||
recv_score = 55
|
||||
recv_detail = f"应收账款周转率{turnover:.1f}次/年,回款速度偏慢"
|
||||
elif turnover < 8:
|
||||
recv_score = 30
|
||||
recv_detail = f"应收账款周转率{turnover:.1f}次/年,回款能力尚可"
|
||||
else:
|
||||
recv_score = 15
|
||||
recv_detail = f"应收账款周转率{turnover:.1f}次/年,回款能力良好"
|
||||
|
||||
# 4. 现金流风险
|
||||
cf_ratio = fin.get("cash_flow_ratio", 1.0)
|
||||
if cf_ratio < 0.5:
|
||||
cf_score = 80
|
||||
cf_detail = f"经营现金流比率仅{cf_ratio:.2f},存在持续经营风险"
|
||||
elif cf_ratio < 0.8:
|
||||
cf_score = 55
|
||||
cf_detail = f"经营现金流比率{cf_ratio:.2f},现金流偏紧"
|
||||
elif cf_ratio < 1.2:
|
||||
cf_score = 30
|
||||
cf_detail = f"经营现金流比率{cf_ratio:.2f},基本健康"
|
||||
else:
|
||||
cf_score = 15
|
||||
cf_detail = f"经营现金流比率{cf_ratio:.2f},现金流充裕"
|
||||
|
||||
overall = int(rd_score * 0.30 + conc_score * 0.30 +
|
||||
recv_score * 0.20 + cf_score * 0.20)
|
||||
|
||||
findings = [rd_detail, conc_detail]
|
||||
if recv_score >= 50:
|
||||
findings.append(recv_detail)
|
||||
if cf_score >= 50:
|
||||
findings.append(cf_detail)
|
||||
|
||||
return {
|
||||
"rd_capitalization_risk": {"score": rd_score, "level": self._level(rd_score), "detail": rd_detail},
|
||||
"concentration_risk": {"score": conc_score, "level": self._level(conc_score), "detail": conc_detail},
|
||||
"receivable_risk": {"score": recv_score, "level": self._level(recv_score), "detail": recv_detail},
|
||||
"cashflow_risk": {"score": cf_score, "level": self._level(cf_score), "detail": cf_detail},
|
||||
"overall_fin_risk": {"score": overall, "level": self._level(overall)},
|
||||
"key_findings": findings,
|
||||
"recommendations": ["关注研发资本化率变化趋势", "降低客户集中度风险"],
|
||||
}
|
||||
|
||||
@staticmethod
|
||||
def _level(score: int) -> str:
|
||||
if score >= 70:
|
||||
return "高"
|
||||
elif score >= 40:
|
||||
return "中"
|
||||
return "低"
|
||||
Reference in New Issue
Block a user