iT邦幫忙

2026 iThome 鐵人賽

DAY 11
0

今天是第十一天!昨天我們一口氣解鎖了「多股巡檢」跟「Windows 工作排程器」,讓我們的 Telegram 機器人正式邁入全自動盯盤的時代!
不過,只有「5MA 與 20MA 均線交叉」其實有點太單純了。均線屬於「落後指標」,有時候等到黃金交叉發生,股價已經漲了一大截;或者遇到橫盤洗盤時,容易頻繁出現假突破。
為了讓我們的看盤小幫手更聰明、判斷更精準,今天我們要幫它的戰術大腦進行深度大升級——一次導入技術分析界最經典的兩大神器:RSI(相對強弱指標) 與 MACD(平滑異同移動平均線)!
為什麼要加 RSI 與 MACD?

RSI(相對強弱指標):

  • 用來判斷股票目前是「太熱」還是「太冷」。
  • RSI > 70(過熱區):代表短線買氣太旺,要注意隨時可能拉回拉!
  • RSI < 30(超賣區):代表跌得有點太誇張,隨時可能出現反彈買點。

MACD(動能指標):
利用快慢線與柱狀圖(Histogram)來捕捉中長期的動能轉折點,比單純看 MA 均線更能早一步看出多空力道的消長。

今天我們的目標,就是要讓機器人產出主圖(K線+MA)+ 副圖1(RSI)+ 副圖2(MACD)的三合一專業線圖,並在文字訊息裡自動幫我們做「多指標綜合診斷」!
步驟一:安裝技術指標必備工具 pandas-ta
在開始修改程式碼之前,一樣要先確認終端機前面有沒有 (venv) 喔!
接著輸入下面這行命令,安裝 Python 處理技術指標最便利的套件 pandas-ta:

pip install pandas-ta

步驟二:修改 main.py 腳本(升級雙指標分析與繪圖)
這次我們要讓 mplfinance 在一張圖裡畫出三個 Panel(主圖與兩個副圖),並用 pandas-ta 自動計算數字!
打開你的 main.py,把程式碼寫上去(記得換成自己的 Token 和 Chat ID 喔!):

import os
import pandas as pd
import pandas_ta as ta
import yfinance as yf
import mplfinance as mpf
import urllib.request
import time

# 1. 通訊金鑰與設定
TOKEN = "你的_BOT_TOKEN"
CHAT_ID = "你的_CHAT_ID"

# 想要追蹤的自選股清單
STOCK_LIST = [
    {"symbol": "2330.TW", "name": "台積電"},
    {"symbol": "2317.TW", "name": "鴻海"},
    {"symbol": "2454.TW", "name": "聯發科"},
    {"symbol": "0050.TW", "name": "元大台灣50"}
]

# 發送圖片到 Telegram 函式 
def send_telegram_photo(token, chat_id, photo_path, caption_text):
    url = f"https://api.telegram.org/bot{token}/sendPhoto"
    boundary = '----WebKitFormBoundary7MA4YWxkTrZu0gW'

    if not os.path.exists(photo_path):
        print(f" 找不到圖片檔案: {photo_path}")
        return False

    with open(photo_path, 'rb') as f:
        photo_data = f.read()

    # 關鍵修正:確保所有字串與變數全都轉成 utf-8 的 bytes 處理
    parts = [
        f'--{boundary}\r\nContent-Disposition: form-data; name="chat_id"\r\n\r\n{chat_id}\r\n'.encode('utf-8'),
        f'--{boundary}\r\nContent-Disposition: form-data; name="caption"\r\n\r\n{caption_text}\r\n'.encode('utf-8'),
        f'--{boundary}\r\nContent-Disposition: form-data; name="photo"; filename="{os.path.basename(photo_path)}"\r\nContent-Type: image/png\r\n\r\n'.encode('utf-8') + photo_data + b'\r\n',
        f'--{boundary}--\r\n'.encode('utf-8')
    ]

    payload = b''.join(parts)
    headers = {'Content-Type': f'multipart/form-data; boundary={boundary}'}

    try:
        req = urllib.request.Request(url, data=payload, headers=headers)
        with urllib.request.urlopen(req) as response:
            return True
    except Exception as e:
        print(f" Telegram 發送失敗:{e}")
        return False

# 分析單檔股票
def process_stock(symbol, name):
    print(f"\n 正在深入分析:{name} ({symbol})...")
    
    # 抓取 6 個月歷史資料
    df = yf.download(symbol, period="6mo", progress=False)

    if df.empty:
        print(f" 無法取得 {symbol} 資料,略過。")
        return

    # 清理 yfinance 多層索引
    if isinstance(df.columns, pd.MultiIndex):
        df.columns = df.columns.get_level_values(0)

    # 1. 計算 5MA 與 20MA
    df['MA5'] = df['Close'].rolling(window=5).mean()
    df['MA20'] = df['Close'].rolling(window=20).mean()

    # 2. 用 pandas-ta 計算 RSI (14天)
    df['RSI'] = df.ta.rsi(length=14)

    # 3. 用 pandas-ta 計算 MACD (12, 26, 9)
    macd_df = df.ta.macd(fast=12, slow=26, signal=9)
    df['MACD'] = macd_df['MACD_12_26_9']
    df['MACD_signal'] = macd_df['MACDs_12_26_9']
    df['MACD_hist'] = macd_df['MACDh_12_26_9']

    # 取最近 60 天的資料繪圖
    df_plot = df.tail(60).copy()
    img_filename = f"{symbol.replace('.', '_')}_chart.png"

    # 設定三個圖層(主圖: K線+MA,副圖1: RSI,副圖2: MACD 柱狀圖)
    ap = [
        mpf.make_addplot(df_plot['MA5'], color='orange', width=1.2),
        mpf.make_addplot(df_plot['MA20'], color='blue', width=1.2),
        mpf.make_addplot(df_plot['RSI'], panel=2, color='purple', ylabel='RSI(14)'),
        mpf.make_addplot(df_plot['MACD_hist'], type='bar', panel=3, color='dimgray', ylabel='MACD Hist')
    ]

    mpf.plot(
        df_plot,
        type='candle',
        volume=True,
        addplot=ap,
        title=f"{name} ({symbol}) Technical Analysis",
        savefig=img_filename,
        panel_ratios=(4, 1, 1, 1)  # 調整主副圖的高度比例
    )

    # 4. 進行綜合判斷與文字撰寫
    latest = df.iloc[-1]
    prev = df.iloc[-2]

    rsi_val = latest['RSI']
    macd_hist_latest = latest['MACD_hist']
    macd_hist_prev = prev['MACD_hist']

    caption = f" 【{name} ({symbol}) 技術面深度報告】\n"
    caption += f" 日期:{df.index[-1].strftime('%Y-%m-%d')}\n"
    caption += f" 收盤價:{latest['Close']:.2f}\n"
    caption += f" 5MA: {latest['MA5']:.2f} | 20MA: {latest['MA20']:.2f}\n"
    caption += f" RSI(14):{rsi_val:.1f}\n"
    caption += f"-----------------------------------\n"

    # 綜合訊號整理
    signals = []

    # 均線判斷
    if prev['MA5'] <= prev['MA20'] and latest['MA5'] > latest['MA20']:
        signals.append(" 【MA】5MA 向上突破 20MA(黃金交叉)")
    elif prev['MA5'] >= prev['MA20'] and latest['MA5'] < latest['MA20']:
        signals.append(" 【MA】5MA 向下跌破 20MA(死亡交叉)")

    # RSI 區間判斷
    if rsi_val >= 70:
        signals.append(" 【RSI】進入過熱區 (>70),留意短線修正風險")
    elif rsi_val <= 30:
        signals.append(" 【RSI】進入超賣區 (<30),注意短線跌深反彈")

    # MACD 動能轉折
    if macd_hist_prev < 0 and macd_hist_latest > 0:
        signals.append(" 【MACD】柱狀圖由負轉正,多頭動能增強!")
    elif macd_hist_prev > 0 and macd_hist_latest < 0:
        signals.append(" 【MACD】柱狀圖由正轉負,空頭動能增強!")

    if not signals:
        caption += " 評語:目前指標處於區間震盪,建議持續觀察。"
    else:
        caption += " 關鍵訊號彙整:\n" + "\n".join(signals)

    # 發送訊息至 Telegram
    success = send_telegram_photo(TOKEN, CHAT_ID, img_filename, caption)
    if success:
        print(f" {name} 深度技術報告已成功發送至 Telegram!")
    
    # 刪除暫存檔
    if os.path.exists(img_filename):
        os.remove(img_filename)

# 主流程
if __name__ == "__main__":
    print(" 啟動第 11 天:RSI + MACD 雙指標盤後掃描...")
    for item in STOCK_LIST:
        process_stock(item["symbol"], item["name"])
        time.sleep(1)
    print("\n 今日深度技術巡檢完畢!")

步驟三:執行與結果測試
在終端機內輸入:

python main.py

大概會長下面這樣~
https://ithelp.ithome.com.tw/upload/images/20260925/20184215O89cZDc2v6.jpg
小結一下:
今天我們直接幫看盤機器人的診斷能力做了一次質的飛躍!
現在我們的機器人已經能夠:
多圖表視覺化:一張圖搞定 K線、均線、成交量、RSI 曲線以及 MACD 柱狀圖。
多指標綜合診斷:不再只看均線交叉,還能同時監控 RSI 是否過熱/過冷,以及 MACD 動能是增強還是轉弱。
精準情報推播:把這一整套專業技術分析報告,自動化地發送到你的 Telegram 手機裡!


上一篇
Day 10 : 打造【全自動多股追蹤 Telegram Bot】
系列文
30 天打造專屬盯盤機器人:資料爬取、策略指標到 Telegram/LINE 推播 共 11 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言