iT邦幫忙

2026 iThome 鐵人賽

DAY 5
0
Software Development

30 天打造專屬盯盤機器人:資料爬取、策略指標到 Telegram/LINE 推播系列 第 5

Day 05:寫出第一個自動看盤策略 — 5日/20日均線黃金交叉!

  • 分享至 

  • xImage
  •  

今天是第五天!前面我們已經完成了抓取數據、繪製成K線圖的任務。而今天我們要寫一個最基礎的技術分析策略,那就是5日均線 (週線) 和20日均線 (月線) 的黃金交叉和死亡交叉!
我們先來探討什麼是黃金交叉和死亡交叉好了,我將列點解釋。

  • 黃金交叉 (買進訊號) : 短期均線(5 日線)由下往上突破長期均線(20 日線),代表近期買氣變強,可能是上漲的預兆!
  • 死亡交叉 (賣出訊號) : 短期均線(5 日線)由上往前跌破長期均線(20 日線),代表近期賣壓變大,可能是下跌的預兆!
    而我們今天要做的事情就是讓 python 幫我們自動算出來,並在畫面上直接告訴我們「台積電今天有沒有出現訊號?」話不多說,我們現在開始吧!
    還是老樣子,先在終端機確認前面有沒有(venv)!
    接下來我們就一步一步來實作吧~

步驟一: 抓取台積電最近 3 個月的股價

df = yf.Ticker("2330.TW").history(period="3mo")

這個昨天以解釋過了,我們就不做過多的解釋了不然好佔篇幅。
步驟二:算均線(直接用 pandas 的 rolling 算平均)

df['SMA5'] = df['Close'].rolling(window=5).mean()    # 5日收盤價平均
df['SMA20'] = df['Close'].rolling(window=20).mean()  # 20日收盤價平均

步驟三:拿最近兩天的資料來比較(昨天與今天)

yesterday = df.iloc[-2]  # 昨天(倒數第二天)
today = df.iloc[-1]      # 今天(倒數第一天)

步驟四:印出今天的股價與均線數字

print(f"=== 台積電 (2330) 均線分析 ({today.name.strftime('%Y-%m-%d')}) ===")
print(f"今日收盤價:{today['Close']:.1f} 元")
print(f"5 日均線 (SMA5):{today['SMA5']:.2f} 元")
print(f"20 日均線 (SMA20):{today['SMA20']:.2f} 元")
print("-" * 35)

步驟五:判斷交叉訊號

# 黃金交叉:昨天 5日線 < 20日線,而且今天 5日線 > 20日線
if yesterday['SMA5'] < yesterday['SMA20'] and today['SMA5'] > today['SMA20']:
    print(" 觸發訊號:出現【黃金交叉】!建議關注買進機會!")

# 死亡交叉:昨天 5日線 > 20日線,而且今天 5日線 < 20日線
elif yesterday['SMA5'] > yesterday['SMA20'] and today['SMA5'] < today['SMA20']:
    print(" 觸發訊號:出現【死亡交叉】!注意下跌風險!")

else:
    print(" 目前狀態:均線持續走勢中,今日無突破訊號。")

這邊使用 if...else 條件判斷來製作,使用 and 的話,需要兩邊條件同時成立才會進行。
所以整個程式碼會長下面這樣!

import yfinance as yf

df = yf.Ticker("2330.TW").history(period="3mo")

df['SMA5'] = df['Close'].rolling(window=5).mean()   
df['SMA20'] = df['Close'].rolling(window=20).mean()  
yesterday = df.iloc[-2]  
today = df.iloc[-1]      

print(f"=== 台積電 (2330) 均線分析 ({today.name.strftime('%Y-%m-%d')}) ===")
print(f"今日收盤價:{today['Close']:.1f} 元")
print(f"5 日均線 (SMA5):{today['SMA5']:.2f} 元")
print(f"20 日均線 (SMA20):{today['SMA20']:.2f} 元")
print("-" * 35)


if yesterday['SMA5'] < yesterday['SMA20'] and today['SMA5'] > today['SMA20']:
    print("觸發訊號:出現【黃金交叉】!建議關注買進機會!")

elif yesterday['SMA5'] > yesterday['SMA20'] and today['SMA5'] < today['SMA20']:
    print("觸發訊號:出現【死亡交叉】!注意下跌風險!")

else:
    print("目前狀態:均線持續走勢中,今日無突破訊號。")

稍微解釋一下程式碼:
df['Close'].rolling(window=5).mean()

  • close是收盤價。
  • rolling(window=5) 代表「每 5 天框成一組」。
  • .mean() 就是「算平均」。這行算出來的就是一般的 5 日均線(SMA5)。

最後!在終端機打上 python main.py ,等待結果就好了呦!
https://ithelp.ithome.com.tw/upload/images/20260919/20184215EkzCtcRDVV.png

小結一下:
今天我們成功讓程式升級成「會自己看盤」的小幫手了!
現在程式雖然能算出訊號,但只能在我們手動執行電腦時才看得見。所以,我們明天將要為傳訊號出去而準備,為後面發訊息到手機做準備。
寫到這裡或許有人會好奇為什麼我們的程式,不是循序漸進的寫法,這是因為我們現在只是在寫各項功能,到時侯要拼在一起,所以我們這個專案內會有許多個檔案。


上一篇
Day 4 數據視覺化 — 用 mplfinance 繪製你的第一張台股 K 線圖!
下一篇
Day 06:建置手機通知管道 — 申請 Telegram Bot 機器人與取得 API Token!
系列文
30 天打造專屬盯盤機器人:資料爬取、策略指標到 Telegram/LINE 推播6
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言