用 Python 爬取各类基金数据并动态展示

共 7289字,需浏览 15分钟

 ·

2021-02-19 13:37

01

前言


去年接触基金,体会到了基金的香(真香),这几天也是过年后开始交易的日子,今天爬取『蛋卷基金』数据,通过pyecharts动图可视化方式展示基金的涨跌情况。


本文将围绕这三点去进行爬取数据,动图可视化展示数据:

  • 近一月涨跌幅前10名

  • 基金各个阶段涨跌幅

  • 近30个交易日净值情况



02

数据获取


数据来源

本文的数据来源:『蛋卷基金』


https://danjuanapp.com/


看过我之前的这篇文章酱香科技!用 Python 分析白酒类基金有多赚钱!都学会了怎么在『蛋卷基金』爬取数据(ajax异步交互方式),不会的可以去看看,文中有详细步骤!!!

数据分析

接下爬取的数据涉及五大类(五种基金)


  1. 股票型基金

  2. 混合型基金

  3. 债券型基金

  4. 指数型基金

  5. QDII型基金




通过抓包分析ajax异步交互链接的规律:


  • type是对应的五种基金的代号


  • order_by是对应最近多久的基金涨跌幅排序


'近一周':'1w''近一月':'1m''近三月':'3m''近六月':'6m''近1年':'1y''近2年':'2y''近3年':'3y''近5年':'5y'


  • page是对应的页数,从第1页开始



备注:『蛋卷基金』这个网站没有反爬!!!,请求不需要cookie!!!


ok,这些都清楚之后,接下来就可以开始爬取数据了!



03

数据可视化


由于『蛋卷基金』这个网站没有反爬!!!,所以数据爬取和可视化分析放一起了(直接爬取数据后就进行可视化!)


分析1:近一月涨跌幅前10名

爬虫代码


###基金类型dict_type={"股票型":1,"混合型":3,"债券型":2,"指数型":5,"QDII型":11}###时间dict_time={'近一周':'1w','近一月':'1m','近三月':'3m','近六月':'6m','近1年':'1y','近2年':'2y','近3年':'3y','近5年':'5y'}
for key in dict_type: url = "https://danjuanapp.com/djapi/v3/filter/fund?type="+str(dict_type[key])+"&order_by=1w&size=10&page=1" res = requests.get(url, headers=headers) res.encoding = 'utf-8' s = json.loads(res.text) s = s['data']['items'] name = [] value = [] for i in range(0,len(s)): print(s[i]['fd_name']+":"+s[i]['yield']) name.append(s[i]['fd_name']) value.append(s[i]['yield']) ###开始绘图 pie(name, value, str(key)+"基金涨跌幅", "["+str(key)+"]基金近一月涨跌幅前10名")



饼状图可视化代码


###饼状图def pie(name,value,picname,tips):    c = (        Pie()            .add(            "",            [list(z) for z in zip(name, value)],            # 饼图的中心(圆心)坐标,数组的第一项是横坐标,第二项是纵坐标            # 默认设置成百分比,设置成百分比时第一项是相对于容器宽度,第二项是相对于容器高度            center=["35%", "50%"],        )            .set_colors(["blue", "green", "yellow", "red", "pink", "orange", "purple"])  # 设置颜色            .set_global_opts(            title_opts=opts.TitleOpts(title=""+str(tips)),            legend_opts=opts.LegendOpts(type_="scroll", pos_left="70%", orient="vertical"),  # 调整图例位置        )            .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))            .render(str(picname)+".html")    )


这里将饼状图可视化代码封装成函数,绘制五种基金的饼状图只需调用这个函数即可


###开始绘图pie(name, value, str(key)+"基金涨跌幅""["+str(key)+"]基金近一月涨跌幅前10名")



1.股票型基金




2.混合型基金



3.债券型基金



4.指数型基金



5.QDII型基金



分析


上图中是五大类基金的选取近一个月涨跌幅最高前10名的基金进行绘图。


同理近一周、近三个月、近一年也可以通过这个代码进行绘制,只需要将参数order_by修改即可


'近一周':'1w''近一月':'1m''近三月':'3m''近六月':'6m''近1年':'1y''近2年':'2y''近3年':'3y''近5年':'5y'



分析2:基金各个阶段涨跌幅

上面分析中可以清楚这五类基金近一个月最高的涨跌幅排名情况,下面从排名中选取第一名基金(五类中各选取第一名)分别展示该基金各个阶段的涨跌幅情况


阶段情况:


'近一周':'1w''近一月':'1m''近三月':'3m''近六月':'6m''近1年':'1y''近2年':'2y''近3年':'3y''近5年':'5y'


爬虫代码


####分析2:基金各个阶段涨跌幅def analysis2():    name =['近1周','近1月','近3月','近6月','近1年','近3年','近5年']    ##五类基金    dict_value={}
for key in dict_type: #### 获取排名第一名基金代号 url = "https://danjuanapp.com/djapi/v3/filter/fund?type="+str(dict_type[key])+"&order_by=1w&size=10&page=1" res = requests.get(url, headers=headers) res.encoding = 'utf-8' s = json.loads(res.text) ###取第一名 fd_code = s['data']['items'][0]['fd_code']
#### 获取排名第一名基金各个阶段情况 fu_url = "https://danjuanapp.com/djapi/fund/derived/"+str(fd_code) res = requests.get(fu_url, headers=headers) res.encoding = 'utf-8' s = json.loads(res.text) data = s['data']
valuess=[]
####防止基金最长时间不够1年、2年、5年的情况报错,用0填充 ##近1周 try: valuess.append(data['nav_grl1w']) except: valuess.append(0) ##近1月 try: valuess.append(data['nav_grl1m']) except: valuess.append(0) ##近3月 try: valuess.append(data['nav_grl3m']) except: valuess.append(0) ##近6月 try: valuess.append(data['nav_grl6m']) except: valuess.append(0) ##近1年 try: valuess.append(data['nav_grl1y']) except: valuess.append(0) ##近3年 try: valuess.append(data['nav_grl3y']) except: valuess.append(0) ##近5年 try: valuess.append(data['nav_grl5y']) except: valuess.append(0) ###添加到集合中 dict_value[key]=valuess bars(name,dict_value)


可视化代码


###柱形图def bars(name,dict_values):
# 链式调用 c = ( Bar( init_opts=opts.InitOpts( # 初始配置项 theme=ThemeType.MACARONS, animation_opts=opts.AnimationOpts( animation_delay=1000, animation_easing="cubicOut" # 初始动画延迟和缓动效果 )) ) .add_xaxis(xaxis_data=name) # x轴 .add_yaxis(series_name="股票型", yaxis_data=dict_values['股票型']) # y轴 .add_yaxis(series_name="混合型", yaxis_data=dict_values['混合型']) # y轴 .add_yaxis(series_name="债券型", yaxis_data=dict_values['债券型']) # y轴 .add_yaxis(series_name="指数型", yaxis_data=dict_values['指数型']) # y轴 .add_yaxis(series_name="QDII型", yaxis_data=dict_values['QDII型']) # y轴 .set_global_opts( title_opts=opts.TitleOpts(title='涨跌幅', subtitle='李运辰绘制', # 标题配置和调整位置 title_textstyle_opts=opts.TextStyleOpts( font_family='SimHei', font_size=25, font_weight='bold', color='red', ), pos_left="90%", pos_top="10", ), xaxis_opts=opts.AxisOpts(name='阶段', axislabel_opts=opts.LabelOpts(rotate=45)), # 设置x名称和Label rotate解决标签名字过长使用 yaxis_opts=opts.AxisOpts(name='涨跌点'),
) .render("基金各个阶段涨跌幅.html") )




分析


从上面动图可以清楚这五类基金第一名基金各个阶段的涨跌幅情况。


有的基金最长时间没有达到3年或者5年,这里使用填充0处理。


分析3:近30个交易日净值情况

同理,上面分析中可以清楚这五类基金近一个月最高的涨跌幅排名情况,下面从排名中选取第一名基金(五类中各选取第一名)分别展示该基金近30个交易日净值情况。


爬虫代码


####分析3:近30个交易日净值情况def analysis3():    for key in dict_type:        #### 获取排名第一名基金代号        url = "https://danjuanapp.com/djapi/v3/filter/fund?type=" + str(            dict_type[key]) + "&order_by=1w&size=10&page=1"        res = requests.get(url, headers=headers)        res.encoding = 'utf-8'        s = json.loads(res.text)        ###取第一名        fd_code = s['data']['items'][0]['fd_code']
#### 获取排名第一名基金近30个交易日净值情况 fu_url = "https://danjuanapp.com/djapi/fund/nav/history/"+str(fd_code)+"?size=30&page=1" res = requests.get(fu_url, headers=headers) res.encoding = 'utf-8' s = json.loads(res.text) data = s['data']['items'] name=[] value=[] for k in range(0,len(data)): name.append(data[k]['date']) value.append(data[k]['nav'])
silder(name, value,key)


可视化代码


###拉伸图def silder(name,value,tips):    c = (        Bar(init_opts=opts.InitOpts(theme=ThemeType.DARK))            .add_xaxis(xaxis_data=name)            .add_yaxis(tips, yaxis_data=value)            .set_global_opts(            title_opts=opts.TitleOpts(title=str(tips)+"近30个交易日净值情况"),            datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_="inside")],        )            .render(str(tips)+"近30个交易日净值情况.html")    )



1.股票型



2.混合型



3.债券型



4.指数型



5.QDII型


分析


从上面动图可以清楚这五类基金第一名基金近30个交易日净值情况



04

总结



以上就是爬取基金数据并通过pyecharts动图可视化方式展示基金的涨跌情况。


围绕这三点去进行爬取数据,动图可视化展示数据:

  • 近一月涨跌幅前10名

  • 基金各个阶段涨跌幅

  • 近30个交易日净值情况



更多阅读



2020 年最佳流行 Python 库 Top 10


2020 Python中文社区热门文章 Top 10


5分钟快速掌握 Python 定时任务框架

特别推荐




点击下方阅读原文加入社区会员

浏览 43
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报