封面圖片
台股因子選股總綱:先檢查因子,再合成策略
因子選股的核心是先問每個條件有沒有預測力、是否和其他條件重複、在不同市況會不會失效,再決定要不要把條件疊成策略。本文用三個常見因子(市值、營收動能、價格動能)示範完整檢查流程:先拆成單一因子,檢查 Factor Return、Centrality、Shapley、IC 與趨勢,再決定要不要合成策略。
| 研究問題 | 這篇會用的工具 | 下一步延伸 |
|---|---|---|
| 這個因子長期有沒有貢獻? | Factor Return | 多因子選股策略 |
| 因子是不是已經太擁擠? | Centrality | 調整權重或暫停使用 |
| 多個因子裡誰真的出力? | Shapley Values | 刪除低貢獻因子 |
| 因子對未來報酬有沒有預測力? | IC 資訊係數 | 對照 Rank IC |
| 如何把研究變成可執行策略? | finlab 回測與 feature.combine |
台股股票選股器、股票選股教學 |
如果你要的是完整選股方法地圖,先讀 股票選股教學;如果你已經有幾個指標,本文負責回答「怎麼判斷這些因子是否值得放進策略」。想用 AI 自動產生候選因子,可以延伸到 AI 因子挖掘,但仍應回到本文的 IC 與貢獻度檢查。
用 AI 開始 FinLab
把這句話交給你的AI,它會帶你完成設定並做出第一個策略。
告訴你的AI:
幫我用 FinLab 檢查三個台股選股因子:先算 Factor Return、IC、Rank IC 與相關性,再判斷哪些因子適合合成多因子策略,請讀:https://finlab.finance/setup?relatedUrl=/blog/factor_analysis_3_factor
很多選股策略的起點都很直覺:螢幕上跳出一檔飆股,心裡覺得「它會漲」。直覺可能有價值,但不能直接變成策略。比較穩的做法,是把靈感拆成可驗證的因子,把「為什麼漲」說清楚,再用資料檢查它是否真的對未來報酬有幫助。
真正的難點是流程:資料要對齊、標籤要定義清楚、不同頻率不能偷看未來,最後還要知道因子之間是否重複。FinLab 把這些步驟包成一致的資料與分析工具,讓研究者把時間放在判斷因子,減少手工清資料的負擔。
因子分析和一般做法,哪裡不一樣?
一般做法:先選幾個看起來厲害的指標,湊一套回測;結果好就覺得是神功,結果差就再換一套。
我們的做法:先把策略拆解,再逐一檢驗每個因子的線索:它帶來的超額報酬是多少?在什麼狀態下有效?會不會太擁擠(大家都在用)?彼此相關性高不高?
沒有 Finlab 我們得自己處理:資料下載、清洗、對齊、換股對齊、月/季頻率對接… 一個環節錯了,結果就不可信。
有了 finlab,我們可用一致頻率的資料集與安全的 resample 邏輯,把時間對齊、避免偷看未來;剩下的,就是認真跟資料搏鬥。
我們的範例策略:
三個最基本、卻常被忽略「為什麼」的因子:市值、營收動能、價格動能。
- 為什麼要小市值?因為小市值在資訊修正與資金挹注時,彈性常常更大。
- 為什麼看營收加速?因為是最扎實的推力。
- 為什麼要動能?因為市場的從眾與慣性,往往延長趨勢。
顯示程式碼
from finlab import data, backtest
marketcap = data.get('etl:market_value')
revenue = data.get('monthly_revenue:當月營收')
close = data.get('price:收盤價')
cond_smallcap = marketcap.rank(pct=True, axis=1) < 0.3
cond_revgro = (revenue.average(3) / revenue.average(12)).rank(pct=True, axis=1) > 0.7
cond_momentum = (close / close.shift(20)).rank(pct=True, axis=1) > 0.7
pos = cond_smallcap & cond_revgro & cond_momentum
report = backtest.sim(pos, resample='ME', upload=False)
report.display()**為什麼要用 rank?**比較的是「相對位置」,而不是絕對數值。
回測結果
把策略拆成可驗證的語言:特徵 & 標籤
先定義我們「到底要預測什麼」:未來一段時間的超額報酬(相對市場平均)。這是策略的真目標,而不是單看漲跌。
顯示程式碼
from finlab import data
import finlab.ml.feature as feature
import finlab.ml.label as label
features = feature.combine({
'marketcap' : cond_smallcap,
'revenue' : cond_revgro,
'momentum' : cond_momentum
}, resample='ME')
labels = label.excess_over_mean(index=features.index, resample='ME')為什麼用超額報酬? 因為我們將焦點從「追隨市場」轉向「超越對手」。我們比較的是相對於競爭者的反應速度,而非大盤的絕對速度。
VIP 區域接著會把 3 因子拆成因子報酬、集中度、Shapley、IC 與趨勢五件套,讓你看到每個因子是否真的貢獻超額報酬。
VIP 區域包含策略細節
登入後可看策略優化、完整程式碼與互動式回測報告
FinLab AI
想建立自己的策略?
用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案
免費開始
