@fanxy
2020-05-31T19:12:11.000000Z
字数 10226
阅读 2910
金融数据
樊潇彦
复旦大学经济学院
下载数据:Ch15_Data.zip
setwd("D:\\...\\Ch15")
rm(list=ls())
install.packages("igraph","ggnetwork","NetworkRiskMeasures")
library(igraph)
library(ggplot2)
library(ggnetwork)
library(Matrix)
library(NetworkRiskMeasures)
## 其他调用
library(tidyverse)
library(readxl)
1. 金融网络的定义
2. 金融网络的分类
根据关系种类的不同,我们可以把金融网络分为两类:
(1)敞口网络 (exposure network)
构建:
根据资产负债表科目( 其中 为银行间资产和负债, 为外部资产和负债):
如果没有金融机构间双边借贷的数据,则要在一定的假定条件下(如假定借贷网络的度分布等),用最大熵等方法重构或估计网络。
下图来自Battiston et al.(2016),直观地展示了银行间市场的融资网络关系:
(2)相关网络 (correlation network)
3. 网络度量指标
(1)描述网络整体性质的指标
Cont et al.(2013)分析了巴西银行间市场的真实网络,特征事实如下:
(2)描述节点重要性的指标
下图来自Haldane(2009),描述了1985年和2005年的国际金融网络(Global Financial Network):
1. 读入数据并建立网络
data = read.csv2('networktable.csv') # 美国2007~2010年间50家银行的日拆借数据
str(data)
size = read.csv2('vertices.csv') # 顶点属性
library(igraph)
bignetwork = graph.data.frame(data, vertices = size) # 创建网络
is.connected(bignetwork) # 是否连通
table(is.multiple(bignetwork)) # 边是否是多重
str(is.loop(bignetwork)) # 是否存在环
snetwork = igraph::simplify(bignetwork, edge.attr.comb = "sum") # 合并边,简化网络
plot(snetwork, edge.arrow.size = 0.4) # 作图发现存在明显的“中心-外围”结构
2. 用网络密度变化分析雷曼兄弟破产前后金融体系的变化
# 按月计算贷款总量并作图,发现2008年9月雷曼兄弟破产后贷款大幅下降
mAmount = with(data, aggregate(Amount, by = list(Month = Month, Year = Year),
FUN = sum))
plot(ts(mAmount$x, start = c(2007, 1), frequency = 12), ylab = "Amount")
# 循环计算每个月的网络密度并作图
ds = sapply(2007:2010, function(year) {
sapply(1:12, function(month) {
mdata <- subset(data, (Year == year) & (Month == month))
graph.density(graph.data.frame(mdata))
})
})
plot(ts(as.vector(ds), start = c(2007, 1), frequency=12))
abline(v = 2008 + 259/366, col = 'red')
3. 计算网络节点的中心性指标,寻找系统重要性金融机构 (Systemically Important Financial Institutions, SIFI)
# 计算四种中心性指标
g <- graph.data.frame(data)
degree <- degree(g, normalized = TRUE)
between <- betweenness(g, normalized = TRUE)
closeness <- closeness(g, normalized = TRUE)
eigenv <- evcent(g, directed = TRUE)$vector
norm <- function(x) x / mean(x) # 标准化函数
index <- (norm(degree) + norm(between) + norm(closeness) + norm(eigenv)) / 4 # 取平均值
index
hist(index) # 做直方图
SIFI=data.frame(id=rownames(data.frame(index)),index)%>%
filter(index>2.5)%>%arrange(desc(index))
SIFI # SIFI从高到低排名
1. 网络估计
library(NetworkRiskMeasures)
# Example from Anand, Craig and Von Peter (2015, p.628)
L <- c(a = 4, b = 5, c = 5, d = 0, e = 0, f = 2, g = 4) # Total Liabilities
A <- c(a = 7, b = 5, c = 3, d = 1, e = 3, f = 0, g = 1) # Total Assets
# (1) Upper(2004)的最大熵估计(Maximum Entropy Estimation),假设每个银行都试图尽可能平均地分散其敞口。
ME <- matrix_estimation(rowsums = A, colsums = L, method = "me")
ME <- round(ME, 2)
ME
# (2) Anand et al.(2015)的最小密度估计(Minimum Density Estimation),假设银行间网络稀疏且分散。
set.seed(192) # seed for reproducibility
MD <- matrix_estimation(A, L, method = "md")
MD
2. 基于模拟数据的网络分析
# (1) 基于模拟数据构建网络
data("sim_data") # 125个银行的资产、负债、资本缓冲和权重的模拟数据集
set.seed(15)
md_mat <- matrix_estimation(sim_data$assets, sim_data$liabilities,
method = "md", # minimum density estimation
verbose = F) # prevent printing
rownames(md_mat) <- colnames(md_mat) <- sim_data$bank # rownames and colnames
library(igraph)
gmd <- graph_from_adjacency_matrix(md_mat, weighted = T) # 用相邻矩阵建立网络
edge_density(gmd) # 密度(density)
assortativity_degree(gmd) # 同配性(Assortativity)
V(gmd)$buffer <- sim_data$buffer # 添加节点属性
V(gmd)$weights <- sim_data$weights/sum(sim_data$weights)
V(gmd)$assets <- sim_data$assets
V(gmd)$liabilities <- sim_data$liabilities
# (2) 网络作图
library(ggplot2)
library(ggnetwork)
set.seed(20)
netdf <- ggnetwork(gmd)
ggplot(netdf, aes(x = x, y = y, xend = xend, yend = yend)) +
geom_edges(arrow = arrow(length = unit(6, "pt"), type = "closed"),
color = "grey50", curvature = 0.1, alpha = 0.5) +
geom_nodes(aes(size = weights)) +
ggtitle("Estimated interbank network") +
theme_blank()
# (3) 寻找SIFIs
sim_data$degree <- igraph::degree(gmd) # 度中心性
sim_data$btw <- igraph::betweenness(gmd) # 中介中心性
sim_data$close <- igraph::closeness(gmd) # 亲近中心性,非连通网络会报错
sim_data$eigen <- igraph::eigen_centrality(gmd)$vector # 特征向量中心性
sim_data$alpha <- igraph::alpha_centrality(gmd, alpha = 0.5) # Katz中心中心性
# 冲击敏感性:衡量相对于其直接传染路径可以到达顶点的可行传染路径。当冲击敏感性大于1时,这意味着该顶点容易受到其直接邻居之外的其他顶点的影响(远程影响)。
sim_data$imps <- impact_susceptibility(exposures = gmd, buffer = sim_data$buffer)
# 影响扩散:捕获节点对网络中影响传播的影响。顶点的影响扩散是通过将其传播感染的能力从网络中删除后,通过其对其他顶点的影响敏感性的变化来衡量的。
sim_data$impd <- impact_diffusion(exposures = gmd, buffer = sim_data$buffer,
weights = sim_data$weights)$total
3. 模拟网络传染与系统损失
用contagion()
函数模拟银行破产冲击在金融系统中的传染过程和最终影响。
# (1) Bardoscia et al.(2015):DebtRank(线性传播)模拟,假定银行遭受损失后会将损失等比例地传递到关联银行
contdr <- contagion(exposures = md_mat,
buffer = sim_data$buffer, weights = sim_data$weights,
shock = "all", method = "debtrank", verbose = F)
summary(contdr)
contdr_summary <- summary(contdr)
sim_data$DebtRank <- contdr_summary$summary_table$additional_stress # DebtRank指标
plot(contdr)
# 以b55为例,其规模是金融系统的11%,如果其初始损失(Original Losses)为584亿美元,在线性冲击传播情况下,其违约将给系统造成28%的额外压力,相当于2358亿美元的额外损失,并导致18个其他机构的违约。
# (2) 违约级联模拟(default cascades simulation),假定除非银行违约,否则不会传染
contthr <- contagion(exposures = md_mat,
buffer = sim_data$buffer, weights = sim_data$weights,
shock = "all", method = "threshold", verbose = F)
summary(contthr)
contthr_summary <- summary(contthr)
sim_data$cascade <- contthr_summary$summary_table$additional_stress
plot(contthr)
# (3) 模拟任意传染: 所有银行同时发生的1%至25%的压力冲击将如何影响系统?为此,只需创建一个包含冲击矢量的列表,然后将其传递给即可contagion()。
s <- seq(0.01, 0.25, by = 0.01)
shocks <- lapply(s, function(x) rep(x, nrow(md_mat)))
names(shocks) <- paste(s*100, "pct shock")
cont <- contagion(exposures = gmd, shock = shocks,
buffer = sim_data$buffer, weights = sim_data$weights,
method = "debtrank", verbose = F)
summary(cont)
plot(cont, size = 2.2)
# 在此示例中,所有组中5%的冲击会在系统中造成20%的额外压力,是初始冲击的4倍。
4. 银行排名与指标比较
head(sim_data)
#我们可能会看到这些不同指标中的一些如何对每个节点进行排名。例如,DebtRank和Default Cascade指标与前五个机构一致。
rankings <- sim_data[1]
var_rk=c("DebtRank","cascade","degree","eigen","impd","assets", "liabilities", "buffer")
rankings <- cbind(rankings,lapply(sim_data[var_rk],
function(x) as.numeric(factor(-1*x))))
rankings <- rankings[order(rankings$DebtRank), ] # 按DebtRank排序
head(rankings, 10) # 前十名银行
cor(rankings[-1]) # 指标之间的相互关系