【背景】根据提供的公募基金在一定时期内持有的股票数据,构建一个社会网络分析框架,度量每个基金在每年的度中心度、介数中心度和特征向量中心度,并对相关数据做出简要说明。
【代码】
import networkx as nx
import pandas as pd
import numpy as np
# 读取数据
df = pd.read_excel("基金持股修正.xlsx")
df.head()
基金代码 | 年份 | 唯一股票代码 | |
---|---|---|---|
0 | 1 | 2019 | 南极电商 |
1 | 1 | 2019 | 中国平安 |
2 | 1 | 2019 | 洲明科技 |
3 | 1 | 2019 | 保利地产 |
4 | 1 | 2019 | 东山精密 |
# 构建网络
G = nx.Graph()
df["年份"] = df["年份"].astype(int)
# 2. 根据基金代码和年份分组并创建图
fund_graphs = {}
for fund_code, fund_df in df.groupby(["基金代码", "年份"]):
graph = nx.Graph()
graph.add_nodes_from(fund_df["唯一股票代码"])
fund_graphs[(fund_code, int(fund_df["年份"].iloc[0]))] = graph
# 3. 计算中心度指标
fund_scores = []
for fund_code, fund_graph in fund_graphs.items():
degree_centrality = nx.degree_centrality(fund_graph)
closeness_centrality = nx.closeness_centrality(fund_graph)
eigenvector_centrality = nx.eigenvector_centrality(fund_graph)
for stock, score in degree_centrality.items():
fund_scores.append({
"基金代码": fund_code[0],
"年份": fund_code[1],
"股票代码": stock,
"中心度指标": "度中心度",
"分数": score
})
for stock, score in closeness_centrality.items():
fund_scores.append({
"基金代码": fund_code[0],
"年份": fund_code[1],
"股票代码": stock,
"中心度指标": "介数中心度",
"分数": score
})
for stock, score in eigenvector_centrality.items():
fund_scores.append({
"基金代码": fund_code[0],
"年份": fund_code[1],
"股票代码": stock,
"中心度指标": "特征向量中心度",
"分数": score
})
fund_score_df = pd.DataFrame(fund_scores)
# 4. 输出表格
fund_score_df.to_excel("fund_stock_centrality.xlsx", index=False)
- - 度中心度:度中心度衡量一个节点的邻接节点数量。在一个基金持股网络中,度中心度较高的股票表示它与其他股票有更多的连接,表明它在该基金的投资组合中具有更高的重要性。
- - 介数中心度:介数中心度衡量一个节点在网络中的整体重要性。它考虑了节点在最短路径中的频率。在一个基金持股网络中,介数中心度较高的股票表示它在基金持股网络中连接不同股票的桥梁作用更强。
- - 特征向量中心度:特征向量中心度考虑了节点的邻接节点的重要性和连接性。在一个基金持股网络中,特征向量中心度较高的股票表示它与其他重要股票的连接更多,表明它在该基金的投资组合中具有更高的影响力。