You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何设置np.random.normal矩阵参数实现MBS百次仿真及分级支付逻辑

MBS分层仿真实现方案

核心逻辑说明

  • 向量化仿真:将随机冲击的生成维度调整为[仿真次数, 借款人数量]的矩阵,无需嵌套循环即可一次性完成100次仿真的所有计算,大幅提升运行效率
  • 分层支付规则实现:严格按照损失承担顺序计算各层级收益,核心逻辑如下:
    • 总池面值为10(10个借款人,每个初始面值1),损失 = 总面值 - 当期总回款
    • 损失≤0.5(总池损失5%):所有损失由初级层承担,优先级、夹层拿全额面值
    • 0.5<损失≤1(总池损失5%~10%):初级层归零,超出0.5的部分由夹层承担
    • 损失>1(总池损失超10%):初级层、夹层全部归零,超出1的部分由优先级承担

完整可运行代码

import numpy as np

# 基础参数配置
rho_list = [0, 0.2, 0.5, 0.6, 1] 
n_borrowers = 10
payoff_default = 0.5
payoff_nodefault = 1
threshold = -1.65
n_simulations = 100 # 仿真次数
total_face_value = n_borrowers * payoff_nodefault # 总池面值=10

# 一次性生成所有仿真的随机冲击,避免循环生成
# s维度:(100次仿真, 1),每个仿真对应1个公共冲击,自动广播到所有借款人
s = np.random.normal(0, 1, size=(n_simulations, 1)) 
# eps维度:(100次仿真, 10个借款人),每个仿真每个借款人对应1个独立冲击
eps = np.random.normal(0, 1, size=(n_simulations, n_borrowers)) 

for rho in rho_list:
    # 向量化计算所有仿真所有借款人的收入,维度(100,10)
    x = np.sqrt(rho) * s + np.sqrt(1 - rho) * eps
    # 计算每个借款人的回款,维度(100,10)
    loan_payoff = (x < threshold) * payoff_default + (x >= threshold) * payoff_nodefault
    # 计算每个仿真的总回款,维度(100,)
    total_payoff = np.sum(loan_payoff, axis=1)
    # 计算每个仿真的总损失
    loss = total_face_value - total_payoff
    
    # 按顺序承担规则计算各层级收益
    # 初始赋值为各层级全额面值
    senior_payoff = np.full(n_simulations, 9.0) # 优先级厚度90%=9
    mezz_payoff = np.full(n_simulations, 0.5) # 夹层厚度5%=0.5
    junior_payoff = np.full(n_simulations, 0.5) # 初级层厚度5%=0.5
    
    # 调整初级层收益
    junior_mask = loss > 0.5
    junior_payoff[junior_mask] = 0
    junior_payoff[~junior_mask] -= loss[~junior_mask]
    
    # 调整夹层收益
    mezz_mask1 = (loss > 0.5) & (loss <= 1)
    mezz_payoff[mezz_mask1] -= (loss[mezz_mask1] - 0.5)
    mezz_mask2 = loss > 1
    mezz_payoff[mezz_mask2] = 0
    
    # 调整优先级收益
    senior_mask = loss > 1
    senior_payoff[senior_mask] -= (loss[senior_mask] - 1)
    
    # 计算100次仿真的平均收益
    avg_senior = np.mean(senior_payoff)
    avg_mezz = np.mean(mezz_payoff)
    avg_junior = np.mean(junior_payoff)
    avg_total = np.mean(total_payoff)
    
    # 输出结果
    print(f"rho={rho}: 总池平均收益={avg_total:.4f}, 优先级平均收益={avg_senior:.4f}, 夹层平均收益={avg_mezz:.4f}, 初级层平均收益={avg_junior:.4f}")

输出说明

运行代码后会依次输出每个rho值对应的100次仿真平均收益,各层级收益计算完全符合要求的顺序承担规则,随机数一次性生成无需嵌套循环,运行效率远高于逐次循环仿真。

内容的提问来源于stack exchange,提问作者studentofdata1234

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 23:48:02