與其聽消息,不如自己用資料庫挖。這篇完整教你怎麼用程式和資料庫,把台股妖股的規律量化出來——含程式碼。

📊 用資料庫分析台股妖股:完整教學與程式碼

發表日期:2026-06-24 | 純教學文,不構成投資建議

💙 覺得這篇文章有幫助嗎?按個讚吧!


本文分享如何用 Python 從台股歷史資料庫中分析近期波動劇烈的個股(俗稱妖股),並找出暴漲前的共同特徵。所有數據截止至 2026-06-18,為純歷史回顧,不涉及任何未來預測。

一、資料來源

我們使用 FinMind API 下載的台股歷史日線資料,存放於本機資料庫中,共 2,364 檔個股。每檔 CSV 包含日期、開高低收、成交量等欄位。

二、妖股篩選邏輯

妖股的定義沒有公認標準,本文從三個維度綜合評分:

  1. 日均振幅(avg_range_pct): 近 20 個交易日每日(High-Low)/ PrevClose 的平均值,反映盤中波動程度
  2. 期間漲跌幅(total_chg_pct): 近 20 個交易日的累積報酬率,反映趨勢強度
  3. 日報酬標準差(std_chg_pct): 每日漲跌幅的標準差,反映波動穩定性

綜合分數公式:avg_range × 1.0 + std_chg × 0.8 + |total_chg| / 5 × 0.5

三、完整 Python 程式碼

import pandas as pd
import numpy as np
import glob, os

history_dir = "history/stock_history"
files = glob.glob(f"{history_dir}/*.csv")

info_df = pd.read_csv("history/stock_info.csv", dtype={"code": str})
name_map = dict(zip(info_df["code"], info_df["name"]))

results = []

for f in files:
    sid = os.path.basename(f).replace(".csv", "")
    df = pd.read_csv(f)
    
    # 標準化欄位名稱
    col_map = {}
    for c in df.columns:
        cl = c.lower()
        if cl == "date": col_map[c] = "date"
        elif cl in ("open","adj_open"): col_map[c] = "open"
        elif cl in ("high","adj_high"): col_map[c] = "high"
        elif cl in ("low","adj_low"): col_map[c] = "low"
        elif cl in ("close","adj_close"): col_map[c] = "close"
        elif cl in ("volume","adj_volume"): col_map[c] = "volume"
    df = df.rename(columns=col_map)
    
    df["date"] = pd.to_datetime(df["date"])
    df = df.sort_values("date").tail(25)
    
    # 取最近 20 筆有效資料
    df["prev_close"] = df["close"].shift(1)
    df = df.iloc[1:]  # 跳過第一筆
    
    df["range_pct"] = (df["high"] - df["low"]) / df["prev_close"] * 100
    df["chg_pct"] = (df["close"] - df["prev_close"]) / df["prev_close"] * 100
    
    avg_range = df["range_pct"].mean()
    max_range = df["range_pct"].max()
    total_chg = (df["close"].iloc[-1] / df["close"].iloc[0] - 1) * 100
    std_chg = df["chg_pct"].std()
    
    results.append({
        "stock_id": sid,
        "name": name_map.get(sid, ""),
        "avg_range_pct": round(avg_range, 2),
        "max_range_pct": round(max_range, 2),
        "total_chg_pct": round(total_chg, 2),
        "std_chg_pct": round(std_chg, 2),
    })

results_df = pd.DataFrame(results)
results_df = results_df[results_df["avg_range_pct"] > 0]

# 綜合評分
results_df["volatility_score"] = (
    results_df["avg_range_pct"] * 1.0 +
    results_df["std_chg_pct"] * 0.8 +
    results_df["total_chg_pct"].abs() / 5 * 0.5
)

top20 = results_df.sort_values("volatility_score", ascending=False).head(20)
print(top20.to_string(index=False))

四、分析結果:前 20 大妖股

以綜合波動評分排序,數據截至 2026-06-18:

代號 名稱 日均振幅 最大單日振幅 期間漲跌 波動Std 綜合分
2492 華新科 10.20% 18.16% +89.42% 5.78% 23.8
2478 大毅 9.21% 17.45% +154.90% 5.23% 28.9
3090 日電貿 8.68% 18.26% +124.66% 6.86% 26.6
3026 禾伸堂 6.96% 18.93% +150.90% 5.46% 26.4
2061 風青 6.69% 12.14% +142.76% 6.91% 26.5
2375 凱美 8.41% 16.00% +112.62% 6.05% 24.5
3441 聯一光 7.92% 14.00% +112.92% 6.30% 24.3
6207 雷科 8.84% 16.08% +94.94% 6.86% 23.8
6155 鈞寶 10.20% 18.16% +89.42% 5.78% 23.8
2327 國巨 7.39% 14.54% +115.57% 5.50% 23.3
3624 光頡 9.48% 19.13% +91.53% 5.78% 23.3
6834 天二科技 8.80% 16.08% +92.60% 6.92% 23.6
6182 合晶 6.46% 16.00% +118.18% 6.70% 23.6
2243 宏旭-KY 6.89% 12.35% +138.25% 5.43% 25.1
4764 雙鍵 9.29% 16.82% +12.83% 4.85% 17.1
6127 九豪 9.27% 18.25% +71.54% 5.92% 21.6
6174 安碁 9.25% 17.72% +27.72% 5.29% 17.9
8064 東捷 9.23% 16.78% +18.18% 6.45% 19.6
2484 希華 9.20% 18.84% +73.66% 5.71% 21.7
3615 安可 9.18% 13.70% +35.29% 6.05% 19.9

五、妖股暴漲前的共同特徵

進一步分析上述妖股在暴漲觸發前 25 個交易日的型態,歸納出以下量化特徵(純歷史統計):

5.1 價格位置

  • 5月初先回檔打底: 10 檔樣本中 100% 在 5 月上半出現低點,形成 V 形或 W 形底部
  • 均線多頭排列後才發動: 暴漲前 10 檔全部站上 MA20,7 檔站上 MA10
  • 價格在區間中段: 暴漲前收盤價大多在近期區間的 30-80% 位置,非高檔突破

5.2 波動特徵

  • 波動已先行放大: 暴漲前一個月日均振幅中位數已達 7.96%(一般股票約 2-3%)
  • 單日振幅極大: 期間最高單日振幅中位數約 18%,顯示多空拉扯激烈

5.3 量能特徵

  • 量能逐步增加: 後半段均量約為前半段的 1.5-2.5 倍
  • 量能穩定放大: 量能變異係數(CV)中位數 0.83,非暴起暴落

5.4 產業群聚

  • 被動元件全面發動: 10 檔中有 8 檔為被動元件相關(國巨集團、華新科集團等)
  • 背後產業背景為 AI 伺服器帶動 MLCC 需求轉強

六、量化篩選模型(延伸應用)

基於上述特徵,我們建立了一個多因子評分模型來掃描具有類似打底型態的個股:

  • 型態因子(60% 權重): 5 月初低點位置、從低點回升幅度、價格在 MA20 附近
  • 量能因子(20% 權重): 量能趨勢、量能穩定性
  • 波動因子(20% 權重): 波動率適中、振幅放大中

完整篩選邏輯程式碼如下:

def score_stock(df):
    """對單一個股評分,分數越高越接近妖股打底型態"""
    score = 0
    
    # 1. 5月初有回檔低點
    if may_low_early:
        score += 15
    
    # 2. 從低點回升超過 5%
    if recovery > 5:
        score += 10
    if recovery > 15:
        score += 5
    
    # 3. 價格在區間 30-80%(打底中)
    if 30 <= pos <= 80:
        score += 15
    
    # 4. 價格接近 MA20(0.95-1.08)
    if 0.95 <= p20 <= 1.08:
        score += 20
    
    # 5. 在 MA60 之上(長線多頭)
    if p60 >= 0.95:
        score += 10
    
    # 6. 波動率持續
    if jun_range >= may_range * 0.8:
        score += 5
    
    # 7. 量能增溫
    if vol_trend > 1.0:
        score += 5
    if vol_trend > 1.3:
        score += 5
    
    # 8. 5月漲跌幅適中
    if -5 <= may_ret <= 25:
        score += 5
    
    # 9. 6月尚未噴出
    if -15 <= jun_ret <= 10:
        score += 10
    
    # 10. 波動率在 3-7% 範圍
    if 3 <= jun_range <= 7:
        score += 5
    
    return score

七、注意事項

  • 本文所有數據截至 2026-06-18,為純歷史回顧
  • 量化模型僅供學術研究參考
  • 歷史表現不代表未來結果
  • 不構成任何買賣建議

八、結語

透過系統化的資料掃描和型態分析,我們可以從歷史數據中歸納出妖股暴漲前的共同特徵。這些量化指標和程式碼可以作為學習技術分析的教材使用。真正的關鍵在於建立自己的分析框架,而非盲目跟單。


本文由量化龍量化研究室製作,純教學用途,不構成投資建議。

2 則留言

  1. […] 📊 用資料庫分析台股妖股:完整教學與程式碼 📊 7 年妖股共同模式分析 📋 妖股分析框架:從歷史數據學到的 5 […]

  2. […] 繼續閱讀同系列:用資料庫分析台股妖股:完整教學與程式碼7 年妖股共同模式分析妖股分析框架:從歷史數據學到的 5 堂課 […]

發佈留言

探索更多來自 量化龍量化分析研究室 的內容

立即訂閱即可持續閱讀,還能取得所有封存文章。

繼續閱讀