用Python搞了个基金查询机器人,还可以拓展!
今天給大家分享一個綜合了數據采集、處理、分析、可視化、接口調用等技術點的項目。
一、說點東西
老早就想搞個基金監控機器人了,方便自己查看自己關注基金的各種指數漲跌情況,及時進行止損或者止盈,今天我們先建樓基,手把手帶大家實現一個基金查詢機器人,目前主要可以查詢基金指定日期段數據和查看基金凈值走勢圖,后面慢慢新增功能。
二、開始動手動腦
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_html和parses_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點獲取所有關注的基金歷史數據,存儲到本地
獲取指定基金 指定日期段 凈值數據
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')這里使用的是折線圖,有一些對圖片樣式的設置,比如:大小、邊框、最大/小值標注,但依然不是很美觀,后面繼續優化。
完整調用
2.4 對接釘釘機器人設置守護程序
目前項目對接了兩種機器人:釘釘群機器人和企業機器人,相關配置方法因篇幅原因這里不展開介紹。
釘釘群機器人主要用來匯報每天自動匯報基金數據更新情況,后面還可以加基金漲跌檢測情況等。
企業機器人主要用來做基金數據查詢自動回復功能,也可以拓展主動發消息給用戶。
2.5?最終效果圖
指定查詢
查看某基金某個時間段內的基金凈值數據。(30條以內數據,表格展示;大于30條,趨勢圖展示)
查詢格式: F基金代碼 起始日期 結束日期,如:F005827 2021-12-03 2022-02-10
普通查詢
查看某基金近10天內凈值和日增長率數據+趨勢圖
查詢格式: F基金代碼,如:F005827
三、后言后語
這項目說大不大,說小也不小,百行代碼。目前基金監測機器人還比較簡陋,甚至都沒有監測功能(目前只支持數據查詢和更新),但是這個樓基很穩、很深,后面添加其他功能會簡單、便捷許多,歡迎大家評論區留言,說說你想為這個機器人添加的功能。完整代碼在下個版本文章發布時一起分享出來,還請耐心等待。
推薦閱讀: 入門:?最全的零基礎學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搞了个基金查询机器人,还可以拓展!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(2024)vue之电商管理系统
- 下一篇: wxpython控件字体_wxPytho