AI 能幫你選股,但無法幫你選「好」股
你可能試過把「幫我找強勢股」丟給 AI。
AI 很快列出營收成長、技術突破、法人買超。條件看起來合理,還不能算策略。
一跑回測,問題才會變具體:營收條件太鬆、籌碼訊號太晚、技術指標雜訊太多,或持股規則讓報酬被稀釋。
本文適合想用 AI 做台股量化研究的讀者:懂 Python 基礎或願意照著範例跑,也希望每條選股規則都能被數據檢查。
本文重點放在:
- 轉換把選股想法改成資料條件
- 檢查用回測看條件有沒有訊號
- 迭代依照失敗原因調整下一版策略
實驗使用 5 個提示詞,讓 AI 完成從「選股」到「回測」到「優化」的流程。最終策略達到:
- 年化報酬率 48.17%
- 夏普比率 1.69
- 最大回撤 -30.38%
接下來會看到策略從營收創高、投信買超、技術動能、價值篩選,一路改到連續營收成長加 60 日新高。
提醒:以下為歷史回測結果,不代表未來表現。
Step 1:營收創新高能不能單獨使用?
先測最直覺的假設:近 3 個月平均營收創 12 個月新高,代表公司成長正在加速。
AI 的工作是把想法改成資料條件,再送進回測。
幫我找出近 3 個月平均營收創 12 個月新高的股票, 要有足夠的流動性(20 日平均成交量 > 500 張)
顯示程式碼
from finlab import data
from finlab.backtest import sim
# 取得營收和成交量數據
rev = data.get("monthly_revenue:當月營收")
vol = data.get("price:成交股數") / 1000 # 轉換為張
# 計算條件
rev_ma3 = rev.average(3)
rev_high = (rev_ma3 == rev_ma3.rolling(12).max()) # 3個月均營收創12個月新高
vol_filter = vol.average(20) > 500 # 流動性篩選
# 選出符合條件的股票
position = rev_high & vol_filter
# 回測
report = sim(position.loc['2015':], resample='M', position_limit=0.1, upload=False)
report.to_html('skill1_revenue_high.html')單純營收創新高,年化報酬約 19.77%。訊號有用,但條件太鬆:大單、短期題材、低基期都可能被選進來。
研究紀錄:營收新高可以保留,但需要額外條件檢查成長能否延續。
下一輪加入資金面,看投信連買能不能提高篩選品質。
Step 2:投信連續買超能不能補上資金面確認?
投信連續買進代表法人資金在建立部位。合理歸合理,仍然要跑回測。
找出投信連續 5 天買超的股票,並用連續買超量排序選前 10 檔
顯示程式碼
from finlab import data
from finlab.backtest import sim
# 取得投信買賣超數據
trust_net = data.get("institutional_investors_trading_summary:投信買賣超股數")
vol = data.get("price:成交股數") / 1000
# 投信連續5天買超
trust_buy_5d = (trust_net > 0).sustain(5)
# 流動性篩選
vol_filter = vol.average(20) > 300
# 組合條件
cond = trust_buy_5d & vol_filter
position = trust_net[cond].is_largest(10)
# 回測
report = sim(position.loc['2015':], resample='M', upload=False)
report.to_html('skill2_trust_buy.html')投信連續買超能顯示資金方向,單獨使用時表現不穩。常見原因包括追到已漲過的股票,或買到基本面沒有同步改善的題材股。
研究紀錄:籌碼面適合當輔助確認,主軸仍需基本面或價格條件支撐。
下一輪改測技術動能,看看進出場節奏能否改善。
Step 3:技術動能看起來順勢,為什麼還是不穩?
多數人會請 AI 把 RSI、MACD、均線組成動能策略。
指標越多,不一定篩得更乾淨;有時只是產生更多交易訊號。
用 RSI 和 MACD 建立動能策略:
- RSI > 50 表示多頭
- MACD 黃金交叉
- 價格在 60 日均線之上
顯示程式碼
from finlab import data
from finlab.backtest import sim
close = data.get("price:收盤價")
vol = data.get("price:成交股數") / 1000
# 技術指標
rsi = data.indicator("RSI", timeperiod=14)
macd, macd_signal, macd_hist = data.indicator("MACD", fastperiod=12, slowperiod=26, signalperiod=9)
sma60 = close.average(60)
# 條件組合
cond_rsi = rsi > 50 # RSI 多頭
cond_macd = (macd > macd_signal) & (macd.shift() < macd_signal.shift()) # MACD 黃金交叉
cond_trend = close > sma60 # 價格在均線上
vol_filter = vol.average(20) > 300
# 進場訊號
cond = cond_rsi & cond_macd & cond_trend & vol_filter
position = close[cond].is_largest(20)
# 回測
report = sim(position.loc['2015':], resample='W', upload=False)
report.to_html('skill3_technical.html')純技術指標策略表現不穩。RSI、MACD、均線可以描述價格狀態,卻很容易把短線反彈看成趨勢延續。
技術面能回答「價格有沒有動」,回答不了「公司營運是否支持後續漲勢」。
下一輪加入估值與品質條件,測試穩定性。
Step 4:低估值好公司為什麼穩定但不驚艷?
第四輪回到價值投資。
條件改成本益比低、殖利率高、ROE 也不差。問題變成:有沒有便宜又體質好的股票?
找出低估值的股票:本益比 < 15、殖利率 > 5%、ROE > 10%
顯示程式碼
from finlab import data
from finlab.backtest import sim
# 取得估值數據
pe = data.get("price_earning_ratio:本益比")
div_yield = data.get("price_earning_ratio:殖利率(%)")
roe = data.get("fundamental_features:ROE稅後")
vol = data.get("price:成交股數") / 1000
# 價值篩選條件
cond_pe = (pe > 0) & (pe < 15) # 本益比 < 15
cond_yield = div_yield > 5 # 殖利率 > 5%
cond_roe = roe > 10 # ROE > 10%
cond_vol = vol.average(20) > 300 # 流動性
# 組合條件並選股
cond = cond_pe & cond_yield & cond_roe & cond_vol
position = div_yield[cond].is_largest(15) # 選殖利率最高的 15 檔
# 回測
report = sim(position.loc['2015':], resample='M', upload=False)
report.to_html('skill4_value.html')價值投資策略年化約 13.19%。波動比較溫和,成長動能不足。
便宜和體質好不等於市場願意立刻重估。缺少營收成長或價格突破時,策略容易卡在低估值區間。
前四輪留下的問題很清楚:
| 測試方向 | 留下的問題 |
|---|---|
| 營收創高 | 條件太鬆 |
| 籌碼連買 | 缺少基本面確認 |
| 技術動能 | 雜訊太多 |
| 低估值 | 動能不足 |
下一版需要檢查訊號的持續性。
Step 5:連續性條件怎麼過濾偶發訊號?
FinLab 的 sustain() 用來檢查條件是否連續成立。
前面幾輪太依賴單日或單月訊號;股票研究更需要知道同樣條件有沒有連續發生。
顯示程式碼
# 營收連續 3 個月年增 > 10%
rev_growth = data.get("monthly_revenue:去年同月增減(%)")
consecutive_growth = (rev_growth > 10).sustain(3)
# 連續條件比單次條件更嚴格,能過濾偶發成長sustain() 檢查「連續幾期都符合條件」。單月營收成長可能來自短期訂單;連續成長更接近營運趨勢。
研究方向收斂到營收連續成長與較長期價格突破。
單一策略跑完後,問題變明確
前面幾輪測試後,表現和問題可以放在同張表裡看。
| 策略 | 年化報酬 | 問題 |
|---|---|---|
| 營收創新高 | ~20% | 沒過濾假突破 |
| 投信買超 | 不穩定 | 需配合基本面 |
| 技術指標 | 不穩定 | 太多雜訊 |
| 價值投資 | ~13% | 動能不足 |
沒有單一策略達到 30%+ 的目標。
下一輪不再增加指標數量,改檢查營收新高能否用連續成長過濾假訊號。
還有更多
登入以閱讀完整內容
FinLab AI
想建立自己的策略?
用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案
免費開始
