AI 量化研究:5 個提示詞打造年化 48% 的選股系統
AI 真的能幫你做量化研究?
這不是噱頭,是事實。
在這次實驗中,我用 5 個提示詞,讓 AI 完成了從「選股」到「回測」到「優化」的完整流程。最終策略達到:
- 年化報酬率 48.17%
- 夏普比率 1.69
- 最大回撤 -30.38%
這篇文章,我會展示 AI 能做到的 5 種量化研究任務,並分享最終策略的優化過程。
提醒:以下為歷史回測結果,不代表未來表現。
Skill 1:營收創新高選股
第一個任務:找出營收創新高的股票。
幫我找出近 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%。不錯的開始,但還不夠好。
Skill 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')投信策略需要配合其他條件才能發揮效果。
Skill 3:技術指標策略
第三個任務:用 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')純技術指標策略表現不穩定,需要基本面配合。
Skill 4:價值投資篩選
第四個任務:找出低估值的好公司。
找出低估值的股票:本益比 < 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%。穩定但不驚艷。
Skill 5:連續性條件 sustain()
這是 FinLab 的獨特功能:sustain() 可以檢測條件是否連續成立。
顯示程式碼
# 營收連續 3 個月年增 > 10%
rev_growth = data.get("monthly_revenue:去年同月增減(%)")
consecutive_growth = (rev_growth > 10).sustain(3)
# 這比單次條件更嚴格,能過濾掉偶發性的成長這個功能在後面的終極策略中發揮關鍵作用。
問題來了:單一策略都不夠好
看完四個技能,你發現了什麼?
| 策略 | 年化報酬 | 問題 |
|---|---|---|
| 營收創新高 | ~20% | 沒過濾假突破 |
| 投信買超 | 不穩定 | 需配合基本面 |
| 技術指標 | 不穩定 | 太多雜訊 |
| 價值投資 | ~13% | 動能不足 |
沒有一個策略能達到 30%+ 的目標。
這時候,AI 真正的價值才要開始...