In [2]:
%matplotlib inline
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
In [116]:
class FinancialNetwork:
def __init__(self, g, th, N, E):
self.g = g
self.th = th
self.N = N
self.E = E
self.a = np.zeros(N)
self.e = np.zeros(N)
self.invest = np.zeros(N)
self.l = np.zeros(N)
self.c = np.zeros(N)
self.d = np.zeros(N)
self.b = np.zeros(N)
self.A = E/(1-th)
self.I = th*self.A
def set_assets(self):
for i in range(self.N):
self.e[i] = self.e_j_wave(i) + self.e_j_hat(i)
self.invest[i] = self.iinvest(i)
self.a[i] = self.e[i] + self.invest[i]
self.c[i] = self.g*self.a[i]
self.b[i] = self.get_bank(i)
self.d[i] = self.a[i] - self.c[i] - self.b[i]
self.l[i] = self.c[i] + self.d[i] + self.b[i]
def e_j_wave(self, i):
i_j = self.iinvest(i)
b_j = self.get_bank(i)
if b_j - i_j > 0:
e_j_wave = b_j - i_j
else:
e_j_wave = 0
return e_j_wave
def e_j_hat(self, i):
e_j_sum = 0
for j in range(self.N):
e_j_sum += self.e_j_wave(j)
e_j_sum = float(e_j_sum)
k_sum = 0
for j in range(25):
k_sum += G.degree(j)
k_sum = float(k_sum)
k_j = float(G.degree(i))
e_j_hat = (self.E - e_j_sum)*k_j/k_sum
return e_j_hat
def iinvest(self, i):
G = self.network
w = self.weight()
iinvest = w*G.out_degree(i)
return iinvest
def get_bank(self, i):
G = self.network
w = self.weight()
get_bank = w*G.in_degree(i)
return get_bank
def weight(self):
G = self.network
z = 0
for i in range(25):
z += G.degree(i)
z = float(z)
w = self.I/z
return w
def set_rn(self, p):
N = self.N
G = nx.DiGraph()
G.add_nodes_from([i for i in range(N)])
for i in range(N):
for j in range(N):
if i != j:
y = np.random.choice([0, 1], p=[p, 1-p])
if y == 0:
G.add_edge(i,j,weight=1)
self.network = G
return self.network
def set_sf(self, m_0, m_in, m_out):
N = self.N
G = nx.DiGraph()
G.add_nodes_from([i for i in range(m_0)])
for i in range(m_0):
for j in range(m_0):
if i != j:
G.add_edge(i,j,weight=1)
k = 1
while m_0+k == N-1:
G.add_node(m_0 + k)
for i in range(m_0 + k -1):
k_in_sum = G.in_degree(i)
k_out_sum = G.out_degree(i)
print m_0 + k
while G.in_degree(m_0 + k) != m_in:
for i in range(m_0 + k -1):
p_in = G.in_degree(i)/k_in_sum
y_in = np.random.choice([0, 1], p=[p_in, 1-p_in])
if y_in == 0:
G.add_edge(i, m_0 + k, weight=1)
while G.out_degree(m_0 + k) != m_out:
p_out = G.out_degree(i)/k_out_sum
y_out = np.random.choice([0, 1], p=[p_out, 1-p_out])
if y_in == 0:
G.add_edge(m_0 + i, k, weight=1)
k += 1
self.network = G
return self.network
def plot(self):
pos = nx.spring_layout(G)
nx.draw_circular(G)
plt.show()
In [117]:
FN = FinancialNetwork(0.08, 0.3, 25, 100000)
In [118]:
FN.set_rn(0.3)
Out[118]:
In [119]:
FN.set_sf(5, 2, 3)
Out[119]:
In [ ]:
In [85]:
FN.set_assets()
In [87]:
sum(FN.e)
Out[87]:
In [ ]:
n.main()
In [53]:
G = nx.DiGraph()
G.add_nodes_from([i for i in range(25)])
for i in range(25):
for j in range(25):
if i != j:
y = np.random.choice([0, 1], p=[0.3, 0.7])
if y == 0:
G.add_edge(i,j,weight=1)
In [101]:
pos = nx.spring_layout(G)
nx.draw_circular(G)
plt.show()
In [45]:
y = np.random.choice([0, 1], 0.1)
In [46]:
G[3]
Out[46]:
In [69]:
k = 0
for i in range(25):
k += G.degree(i)
k
Out[69]:
In [62]:
G.nodes()
Out[62]:
In [68]:
G.number_of_edges()
Out[68]:
In [95]:
G = nx.DiGraph()
G.add_nodes_from([i for i in range(5)])
In [100]:
for i in range(100):
G.add_edge(1,2,weight=1)
G.add_edge(1,2,weight=1)
G.add_edge(2,3,weight=1)
In [102]:
G.in_degree(2)
Out[102]:
In [ ]: