2025年9月10日 星期三

成交量 × 移動平均 × 異常量能小實驗


今日技能分享:成交量 × 移動平均 × 異常量能小實驗

1️⃣ 今日技能目標

  • 目標任務
    成交量與移動平均計算,並觀察黃金交叉 / 死亡交叉訊號。

  • 使用工具 / 技術
    Python, Pandas, Matplotlib, yfinance


2️⃣ 程式碼片段

import yfinance as yf
import matplotlib.pyplot as plt
import pandas as pd

# 1️⃣ 選股票:這裡用台積電2330.TW,抓取近3個月日線資料
data = yf.download(ticker := "2330.TW", period="3mo", interval="1d", auto_adjust=True)

# 2️⃣ 取成交量,確保是 Series(避免有時候是 DataFrame 出錯)
if isinstance(data['Volume'], pd.Series):
volume = data['Volume']
else:
volume = data['Volume'].squeeze() # 如果不是 Series,就轉成 Series

# 3️⃣ 計算成交量的移動平均線(MA5 與 MA20)
data['MA5'] = volume.rolling(window=5).mean()
data['MA20'] = volume.rolling(window=20).mean()

# 4️⃣ 產生交易訊號:
# 當 MA5 > MA20 → 黃金交叉(買進訊號,Signal = 1)
# 當 MA5 < MA20 → 死亡交叉(賣出訊號,Signal = -1)
data['Signal'] = 0
data.loc[data['MA5'] > data['MA20'], 'Signal'] = 1
data.loc[data['MA5'] < data['MA20'], 'Signal'] = -1

# Cross = 訊號變化:2 代表黃金交叉,-2 代表死亡交叉
data['Cross'] = data['Signal'].diff()

# 印出最近15天的數據(成交量、均線、訊號、交叉)
print(data[['Volume','MA5','MA20','Signal','Cross']].dropna().tail(15))

# 5️⃣ 繪圖:
plt.figure(figsize=(12,6))

# 成交量畫成 Bar(灰色)
plt.bar(data.index, volume, color='lightgray', alpha=0.6, label='Volume')

# 畫出 MA5(藍線)與 MA20(橘線)
plt.plot(data.index, data['MA5'], label='MA5', color='blue', linewidth=2)
plt.plot(data.index, data['MA20'], label='MA20', color='orange', linewidth=2)

# 標註黃金交叉(綠色三角形 ↑)與死亡交叉(紅色三角形 ↓)
cross_buy = data[data['Cross'] == 2]
cross_sell = data[data['Cross'] == -2]
plt.scatter(cross_buy.index, cross_buy['MA5'], marker='^', color='g', s=100, label='黃金交叉')
plt.scatter(cross_sell.index, cross_sell['MA5'], marker='v', color='r', s=100, label='死亡交叉')

# 圖表標題與圖例
plt.title("2330.TW 成交量與移動平均 (Bar + Line)")
plt.legend()
plt.show()

3️⃣ 今日成果

  • 成功點

    • 成交量以 Bar 呈現,清楚顯示量能變化

    • 成功畫出 MA5 與 MA20 折線

    • 黃金交叉 / 死亡交叉點一眼可見

  • 挑戰 / 解決方法

    • 成交量柱狀圖與均線折線合併顯示 → 用 plt.bar() 畫成交量,再用 plt.plot() 疊加均線。


這樣在 Blogger 貼文就會有:

  • 成交量 Bar (直方圖)

  • MA5 / MA20 折線

  • 交叉點箭頭(黃金交叉綠色向上,死亡交叉紅色向下)

     


     

     

     

     

沒有留言:

張貼留言