今天是第五天!前面我們已經完成了抓取數據、繪製成K線圖的任務。而今天我們要寫一個最基礎的技術分析策略,那就是5日均線 (週線) 和20日均線 (月線) 的黃金交叉和死亡交叉!
我們先來探討什麼是黃金交叉和死亡交叉好了,我將列點解釋。
步驟一: 抓取台積電最近 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 ,等待結果就好了呦!
小結一下:
今天我們成功讓程式升級成「會自己看盤」的小幫手了!
現在程式雖然能算出訊號,但只能在我們手動執行電腦時才看得見。所以,我們明天將要為傳訊號出去而準備,為後面發訊息到手機做準備。
寫到這裡或許有人會好奇為什麼我們的程式,不是循序漸進的寫法,這是因為我們現在只是在寫各項功能,到時侯要拼在一起,所以我們這個專案內會有許多個檔案。