iT邦幫忙

2024 iThome 鐵人賽

DAY 15
0
Python

30天做出理財小助理系列 第 15

Day15:計算GPM、OPM、NPM的四季平均值&成長次數

  • 分享至 

  • xImage
  •  

昨天把資料都抓齊之後,今天我們要把四季的平均值都抓出來,並且記錄他的成長次數,當一支股票都能穩定保持成長的時候,那就代表他是一支好的股票,我們藉由抓取到的資料再去查詢今年跟前年的對比,看是否成長。
前置作業就不多說,直接進入主題。
https://ithelp.ithome.com.tw/upload/images/20240929/20169376KtngC2nhcq.jpg
這裡定義了三個 SQL 查詢語句,並通過 Pandas 的 read_sql 方法將查詢結果存儲到 DataFrame 中:
df_all:存放所有 PP_GPM_OPM_NPM 表中的資料,按照 stockid 和 dateQ 排序。
df_date:存放所有不同的日期。
df_stockid:存放所有不同的股票代碼。
stock_ids_count:股票代碼的數量。
date_count:日期的數量。
all_count:總記錄數。
https://ithelp.ithome.com.tw/upload/images/20240929/201693763M2xgJdl9L.jpg
這部分初始化了一些變數來儲存四季的財務數據(GPM4Q、OPM4Q、NPM4Q)以及它們的上升或下降次數(UP/4QUP),每次處理一個股票代碼。
https://ithelp.ithome.com.tw/upload/images/20240929/20169376dOCXNkiBkT.jpg
這個部分是內部迴圈遍歷每個日期的數據:
for i in range(0, date_count):這個迴圈遍歷某股票的所有日期記錄,每次處理一個日期。提取具體數據:
tx_date = df_PP_inventory.iloc[count, 0]:從 df_PP_inventory 中取得當前的日期。
stock_id = df_PP_inventory.iloc[count, 1]:取得當前處理的股票代碼。
GPM, OPM, NPM:分別對應於當前日期的營業毛利率、營業利益率、稅後淨利率。
sn = df_PP_inventory.iloc[count, 14]:取得這筆記錄的唯一識別符號(SN),用於後續的資料更新。
https://ithelp.ithome.com.tw/upload/images/20240929/20169376vUzmpUVegv.jpg
計算最近四個季度的平均值:
if i >= 3:這個條件判斷確保至少有四筆資料可供計算。當處理到第四筆或之後的資料時,才會進行最近四季的平均計算。
計算最近四季的營業毛利率(GPM4Q):
GPM4Q = (df_PP_inventory.iloc[count, 2] + df_PP_inventory.iloc[count-1, 2] + df_PP_inventory.iloc[count-2, 2] + df_PP_inventory.iloc[count-3, 2]) / 4:這裡是將當前季度以及前面三個季度的營業毛利率相加,然後取平均值。iloc[count, 2] 對應於當前季度的 GPM,iloc[count-1, 2] 對應上一季度的 GPM,以此類推。
計算最近四季的營業利益率(OPM4Q)和稅後淨利率(NPM4Q):
OPM 和 NPM 的計算邏輯與 GPM 一樣,將四個季度的數據相加取平均。
將四季的平均值寫回 DataFrame:
df_PP_inventory.iloc[count, 3] = GPM4Q:將 GPM4Q 寫回 DataFrame 的第 3 列。
同理,OPM4Q 和 NPM4Q 也寫回到第 7 列和第 11 列。
https://ithelp.ithome.com.tw/upload/images/20240929/20169376CtwZnchynk.jpg
處理單季上升次數(UP)與四季平均上升次數(UP4Q)

單季的上升/下降次數(UP):
if i >= 1:這裡保證至少有兩筆資料來進行比較。
GPM 的變動趨勢:
if df_PP_inventory.iloc[count, 2] > df_PP_inventory.iloc[count-1, 2]:如果當前季度的 GPM 比上一季度高,GPM_UP 增加 1。
elif df_PP_inventory.iloc[count, 2] < df_PP_inventory.iloc[count-1, 2]:如果當前季度的 GPM 比上一季度低,GPM_UP 減少 1。
OPM 和 NPM 的處理邏輯同理:
分別計算 OPM_UP 和 NPM_UP,根據前後兩個季度的 OPM 和 NPM 的比較結果來增減。
將單季的上升次數寫回 DataFrame:
df_PP_inventory.iloc[count, 4] = GPM_UP:將 GPM_UP 寫回第 4 列。
OPM 和 NPM 的上升次數也分別寫入第 8 和第 12 列。
https://ithelp.ithome.com.tw/upload/images/20240929/20169376yhTViCiHzH.jpg
四季平均值的上升/下降次數(UP4Q):
if i >= 4:這裡保證至少有五筆資料進行比較,因為需要比較的是四季平均值的上升或下降趨勢。
GPM 四季平均的變動趨勢:
if df_PP_inventory.iloc[count, 3] > df_PP_inventory.iloc[count-1, 3]:如果當前四季平均 GPM 比上一期高,GPM4Q_UP

https://ithelp.ithome.com.tw/upload/images/20240929/20169376FEdKWpxGW7.jpg
上述要求都完成之後,接下來就是回寫SQL的時間(記得名稱跟順序一定要跟SQL一模一樣!!!)
接著我們打開SQL檢查一下資料是否有存取進去,這邊以台積電為舉例(2330)
https://ithelp.ithome.com.tw/upload/images/20240929/20169376CuoEB3psLB.jpg
檢查完之後確認資料無誤,就大功告成了!


上一篇
Day14:抓取毛利率、利益率、稅後淨利率資料
下一篇
Day16:卷商是甚麼?
系列文
30天做出理財小助理24
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言