點圖可查看原尺寸;完整數字也列在下方的研究下載區。 葛蘭碧八大法則的四個買點,我們分別用於個股與0050,再把0050的持有時段反過來測,共十二個設計、108組參數,沒有一個通過這次的三項驗證。本文以反面教材為主:圖上看得出轉折,還需要回答轉折當時知不知道、什麼價成交,以及等賣點時付出了多少代價。
葛蘭碧八大法則是什麼
葛蘭碧八大法則以股價和移動平均線的關係,整理四個買進與四個賣出情境。第一類看均線轉向後突破,第二類看趨勢中跌破後站回,第三類看回測均線守住,第四類看遠離均線後的反彈。賣點可以用相反方向理解,但「走平」「短暫」「遠離」都不是可以直接交給電腦的數字。
Joseph Granville 的1960年著作可作為這套均線分析的歷史背景。本文把文字情境寫成一套事前固定的機械規則,沒有宣稱六十日均線或百分比門檻是作者唯一的原始設定。不同教材的八點編號也可能不同,因此表中同時寫出條件,避免只憑編號認策略。
| 買點 | 本次買入條件 | 對應出場條件 |
|---|---|---|
| 一、均線轉向後突破 | 收盤由下穿上均線,當下斜率非負、前一段斜率非正 | 收盤由上穿下,當下斜率非正、前一段斜率非負 |
| 二、上揚均線跌破後站回 | 收盤由下穿上均線,當下與前一段均線斜率都為正 | 收盤由上穿下,當下與前一段斜率都為負 |
| 三、回測上揚均線守住 | 前收盤在線上,當日低價靠近均線,收盤仍在線上且均線上揚 | 前收盤在線下,當日高價靠近均線,收盤仍在線下且均線下彎 |
| 四、負乖離反彈 | 收盤遠低於下彎均線 | 收盤遠高於上揚均線 |
這裡的賣出是把原先持股賣掉,沒有放空。買點與賣點同日出現時,賣出優先;沒有賣訊就繼續持有,未另外加停損。尤其第四點可能長時間等不到對應賣點,這個代價也算進結果。若研究的是均線本身,相關背景整理在均線擇時回測;兩條均線交叉的問題,則另見黃金交叉選股,不能把兩種實驗混在一起。
主要測試結果
先看「年化報酬」:平均每年賺或賠多少;「最大回撤」是從高點最多跌多少。日夏普比較報酬與波動,數字越高越好,但不保證獲利。
- 十二個設計都未通過,換鄰近參數後無法穩定領先。
- 第一買點0050版:年化報酬15.8%,期間最大跌幅34.0%;同期持有0050為年化13.9%、最大跌幅52.4%。
- 這組主要設定看似較好,但九組參數只有三組贏0050,未達至少七組的門檻。
完整逐項數字如下;手機可左右滑動表格比較。
| 設計 | 年化報酬 | 日夏普 | 最大回撤 | 前/後半段日夏普 | 9格贏0050 | 在場比例 |
|---|---|---|---|---|---|---|
| 買點1・個股 | 6.9% | 0.44 | -61.8% | 0.21/0.67 | 0/9 | 100.0% |
| 買點1・0050 | 15.8% | 0.95 | -34.0% | 0.71/1.14 | 3/9 | 76.2% |
| 買點1・避開後持有0050 | -1.9% | -0.12 | -52.4% | -0.14/-0.11 | 0/9 | 23.8% |
| 買點2・個股 | 6.6% | 0.42 | -61.4% | 0.19/0.65 | 0/9 | 100.0% |
| 買點2・0050 | 9.3% | 0.59 | -53.1% | 0.24/0.93 | 0/9 | 68.6% |
| 買點2・避開後持有0050 | 3.4% | 0.40 | -25.6% | 0.29/0.50 | 0/9 | 31.4% |
| 買點3・個股 | 5.4% | 0.36 | -62.1% | 0.12/0.61 | 0/9 | 100.0% |
| 買點3・0050 | 10.3% | 0.68 | -28.2% | 0.49/0.83 | 0/9 | 70.5% |
| 買點3・避開後持有0050 | 1.2% | 0.16 | -47.6% | -0.14/0.66 | 1/9 | 29.5% |
| 買點4・個股 | 0.4% | 0.12 | -63.3% | -0.02/0.28 | 0/9 | 100.0% |
| 買點4・0050 | 7.6% | 0.55 | -52.4% | 0.20/1.03 | 1/9 | 65.1% |
| 買點4・避開後持有0050 | 5.6% | 0.49 | -28.0% | 0.44/0.54 | 1/9 | 34.9% |
| 同期0050含息持有 | 13.9% | 0.74 | -52.4% | 0.39/1.10 | — | 100% |
本文提供研究結果,沒有推薦這些買賣規則。想自行重跑,可先 設定 FinLab 環境,再 下載研究程式(.py);其他檔案見 研究下載區。
中心設定下,第一買點用於0050的日夏普為 0.95,高於同期0050的 0.74,但九格只有 3格贏。單一中心點較好,沒有形成可依賴的一片鄰近區域。四種個股買點則沒有任何一格勝過0050,不能用「每檔都有均線訊號」推論成分散後就有優勢。
第一買點個股版平均持有 274 檔,整段 3,531 筆交易;0050版 6 筆。持股數很多只能分散單一公司的風險,無法消除共同的市場下跌與進出成本。下方互動報告是第一買點個股版,另一份下載報告是同買點的0050版,均為中心參數,沒有從九格挑出成績最高者。
回測方法與判讀限制
資料截至 2026-11-09,重跑日為 2026-11-10,套件 finlab 2.3.8。期間從 2008-01-02 開始。基準採 etl:adj_close 的 0050 還原收盤價,包含配息與分割調整;停牌日沿用前一價格。基準用還原價比值計算買進持有,不經回測引擎,也不扣成本。所有表格與圖都用同一段交易日,起點淨值同為一;訊號還沒出現的空手日也保留。
| 項目 | 設定與限制 |
|---|---|
| 成交時間 | 當天收盤算訊號,隔一個交易日收盤成交;無法用今天的訊號買回今天的收盤 |
| 成本 | sim() 預設手續費買賣各 0.1425%,賣出證交稅 0.3%,未打折;ETF 也沿用這個較高的股票稅率,沒有另切較低稅率 |
| 周轉率 | 本次未計算含價格漂移的實際成交金額周轉率,交易筆數不能直接換算周轉率;下方另列目標權重變化的月周轉估計 |
| 滑價與容量 | 未另外假設滑價,未估算策略容量;實際成交可能受漲跌停、成交量與委託影響 |
| 股票池 | 個股實驗用歷史四碼普通股,排除0開頭與91開頭代號;20日平均成交金額至少2,000萬元才能進場,保留下市股票,未另外排除金融、KY與全額交割股 |
| 權重 | 個股對當時持股等權,不限制檔數;0050設計只在持有0050與現金之間切換;現金報酬設為零 |
| 資料可得日 | 價量使用資料原有日期,當日高低價收盤後才完整可得;未使用個別投資人的策略或交易紀錄 |
| 樣本 | 全段樣本內,沒有樣本外或前瞻實盤驗證;切前後半段也不能替代樣本外 |
「贏」採日夏普:日報酬平均除以標準差,再乘以252的平方根,不扣無風險利率。每個設計換兩個參數、各取三個值,共九格,至少七格要高於同期0050;中心參數在交易日對半切的兩段,也各自要高於0050;全部用扣成本結果。平均有多少天持股,就是表中的在場比例。有現金的設計還要高於「每天固定維持同平均權重的0050、其餘現金」對照,避免把少投資帶來的較小波動誤認成擇時能力。這個固定權重對照不扣調倉成本。
通過上述三項後,還須拿掉中心參數報酬最好的一個日曆年,再次高於同期0050,才算通過本次整體檢查;這不能補救前面未過的項目。未通過者不設成公開策略,也不提供把它當成已驗證策略的 Studio 捷徑。若要理解含息與一般收盤價的差異,可看回測方法;量化交易指南則說明研究結果與實際執行的距離。
換參數後,哪個買點還站得住
均線長度固定測四十、六十、八十日,中心為六十日。第一、二點的斜率用三、五、十日價差,中心五日;第三點的高低價距均線範圍為0.5%、1%、2%,中心1%;第四點偏離幅度為8%、12%、16%,中心12%。第三、四點的均線斜率都看五日。每個買點完整跑三乘三,沒有先看結果再改成另一條均線。
熱圖每格是策略減去0050的日夏普,藍色正值才是該格比較高,紅色負值代表比較低。個股版四張小圖全為負值;0050版第一點有局部正值,其他買點偶有一格勝出,互補方向也沒有達到七格門檻。「避開訊號、其他時間持有」仍要測,因為稀疏的反彈訊號容易讓資金長期空手;但改成互補方向也不能自動通過驗證。
淨值圖保留第一點的個股版與0050版,以及第四點避開後持有的版本,灰線為0050含息。累積線回答資金最後走到哪裡,前後段圖則回答改善是否只集中於某一段;兩個問題都需要看。回撤較小也可能來自大量現金,必須同時交代在場比例與少參與上漲的成本。
從圖形解讀到交易規則,中間差了什麼
第一,均線轉向是一段持續演變的過程。第一買點要求「當下轉平、之前沒有上揚」,第二買點要求「之前也在上揚」,所以同樣的向上突破會被分配到不同情境。若看到結果後把某次不漂亮的突破改稱「假突破」、排除在八法則之外,就無法得到可重跑的研究。
第二,回測守住要事前定義。本文用當日最低價距均線的百分比範圍,收盤再確認仍在線上;這會排除跌得太深才拉回的長下影線。另一位研究者可以採不同定義,但應先寫定,再完整公布相鄰參數。這份結果只適用於表中設定,不能延伸成所有均線回檔都無效。
第三,負乖離大可能伴隨市場風險持續上升。知道價格離均線很遠,不代表知道反彈哪天開始;等到對稱賣點又可能錯過先前反彈。把乖離率改當排名因子是另一個題目,相關機制可對照技術指標研究,不能把那類組合的成績移植到本次單獨買賣規則。
Brock、Lakonishok與LeBaron(1992)研究過移動平均與區間突破,對象與年代不同,不能直接替這十二個台股設計背書。Sullivan、Timmermann與White(1999)則提醒,多看許多技術規則再挑最好者,會引入資料探勘偏誤。本次固定參數與完整表格可以減少挑漂亮格子的空間,但沒有做該論文的統計檢定。
常見問題
葛蘭碧八大法則適合看日線還是週線?
本文只測日線。改成週線會改變訊號確認、持有長度與成交次數,屬於新的研究,不能直接沿用這次數字。
葛蘭碧法則一定要用二百日均線嗎?
沒有在這次研究測二百日。本次事前固定四十、六十、八十日,目的是觀察季線附近的敏感度,不提供一條適用所有市場的最佳天數。
四個買點可以混在一起使用嗎?
可以另提組合假說,但本次分開測。混用後還要寫清楚哪個賣點管理哪次進場,不能在出場時才挑當時看起來最有利的解釋。
回測均線有撐就能當天買進嗎?
當日最低與收盤價要到收盤後才完整確定。本文隔日收盤成交,因此沒有把事後已知的支撐買回當日最低價。
沒有通過,是否代表技術分析都沒用?
只能說這十二個固定設計在這段台股期間沒有穩定勝過0050。加上其他資料、換市場或換持有方式,都是需要另驗的題目。可對照大盤均線濾網的不同用途。
新手可以怎麼重跑?
從下載研究程式開始,保留原參數與固定迄日,對照本文的九格與逐日淨值。能重現後,再把新想法當成新實驗;程式交易入門說明整個流程。
用Python表達第一買點
這段是第一買點用於0050的中心設定。hold_until把進場事件延續到對應賣出事件,期間仍包含沒有新訊號的交易日。完整研究程式另跑其他買點與所有鄰近參數。
顯示程式碼
from finlab import data
from finlab.backtest import sim
close = data.get("etl:adj_close")[["0050"]].loc[:"2026-11-09"]
ma = close.rolling(60).mean()
slope = ma.diff(5)
cross_up = (close > ma) & (close.shift(1) <= ma.shift(1))
cross_down = (close < ma) & (close.shift(1) >= ma.shift(1))
buy = cross_up & (slope >= 0) & (slope.shift(5) <= 0)
sell = cross_down & (slope <= 0) & (slope.shift(5) >= 0)
position = buy.hold_until(sell) & close.notna()
report = sim(
position.loc["2008-01-02":],
retain_initial_cash=True,
end_date="2026-11-09",
upload=False,
)目標權重變化與月周轉
下表將每日目標等權部位的變化取絕對值,買進與賣出相加後按月加總。持股從零到滿倉計100%,再全部賣出另計100%;只轉換同一檔持股的期間不重複計算。這是不含價格漂移的目標權重周轉估計,並非回測引擎實際成交金額除淨值;平均包含空手月份,資料最後不足一個月也納入。交易筆數則可能同時包含許多檔股票,不能拿來替代周轉率。
| 中心設計 | 平均每月雙邊周轉 | 單月最高 |
|---|---|---|
| 買點1・個股 | 19.7% | 123.9% |
| 買點1・0050 | 4.8% | 200.0% |
| 買點1・避開後持有0050 | 5.3% | 200.0% |
| 買點2・個股 | 47.6% | 157.1% |
| 買點2・0050 | 12.8% | 200.0% |
| 買點2・避開後持有0050 | 12.3% | 200.0% |
| 買點3・個股 | 84.2% | 175.7% |
| 買點3・0050 | 30.4% | 300.0% |
| 買點3・避開後持有0050 | 30.0% | 300.0% |
| 買點4・個股 | 57.6% | 371.5% |
| 買點4・0050 | 4.8% | 200.0% |
| 買點4・避開後持有0050 | 4.4% | 200.0% |
下載與重跑
只想看結果,不用安裝軟體或執行程式。 下方兩份互動網頁可查看歷年報酬與最大跌幅;要自行重跑全部研究,再選擇下載Python程式。
- 買點一・個股互動報告:看本文主要測試的結果。
- 買點一・0050互動報告:看另一個固定設計。
- 完整研究程式(Python,.py):自行執行三個主題、全部162組。
- 全部統計(JSON):查看本文全部參數與指標。
- 每日淨值(CSV):下載本文中心參數的每日淨值。
選擇性:自行重跑完整研究
- 下載共用研究程式,存成
research.py。 - 依FinLab設定流程準備環境,安裝finlab、numpy與pandas,依套件指示登入。資料權限依登入帳號而定。
- 在程式所在資料夾執行:
顯示程式碼
python research.py --out results這個命令會跑三個主題、十八個設計的全部162組,並非只跑本文。輸出的 results/metrics.json 包含完整參數與統計,各設計另有具名的互動HTML報告與每日淨值CSV;程式不會部署或下單。
兩份互動報告對應表格具名的兩個中心設計,沒有從九格中挑最好者。報告內建市場線不替代本文依同期0050還原價算出的對照表。後續資料修補或套件更新可能使重跑數字小幅不同;本文保留這次執行的數字與日期。
投資有風險,過去績效不代表未來表現。本文僅供教學與研究參考,不構成投資建議,不推薦買賣任何個股。最大回撤、空手機會成本與交易成本請一併評估。
最後更新:2026-11|回測區間:2008-01-02~2026-11-09|作者:FinLab 量化研究團隊。團隊以歷史資料與可重跑程式研究台股及美股策略。
FinLab AI
想建立自己的策略?
用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案
免費開始





