2022年3月29日 星期二

[挑戰用python寫一支股票工具] Day2 抓取每季保留盈餘

持之以恆到了第二天,前一篇提到用公開資訊站抓取月營收資訊。 今天來分享用公開資訊站抓取"保留盈餘"這個資訊。

提到"保留盈餘",就必須參照"資產負債表",因為保留盈餘屬於資產負債表裡面的股東權益項目,所以我們要去公開資訊觀測站裡面查詢:https://mops.twse.com.tw/mops/web/t164sb03

為何保留盈餘這個指標具有參考性呢?  保留盈餘屬於股東權益的一部分,一家公司,保留盈餘是否有持續成長,代表這家公司是否有持續性提供股東權益的增長。若保留盈餘減少,卻還是大量發放股利,就代表我們需要小心公司未來成長的方向。


做法與Day1的程式碼很類似,只有入口網站有更改,觀察入口網站需要輸入的項目,需要使用者填寫的項目分別為"歷史資料"、"公司代號"、"年度"和"季度"。


這邊可以參照Day1有提到的,使用檢查的方式先叫出網頁的程式碼,然後觀察其使用者輸入後程式碼對應的項目。這邊不再贅述。可以發現到與月營收不同的是,這邊已經改為season (季度)

在使用程式碼擷取前,我們可以先觀察一下公開資訊站的資產負債表格式,假如使用者填入第四季度,則資產負債表顯示如下,它的主欄位有兩欄,分別顯示查詢民國年12月底與去年12月底。
假如使用者填入"第一、二、三季度",則顯示如下,可發現主欄為變成三欄,除了原本使用這欲查詢的年份,還多了去年年底12月和去年對應的季度。
由這個變化,也提醒我們在做資料尋找時,要先確定網站上表格格式的變化是否會影響資料的抓取。

接下來,這些表格裡面,我們需要的是"保留盈餘"這列資訊。 以普萊德(6263) 民國110年第四季度為範例,可發現我們欲取得768,852這筆數據。


執行程式碼後,可在dfinfo這個Dataframe裡面擷取出所有表格的數據
觀察資料型態,可以發現我們要查找的"保留盈餘合計"位於第42列第一欄,而我們要撈取的資料768512則位於第42列第二欄。
我在程式碼中,使用dataframe篩選的技巧,首先創建一個filter變數,並讓他判斷
filter=dfinfo.iloc[:,0]=='保留盈餘合計'

這行指令代表,會去查找第一欄裡面所有元素是否有符合"保留盈餘合計"這個字串,並會生成布林陣列,接著再用這個filter去撈取第二欄的資料,這樣就能把768512這個數字篩選出來。
這個做法類似excel的vlookup,只是我簡單使用panda dataframe的函數去做篩選。

retained_surplus=dfinfo.loc[filter].iloc[0,1]


好啦,今天就分享到這裡。 附上Day2程式碼,有問題再留言吧!

================================程式碼================================


"""
Day2範例-抓取每月累積營收年增率
"""
import requests
import pandas as pd

#####
url = 'https://mops.twse.com.tw/mops/web/t164sb03'  #獨立報表-資產負債表
year=110    # 使用者輸入處: 年份(民國)
season=4     # 使用者輸入處:季度(1,2,3,4)
co_id=6263  # 使用者輸入處 :公司代碼
###
latest_revenue=[]

season="".join(['0',str(season)])
       
postinfo={
   'encodeURIComponent':1,
   'step':1,
   'firstin':1,
   'off':1,
   'queryName':'co_id',
   'inputType':'co_id',
   'TYPEK':'all',
   'isnew':False,  #false:歷史資料  true:最新資料
   'co_id':co_id,
   'year':str(year),
   'season':season,
}
headers = {'Connection': 'close'}  # prevent pop up error:max retries exceed with url
info= requests.post(url,postinfo,headers=headers)  #post to URL
info.encoding = 'utf8'
dfinfo = pd.read_html(info.text, header=None)[10]  #data is in list[10]
filter=dfinfo.iloc[:,0]=='保留盈餘合計'
retained_surplus=dfinfo.loc[filter].iloc[0,1]

沒有留言:

張貼留言

[讀時光] 教養與自我的情緒克- 薩提爾的親子情緒課 (李儀婷 著)

周末花時間一口氣看完了薩提爾的親子情緒課一書。雖然目前還是準爸爸,實際等到要教養自己的小孩也是兩三年之後,但我覺得這本書其實闡述了一些很重要的溝通法則,這些通則或許偶爾不那麼合用在現實成人世界上,但卻有助於內化自省,讓自己成為更好的人。即使沒有小孩需要教養,依然可以把它當成一本心...