如何设置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
相关产品推荐
相关产品推荐

