今天给大家分享一个综合了数据采集、处理、分析、可视化、接口调用等技术点的项目。

一、说点东西

老早就想搞个基金监控机器人了,方便自己查看自己关注基金的各种指数涨跌情况,及时进行止损或者止盈,今天我们先建楼基,手把手带大家实现一个基金查询机器人,目前主要可以查询基金指定日期段数据和查看基金净值走势图,后面慢慢新增功能。

二、开始动手动脑

2.1 环境准备

  • Linux、Mac、Windows 都可以

  • python 3.7及以上

  • 相关第三方包:pandas(数据处理)、requests(爬取数据)、re(文本内容解析)、akshare(获取基金股票数据)、matplotlib(数据可视化)、dataframe-image(dataframe表格转成图片)

2.2 获取指定日期段基金数据

基金数据可以从一些金融相关的网站获取到,比如天天基金网、新浪基金网等,可以自己写爬虫程序获取网站数据,也可以使用现成的工具包获取数据,比如之前介绍过的 tushare 和akshare等库。

这里我们同时介绍下两种方法:

2.2.1 回顾下akshare获取基金数据

目前akshare不支持获取指定日期范围内的基金净值数据,但是可以一次获取到基金历史净值数据,调用函数fund_em_open_fund_info获取基金历史数据,然后自己根据日期选取时间段进行分析。

import akshare as ak
fund_data = ak.fund_em_open_fund_info(fund='005827', indicator='单位净值走势')print(fund_data)

2.2.2 自己调用现成数据接口

本质上akshare也是从一些金融相关的网站获取到数据,我们也可以自己写代码进行获取,通过浏览器我们很快能搜索到基金数据接口,来自东方财富的天天基金网。

f'http://fund.eastmoney.com/f10/F10DataApi.aspx?type=lsjz&code={code}&page={page}&sdate={start_date}&edate={end_date}&per={per}'code - 基金代码
page - 基金数据页码
start_date - 数据开始日期
end_date - 数据结束日期
per - 每页展现数据量,最多40

根据指定参数,浏览器会返回指定参数,一段js赋值代码,包括了 基金数据(content)、总记录条数(records)、总页数(pages)、当前页数(curpage)。

格式非常规整,我们可以直接通过正则提取数据,

'''
获取单页面 基金数据
'''
def get_html(code, start_date, end_date, page=1, per=40):url = f'http://fund.eastmoney.com/f10/F10DataApi.aspx?type=lsjz&code={code}&page={page}&sdate={start_date}&edate={end_date}&per={per}'# print(url)rsp = requests.get(url)html = rsp.textreturn html

通过返回的数据可以发现,基金数据部分是一个由table标签包裹的html代码,那我们可以直接使用pandas的read_html来解析数据。

# 从html中解析出数据表部分 并解析成df
def parses_table(html):# 获取基金数据表pattern = 'content:"<table(.*)</table>",'table = re.search(pattern, html).group(1)table = '<table' + table + '</table>'fund_data = pd.read_html(table)[0]return fund_data

前面有提到,基金数据接口返回数据每页最多展示40条,所以要想获取所有数据,我们可能需要遍历每一页,那么我们还需要通过正则将总页数pages获取到,然后遍历调用get_htmlparses_table函数解析出所有数据。

# 获取指定日期内 累计净值 等数据
def get_fund_data(code, start_date, end_date):first_page = get_html(code, start_date, end_date)# 获取总页数pattern = 'pages:(.*),'pages = re.search(pattern, first_page).group(1)# 转成int数据try:pages = int(pages)except Exception as e:r = f'【错误信息】{e}'# print(r)return r # 存放每页获取到的基金数据 dataframe格式 便于后面合并fund_df_list = []# 循环便利所有页面for i in range(pages): if i == 0:fund_data = parses_table(first_page)else:page_html = get_html(code, start_date, end_date, page=i+1)fund_data = parses_table(page_html)fund_df_list.append(fund_data)# 将每页的数据合并到一起fund_df = pd.concat(fund_df_list)return fund_df

上面两种方法都可以获取到基金净值数据,最后我选择了akshare方式获取,设置一个定时任务,每天三点更新自己关注的基金所有数据,存储到本地,后面要查询的时候直接读取本地文件查询即可。

  • 定时任务:每天早上3点获取所有关注的基金历史数据,存储到本地

# 定时任务:每天早上3点获取所有关注的基金历史数据,存储到本地
def get_all():try:# 从文件读取 自己关注的基金代码列表with open('./FD/funds.txt') as f:funds = [i.strip() for i in f.readlines()]# 遍历 一个个更新数据for fund in funds:fund_df = ak.fund_em_open_fund_info(fund, indicator='单位净值走势')fund_df = fund_df.sort_values(by=['净值日期'], ascending=False)fund_df.to_csv(f"./FD/DATA/F{fund}_data.csv", index=False)# print(f"./FD/DATA/F{fund}_data.csv")time.sleep(random.randint(1,5))return '基金数据更新完成'except Exception as e:r = f"【错误信息】{e}"return r
  • 获取指定基金 指定日期段 净值数据

# 获取指定基金 指定日期段 净值数据
def get_fund_data(fund, start_d, end_d):fund_df = pd.read_csv(f'./FD/DATA/{fund}_data.csv')result_df = fund_df.query(f"'{start_d}'<=净值日期<='{end_d}'")return result_df

2.3 返回数据呈现方式

目前先简单点,设置规则如下:

  • 1)如果数据量小于等于30条,就返回原始数据图

原始数据图就是直接将获取到的数据转成图片的方式发送给用户,这里我们使用dataframe-image这个第三方包,使用非常简单,pip安装后,直接调用export函数即可快速将datafrmae数据转成图片。

# 将dtaframe表格转变成图片
def df_to_img(fund_df, fund, start_d, end_d):if fund_df.shape[0] <=1:dfi.export(fund_df, f'./FD/IMG/{fund}_{start_d}_{end_d}_data.png')return # 格式化表格 凸显最大最小值fund_df = fund_df.style.highlight_max(subset=['单位净值'], color='red')\.highlight_min(subset=['单位净值'], color='green')\.format({'日增长率': '{:}%'})dfi.export(fund_df, f'./FD/IMG/{fund}_{start_d}_{end_d}_data.png')

为了图片数据更好看,我们还使用了df.style设置数据表格样式(单位净值最大值、最小值高亮和日增长率添加百分号)。

  • 2)如果数据量大于30条,就返回原始数据趋势图

原始数据趋势图就是将数据可视化下,然后返回给用户,这里我们选择绘制数据的走(趋)势图,使用matplotlib进行绘制。

# 绘制基金单位净值走势图
def draw_fund_line(fund_df, fund, start_d, end_d):plt.rcParams['figure.figsize'] = (8.0, 4.0) # 设置figure_size尺寸plt.rcParams['savefig.dpi'] = 300 #保存图片分辨率# 不显示右、上边框ax=plt.gca() ax.spines['right'].set_color('none')ax.spines['top'].set_color('none')# 设置坐标网格plt.grid(axis="y", color='gray')  # 计算最大值 最小值坐标 并标注到图中fund_max = fund_df.loc[fund_df['单位净值'].idxmax()]fund_min = fund_df.loc[fund_df['单位净值'].idxmin()]ax.annotate(f'({fund_max[0]},{fund_max[1]})', xy=(fund_max[0], fund_max[1]), color='red')ax.annotate(f'({fund_min[0]},{fund_min[1]})', xy=(fund_min[0], fund_min[1]), color='green')# 画图plt.plot(fund_df['净值日期'],fund_df['单位净值'], color="c")plt.title('基金单位净值走势图')plt.xticks(rotation=30)plt.xlabel('净值日期')plt.ylabel('单位净值')plt.savefig(f'./FD/IMG/{fund}_{start_d}_{end_d}_data.png')

这里使用的是折线图,有一些对图片样式的设置,比如:大小、边框、最大/小值标注,但依然不是很美观,后面继续优化。

  • 完整调用

# 返回数据
def response_data(fund, start_d, end_d):# 本地查看 查询结果是否已存在imgs = os.listdir('./FD/IMG/')if f'{fund}_{start_d}_{end_d}_data.png' in imgs:return f'./FD/IMG/{fund}_{start_d}_{end_d}_data.png'# 获取数据fund_df = get_fund_data(fund, start_d, end_d)# 如果数据量小于等于30条,就返回原始数据图if fund_df.shape[0]<= 30:df_to_img(fund_df, fund, start_d, end_d)else:# 否则返回数据趋势图fund_df = fund_df.sort_values(by=['净值日期'])draw_fund_line(fund_df, fund, start_d, end_d)return f'./FD/IMG/{fund}_{start_d}_{end_d}_data.png'

2.4 对接钉钉机器人设置守护程序

目前项目对接了两种机器人:钉钉群机器人和企业机器人,相关配置方法因篇幅原因这里不展开介绍。

钉钉群机器人主要用来汇报每天自动汇报基金数据更新情况,后面还可以加基金涨跌检测情况等。

企业机器人主要用来做基金数据查询自动回复功能,也可以拓展主动发消息给用户。

2.5 最终效果图

  • 指定查询

查看某基金某个时间段内的基金净值数据。(30条以内数据,表格展示;大于30条,趋势图展示)

查询格式: F基金代码 起始日期 结束日期,如:F005827 2021-12-03 2022-02-10

效果图
  • 普通查询

查看某基金近10天内净值和日增长率数据+趋势图

查询格式: F基金代码,如:F005827

最近10天内,只有两个交易日

三、后言后语

这项目说大不大,说小也不小,百行代码。目前基金监测机器人还比较简陋,甚至都没有监测功能(目前只支持数据查询和更新),但是这个楼基很稳、很深,后面添加其他功能会简单、便捷许多,欢迎大家评论区留言,说说你想为这个机器人添加的功能。完整代码在下个版本文章发布时一起分享出来,还请耐心等待。

推荐阅读:
入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径
干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影
趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!
AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影
小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!|  再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|

年度爆款文案

  • 1).卧槽!Pdf转Word用Python轻松搞定!

  • 2).学Python真香!我用100行代码做了个网站,帮人PS旅行图片,赚个鸡腿吃

  • 3).首播过亿,火爆全网,我分析了《乘风破浪的姐姐》,发现了这些秘密

  • 4).80行代码!用Python做一个哆来A梦分身

  • 5).你必须掌握的20个python代码,短小精悍,用处无穷

  • 6).30个Python奇淫技巧集

  • 7).我总结的80页《菜鸟学Python精选干货.pdf》,都是干货

  • 8).再见Python!我要学Go了!2500字深度分析!

  • 9).发现一个舔狗福利!这个Python爬虫神器太爽了,自动下载妹子图片

点阅读原文,看原创200个趣味案例!

用Python搞了个基金查询机器人,还可以拓展!相关推荐

  1. Python分析三季度基金调仓

    目前三季度已经过去了一个月,大部分基金都已经公布了三季度持仓数据,今天我们就用 Python 分析以下今年三个季度基金的调仓情况. 1 获取数据 第一步,我们要获取目前发行的所有基金及其持有的股票. ...

  2. 【毕业设计_课程设计】基于python的微信公众平台机器人的设计与实现

    文章目录 0 项目说明 项目介绍 项目工程 0 项目说明 基于python的微信公众平台机器人的设计与实现 提示:适合用于课程设计或毕业设计,工作量达标,源码开放 项目介绍 1.NGINX做负载均衡, ...

  3. 毕业设计 python的微信公众平台机器人

    文章目录 0 项目说明 项目介绍 项目工程 0 项目说明 基于python的微信公众平台机器人的设计与实现 提示:适合用于课程设计或毕业设计,工作量达标,源码开放 项目介绍 1.NGINX做负载均衡, ...

  4. rpa调用https接口 返回数据异常_金融企业“银行余额RPA查询机器人”解读

    一.财务机器人应用背景 公司简介 金融行业银行卡联合组织--是只通过银联跨行交易清算系统,实现商业银行系统间的互联互通和资源共享,保证银行卡跨行.跨地区和跨境的使用的组织. 总部设于上海,作为中国的银 ...

  5. python什么时候进入中国-Python什么时候开始流行的?还能流行多久?

    在过去的一年里,Python的火爆程度一时竟与Java的风头难分高下.相信不少人听说Python也就是近几年的事,却不知道它早在1989年就被开发出来了.那么Python什么时候开始流行的?其实也就是 ...

  6. python制作聊天机器人原理_用 Python 来做一个聊天机器人吧!(一)

    在我的一个回答里,我提到了用 Python 搭建聊天机器人.从今天开始,我就带着大家从0开始搭建一个聊天机器人. (顺便说一句,我喜欢把链接像上面这样加在文字里,如果找不到文中所说的资源,可以看看周围 ...

  7. python能做机器人吗_最火的Python语言也能做机器人仿真,你会不?

    原标题:最火的Python语言也能做机器人仿真,你会不? 最近接到好多刚踏出大学的学弟学妹们的问候,面临人生中的第一次求职,可有感觉自己没在学校学到一技之长,但又不想随便找份工作将就,那这种情况下该怎 ...

  8. python爬虫获取基金数据2

    用sklearn分析基金数据<1> python爬虫获取基金数据<2> 数据预处理:数据清洗.生成样本数据<3> 用sklearn训练样本数据<4> 用 ...

  9. 用 Python 快速获取基金持仓增减情况 | 更新版

    来源:Python数据之道 (ID:PyDataLab) 作者:阳哥 01写在前面 大家好,我是阳哥. 大家知道,在财经领域,Python是有着广泛的用途的.2021年,量化基金开始成为弄潮儿.有不少 ...

  10. 如何使用Python爬取基金数据,并可视化显示

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于Will的大食堂,作者打饭大叔 前言 美国疫情越来越严峻,大选也进入 ...

最新文章

  1. 9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路...
  2. Jackson解析JavaBean空值不显示问题
  3. linux bash shell 常用快捷键
  4. JavaScript时间事件:setTimeout和setInterval
  5. slf4j与logback的结合使用
  6. 【摘】蓝牙技术及其协议栈
  7. KTable的设置单元格属性
  8. gcov 使用注意事项
  9. c 语言自动关机代码,自动关机 C语言源代码
  10. [生存志] 第91节 鬼谷捭阖之策
  11. Minecraft mod制作简易教程目录
  12. java中retry的使用
  13. 浙工商计算机学院教师,浙工商计算机与信息工程学院导师介绍:魏贵义
  14. java中测长度的方法,java获取文件大小的几种方法
  15. 2017年清华大学计算机科学与技术系考研小结
  16. 关于SQL SERVER注释快捷键
  17. logstash截取指定字符和grok的使用
  18. ArcGIS Notebook Server 10.9.1 Linux版本安装示例
  19. diskgenius恢复文件(diskgenius恢复文件收费)
  20. 45页智慧旅游系统建设解决方案【附下载】

热门文章

  1. 软件质量保证基本知识加复习建议
  2. Python教学视频(七)分支结构
  3. 「纯正干货」教你一招解决PDF去密码
  4. mysql sql语句面试经典50题_常见的SQL面试题:经典50题(简单)
  5. 基于信息论的特征选择算法综述
  6. 国产在线三维云CAD:CrownCAD (在线建模CAD软件)
  7. 《高性能Linux服务器构建实战Ⅱ》已出版发售,附封面照!
  8. LaTeX的安装教程(Texlive 2020 + TeX studio)
  9. c xaml语言教程,Xamarin XAML语言教程基础语法篇大学霸
  10. 图书管理系统(前台(vue))