-
Notifications
You must be signed in to change notification settings - Fork 1
/
rogersveraart.m
48 lines (31 loc) · 1.33 KB
/
rogersveraart.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
function [equityLoss equity equityZero paymentVector error] = rogersveraart(interbankLiabilitiesMatrix,externalAssets,externalLiabilities, externalAssetsFiresaleRate, interbankFiresaleRate)
% PB for BDF2017
%[3] Rogers, Leonard CG, and Luitgard AM Veraart. "Failure and rescue in an interbank network. " Management Science 59, no. 4 (2013): 882-898.
%interbankLiabilitiesMatrix => L
%A => A
%externalAssets => Ae
%externalLiabilities => Le
%exogenousRecoveryRate => R
L = interbankLiabilitiesMatrix;
A = L';
Ae = externalAssets;
Le = externalLiabilities;
epsilon = 10^(-5);
max_counts = 10^5;
nbanks = length(L);
l = sum(L,2);
equityZero = Ae - Le + sum(A,2) - l;
equity = equityZero;
error = 1;
counts = 1;
while (error > epsilon)&&(counts < max_counts)
oldEquity = equity;
recoveryVector = ones([nbanks 1]).*((equity>=0) + (max(1 + equity./l,0) ).*(equity<0));
equity = ((equity>=0) + externalAssetsFiresaleRate*(equity<0)).*Ae - Le + ((equity>=0) + interbankFiresaleRate*(equity<0)).*(A*(recoveryVector)) - l;
error = norm(equity - oldEquity)/norm(equity);
counts = counts +1;
end
recoveryVector = ones([nbanks 1]).*((equity>=0) + (max(1 + equity./l,0) ).*(equity<0));
equity = Ae - Le + A*(recoveryVector) - l;
paymentVector = max(0,min( Ae - Le + A*recoveryVector, l));
equityLoss = equity - equityZero;