佛斯特·史蒂芬·弗里士(Foster Stephen Friess,1940年4月2日-2021年5月27日)是美國著名的投資管理專家、共同基金經理人與慈善家。他以創立 Friess Associates 投資公司及其旗下的旗艦產品「白蘭地基金」(Brandywine Fund)聞名於世。在 1990 年代,弗里士被視為成長股投資(Growth Investing)的領軍人物,1999 年《CNBC》譽其為「世紀偉大投資者」之一。
弗里士最輝煌的紀錄在於白蘭地基金的長期績效。自 1985 年成立至 2000 年代初期,該基金的平均年化報酬率接近 20%。據報導,如果在該基金成立之初投入 1 萬美元,到 2000 年時,該筆資產將成長至超過 27 萬美元,遠遠跑贏同期的標準普爾 500 指數。
他在 2001 年《商業週刊》(BusinessWeek)的採訪中被評為「生存最久的成長股選股大師」,因為他在長達 36 年的投資生涯中(截至當時),成功帶領投資者度過多次市場牛熊轉換,且始終能保持卓越的獲利水準。
他最核心的選股邏輯是尋找「盈餘增長速度高於預期」的公司。弗里士深信,股價最終會反映企業的獲利能力,因此他的研究團隊會極致地追蹤企業的每季盈餘。他不僅看本益比(P/E ratio),更重視盈餘成長率與估值的對等關係。
他最有名的操作手法是”Stick with them until you find something better” (替換原則):建立一個動態的評分系統(Scoring System),然後根據這個系統,汰弱留強。
Friess 的核心思想是「永遠保持投資組合處於最強狀態」。他不看絕對估值,而是把持股當作球隊陣容,只要板凳區有表現更好的球員(分數更高的股票),就毫不猶豫地換人。
我根據他的精神,寫了一個適合台股的動態評分系統,分數的比重如下
![]()
腳本如下
// 腳本名稱:Friess 動態替換多因子模型 (全市場排行)
// 資料頻率:日
rank FriessScore begin
// ================= 0. 基本流動性過濾 =================
// 排除股價低於10元或近5日均量低於500張的冷門股,避免籌碼分數失真
if Average(Volume, 5) < 500 or Close < 10 then
retval = 0
else begin
var: score1(0), score2(0), score3(0), score4(0);
// ================= 因子1:營收驚喜 (權重 40%) =================
// 邏輯:本月營收年增率,減去「過去6個月平均年增率」
var: rev_yoy(0), rev_avg(0), surprise(0);
rev_yoy = GetField("月營收年增率", "M");
rev_avg = Average(GetField("月營收年增率", "M")[1], 6);
surprise = rev_yoy - rev_avg;
// 正規化:大於等於 50% 拿滿分 100,小於等於 0 拿 0 分
if surprise >= 50 then score1 = 100
else if surprise <= 0 then score1 = 0
else score1 = surprise * 2;
// ================= 因子2:盈餘成長 (權重 30%) =================
// 邏輯:單季稅後淨利年增率
var: earn_yoy(0);
earn_yoy = GetField("稅後淨利成長率", "Q");
// 正規化:大於等於 100% 拿滿分 100,小於等於 0 拿 0 分
if earn_yoy >= 100 then score2 = 100
else if earn_yoy <= 0 then score2 = 0
else score2 = earn_yoy;
// ================= 因子3:法人籌碼動能 (權重 20%) =================
// 邏輯:近 5 日 (外資買賣超 + 投信買賣超) 佔總成交量的比例
var: inst_net(0), vol_sum(0), inst_ratio(0);
inst_net = Summation(GetField("外資買賣超", "D") + GetField("投信買賣超", "D"), 5);
vol_sum = Summation(Volume, 5);
if vol_sum > 0 then inst_ratio = (inst_net / vol_sum) * 100 else inst_ratio = 0;
// 正規化:買超佔總量大於等於 10% 拿滿分 100,賣超或沒買拿 0 分
if inst_ratio >= 10 then score3 = 100
else if inst_ratio <= 0 then score3 = 0
else score3 = inst_ratio * 10;
// ================= 因子4:價格動能 (權重 10%) =================
// 邏輯:近 20 日 (約一個月) 漲跌幅
var: mom(0);
mom = RateOfChange(Close, 20);
// 正規化:月漲幅大於等於 30% 拿滿分 100,下跌拿 0 分
if mom >= 30 then score4 = 100
else if mom <= 0 then score4 = 0
else score4 = mom * 3.33;
// ================= 計算加權總分 =================
retval = (score1 * 0.4) + (score2 * 0.3) + (score3 * 0.2) + (score4 * 0.1);
end;
end;
// ================= 主執行區:篩選與輸出 =================
// 找出全市場多因子綜合評分前 50 名的股票 (作為動態替換的「板凳候選人」)
if FriessScore.pos <= 50 and FriessScore.value > 0 then begin
ret = 1;
outputField1(FriessScore.pos, " Friess 排名");
outputField2(FriessScore.value, " 綜合總分");
// 輸出原始數據,方便在 XQ 介面直接肉眼驗證各因子的強度
outputField3(GetField("月營收年增率", "M") - Average(GetField("月營收年增率", "M")[1], 6), "營收驚喜(%)");
outputField4(GetField("稅後淨利成長率", "Q"), "淨利 YoY(%)");
// 計算並輸出法人買超佔比
var: out_inst_net(0), out_vol(0);
out_inst_net = Summation(GetField("外資買賣超", "D") + GetField("投信買賣超", "D"), 5);
out_vol = Summation(Volume, 5);
if out_vol > 0 then
outputField5((out_inst_net / out_vol) * 100, "法人買佔比(%)")
else
outputField5(0, "法人買佔比(%)");
end;
我拿這個腳本去回測所有普通股,因為主要是靠月營收來衡量業績是否超過市場預期,所以持有期間設為22天,然後投資組合設為50檔,這樣回測的結果如下圖

雖然組合的勝率不到50%,但整個投資組合過去12年來的時間加權平均報酬率是692%,比大盤的269%要好,也比0050的668%要好
