融资租赁尽调自动化:我是如何用 API 实现金规25号文的穿透式核查

金规〔2025〕25号文落地一年,业务压力和监管压力同时压下来------单人管20个项目,尽调形同虚设。这个问题不是哪家公司独有,是整个行业的结构性问题。本文记录我实际落地的一套技术方案,用 API + 自动化监控把尽调流程做实。不讲概念,只讲实现。


背景:尽调压力到底在哪

金规25号文要求"双人实施、现场调查",核心逻辑是:尽调不能只是查公开数据,必须有人到现场核实实物和实际情况。

现实是:业务经理一个人同时管十几个、二十个项目,尽调时间被严重压缩。双人实施变成两个人签同一份报告,现场调查变成去现场拍张照。

所以问题不是"要不要做尽调",而是:现场时间有限,怎么把它用在真正需要现场核实的问题上?

答案是:线上能查的,先查清楚。


一、租前身份识别:API 批量核验

尽调之前先拿到客户的基础数据画像,到现场带着问题去核实,而不是两眼一抹黑。

核心核查维度

维度 说明 关联数据
基础工商照面 营业执照、法人、经营状态 企业基本信息
股东及股权结构 识别股权代持、嵌套持股 股东穿透
实际控制人 穿透到最终受益自然人 实控人识别
关联企业图谱 识别隐性关联方 关联关系
历史变更记录 短期频繁变更 = 高风险信号 工商变更

Python 实现:企业基本信息批量查询

python 复制代码
import requests
import json
from typing import Optional

class QichachaClient:
    def __init__(self, api_key: str):
        self.api_key = api_key
        self.base_url = "https://api.qcc.com"

    def get_company_basic(self, company_name: str) -> dict:
        """查询企业基础工商信息"""
        url = f"{self.base_url}/api/v1/company/basic"
        headers = {"Authorization": f"Bearer {self.api_key}"}
        params = {"name": company_name}
        resp = requests.get(url, headers=headers, params=params, timeout=10)
        resp.raise_for_status()
        return resp.json()

    def get_actual_controller(self, company_name: str) -> dict:
        """穿透实际控制人"""
        url = f"{self.base_url}/api/v1/company/actualController"
        headers = {"Authorization": f"Bearer {self.api_key}"}
        params = {"name": company_name}
        resp = requests.get(url, headers=headers, params=params, timeout=10)
        resp.raise_for_status()
        return resp.json()

    def get_associates(self, company_name: str) -> dict:
        """获取关联企业图谱"""
        url = f"{self.base_url}/api/v1/company/associates"
        headers = {"Authorization": f"Bearer {self.api_key}"}
        params = {"name": company_name}
        resp = requests.get(url, headers=headers, params=params, timeout=10)
        resp.raise_for_status()
        return resp.json()

    def batch_due_diligence(self, company_list: list[str]) -> list[dict]:
        """批量租前尽调:一次性输出画像报告"""
        results = []
        for name in company_list:
            try:
                basic = self.get_company_basic(name)
                controller = self.get_actual_controller(name)
                associates = self.get_associates(name)

                # 识别高风险信号
                risk_signals = self._detect_risk_signals(basic, controller, associates)

                results.append({
                    "company": name,
                    "status": basic.get("status"),
                    "legal_person": basic.get("legalPerson"),
                    "actual_controller": controller.get("controllerPerson"),
                    "associate_count": associates.get("total", 0),
                    "risk_signals": risk_signals,
                    "report_ready": True
                })
            except Exception as e:
                results.append({"company": name, "error": str(e), "report_ready": False})
        return results

    def _detect_risk_signals(self, basic, controller, associates) -> list[str]:
        signals = []
        # 经营状态异常
        if basic.get("status") not in ["存续", "正常"]:
            signals.append(f"经营状态异常: {basic.get('status')}")
        # 短期内工商变更
        if basic.get("changeRecentDays", 999) < 90:
            signals.append(f"90天内有工商变更: {basic.get('changeRecentDays')}天")
        # 关联企业被执行
        if associates.get("executed_count", 0) > 0:
            signals.append(f"关联企业存在被执行记录: {associates.get('executed_count')}家")
        # 实控人穿透异常
        if not controller.get("controllerPerson"):
            signals.append("无法穿透实控人")
        return signals

# 使用示例
client = QichachaClient(api_key="YOUR_API_KEY")
report = client.batch_due_diligence(["目标公司A", "目标公司B", "目标公司C"])
for r in report:
    if r["report_ready"] and r["risk_signals"]:
        print(f"⚠️ {r['company']} 存在风险信号: {r['risk_signals']}")

预期返回示例

json 复制代码
{
  "company": "目标公司A",
  "status": "存续",
  "legal_person": "张三",
  "actual_controller": "李四",
  "associate_count": 12,
  "risk_signals": [
    "90天内有工商变更: 45天",
    "关联企业存在被执行记录: 1家"
  ],
  "report_ready": true
}

二、租赁物权属核查:识别"低值高估"和"重复融资"

这是监管处罚最集中的领域。售后回租场景下,两件事必须查清楚:

  1. 承租人对设备的所有权是否真实
  2. 这台设备有没有已经被抵押给他人

核查逻辑

复制代码
承租人报价设备价值
    ↓
对比同类设备市场交易价格(偏差过大触发预警)
    ↓
核查动产抵押登记状态(在先登记 = 签约红线)
    ↓
工商变更记录:签约前短期内新增抵押登记 = 高风险信号

Python 实现:动产抵押 + 股权出质核验

python 复制代码
def verify_asset_clearance(company_name: str, equipment_name: str) -> dict:
    """
    设备权属核验主函数
    核查维度:动产抵押登记 + 股权出质登记 + 工商变更历史
    """
    # 1. 动产抵押登记查询
    chattel_url = f"{base_url}/api/v1/chattel/mortgage"
    chattel_resp = requests.get(
        chattel_url,
        headers=headers,
        params={"debtor": company_name},
        timeout=10
    ).json()

    # 2. 股权出质登记查询
    equity_url = f"{base_url}/api/v1/equity/pledge"
    equity_resp = requests.get(
        equity_url,
        headers=headers,
        params={"company": company_name},
        timeout=10
    ).json()

    # 3. 工商变更记录(识别短期新增抵押)
    changes_url = f"{base_url}/api/v1/company/changes"
    changes_resp = requests.get(
        changes_url,
        headers=headers,
        params={"name": company_name, "days": 180},
        timeout=10
    ).json()

    # 聚合风险判断
    mortgage_records = chattel_resp.get("results", [])
    pledge_records = equity_resp.get("results", [])
    recent_changes = changes_resp.get("results", [])

    risk_level = "LOW"
    risk_reasons = []

    # 存在在先抵押登记
    if mortgage_records:
        risk_level = "HIGH"
        risk_reasons.append(f"存在{mortgage_records[0].get('amount')}元在先抵押登记")

    # 签约前180天内新增抵押
    new_mortgage = [c for c in recent_changes if "抵押" in c.get("changeType", "")]
    if new_mortgage:
        risk_level = "HIGH"
        risk_reasons.append(f"近180天内新增抵押登记: {len(new_mortgage)}条")

    # 股权出质状态
    active_pledges = [p for p in pledge_records if p.get("status") == "有效"]
    if active_pledges:
        risk_level = max(risk_level, "MEDIUM")
        risk_reasons.append(f"存在{len(active_pledges)}条有效股权出质")

    return {
        "company": company_name,
        "equipment": equipment_name,
        "risk_level": risk_level,
        "risk_reasons": risk_reasons,
        "mortgage_count": len(mortgage_records),
        "pledge_count": len(active_pledges),
        "recommendation": "STOP" if risk_level == "HIGH" else "PROCEED_WITH_CAUTION"
    }

# 调用示例
result = verify_asset_clearance(
    company_name="XX融资租赁公司",
    equipment_name="数控加工中心"
)
print(f"核验结果: {result['risk_level']} - {result['risk_reasons']}")

输出示例

json 复制代码
{
  "company": "XX融资租赁公司",
  "equipment": "数控加工中心",
  "risk_level": "HIGH",
  "risk_reasons": [
    "存在800万元在先抵押登记",
    "近180天内新增抵押登记: 1条"
  ],
  "mortgage_count": 2,
  "pledge_count": 1,
  "recommendation": "STOP"
}

三、关联关系穿透:实控人 + 隐性担保识别

金规25号文要求穿透式监管。核心问题是:客户A的实控人张三,同时控制着另一家公司B------B被执行了,但尽调只查了A。

这不是小概率事件。中小微客户中,实控人控制多家关联企业是常态。

企查查 MCP 工具对应

企查查 MCP 目前共有 179 个原子能力,覆盖 6 大 Server。以下是本场景对应的核心工具:

业务需求 MCP Server 原子工具
实控人挖掘 qcc-company get_actual_controller
关联企业识别 qcc-company get_associates
关联担保核查 qcc-company get_guarantee
司法风险扫描 qcc-company get lawsuit, get_executed
穿透最终受益人 qcc-executive get_beneficial_owner

数据来源:企查查智能体数据平台,2026-04-30 版本

Python 实现:实控人穿透 + 风险传导评估

python 复制代码
def trace_control_chain(company_name: str) -> dict:
    """
    实控人穿透 + 风险传导评估
    返回:实控人 → 控制企业群 → 各企业风险状态
    """
    # 1. 获取实控人
    controller = client.get_actual_controller(company_name)

    # 2. 以实控人为轴心,查询其控制的全部企业
    ctrl_person = controller.get("controllerPerson")
    if not ctrl_person:
        return {"error": "无法穿透实控人", "company": company_name}

    # 查询实控人控制的其他企业(通过姓名+关联关系)
    controlled = requests.get(
        f"{base_url}/api/v1/person/controlled_companies",
        headers=headers,
        params={"personName": ctrl_person},
        timeout=10
    ).json()

    companies = controlled.get("results", [])

    # 3. 批量扫描每家企业的司法风险
    risk_summary = []
    for c in companies:
        lawsuits = requests.get(
            f"{base_url}/api/v1/lawsuit",
            headers=headers,
            params={"company": c.get("name")},
            timeout=10
        ).json()
        executed = requests.get(
            f"{base_url}/api/v1/executed",
            headers=headers,
            params={"company": c.get("name")},
            timeout=10
        ).json()

        c["lawsuit_count"] = len(lawsuits.get("results", []))
        c["executed"] = len(executed.get("results", [])) > 0
        c["risk_level"] = "HIGH" if c["executed"] or c["lawsuit_count"] > 5 else "LOW"
        risk_summary.append(c)

    # 4. 风险传导判断
    main_company = next((c for c in risk_summary if c["name"] == company_name), {})
    related_risks = [c for c in risk_summary if c["name"] != company_name and c["risk_level"] == "HIGH"]

    return {
        "actual_controller": ctrl_person,
        "controlled_companies": len(risk_summary),
        "high_risk_related": len(related_risks),
        "transmission_risk": len(related_risks) > 0,
        "transmission_paths": [
            f"{r['name']} 存在{'被执行' if r['executed'] else '诉讼'}风险,可能向{main_company.get('name')}传导"
            for r in related_risks
        ],
        "recommendation": "REQUIRE_ENHANCED_REVIEW" if related_risks else "STANDARD_REVIEW"
    }

# 调用
result = trace_control_chain("目标客户A")
if result.get("transmission_risk"):
    print(f"⚠️ 实控人{result['actual_controller']}控制{result['controlled_companies']}家公司")
    print(f"⚠️ 其中{result['high_risk_related']}家存在高风险,可能向目标客户传导")
    for path in result["transmission_paths"]:
        print(f"  → {path}")

四、租后监控:事件驱动预警机制

尽调做完签约完成,大多数公司的租后管理进入"等通知模式"------客户不主动联系,就默认一切正常。

问题是:风险事件往往不是慢慢累积的,是突然发生的。

一家中型客户可能在两周内完成:法人变更 + 引入新股东 + 新增三条被执行记录。等你发现时,处置窗口期早就过了。

行业数据显示:租后风险信号的平均响应时间长达 45天

Python 实现:事件驱动监控 + 即时推送

python 复制代码
import schedule
import time
import sqlite3
from datetime import datetime, timedelta

class LeaseMonitor:
    """
    租后风险监控引擎
    监控维度:工商变更 / 司法风险 / 经营异常 / 舆情动态
    高风险信号即时推送
    """

    HIGH_RISK_EVENTS = [
        "法定代表人变更",
        "注册资本减少",
        "新增被执行记录",
        "新增失信惩戒",
        "经营状态变更",
        "股权出质新增",
        "动产抵押新增",
    ]

    def __init__(self, db_path: str, push_callback=None):
        self.db_path = db_path
        self.push_callback = push_callback  # 推送函数,可接入企微/钉钉/邮件
        self._init_db()

    def _init_db(self):
        conn = sqlite3.connect(self.db_path)
        conn.execute("""
            CREATE TABLE IF NOT EXISTS lease_monitor_log (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                company TEXT,
                event_type TEXT,
                event_time TEXT,
                checked_at TEXT,
                status TEXT
            )
        """)
        conn.commit()
        conn.close()

    def check_single_company(self, company_name: str) -> list[dict]:
        """单家企业全维度监控"""
        events = []

        # 工商变更
        changes = requests.get(
            f"{base_url}/api/v1/company/changes",
            headers=headers,
            params={"name": company_name, "days": 7},
            timeout=10
        ).json()

        for change in changes.get("results", []):
            if change.get("changeType") in self.HIGH_RISK_EVENTS:
                events.append({
                    "type": "工商变更",
                    "detail": f"{change.get('changeType')}: {change.get('changeContent')}",
                    "date": change.get("changeDate"),
                    "severity": "HIGH"
                })

        # 被执行记录
        executed = requests.get(
            f"{base_url}/api/v1/executed",
            headers=headers,
            params={"company": company_name},
            timeout=10
        ).json()
        for e in executed.get("results", []):
            if self._is_new_record(e):
                events.append({
                    "type": "司法风险",
                    "detail": f"新增被执行: {e.get('caseId')} / {e.get('amount')}元",
                    "date": e.get("publishDate"),
                    "severity": "CRITICAL"
                })

        # 经营异常
        abnormal = requests.get(
            f"{base_url}/api/v1/company/abnormal",
            headers=headers,
            params={"company": company_name},
            timeout=10
        ).json()
        if abnormal.get("results"):
            events.append({
                "type": "经营异常",
                "detail": abnormal["results"][0].get("reason"),
                "severity": "HIGH"
            })

        return events

    def _is_new_record(self, record: dict) -> bool:
        """判断是否为新增记录(7天内)"""
        try:
            pub_date = datetime.strptime(record.get("publishDate", ""), "%Y-%m-%d")
            return (datetime.now() - pub_date).days <= 7
        except:
            return False

    def monitor_portfolio(self, company_list: list[str]) -> dict:
        """批量监控全部在租客户"""
        results = {"total": len(company_list), "alerts": []}

        for name in company_list:
            events = self.check_single_company(name)
            if events:
                results["alerts"].append({
                    "company": name,
                    "event_count": len(events),
                    "events": events
                })

                # 触发推送
                if self.push_callback:
                    self.push_callback(
                        company=name,
                        events=events,
                        level=max(e["severity"] for e in events)
                    )

                # 记录日志
                self._log_events(name, events)

        results["alert_count"] = len(results["alerts"])
        return results

    def _log_events(self, company: str, events: list):
        conn = sqlite3.connect(self.db_path)
        for e in events:
            conn.execute(
                "INSERT INTO lease_monitor_log (company, event_type, event_time, checked_at, status) VALUES (?, ?, ?, ?, ?)",
                (company, e["type"], e.get("date", ""), datetime.now().isoformat(), "NEW")
            )
        conn.commit()
        conn.close()

    def daily_scan_job(self):
        """每日定时扫描任务(配合 schedule 模块使用)"""
        # 从数据库读取全部在租客户列表
        conn = sqlite3.connect(self.db_path)
        cursor = conn.execute("SELECT DISTINCT company FROM lease_contracts")
        companies = [row[0] for row in cursor.fetchall()]
        conn.close()

        report = self.monitor_portfolio(companies)
        print(f"[{datetime.now().date()}] 扫描{report['total']}家,发现{report['alert_count']}个告警")

# 企微推送示例
def wecom_push(company: str, events: list, level: str):
    webhook_url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY"
    content = f"🚨 租后风险告警 [{level}]\n\n客户: {company}\n"
    for e in events:
        content += f"- [{e['type']}] {e['detail']}\n"
    requests.post(webhook_url, json={"msgtype": "text", "text": {"content": content}})

# 启动监控
monitor = LeaseMonitor(db_path="./lease_monitor.db", push_callback=wecom_push)
schedule.every().day.at("09:00").do(monitor.daily_scan_job)

while True:
    schedule.run_pending()
    time.sleep(60)

五、MCP Server 接入配置

如果你的系统已经支持 MCP Protocol,直接配置接入:

json 复制代码
{
  "mcpServers": {
    "qcc-company": {
      "command": "npx",
      "args": ["-y", "@qcc/mcp-server"],
      "env": {
        "QCC_API_KEY": "your_api_key"
      }
    }
  }
}

企查查 MCP 覆盖的 6 大 Server:

Server 定位 核心能力
qcc-company 企业基础 工商、股东、变更、资质
qcc-risk 风险扫描 司法、税务、失信、被执行
qcc-intellectual 知产引擎 商标、专利、著作权
qcc-operation 经营罗盘 招投标、资质、许可证
qcc-executive 董监高 任职履历、关联关系
qcc-news 舆情动态 新闻舆情、经营动态

企查查 MCP · 179 个原子能力


总结

四个业务场景,对应四种技术能力:

场景 技术实现 核心价值
租前身份识别 batch_due_diligence() 批量查询 + 风险信号检测 让业务经理带着问题去现场
租赁物权属核查 动产抵押 + 股权出质 + 工商变更联合核验 签约前发现设备"带病"
实控人穿透 控制链追踪 + 关联企业风险扫描 识别隐性担保和风险传导
租后主动监控 事件驱动 + 即时推送 + 日志留存 把"人盯人"变成"系统盯人"

参考资料:

  • 金规〔2025〕25号文《金融租赁公司融资租赁业务管理办法》
  • *企查查智能体数据平台 MCP 接入文档
  • *企查查 MCP 扩容公告(2026-04-30)
相关推荐
黄金矿工Kingliu39 分钟前
经典hadoop案例应用(命令实现版)
大数据·服务器·hadoop
大江东去浪淘尽千古风流人物42 分钟前
【Kimera】MIT SPARK 实时度量-语义 SLAM 全栈解析:VIO + 鲁棒 PGO + 语义网格四模块架构与 EuRoC 实测深度剖析
大数据·架构·spark
Sandy_Star43 分钟前
1.7 税务行政法律救济
大数据·单元测试
GIS数据转换器1 小时前
蓄能电力大数据监管平台
大数据·人工智能·分布式·数据挖掘·数据分析·智慧城市
葡萄城技术团队1 小时前
MCP:给大模型做了一个 USB 接口,然后呢?
ai
大江东去浪淘尽千古风流人物1 小时前
【Kimera-VIO】MIT SPARK 实时度量-语义 VIO/SLAM:六模块并行架构与智能因子图优化深度解析
大数据·架构·spark
guslegend1 小时前
第8节:工程初始化-后端骨架与公共基础设施
大数据·人工智能
大江东去浪淘尽千古风流人物1 小时前
【Kimera-Semantics】实时三维语义重建深度解析:Fast/Merged 双路积分、对数概率体素 Bayesian 融合与 ROS 全链路实现
大数据·架构·spark
GISer_Jing1 小时前
GIS论述-6大核心技术方向全解
数据库·arcgis·ai