先说背景。
最近大家都在转那几篇关于所谓“〔2025〕9号助贷新规”及“10月1日倒计时”“24–36 区间要被清掉”“24%+ 权益类打包要不被允许”的文章。
我这一个月微信上被之前的同行、资金方同事、原来合作的渠道老板轮番问:以后怎么做?定价降下来了还能活吗?资金方死盯的“年损”到底要做到多少才算及格?
我干了十几年信贷风控,从国内P2P到持牌机构和助贷,再到出海,见证过几轮“收紧+出清”周期。
说句掏心窝的:现在这个阶段,谁先真正弄懂“年损”逻辑,谁就先把命续上了。
所以我决定把这篇写给你——哪怕你是刚入行的“风控小白”。
一、到底什么是“年损”?别再把它和不良率混为一谈
很多人第一次被资金方问“你们的年损是多少”时,下意识甩一个“当前M3+”或“90+不良率”。
错。
年损(有的资金方叫“年化损失率”“年化净损”“Annual Loss Rate”)核心是:
在一个会计年度或滚动12个月里,资金真实承受的那部分“不可逆本金损失”的年化比例。
我习惯拆成三层看:
-
损失金额(Loss Amount):
已经发生且确认无法再通过常规催回的净本金损失(通常=已核销本金 - 后续回收 + 回收成本,如果资金方口径简单,可能直接用“已核销本金 - 回收”)。 -
平均在贷余额(Average Outstanding Principal):
不是年初余额,也不是年末余额,而是全年逐月(或逐日)期末在贷平均值。 -
年损率(Annual Loss Rate):
年损率公式:
如果你用的是一个“静态批次(Vintage)”尚不足12个月的观察窗口,则常见“年化”处理:
年化Vintage损失率公式:
这一年化只是估计,越早阶段越容易高估或低估。
别混淆:
-
[ 不良率 = (某时点的不良余额)/(在贷余额) ] 它是时点库存。 -
[ 年损率 ] 是流量属性,衡量“资金一年被消耗掉多少”。 -
[ M3+率、Roll率、逾期迁移 ] 是过程指标。
资金方最终在定价模型里扣的,是年损(或其预估值),而不是单纯的不良库存。
二、为什么监管收紧后“年损”被放到放大镜下?
新规讨论里一个主线:综合定价天花板下降,24–36% 之间以及“24%+ 权益打包”类资产被规范甚至退出。
我们做定价拆解时的经典公式:
[ 综合定价 = 资金成本 + 获客&运营 + 风控年损 + 税费&拨备 + 目标利润 ]
当上限压下来,资金成本又因为大额合规资金偏紧而没法迅速下降,唯一能动刀的,就是“获客成本”和“风控年损”。
所以资金方现在问你“年损”,不是闲聊,是在判断你这摊资产还能不能塞进它的收益结构里。
三、年损的主流口径与常见踩坑
我之前协助做尽调或接第三方资产组合时,第一反应是确认:口径统一了吗?
常见分歧点:
是否按“核销”时点确认,还是按“逾期≥180天”直接拉入损失。 是否扣除已回收(催回/资产包处置/以资抵债)的本金部分。 是否包含利息损失与费用减免。 分期产品提前结清,会不会扭曲年化。 展期、续贷算重生还是继续计入原Vintage。
我给小白的建议:拿资金方发来的合作协议或测算模型,把其“Loss”字段拆到原子层:
如果没有核销制度,就用“逾期≥X天未回收本金 - 后续回收”近似。
平均在贷余额可用:
精细一点:
资金方要严谨,多半用日均。
四、从“静态池”到“动态组合”:如何读懂年损演进
一个实际案例。
之前前同事接手一条“24–30%区间”资产链路,渠道声称“M3+ 只有4%”。
他让分析同事拉静态池。结果:
-
放款第1月M1 率 8% -
M2 回落到5%(因为强催 & 费用减免) -
M3 又上跳到7%
累积核销在第7月后陡增。
最后12月时静态池累计净损失 / 初始本金 = 14%。
年化前6个月时粗暴放大给资金方是 14% * 12 / 6 = 28%。
资金方直接说:不行。
他做的修正是把“后6个月回收尾水”的真实现金回流纳入期望(基于历史相似池回收曲线做回收率曲线假设),重新估计终局净损 11.2%,才勉强进入谈判区间。
启发:
-
别只看“M3+平稳”,要看核销/回收节奏。 -
给资金方的“年损预测”要基于 Vintage 曲线与回收曲线拟合,而不是静态截面乘以年化系数。
五、一个落地的“年损分析”数据结构与代码示例
我放一份极简形态的 Python 示例,演示:
-
构造模拟放款数据 -
按Vintage计算累计净损失曲线 -
计算滚动12个月年损率 -
做一个简易的“回收后调整”
id: lufei
name: Annual Loss Calculation
type: code.python
content: |-
import pandas as pd
import numpy as np
from datetime import datetime
# 1. 构造模拟数据(真实场景直接从ODS或数据仓库抽取)
np.random.seed(42)
n = 3000
disburse_dates = pd.date_range('2024-01-01','2024-12-31',freq='D')
loans = pd.DataFrame({
'loan_id': range(1, n+1),
'disburse_date': np.random.choice(disburse_dates, n),
'principal': np.random.choice([1000,1500,2000,3000,5000], n, p=[0.25,0.25,0.2,0.2,0.1]),
'term_months': np.random.choice([3,6,9,12], n, p=[0.3,0.4,0.2,0.1])
})
loans['maturity_date'] = loans['disburse_date'] + pd.to_timedelta(loans['term_months']*30, unit='D')
# 2. 随机生成违约与核销
# 定义违约概率与回收率
base_pd = 0.12 # 基础违约概率
loans['default_flag'] = np.random.binomial(1, base_pd, n)
# 默认违约发生在放款后1~term_months*30天
loans['default_date'] = np.where(
loans['default_flag']==1,
loans['disburse_date'] + pd.to_timedelta(np.random.randint(30, 180, n), unit='D'),
pd.NaT
)
# 核销:违约后再过 90~150 天
loans['writeoff_date'] = np.where(
loans['default_flag']==1,
loans['default_date'] + pd.to_timedelta(np.random.randint(90,150,n), unit='D'),
pd.NaT
)
# 回收:部分违约贷款在核销后 30~180 天回收一定比例
loans['lgd'] = np.where(loans['default_flag']==1, np.random.beta(5,2,n), 0) # 期望LGD ~ 0.7
# 实际回收额 = principal * (1 - lgd) * 回收是否成功
loans['post_recovery_flag'] = np.where(loans['default_flag']==1,
np.random.binomial(1,0.35,n),
0)
loans['recovery_date'] = np.where(
(loans['post_recovery_flag']==1),
loans['writeoff_date'] + pd.to_timedelta(np.random.randint(30,180,n), unit='D'),
pd.NaT
)
loans['recovery_amount'] = np.where(
loans['post_recovery_flag']==1,
loans['principal'] * (1 - loans['lgd']) * np.random.uniform(0.6,1.0,n),
0
)
# 3. 生成月份面板,计算月末在贷
calendar = pd.date_range('2024-01-31','2025-12-31',freq='M')
records = []
for dt in calendar:
# 在贷:放款已发生且未到期且(未核销或未提前结清)
onbook = loans[
(loans['disburse_date'] <= dt) &
(loans['maturity_date'] > dt) &
( (loans['writeoff_date'].isna()) | (loans['writeoff_date'] > dt) )
]['principal'].sum()
# 当月核销本金
writeoff = loans[loans['writeoff_date'].dt.to_period('M') == dt.to_period('M')]['principal'].sum()
# 当月回收
recovery = loans[loans['recovery_date'].dt.to_period('M') == dt.to_period('M')]['recovery_amount'].sum()
records.append({
'month': dt,
'onbook_principal': onbook,
'writeoff_principal': writeoff,
'recovery_amount': recovery
})
panel = pd.DataFrame(records)
panel['net_loss_flow'] = panel['writeoff_principal'] - panel['recovery_amount']
panel['cum_net_loss'] = panel['net_loss_flow'].cumsum()
panel['avg_onbook_12m'] = panel['onbook_principal'].rolling(12).mean()
panel['net_loss_12m'] = panel['net_loss_flow'].rolling(12).sum()
panel['annual_loss_rate'] = panel['net_loss_12m'] / panel['avg_onbook_12m']
# 4. 简单的Vintage(按放款月)累计损失率
loans['vintage_month'] = loans['disburse_date'].dt.to_period('M')
# 取截至2025-12最新观察
latest_obs = calendar.max()
# 计算每笔是否在最新日前已核销及回收
loans['net_loss_amount'] = np.where(
(loans['writeoff_date'].notna()) & (loans['writeoff_date'] <= latest_obs),
loans['principal'] - loans['recovery_amount'],
0
)
vintage_stats = loans.groupby('vintage_month').agg(
disb_prin=('principal','sum'),
net_loss=('net_loss_amount','sum')
).reset_index()
vintage_stats['cum_loss_rate'] = vintage_stats['net_loss'] / vintage_stats['disb_prin']
# 5. 输出核心结果(尾部几行)
print(panel[['month','onbook_principal','net_loss_flow','annual_loss_rate']].tail(6))
print(vintage_stats.tail(6))
要点解读:
-
用到了“滚动12个月净损 / 滚动12个月平均在贷”来近似真实年损率。 -
Vintage 只是帮助你看不同放款月份的终局(或阶段性)损失质量。 -
在真实项目中你需要:拆利息、本金;把展期逻辑、提前结清、减免抵销都映射进现金流。
接下来你可以加:
-
Recovery Curve 拟合(用 Weibull / Log-logistic) -
LGD 分层(看额度、渠道、评分分箱) -
情景测试:违约率 +100bps / 回收率 -10% 对年损弹性。
六、如何快速把“年损”打进策略闭环?
我前任领导常给团队讲一句:年损不是财务结算指标,是实时控制指标。
落地路径:
-
前端准入: -
用资金方认可的评分(或你映射到其PD档位)控制高 PD 流量占比。 -
渠道维度出“PD * 预估LGD”成本线,超过即削减配额。 -
授信与定价联动: -
同一风险等级不同额度/期限组合的 LGD 差异要量化,很多时候把 12 期压成 6 期,LGD 降低 > APR 降低。 -
贷中监测: -
D1~D7 早期逾期曲线与目标曲线偏差实时告警,用 [ 年损预估 = 当前Vintage累计损失 + (预测剩余违约 * 预测LGD - 预计回收) ] 动态刷新。 -
贷后回收: -
催收策略 A/B:语音+外呼 vs 智能触达+减免额度,比较单位回收贡献。 -
早期回收对年损影响极大:将 M1 冻结天数从 15 降到 7,历史案例我们把最终LGD拉低了 2.3 个百分点。 -
数据闭环: -
周会固定一页:Rolling 12M 年损率、Vintage 梯度、渠道分层年损贡献 TOP10、策略变更影响。
七、在“24%天花板”下的年损倒推
假设新规后你的目标资产综合定价 ≤ 24%。
资金成本(含资金占用、担保结构)= 8%。
获客+运营摊销 = 5%。
税费&拨备 估 2%。
目标利润(最低生存)= 3%。
那么可容纳的年损:
[ 可容纳年损 = 24% - 8% - 5% - 2% - 3% = 6% ]
如果你现在真实年损=10%,就必须:
-
渠道调结构:砍掉尾部 20% 高 PD 流量。 -
缩短期限:6→3 期,LGD 降低。 -
加强前置核验(实名、在网时长、设备黑产特征),削掉欺诈段(欺诈一掉,年损立刻下台阶)。 -
回收策略前移(首逾 3 日触达率从 52% → 70%)。
你做完这些,年损可能从 10% 降到 7%。
剩余 1 个百分点,用资产组合再平衡(导入一部分优质代发工资流量),才能压到 6%。
八、为什么“24–36区间资产”退出会加剧年损压力?
以前你靠高定价池子里的“高息覆盖低效”模式,把一些低效率渠道亏损掩盖掉。
这些资产被清掉后,风险补偿冗余被抽走,你的运营低效率、策略迟钝、数据烟囱会立即赤裸裸映射到年损。
所以现在是“结构性降杠杆”。
一个战术动作:
-
用“渠道—授信段—期限”三维毛利矩阵,把负毛利格子标红,分三批出清。 -
同时建立“替换资产孵化池”,别一刀砍完导致账面在贷崩塌(平均在贷下降=分母缩=年损率短期被放大)。
九、快速评估——拿到一份数据你先看什么?
某国内头部助贷公司真实在支援一个团队时的 Checklist:
集中度:Top5 渠道放款占比 > 60% 吗? D1 逾期 vs M1+ 存量是否存在异常“遮掩”(强催/续贷掩盖)? Vintage 曲线上升是否“拖尾”(>6期后陡增表明催收后置化或展期滥用)? 回收率分层:首逾<=30 天与 >60 天资源配置是否失衡? 欺诈段:首逾=核销比率(首逾即死)高于多少?>40% 说明前端核身漏。 年损拆解:[ 年损 = 欺诈损失 + 信用风险损失 - 回收 ] 逐项列出。
快速把高影响因子排序,通常 Top3 能贡献 70% 改善。
十、给“小白”一个“一周内提升”的行动包
-
第1天:对齐资金方年损口径,写一页“公式+字段映射”发群里。 -
第2天:拉最近12个 Vintage,画累计净损失曲线与行业基准。 -
第3天:拆分渠道段年损贡献,标出 Tail 渠道。 -
第4天:建立首逾(D1)预测模型基线(哪怕是逻辑回归),输出重要变量。 -
第5天:和催收核对前 7 天触达率、承诺还款兑现率。 -
第6天:做定价倒推,算“目标年损倒推所需 PD * LGD 路径”。 -
第7天:写一份“年损降3个百分点路线图”复盘。
做到这套,你不再是“小白”。
十一、常见误解再纠正一次
-
“M3+低=年损低”
不,总存在隐藏核销尾或展期稀释。 -
“年损就是本金核销除以期末在贷”
不,是年度净损 / 平均在贷。 -
“年损下来了说明没问题”
也可能是放款收缩过快导致分母塌缩。 -
“先扩量再控损”
在政策收紧窗口,先控损才能保命,再扩量。
十二、回到新规冲击:我真实的三个判断
-
行业分化:能把年损压到 5–6% 且资金成本控制住的头部会拿到更优额度。 -
技术栈重估:粗放模式会被挤出,自动化实时年损监测进入标配。 -
渠道议价倒挂:获客单价下不来又不敢高价续命的,会被迫转型数据分发或做联合贷服务层。
十三、最后的心法:把年损当“活指标”
我前任领导常讲一句:
年损不是等财务关账后才知道的结果,而是你每周能手动调弦的乐器。
当你把“策略变更 → 逾期早期信号偏移 → Vintage曲线修正 → 年损预测偏差 → 定价或额度再调”这条闭环通顺后,
合规新规只是换了题目,解题思路不变。
结语
写到这里,如果你原本对“年损”是模糊的,现在应该能:
-
说清它与不良率、逾期率区别 -
用滚动12M方式算出资金方认可的年损率 -
把年损拆解到渠道、期限、额度、欺诈段 -
在 24% 定价天花板下倒推可承受年损并制定降损路线
如果你想,要不我下一篇写:海外风控和国内风控区别和联系?
有收获就点赞、在看、关注,我会继续把过去多年踩过的坑拆开给你看。
我们下篇见。
参考注释
[1] 最高人民法院相关司法解释(民间借贷利率上限调整背景)
[2] 《商业银行互联网贷款管理暂行办法》有关风险分担与集中度条款
[3] Basel 信用风险框架中 PD / LGD / EAD 概念延伸(用于本地化拆解年损)
END

