與其聽消息,不如自己用資料庫挖。這篇完整教你怎麼用程式和資料庫,把台股妖股的規律量化出來——含程式碼。
📊 用資料庫分析台股妖股:完整教學與程式碼
發表日期:2026-06-24 | 純教學文,不構成投資建議
💙 覺得這篇文章有幫助嗎?按個讚吧!
本文分享如何用 Python 從台股歷史資料庫中分析近期波動劇烈的個股(俗稱妖股),並找出暴漲前的共同特徵。所有數據截止至 2026-06-18,為純歷史回顧,不涉及任何未來預測。
一、資料來源
我們使用 FinMind API 下載的台股歷史日線資料,存放於本機資料庫中,共 2,364 檔個股。每檔 CSV 包含日期、開高低收、成交量等欄位。
二、妖股篩選邏輯
妖股的定義沒有公認標準,本文從三個維度綜合評分:
- 日均振幅(avg_range_pct): 近 20 個交易日每日(High-Low)/ PrevClose 的平均值,反映盤中波動程度
- 期間漲跌幅(total_chg_pct): 近 20 個交易日的累積報酬率,反映趨勢強度
- 日報酬標準差(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,為純歷史回顧
- 量化模型僅供學術研究參考
- 歷史表現不代表未來結果
- 不構成任何買賣建議
八、結語
透過系統化的資料掃描和型態分析,我們可以從歷史數據中歸納出妖股暴漲前的共同特徵。這些量化指標和程式碼可以作為學習技術分析的教材使用。真正的關鍵在於建立自己的分析框架,而非盲目跟單。
本文由量化龍量化研究室製作,純教學用途,不構成投資建議。
發佈留言