iT邦幫忙

2025 iThome 鐵人賽

DAY 15
0
AI & Data

從網路爬蟲到資料洞察的應用系列 第 15

計算月平均價、月成交量

  • 分享至 

  • xImage
  •  

在前幾天的練習裡,我們已經能夠抓取每日的股價資料,並進行一些基本統計。但是如果我們想從更長期的角度來觀察股票走勢,光看每日數據可能不夠清楚。今天要來把每天的數據整理成每個月的平均收盤價與總成交量。這樣可以更好地觀察趨勢,例如判斷某檔股票在近幾個月是逐漸走高,還是成交量逐漸減少。

程式碼範例

# 新增功能:計算月平均價與月成交量
print("\n計算每月平均價與月成交量...")

# 確保 Volume 和 Close 是數字類型,以便計算
df['Volume'] = pd.to_numeric(df['Volume'])
df['Close'] = pd.to_numeric(df['Close'])

# 建立一個年份和月份的欄位來分組
df['YearMonth'] = df['Date'].dt.to_period('M')

# 依 YearMonth 分組並計算平均收盤價與總成交量
monthly_stats = df.groupby('YearMonth').agg(
    月平均收盤價=('Close', 'mean'),
    月總成交量=('Volume', 'sum')
).sort_index(ascending=False)

print("每月統計資料:")
print(monthly_stats)

程式碼詳解

  1. 確保數據類型正確
df['Volume'] = pd.to_numeric(df['Volume'])
df['Close'] = pd.to_numeric(df['Close'])

有時候從網頁或 API 抓取的資料會是文字型別(string),像 "24,841,820" 或 "1265.5"。如果不先轉換,之後進行數學運算會出錯。這裡用 pd.to_numeric() 把 成交量 (Volume) 和 收盤價 (Close) 轉成數字格式。

  1. 建立「年月」欄位
df['YearMonth'] = df['Date'].dt.to_period('M')
  • df['Date'] 原本是完整的日期(例如 2025-09-01)
  • .dt.to_period('M') 表示只保留「年月」的資訊,例如 2025-09

這樣我們就可以用 年月 來分組,而不用處理每天的細節。

  1. 按月份分組計算統計
monthly_stats = df.groupby('YearMonth').agg(
    月平均收盤價=('Close', 'mean'),
    月總成交量=('Volume', 'sum')
)

這一段的重點是 groupby('YearMonth'),意思是按照 YearMonth 這個欄位來分組,接著用 .agg() 指定每個欄位要做的運算:

  • ('Close', 'mean') → 計算每月的平均收盤價
  • ('Volume', 'sum') → 計算每月的總成交量

最後用 sort_index(ascending=False),把結果從最新的月份開始排序,方便我們觀察。

  1. 輸出結果
print("每月統計資料:")
print(monthly_stats)

執行後會看到類似以下的輸出:

每月統計資料:
         月平均收盤價        月總成交量
YearMonth                        
2025-09   1285.3   248418200
2025-08   1268.5   320198000
2025-07   1242.7   289541600

這樣我們就能很快知道:

  • 2025 年 9 月的平均收盤價是多少
  • 哪個月份的成交量最高
  • 股價趨勢是上升還是下降

總結

  • 轉換數據類型:先把 Volume 和 Close 轉成數字,避免後續計算出錯
  • 建立年月欄位:用 .dt.to_period('M'),把每日日期整理成「年月」
  • 分組計算:利用 groupby 搭配 .agg(),可以一次計算多種統計數據
  • 結果應用:從月度統計資料中,我們能更清楚地看出股票長期走勢

這樣的技巧在實務上非常有用,因為大家不只是看「每天」的數據,更會去關注「趨勢」是否持續。
那今天就先樣。
/images/emoticon/emoticon29.gif


上一篇
將多月資料合併成一個 DataFrame
下一篇
畫月平均收盤價折線圖
系列文
從網路爬蟲到資料洞察的應用16
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言