日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

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

發布時間:2023/12/10 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用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點獲取所有關注的基金歷史數據,存儲到本地

#?定時任務:每天早上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搞了个基金查询机器人,还可以拓展!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。