【Google Colab Python系列】以Goodinfo!為例,統計一段時間內的最高、最低殖利率

閱讀時間約 9 分鐘
上一篇我們有介紹Google Colab Python的爬蟲基礎概念與技巧,還沒閱讀的朋友可以先進行閱讀,並建立基礎概念之後再接著進行實戰演練會比較容易上手唷! 這裡就附上連結「【Google Colab系列】該如何設計自己的爬蟲來抓取Html資料?」供各位參考囉!
這一篇章會以捕魚的四大步驟進行比喻,由淺入深,逐步完成屬於自己的統計程式,目標是能夠以生活化例子建立撰寫爬蟲的基礎概念,未來假若我們需要進一步蒐集資料進行統計分析時,就將這套心法搬出來舞弄,相信概念與技巧熟練之後,遇到任何奇耙的網站資料也都能夠迎刃而解。
上一次我們已經示範如何抓取目標表格,這次的主軸會圍繞在如何切換表格內容並抓取某幾個cell的資料進行程式運算,因此這個篇章我們會學到以下幾個重要技能:
  • 抓取某段範圍內的cell內容。
  • 過濾標題。
  • 使用pandas進行計算與統計。

觀察: 分析切換「顯示依據」的行為

我們先打開F12並切到Network來觀察操作行為過程中會發送哪些網路封包。
這時候就得考驗我們的觀察能力了,有沒有發現圖片上請求的URL已經有點不太一樣了,我們拿這段URL去試著請求看看,果不其然,刷新後的頁面就是股利發放政策的相關資訊了。
https://goodinfo.tw/tw/StockDividendPolicy.asp?STOCK_ID=xxx

撒網: 定義明確目標

首先我們成功抓到表格之後,下一步就是定義我們今天要統計的數值,以這次的目標為例,統計的為N段時間內的最高、最低殖利率。
因此我們需要抓取的元素有「股利發放年度」、「現金股利」、「年度股價」這些資訊輔助我們進行每一年殖利率的計算。

收網: 撰寫程式進行抓取重要區塊

這時候我們就可以大膽的將這串URL寫到程式碼中,進一步進行抓取。
import requests

STOCK_ID='3231'

headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'
}
res = requests.get('https://goodinfo.tw/tw/StockDividendPolicy.asp?STOCK_ID={0}'.format(STOCK_ID), headers = headers)
res.encoding = 'utf-8'
res.text
再來我們一樣藉由F12(Network)來錨定關注範圍的表格。
接著我們運用「BeautifulSoup」來抓取該表格的標籤。
from bs4 import BeautifulSoup
bs = BeautifulSoup(res.text, 'html.parser')
data = bs.select_one('#tblDetail')
print(data)
再來使用pandas套件來檢驗我們抓取的表格是否正確。
import pandas
dfs = pandas.read_html(data.prettify())
print(dfs)
看樣子是我們所需要的資訊沒有錯,接下來就要開始抓取最高與最低股利來計算這兩者的平均殖利率囉!

料理:統計的精華與心法

首先我們一樣用取節點的技巧,並印出前N筆的方式來縮減範圍,並且框出我們需要的欄位。
import pandas
import datetime



dfs = pandas.read_html(data.prettify())
node = dfs[0]

node.head(5)
這邊有幾篇關於Pandas的教學,建議可以先行閱讀,才比較容易知道如何使用這個強大的套件。
接著我們直接進入重點,我們先試試看抓取重要的幾個欄位並留下即可,並且我們試著將columns印出,記錄我們需要的欄位名稱,下一步我們會使用這些資訊留下重要的欄位資訊。
# 這邊我們將標題僅留下第3列即可
node.columns = node.columns.get_level_values(3)

# 印出標題名稱
node.columns
接著我們試著讓資訊列僅留下指定欄位資訊。
# 顯示Columns(列)為名稱的數據
# 這次抓取的目標有4個欄位,分別以下:
node = node[['股利 發放 年度', '股利 合計', '最高', '最低']]

node = node.head()
重頭戲來囉! 加油,剩下最後一段路了,讓我們來統計一下這N年的最高與最低殖利率吧! 如果不知道殖利率怎麼計算的朋友不妨試著閱讀以下文章:
讓我們動手來進行程式開發,統計屬於自己的分析庫,首先我們針對前N筆的股利合計、最高、最低進行平均的運算,但在平均之前值得注意的是表格內的值尚未轉換前仍為字串,因此我們要優先處理型態轉換如下:
# 把 str 轉成 float 型態才能進行統計
node['最低'] = node['最低'].astype('float')
node['最高'] = node['最高'].astype('float')
接著我們分別取合計股利、最高、最低的平均數。
dividend = node['股利  合計'].mean()
highest = node['最高'].mean()
lowest = node['最低'].mean()
接下來就是重頭戲殖利率的計算囉!
# 由於股價越低,殖利率越高的特性,因此會以股利除以最低價
hYield = dividend / lowest


# 由於股價越高,殖利率越低的特性, 因此會以股利除以最高價
lYield = dividend / highest

# 這邊已知的資訊有目前股價,而未知的資訊則是發放股利,因此我們可以設法由最近四季去推估未來可能的股利,進而得到目前殖利率的指標, 最終依據最高與最低殖利率決定買進時間點
# 注意: 以下並非真實資料,僅以示範為主
# 假設目前股價為27.5
# 平均股利: 1.8782
cYield = dividend / 27.5

print('最高殖利率={0:.2%}, 最低殖利率={1:.2%}, 目前殖利率={2:.2%}'.format(hYield, lYield, cYield))
得出最終結果為:
最高殖利率=9.06%, 最低殖利率=5.71%, 目前殖利率=6.83%
這邊的股價請使用今天的範例進行動態抓取,做為練習,加深印象,因此範例中特以固定的值進行統計,真實數據並非如此,需自行抓取目前股價才能推估。
📝 這次的實戰練習會用到一些基本的API筆記如下:
# 顯示有哪些欄位
node.columns

# 顯示Columns(列)為名稱的數據
node[['名稱']]

# 取得指定「列」的標題
node.columns.get_level_values(3)

# 將指定欄資料集轉換型態以利統計
node['欄位名稱'].astype('float')

# 取平均
node['欄位名稱'].mean()

結語

過程中其實都在訓練我們的觀察能力,如何察覺到某些地方的微小差異就能夠透過這樣的差異抓到一些規則,藉由這些規則進行排除法,一步步的獲取我們重要的資訊,
下一篇章我們預計將殖利率區間渲染成報表,學習如何產生圖表,以視覺化來呈現推估數據,提升分析與評估的效益。
今天的範例都在這裡「📦 goodinfo_yield.ipynb」歡迎自行取用。
------------------------------------------------------------------------------------------------
喜歡撰寫文章的你,不妨來了解一下:
歡迎加入一起練習寫作,賺取知識,累積財富!
即將進入廣告,捲動後可繼續閱讀
為什麼會看到廣告
avatar-img
117會員
262內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
阿Han的沙龍 的其他內容
上一篇我們已經介紹過Google Colab的基本用法,建議可以先行閱讀「【Google Colab系列】台股分析預備式: Colab平台與Python如何擦出火花?」,進行基本概念與環境的建置再進行下一步會比較容易進行學習。 雖然網路上已經提供非常多的股市資訊,但各個網站可能都零零散散,難免我們得
這次的主題除了結合平時興趣之一的金融理財之外,亦將本業的軟體程式概念進行結合,透過跨領域的想法激盪出屬於自己的交易策略,過程中也將學習歷程進行筆記,提供給路途中的朋友一個方向,讓我們一起動動手打造出自己的分析程式吧! 多年的軟體開發經驗,過程中也踩過不少雷,因此常常在學習道路上都期望有人能夠將技術經
一般來說我們會這樣定義Struct來接收前端請求的POST Body 那假設POST Body是這樣 此時我們利用gin的BindJSON來Unmarshal 結果印出來會是 上述結果的name被我們過濾掉是正常,但enabled就我們的需求上來看,不應該被過濾掉才對。 所以我們應該將bool、in
由於Go語言本身沒有提供Enum的功能, 故我們可以使用package及type的技巧來達到類似的功能,假設今天要定義季節的enum型別, 包含了「春、夏、秋、冬」四種值的時候,可以怎麼做呢? 首先我們可以用package來框住season的範圍: 然而在season.go可以定義一個字串的類型 最
我們開發程式的過程中難免會依賴DB或其他服務, 但複雜的網路環境下我們並沒有辦法確保我們發送的請求是否正確的送達, 因此我們可以在程式中加入Retry機制, 提升我們軟體的強健性。 尤其是面對NoSQL相對弱一致性的DB時更需注意, 而在Go語言, 我們可以用簡單的技巧來完成Retry的策略, 在進
一般來說我們如果將程式運行在console上,只要用ctrl + c 之類的強制中斷方式就能讓程式中止,但如果我們想要在程式運行到一半時,偵測到某些例外狀況就離開程式,可以怎麼做呢? nodejs核心模組提供了process.exit()的方法可以讓程式強制中止,但使用了這個功能之後,我們尚未完成的
上一篇我們已經介紹過Google Colab的基本用法,建議可以先行閱讀「【Google Colab系列】台股分析預備式: Colab平台與Python如何擦出火花?」,進行基本概念與環境的建置再進行下一步會比較容易進行學習。 雖然網路上已經提供非常多的股市資訊,但各個網站可能都零零散散,難免我們得
這次的主題除了結合平時興趣之一的金融理財之外,亦將本業的軟體程式概念進行結合,透過跨領域的想法激盪出屬於自己的交易策略,過程中也將學習歷程進行筆記,提供給路途中的朋友一個方向,讓我們一起動動手打造出自己的分析程式吧! 多年的軟體開發經驗,過程中也踩過不少雷,因此常常在學習道路上都期望有人能夠將技術經
一般來說我們會這樣定義Struct來接收前端請求的POST Body 那假設POST Body是這樣 此時我們利用gin的BindJSON來Unmarshal 結果印出來會是 上述結果的name被我們過濾掉是正常,但enabled就我們的需求上來看,不應該被過濾掉才對。 所以我們應該將bool、in
由於Go語言本身沒有提供Enum的功能, 故我們可以使用package及type的技巧來達到類似的功能,假設今天要定義季節的enum型別, 包含了「春、夏、秋、冬」四種值的時候,可以怎麼做呢? 首先我們可以用package來框住season的範圍: 然而在season.go可以定義一個字串的類型 最
我們開發程式的過程中難免會依賴DB或其他服務, 但複雜的網路環境下我們並沒有辦法確保我們發送的請求是否正確的送達, 因此我們可以在程式中加入Retry機制, 提升我們軟體的強健性。 尤其是面對NoSQL相對弱一致性的DB時更需注意, 而在Go語言, 我們可以用簡單的技巧來完成Retry的策略, 在進
一般來說我們如果將程式運行在console上,只要用ctrl + c 之類的強制中斷方式就能讓程式中止,但如果我們想要在程式運行到一半時,偵測到某些例外狀況就離開程式,可以怎麼做呢? nodejs核心模組提供了process.exit()的方法可以讓程式強制中止,但使用了這個功能之後,我們尚未完成的
你可能也想看
Google News 追蹤
在此篇中,我們來拿實務的例子作實戰練習,我們會討論如何在Google Colab的環境下,撈取所有台美股的股票代碼,並獲取相關細節,最後將獲取的資訊存取於SQLite資料庫中。
你是否曾使用Python進行網上爬蟲、撈取資料、分析,並將結果存進雲端資料庫? 你知道這一切可以全部發生在Google Drive裡嗎?而且,全部都是免費的!
Thumbnail
對於剛接觸Python程式的使用者來說,要一口氣學會爬蟲可能相對困難,但若想即時且輕鬆獲得台股相關數據,你可以利用證交所所提供的API進行數據蒐集。只需要簡單幾行程式碼,就能輕鬆抓到台股上千支股票的每日資訊,是不是棒呆了!!
Thumbnail
這篇文章介紹如何使用Python整理資料成百分比資料以及繪製百分比堆疊直條圖。
Thumbnail
透過分析臺灣好行的公開資料,分享如何用Python繪製折線圖
Thumbnail
本文介紹瞭如何使用 Python pandas 進行資料分析,包括如何使用 corr() 函數針對數字類型的欄位進行分析,以及如何刪除不需要的欄位和取得想要的小數位數。
Thumbnail
股票的真相是什麼? 何為投資的底層邏輯? 資本市場的秘密為何? 看透本質,讓我們一起找到屬於自己的最佳策略!
在此篇中,我們來拿實務的例子作實戰練習,我們會討論如何在Google Colab的環境下,撈取所有台美股的股票代碼,並獲取相關細節,最後將獲取的資訊存取於SQLite資料庫中。
你是否曾使用Python進行網上爬蟲、撈取資料、分析,並將結果存進雲端資料庫? 你知道這一切可以全部發生在Google Drive裡嗎?而且,全部都是免費的!
Thumbnail
對於剛接觸Python程式的使用者來說,要一口氣學會爬蟲可能相對困難,但若想即時且輕鬆獲得台股相關數據,你可以利用證交所所提供的API進行數據蒐集。只需要簡單幾行程式碼,就能輕鬆抓到台股上千支股票的每日資訊,是不是棒呆了!!
Thumbnail
這篇文章介紹如何使用Python整理資料成百分比資料以及繪製百分比堆疊直條圖。
Thumbnail
透過分析臺灣好行的公開資料,分享如何用Python繪製折線圖
Thumbnail
本文介紹瞭如何使用 Python pandas 進行資料分析,包括如何使用 corr() 函數針對數字類型的欄位進行分析,以及如何刪除不需要的欄位和取得想要的小數位數。
Thumbnail
股票的真相是什麼? 何為投資的底層邏輯? 資本市場的秘密為何? 看透本質,讓我們一起找到屬於自己的最佳策略!