场内基金数据分析

1. 爬取场内基金数据

print('----------爬取所有场内基金名单开始----------')
# 天天基金所有场内交易基金url
url = 'http://fund.eastmoney.com/data/rankhandler.aspx?op=ph&dt=fb&ft=ct&rs=&gs=0&sc=clrq&st=asc&pi=1&pn=1000'
# 请求头
header = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/101.0.4951.67 Safari/537.36 ',
'Host': 'fund.eastmoney.com',
'Referer': 'http://fund.eastmoney.com/data/fbsfundranking.html'
}

# 请求应答
response = requests.get(url, headers=header)
response.encoding = 'utf-8'
# print(response.text)

# 去无关的信息
response_body = response.text.replace("var rankData = ", "").replace(";", "")
# print(response_body)

# 通过”“分割应答消息
datas = response_body.split('"')

# 构建的pandas二维数组
data_list = []

# 每隔一行都是数据
for i in range(1, len(datas), 2):
# print(datas[i])
# 保存每一行的数据
item = []
# 每行数据根据逗号分割加入数组
for data in datas[i].split(','):
item.append(data)
data_list.append(item)

# print(data_list)
result = pd.DataFrame(data_list)
file_name = datetime.datetime.now().strftime("%Y-%m-%d") + '-fund.csv'

# 删除几列没用的数据
result.drop(columns=[16, 17, 18, 19, 20], inplace=True)
# 设置表头
result.columns = ['基金代码', '基金全称', '基金英文缩写', '日期',
'单位净值', '累计净值', '近一周', '近一月', '近三月', '近六月',
'近一年', '近两年', '近三年', '今年来', '成立来', '成立日期',
'类型', '近五年']
# 调整列顺序
fund_type = result.pop("类型")
result.insert(3, "类型", fund_type)
five_rate = result.pop("近五年")
result.insert(14, "近五年", five_rate)

result.to_csv(file_name, encoding='gbk', index=False)
print("总共爬取了" + str(len(datas) // 2) + "只场内基金数据")
print('----------爬取所有场内基金名单结束----------')

2. 获取所有场内基金的规模

print('----------爬取所有场内基金的规模开始----------')
file_name = datetime.datetime.now().strftime("%Y-%m-%d") + '-fund.csv'
fund_csv = pd.read_csv(file_name, encoding='gbk')
fund_code_list = fund_csv['基金代码']
# print(fund_code_list.size)
fund_scale = []
fund_scale_time = []
# 添加进度条
for fund_code in tqdm(fund_code_list):
url = 'http://fund.eastmoney.com/pingzhongdata/' + str(fund_code) + '.js?v=20221205224650'
# print(url)
response = requests.get(url)
# 截取后面一部分
tile = response.text[-4000:-1000]
index_head = tile.find('{"name":"净资产"')
index_tail = tile.find(';/*业绩评价')
# 构造json
tile_new = tile[index_head:index_tail].replace('}]', '')
tile_json = json.loads(tile_new)
# print(tile_json)
# 将基金规模与对应的时间写入list
# print(tile_json['data'])
# print(tile_json['categories'])
if len(tile_json['data']) > 0:
fund_scale.append(tile_json['data'][-1])
else:
fund_scale.append(np.nan)
if len(tile_json['categories']) > 0:
fund_scale_time.append(tile_json['categories'][-1])
else:
fund_scale_time.append(np.nan)
fund_csv['基金规模'] = fund_scale
fund_csv['基金规模时间'] = fund_scale_time
fund_csv.to_csv(file_name, encoding='gbk', index=False)
print('----------爬取所有场内基金的规模结束----------')

3. 筛选基金规模在2亿以上的并可视化分析

print('----------可视化分析场内基金开始----------')
file_name = datetime.datetime.now().strftime("%Y-%m-%d") + '-fund'
fund_csv = pd.read_csv(file_name + ".csv", encoding='gbk')
fund_scale_above_200_million = fund_csv[fund_csv['基金规模'] > 2]
profile_fund = pandas_profiling.ProfileReport(fund_scale_above_200_million, title="场内2亿规模以上基金分析报告")
profile_fund.to_file(file_name + '.html')
print('----------可视化分析场内基金结束----------')

分析可视化示例