跳至主要內容
台股研究 約 5 分鐘閱讀

AI 量化研究:5 個提示詞,
把選股想法跑成年化 48% 策略

用 5 個提示詞把選股想法跑成可回測策略,從營收創高、投信買超、技術動能到價值篩選逐輪迭代,以連續 2 月營收年增 >15% 加 60 日新高,2015–2025 台股 AI 量化研究實測 CAGR 48.17%、Sharpe 1.69,附 FinLab Python 程式碼。

先回測,再優化 CAGR 48.2% Sharpe 1.69

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 自動驗證、回測、給你答案

免費開始

更多動能與趨勢研究

查看全部