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

pandas qcut 指標計分選股:打分排名年化 20.3%,
門檻篩選只有 12.8%

指標計分選股怎麼做?用 pandas qcut 把 ROE、營收年增、動能、波動四個因子打分加總取前 30 檔,2015~2026 台股回測年化 20.3%,同池同窗的門檻篩選只有 12.8%,0050 含息 21.2%。拆解排名法為何勝出、嚴格門檻為何常空手、排名方向寫反的陷阱,附可下載程式碼與互動回測。

qcut打分年化20.3%勝門檻法 CAGR 20.3% Sharpe 1.10

指標計分選股回測:pandas qcut 打分排名法、連續百分位、合理門檻、嚴格門檻與 0050 的年化報酬與最大回撤對照

依本文重跑

執行這個策略

複製提示詞,讓 AI 依照上方證據的資料、條件與風險檢查重跑一次。

告訴你的AI:

幫我設定 FinLab,重現 qcut 指標計分選股回測,請讀:https://finlab.finance/setup?relatedUrl=/blog/stock-scoring-pandas-qcut

免安裝,開啟 FinLab Studio

指標計分選股:排名法年化 20.3%、門檻法 12.8%、0050 含息 21.2%

指標計分選股,是把每檔股票在幾個指標上的相對名次換成分數,加總後買總分最高的一批。這篇用 pandas qcut 把四個因子(單季 ROE、月營收年增率、60 日價格動能、60 日波動)各切成十等分打 1~10 分,加總取前 30 檔,和「四個指標各設一個門檻、全部通過才買」的篩選法放在同一個股票池、同一段時間(2015-01 ~ 2026-09,資料快照 2026-09-07)用 finlab 實跑對照。上圖是五組結果的年化報酬與最大回撤,關鍵數字如下表。

策略 年化報酬 總報酬 日夏普 月索提諾 最大回撤 平均持股 100 萬終值
qcut 十分位加總取前 30(排名法,本文主角) 20.3% +744% 1.10 1.84 -31.0% 29.9 檔 844 萬
連續百分位加總取前 30(歸因對照,不分級) 20.2% +733% 1.10 1.82 -30.4% 30.0 檔 833 萬
合理門檻 AND 疊加(門檻法) 12.8% +300% 0.95 1.39 -29.8% 25.1 檔 400 萬
嚴格門檻 AND 疊加 7.1% +121% 0.48 0.88 -27.6% 2.0 檔 221 萬
0050 含息(純買進持有,不含成本) 21.2% +841% 1.11 1.83 -34.0% 1 檔 ETF 941 萬

三個結論。第一,同樣的四個指標,用排名法加總選股,年化 20.3%,用合理門檻篩選只剩 12.8%,100 萬終值 844 萬對 400 萬。第二,排名法把每個因子切成 10 級或保留連續百分位,結果幾乎一樣(20.3% 對 20.2%),所以「要切幾等分」對績效影響很小,排名法真正的效果來自「永遠持有分數最高的 30 檔」。第三,在本文設定與這段期間,排名法的年化報酬輸給含息 0050(20.3% 對 21.2%),贏的地方是最大回撤(-31.0% 對 -34.0%,少 3 個百分點)與 2015~2018 這段盤整期(分段年化 10.1% 對 4.8%);月索提諾 1.84 對 1.83 只能算打平。

研究問題:打分排名與門檻篩選,差在哪裡

多數人第一次寫選股條件,寫的都是門檻:ROE 大於 10%、營收年增大於 0、股價站上季線,條件用 AND 串起來,全部成立才買。這種寫法直覺、好解釋,但有兩個結構性問題。一是持股數不受控,市況好時通過的股票一大堆,市況差時可能一檔都沒有;二是「一票否決」,某檔股票三個指標都在池內前 10%,只因為波動比中位數高一點就整檔被丟掉。

排名法的邏輯相反:每個指標不問「有沒有過線」,只問「在池內排第幾」,換成分數後加總,買總分最高的固定檔數。Piotroski (2000) 的 F-Score 是最早被廣泛引用的加分制選股方法,九個財務訊號各給 0 或 1 分,加總後買高分組,這種加總設計容許個別訊號失分,和要求每個條件都成立的篩選法是兩種不同的邏輯。Asness、Frazzini 與 Pedersen (2019) 的 Quality Minus Junk 更進一步,把獲利、成長、安全性等多個指標各自做橫斷面排名並標準化後再加總,是機構常用的多指標合成做法。本文的 qcut 十分位加總,就是這條路線最簡單的版本。

FinLab 站上的選股方法總覽把常見的選股切入點分成基本面、技術面、籌碼面與消息面,這篇不討論該挑哪個指標,只回答一個問題:同一組指標,用排名加總與用門檻篩選,結果差多少,差在哪裡。

pandas qcut 是什麼?把數值切成等人數的分級

qcut 是 pandas 裡基於分位數的離散化函式:給它一串數值和想切的組數 q,它會找出分位數切點,讓每一組的樣本數大致相等。把 0~19 這 20 個數切成 10 組,每組剛好 2 個:

顯示程式碼
import pandas as pd
 
# 把 0~19 這 20 個數切成 10 等分,labels=False 回傳整數組別
pd.qcut(x=range(20), q=10, labels=False)
# array([0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9])

組別從 0 開始,習慣上加 1 變成 1~10 分比較好讀。qcut 只接受一維序列,finlab 的資料是「日期 × 股票」的二維表,要逐月把該月所有股票的值丟進去切。另一個常見寫法是用 rank(pct=True) 先算出每檔股票在該月的百分位(0~1),乘上 10 再無條件捨去,效果等同十等分;最高分那檔百分位剛好是 1.0 會變成 11 分,用 clip 壓回 10:

顯示程式碼
import numpy as np
from finlab import data
 
 
def qcut_feature(data_name: str, q_range: int = 10, higher_is_better: bool = True):
    """把 finlab 的一張指標表逐月換成 1~q_range 分。
 
    higher_is_better=True:數值越高分數越高(ROE、營收年增、動能)
    higher_is_better=False:數值越低分數越高(波動、負債比率)
    """
    df = data.get(data_name)
    score = (
        df.rank(axis=1, pct=True, ascending=higher_is_better)
        .mul(q_range)
        .add(1)
        .apply(np.floor)
        .clip(1, q_range)
    )
    return score
 
 
roe_score = qcut_feature("fundamental_features:ROE稅後")

參數名刻意用 higher_is_better 而非 pandas 原生的 ascending。兩者在程式上等價,但「ascending=False 代表越低越好」要多想一層,寫成 higher_is_better=False 一眼就看得出波動是要反向計分的。這件事在後面「排名方向寫反會怎樣」一節會用真實回測數字說明為什麼值得計較。

兩種寫法的差別在於 rank 版把整張表一次算完,速度快、程式短;逐月 qcut 版可以在切分前處理該月有效樣本太少、或切點重複(ValueError: Bin edges must be unique)的情況。本文可下載的完整程式用的是逐月 qcut 版,因為要對「池內」的股票切分,池外股票每個月都不同,rank 版一次算完會把池外的股票也算進分位。

回測設定:同池、同窗、同四個因子

項目 設定
回測區間 2015-01-01 ~ 2026-09-07(資料快照 2026-09-07)
股票池 市值前 250 檔,且近 60 日日均成交金額在全市場前 50%,逐月重算
因子一:品質 單季 ROE 稅後(fundamental_features:ROE稅後),越高越好
因子二:成長 月營收年增率(monthly_revenue:去年同月增減(%)),越高越好
因子三:動能 收盤價 60 日報酬,越高越好
因子四:低波動 日報酬 60 日標準差,越低越好
排名法 四因子逐月在池內 qcut 十等分得 1~10 分(波動反向),加總取前 30 檔
歸因對照組 同四因子改用連續百分位(rank pct)加總,取前 30 檔,唯一差異是分級與不分級
合理門檻 單季 ROE > 2.5(約年化 10%)、營收年增 > 0、60 日動能 > 0、波動低於池內中位數,全部通過才買,不限檔數
嚴格門檻 單季 ROE > 3.75(約年化 15%)、營收年增 > 20%、動能 > 10%、波動在池內最低 30%
調倉與權重 月調倉,單檔上限 10%,池內等權(30 檔時每檔約 3.3%)
交易成本 finlab sim() 預設:手續費 0.1425%、賣出證交稅 0.3%,未設滑價
基準 0050 含息(etl:adj_close 純算術買進持有,不含成本)

四個因子各有實證來源。動能來自 Jegadeesh 與 Titman (1993) 對美股 3~12 個月贏家續強的記錄;低波動來自 Ang、Hodrick、Xing 與 Zhang (2006) 發現高特異波動股票後續報酬偏低;獲利能力與後續報酬的關係見 Novy-Marx (2013)。這些研究用的是美股與不同期間,台股是否成立要靠下面的回測回答。ROE 與月營收年增率的資料說明可看 ROE 資料頁與月營收年增率資料頁。

四個分數加總、取前 30 檔的核心程式:

顯示程式碼
total_score = (
    qcut_score(factors["roe"], higher_is_better=True)
    + qcut_score(factors["revenue_yoy"], higher_is_better=True)
    + qcut_score(factors["momentum"], higher_is_better=True)
    + qcut_score(factors["volatility"], higher_is_better=False)
)
 
# 只在池內排名,總分最高的 30 檔為持股
position_qcut = total_score.where(pool).rank(axis=1, ascending=False) <= 30
 
# 門檻法:四個條件全部成立才買,檔數不固定
median_volatility = factors["volatility"].where(pool).quantile(0.5, axis=1)
position_threshold = (
    pool
    & (factors["roe"] > 2.5)
    & (factors["revenue_yoy"] > 0)
    & (factors["momentum"] > 0)
    & (factors["volatility"].lt(median_volatility, axis=0))
)

qcut_score 是逐月對池內值做 pd.qcut 的版本,完整定義在可下載的程式裡。這兩段之外,兩種方法共用同一份資料載入、同一個股票池、同一個 sim() 設定,差別只在選股那幾行。

回測結果

完整指標對照,含近 3 年與近 5 年的日夏普:

策略 年化報酬 日夏普 月夏普 月索提諾 最大回撤 近 3 年日夏普 近 5 年日夏普
排名法(qcut 十分位) 20.3% 1.10 1.13 1.84 -31.0% 1.61 1.08
連續百分位 20.2% 1.10 1.10 1.82 -30.4% 1.54 1.06
合理門檻 12.8% 0.95 1.05 1.39 -29.8% 1.10 1.01
嚴格門檻 7.1% 0.48 0.50 0.88 -27.6% 1.22 0.78
0050 含息 21.2% 1.11 1.06 1.83 -34.0% — —

指標計分選股五組策略對數淨值曲線:qcut 排名法、連續百分位、合理門檻、嚴格門檻與 0050,2015 年共同起點 1

對數淨值曲線從 2015 年共同起點 1 出發。排名法與連續百分位兩條線幾乎重疊,全程貼著 0050 走,2017、2021、2023 三年拉開差距,2019、2020、2024 三年被 0050 追回。合理門檻在 2019 年以前與排名法的累積差距不大,2020 年之後明顯落後,終值 400 萬對 844 萬。嚴格門檻那條線多數時間是水平的,反映它經常空手,這點在後面「歸零效應」一節會用持股數說明。

指標計分選股回撤曲線:qcut 排名法最大回撤 -31.0%,合理門檻 -29.8%,0050 -34.0%

回撤曲線顯示三次深跌的位置一致:2020 年 2~4 月、2022 年全年、2025 年 2~5 月。排名法最大回撤 -31.0%,比 0050 的 -34.0% 淺 3 個百分點;合理門檻 -29.8% 更淺一點,但它是用年化報酬 12.8% 對 20.3% 的差距換來的。門檻法佔優最明顯的一年是 2022 年,當年排名法 -22.9%、合理門檻 -7.5%,因為門檻法在營收年增與動能同時轉負時會自動空手,排名法則一定會持有 30 檔;2016 與 2019 兩年門檻法也領先,差距分別是 3.0 與 6.4 個百分點。

指標計分選股風險調整報酬:五組策略的日夏普與月索提諾長條,1.5 為參考虛線

風險調整後的比較,排名法日夏普 1.10、月索提諾 1.84,與 0050 的 1.11、1.83 幾乎相同;合理門檻 0.95、1.39,嚴格門檻 0.48、0.88。圖上 1.5 的虛線是我們對月索提諾的參考線,排名法與 0050 都在線上,兩種門檻法都沒過。夏普與索提諾的定義見夏普比率與最大回撤詞條。排名法的完整互動回測報告如下,可以自己拉時間軸看每一期持股:

為什麼門檻法輸:一票否決砍掉了「三強一弱」的股票

排名法與門檻法用的因子一模一樣,差距來自誰被選進來。從同一次回測抽出每月的持股名單對照:

每月平均 排名法前 30 檔
ROE 不到 2.5(合理門檻的 ROE 條件)的檔數 1.3 檔
營收年增為負的檔數 0.8 檔
60 日動能為負的檔數 3.4 檔
波動高於池內中位數的檔數 13.0 檔
與合理門檻名單重疊的檔數 11.9 檔

排名法選出的 30 檔裡,ROE、營收、動能三項幾乎都符合合理門檻的條件,但每月有 13.0 檔的波動高於池內中位數。這些股票通常是營收成長強、動能強、ROE 高,波動因此也偏高的成長股,總分照樣排在前段。門檻法的「波動低於中位數」是一票否決,把它們整批砍掉。兩種方法每月平均只有 11.9 檔重疊,各自約 30 檔與 25 檔的名單,重疊不到一半。

第二個差別是持股數的穩定性。排名法固定 30 檔(因同分並列,實際最少 23、最多 37);合理門檻中位數 24 檔,最少 4 檔、最多 63 檔。持股數擺盪代表單檔權重跟著擺盪,也代表市況好時買一堆、市況差時買很少,等於用條件通過率在做擇時,而這種擇時在 2015~2026 這段多頭為主的期間是拖累。

周轉率兩者接近:排名法每月平均換 14.4 檔(約 48% 名單更新),合理門檻每月換 12.3 檔(約 51%)。所以門檻法的落後與交易成本無關,純粹是選到的股票不同。周轉率的定義與成本影響見周轉率詞條。

分級與不分級的差別也很小:qcut 十分位 20.3%、連續百分位 20.2%,最大回撤 -31.0% 對 -30.4%。切成 10 級丟掉的是組內的細微差異,加總四個因子後,這些差異對誰進前 30 幾乎沒有影響。這也回答了「該切 5 等分還是 20 等分」的問題:在四因子等權加總的架構下,分幾級不是關鍵參數。

嚴格門檻的歸零效應

把門檻拉高到「單季 ROE > 3.75、營收年增 > 20%、動能 > 10%、波動在最低 30%」,四個條件單看都很合理,交集卻幾乎是空集合。嚴格門檻的持股數中位數是 0 檔,52.5% 的月份完全空手,95% 的月份持股不到 5 檔,平均只有 2.0 檔。持股只有 2 檔時單檔權重可到 50%,名單每月更新率約 84%,等於整個組合每個月幾乎換一輪。

結果是年化 7.1%、日夏普 0.48,全部五組裡最低。最大回撤 -27.6% 看起來最淺,但那是因為一半時間空手,並非選股能力。這是 AND 疊加最典型的失敗模式:每加一個條件,通過的股票就少一截,四個「合理」的條件乘起來,通過率低到組合失去分散效果。分散不足的風險那篇有更完整的討論。

排名方向寫反會怎樣

排名法有一個門檻法沒有的陷阱:方向。門檻寫反(ROE < 2.5)一看就知道錯;排名方向寫反(ROE 越低分越高、波動越高分越高),程式不會報錯,回測照樣跑出一條淨值曲線,看起來像一個「表現比較差的策略」,而非一個 bug。

用同一套程式把四個因子的方向全部反過來跑:qcut 版年化 4.4%、日夏普 0.31、最大回撤 -43.3%;連續百分位版年化 6.1%。如果沒有正確版本放在旁邊,這個結果很可能被解讀成「四因子在台股沒用」,然後開始換因子、調參數。

檢查方法只需要一個月份:抽任何一期,把當期前 30 檔的四個因子原始值印出來,看 ROE 是不是真的高、營收年增是不是正、動能是不是正、波動是不是低於池內中位數。

顯示程式碼
month = total_score.index[-1]
top30 = position_qcut.loc[month]
top30 = top30[top30].index
 
check = pd.DataFrame({
    "roe": factors["roe"].loc[month, top30],
    "revenue_yoy": factors["revenue_yoy"].loc[month, top30],
    "momentum": factors["momentum"].loc[month, top30],
    "volatility": factors["volatility"].loc[month, top30],
})
print(check.describe())

如果印出來的 30 檔波動中位數比池內中位數還高,或 ROE 有一半是負的,方向就寫反了。函式參數名用 higher_is_better 而非 ascending,也是為了讓這個錯誤在寫程式時就被看見。

穩健性:逐年、分段、三次下跌

逐年報酬(%,2015 為 2015-02-26 起算):

年 排名法 連續百分位 合理門檻 嚴格門檻 0050
2015 -0.9 -0.5 -4.9 -8.7 -10.9
2016 9.1 9.1 12.1 6.5 19.6
2017 37.1 35.7 21.8 -3.0 18.1
2018 -2.4 -3.1 -3.6 -5.4 -4.9
2019 15.0 14.5 21.4 1.0 33.5
2020 21.8 21.5 13.6 9.0 31.1
2021 42.5 47.1 25.9 18.1 21.9
2022 -22.9 -21.1 -7.5 -13.1 -21.4
2023 36.5 39.8 19.6 7.3 27.5
2024 19.5 17.9 14.5 21.1 48.6
2025 45.0 38.3 5.3 5.3 36.8
2026(至 9/7) 60.1 58.5 38.0 60.5 70.9

排名法 12 個年度裡 6 年贏 0050(2015、2017、2018、2021、2023、2025),輸的 6 年集中在 0050 大漲的年份(2016、2019、2020、2024、2026),以及 2022 那種全面下跌年。排名法 12 年裡只有 2015、2018、2022 三年為負,合理門檻也是三年,但合理門檻正報酬的年份漲幅明顯較小,2025 年只有 5.3%。

三段期間的年化與最大回撤:

期間 排名法 合理門檻 0050
2015~2018 10.1% / -19.5% 6.0% / -17.3% 4.8% / -21.0%
2019~2021 26.3% / -27.1% 20.6% / -27.3% 29.7% / -28.2%
2022~2026 25.9% / -28.8% 14.1% / -29.8% 30.4% / -34.0%

排名法在三段期間都贏合理門檻,且越近期差距越大。對 0050 則是前段贏、後兩段輸,2022 年之後 0050 受台積電權重拉抬,年化 30.4% 是排名法沒有追上的。

三次下跌的回撤:

壓力期間 排名法 合理門檻 0050
2020 年 2~4 月 -27.1% -27.3% -28.2%
2022 年全年 -28.8% -13.7% -34.0%
2025 年 2~5 月 -27.1% -25.9% -26.4%

三次下跌裡排名法都沒有比 0050 深,但也沒有明顯淺,2020 與 2025 兩次都在 -27% 左右。排名法沒有任何擇時機制,永遠滿倉 30 檔,下跌時能做的只有靠低波動因子把持股往波動較低的一端偏。

與 0050 的比較:哪裡輸、哪裡贏

年化報酬 20.3% 對 21.2%,排名法落後,100 萬終值 844 萬對 941 萬。日夏普 1.10 對 1.11、月索提諾 1.84 對 1.83,都在誤差範圍內,算打平。排名法贏的地方有兩個:最大回撤 -31.0% 對 -34.0%,以及 2015~2018 那段 0050 年化只有 4.8% 的盤整期,排名法做到 10.1%。

換句話說,這個排名法在本文設定下沒有超越 0050 的報酬,它給的是一個「與 0050 報酬相近、回撤略淺、持股分散在 30 檔而非集中在台積電」的替代方案。要不要用它取代 0050,取決於你對單一權值股集中度的看法,而非報酬數字。想要更高報酬的版本,多因子選股策略那篇用同樣四個方向的因子但加權合成、不同股票池與窗口,結果不能直接跟本文比,但可以看到參數設計的差異。

回測方法與限制

項目 本文設定
交易成本 finlab sim() 預設:買賣各收手續費 0.1425%、賣出加證交稅 0.3%,未打折
滑價 未設定。實際衝擊取決於資金規模與成交量,本文未估算策略容量
股票池 市值前 250 檔且近 60 日日均成交金額在全市場前 50%,逐月依當時資料重算,不以今日名單回填
流動性過濾 有,即上述近 60 日日均成交金額在全市場前 50% 的條件
排除類別 未另外排除金融股與 KY 股(最新名單裡就有元大金、亞德客-KY);ETF 與全額交割股未做額外排除
前視偏差 財報用 index_str_to_date() 對齊到 finlab 的公布日索引;月營收索引本身即為公布時點;再 reindex 到交易日、ffill 後取月底值,每月底只用當時已公開的數字。財報公布時程見台股財報公布日
權重 池內等權,單檔上限 10%。排名法 30 檔時每檔約 3.3%;合理門檻持股 4 檔時每檔可到 10% 上限;嚴格門檻 2 檔時每檔 50%
周轉率 排名法每月平均換 14.4 檔(約 48%);合理門檻 12.3 檔(約 51%);嚴格門檻名單更新率約 84%
樣本內外 全段 in-sample,未做樣本外或滾動測試。三段期間表是事後切分的穩健性檢視,並非樣本外驗證
基準口徑 0050 含息用 etl:adj_close 純算術買進持有,不含任何成本,與策略的 sim() 口徑不同,對策略偏不利

另外要說明的是,排名法的 30 檔、十等分、四因子等權,是研究開始前定的設定,文中沒有針對 CAGR 調整過。但這不代表沒有過度配適風險,量化交易的缺點與風險那篇對過擬合的討論同樣適用於這裡。回測是什麼則解釋了為什麼歷史模擬與實際交易之間會有落差。

延伸:同一套排名法在其他設定下的表現

站上另外兩篇用的也是排名加總,但窗口與股票池不同,數字不能與本文直接比較,適合看設計選擇的差異:

門檻計數型的打分可看 F-Score 指標,它把九個條件各記 0 或 1 分再加總,介於本文的排名法與門檻法之間。單一指標的門檻選股實例則有 EPS 與 ROE 選股比較、營業利益率篩選與低價股量化策略。用 Python 跑 finlab 回測的入門流程見Python 選股回測教學,更多策略在策略總覽與量化交易完整指南。

常見問題

pandas qcut 和 cut 差在哪裡? cut 依數值範圍等距切分,每組人數不同;qcut 依分位數切分,每組人數大致相等。打分選股要的是「相對名次」,用 qcut。用 cut 的話,ROE 分布右偏時多數股票會擠在低分組。

qcut 出現 ValueError: Bin edges must be unique 怎麼辦? 該月有太多股票的值相同(例如營收年增有大量 0),分位數切點重疊。解法是先 rank(method="first") 把相同值排成不同名次再 qcut,本文程式就是這樣寫;或用 duplicates="drop" 參數,但組數會變少。

要切幾等分? 本文對照顯示十等分(20.3%)與不分級的連續百分位(20.2%)幾乎沒有差別。等分數影響的是分數的粗細,對前 30 檔名單影響很小。

四個因子的分數要不要加權? 本文用等權。加權會引入四個額外參數,需要另外做敏感度測試;上面延伸那兩篇是加權版本,可以對照。等權的好處是沒有可調的東西,比較不容易調出只在歷史上好看的結果。

門檻法完全沒用嗎? 本文的合理門檻年化 12.8%,在 2022 年那種全面下跌年回撤只有 -13.7%,比排名法淺很多。門檻法的空手機制在空頭有保護作用,但在 2015~2026 這段多頭為主的期間,代價是年化 12.8% 對排名法的 20.3%。它比較適合當「不買什麼」的過濾層,而非主要選股邏輯。

排名法要持有多少檔? 本文用 30 檔,同分並列時實際在 23~37 檔之間。檔數越少,前幾名的因子暴露越純,但單檔風險越高;檔數越多越接近池子平均。

這套方法可以用在美股嗎? finlab 有美股資料,把 data.set_market("us") 後可以取同類的財報與價格欄位。但月營收年增率是台股特有的月頻資料,美股沒有對應欄位,四因子要改成三因子或換一個成長指標。

finlab 怎麼取這些資料? from finlab import data 之後,data.get("fundamental_features:ROE稅後") 取單季 ROE,data.get("monthly_revenue:去年同月增減(%)") 取月營收年增率,data.get("price:收盤價") 取收盤價算動能與波動。第一次取資料時 finlab 會引導登入,程式碼裡不需要放任何 token。

下載與重現

本文五組策略的完整程式、五條淨值日序列與所有指標都放在 VIP 區的下載檔裡,執行完整程式會印出排名法與合理門檻法的年化與最大回撤,數字與本文一致。最新一期(2026-09 快照)排名法持股前 5 檔為亞德客-KY(1590)、大成鋼(2027)、新代(7750)、洋基工程(6691)、緯穎(6669),各約 3.3%;合理門檻法前 5 檔為統一(1216)、元大金(2885)、裕融(9941)、億豐(8464)、保瑞(6472)。名單只是回測當期輸出,用來對照兩種方法選出的股票有多不同。

VIP 區域接著提供排名法(年化 20.3%、最大回撤 -31.0%)與合理門檻法兩種方法的完整 Python 程式碼、五條淨值日序列 CSV、指標 JSON,以及合理門檻法的互動式回測報告與三個可以自己動手改的方向。

VIP 區域包含策略細節

登入後可看策略優化、完整程式碼與互動式回測報告

FinLab AI

想建立自己的策略?

用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案

免費開始

更多多因子選股研究

查看全部