VALYNOXSTRATEGY RESEARCH TECHNOLOGY
AlphaPrimeAlphaPrime
策略學院 / 回測與檢驗

台股與 ETF 回測:資料、成本與 0050 範例

台股或 ETF 回測要經得起檢驗,必須使用已還原股利與分割的價格、買賣兩邊都計手續費、賣出時再計證券交易稅、在下一根 K 棒成交,並在第一次執行前就定好資金投入方式(單筆投入或定期定額)。最後再拿這條規則和單純持有該 ETF 做比較。

作者 · 發佈 · 更新於 · 編輯原則

目錄
  1. 一個像樣的台股或 ETF 回測需要什麼?
  2. 為什麼台股與 ETF 的價格資料必須還原股利與分割?
  3. 台股與 ETF 一買一賣(來回)的稅、手續費與滑價要花多少?
  4. 單筆投入或定期定額:各自要怎麼回測?
  5. 0050 的第一次回測,一步一步看起來是什麼樣子?
  6. 有哪些免費的股票回測工具可用,它們在哪裡就不夠用了?
  7. 哪些錯誤會讓台股回測看起來比實際好?
  8. 常見問題
  9. 參考資料

一個像樣的台股或 ETF 回測需要什麼?

一個像樣的台股或 ETF 回測,要使用已還原股利與分割的價格,買賣兩邊都計券商手續費、賣出時計證券交易稅,所有委託都在下一根 K 棒成交,並在第一次執行前就決定資金是單筆投入還是定期定額。接著再拿這條規則和單純持有同一檔 ETF 做比較。

回測是把交易規則放到過去的價格上重播,報告這條規則當時會做出什麼結果。台股回測在四個地方容易出錯,這些是期貨回測不會碰到的:價格序列必須還原股利與分割;稅只在賣出時課徵,而且股票與 ETF 的稅率不同;股票以一千股(一張)為單位買進,所以部位大小是一塊一塊的;而且很多人是每個月投入固定金額,而不是一次投入一筆。接下來三節處理還原、成本與資金流入方式;張數的問題則在定期定額的表格裡碰到時再談。

台灣證券交易所(TWSE)的一般交易時段是台灣時間 09:00 到 13:30,所以日 K 棒只是一個很短的交易時段,開盤常帶著隔夜跳空。交易所可能調整交易時段與費用;測試前請到 TWSE 的交易規則頁面確認。

為什麼台股與 ETF 的價格資料必須還原股利與分割?

未還原的收盤價在每個除息日都會下跌,所以用原始資料回測,會低估像 0050 這種配息的 ETF,也會誤讀每一次分割;請使用還原序列,或把股利當成現金加回去。

還原價格資料,是指把過去的價格按比例調整,讓股利與分割不會顯示成價格變動的序列。想像一支水錶每隔幾個月就被人歸零一次:原始讀數會出現突然下降,但水並沒有倒流。除息日當天,交易所會把參考價下調股利的金額。持有人並沒有損失,因為現金會進到帳戶,但如果規則讀的是原始收盤價,就會看到虧損,甚至可能觸發停損。

0050 是元大台灣50 ETF 的股票代號,追蹤富時台灣證券交易所台灣50指數,一年配息不只一次。十年下來,原始序列裡就是許多小階梯式的下跌。拿原始資料測試的趨勢規則,會把從未真正損失的股利當成下跌而賣出。分割更糟:2025 年該基金把每一單位分割為四,所以未還原的圖表會顯示價格一天內跌到約四分之一,原始資料上的任何均線規則都會看到一場崩盤。

一年間,配息 ETF 的原始價格線在每個除息日都會下跌。還原價格線則平滑上升,終點相同,因為這些下跌是付給持有人的現金,並非虧損。 配息缺口並非虧損 原始與還原價格,一年 配息落差 原始 還原 原始價格下跌是已發放的現金。 所以:用還原價格測試。
配息 ETF 在一年內的未還原與已還原價格。原始線上的階梯是付給持有人的現金,不是虧損,已還原的線把它們去除了。

有兩種正確的做法,選哪一種取決於你想衡量什麼:

  1. 使用總報酬還原序列。每一筆過去的價格都按比例下調,讓除息的階梯消失。這樣回測衡量的是股利在除息日再投入的報酬。多數資料供應商與基金發行公司自己的文件,都提供了建立它所需的資料。要拿不同規則互相比較時用這一種。
  2. 使用原始價格,並把每筆股利記為現金。規則讀的是原始收盤價,在每個除息日,回測把股利乘以持有股數加進現金餘額。當你希望規則看到市場實際印出的價格時用這一種,同時要接受你得告訴規則,不要把除息的階梯當成訊號。

不論選哪一種,都要用回測資料品質:缺漏、壞報價、時區與轉倉裡描述的問題來檢查序列:缺少的假日、成交量為零的 K 棒,或是供應商晚了一天才還原的分割。

台股與 ETF 一買一賣(來回)的稅、手續費與滑價要花多少?

一買一賣(來回)的成本,是買賣兩邊的券商手續費,加上只在賣出時課徵的證券交易稅,而 ETF 的稅率比股票低,所以同一條規則可能在 ETF 上通過、在股票上失敗。

證券交易稅是向賣方課徵、按賣出金額計算的百分比稅。依證券交易稅條例,股票的稅率是 0.3%,ETF 受益憑證是 0.1%。券商手續費是券商的收費,買進與賣出兩邊都收,法定上限為成交金額的 0.1425%;多數券商會給折扣,也有不少券商對每筆委託設有最低收費。現股當沖的賣出端適用暫時性的減半稅率,其到期日已延長過數次,所以測試當沖規則之前,請先到財政部頁面確認目前的日期。

本文唯一的公式,是計入滑價之前的來回成本:

來回成本 % = 2 × 手續費 % + 交易稅 %

這裡的手續費 % 是你的券商每一邊收的費率,因為買賣各一次所以算兩次;交易稅 % 只算一次,因為只有賣出被課稅。在手續費上限下,股票是 0.585%,ETF 是 0.385%。滑價是回測中的價格與你實際會成交的價格之間的差距;對流動性好的 ETF,在開盤用市價單,每邊一個跳動點是合理的起點,流動性差的股票則要更多。

成本項目股票ETF
買進手續費(上限)0.1425%0.1425%
賣出手續費(上限)0.1425%0.1425%
賣出交易稅0.3%0.1%
計入滑價前的一買一賣(來回)0.585%0.385%
一買一賣的成本以手續費上限堆疊,並含估計滑價。兩者手續費相同,但證券交易稅股票為 0.3%、ETF 為 0.1%,因此股票成本約 0.69%,ETF 約 0.49%。 股票的稅是 3 倍 手續費上限下的一買一賣 手續費 稅 滑價(估計) 股票 0.3% 0.69% ETF 0.1% 0.49% 規則相同,股票門檻更高。 因此:以 0.3% 稅重跑。
股票與 ETF 在手續費上限下的來回成本堆疊,假設每邊滑價約 5 個基點;TWSE 的跳動點大小取決於價格級距,所以輸入之前請先把你自己的跳動點換算成百分比。股票的交易稅區塊高度是 ETF 的三倍。

假設性範例

你以 NT$100 買進一張(一千單位)ETF,成交金額 NT$100,000,之後以相同價格賣出。0.1425% 的手續費,買進是 NT$142.5,賣出是 NT$142.5。賣出時 0.1% 的交易稅是 NT$100。這一趟來回花 NT$385,也就是部位的 0.385%。同樣的交易如果是股票,稅是 NT$300,總成本 NT$585。如果你的規則在扣除成本前的平均每筆損益是 0.5%,它在 ETF 上撐得住,在股票上就虧損。

成本要放進第一次執行,而不是最後一次,並且要按回測中的交易成本:手續費、滑價與平均每筆損益所述,拿它和平均每筆損益比較。一條每週交易的規則,一年大約要付五十次來回成本;以每趟 0.4% 計,在還沒算滑價之前就是每年約 20% 的資本,很少有指數 ETF 上的規則扛得住。把每趟 0.4% 一次填進 AlphaPrime(Valynox) 回測的手續費與滑價設定,每週交易一次的 0050 規則從第一次測試起,每個來回都會被扣到。

單筆投入或定期定額:各自要怎麼回測?

單筆投入的測試衡量的是策略;定期定額的測試衡量的是策略加上你存入資金的時點,所以兩者需要不同的權益曲線與不同的績效衡量方式。

定期定額是每個月固定一天投入相同金額、不管價格高低的計畫。單筆投入則是第一天就把全部金額投入。這是兩種不同的東西:單筆投入的曲線一開始就滿倉,每一次波動都作用在全部資本上;定期定額的曲線一開始接近零,大部分資金是晚一點才進來。比較兩者的最終價值,就像比較兩位不同時間起跑的跑者。

一年內投入的資金。單筆投入從一開始就全額投入,之後維持不變。每月定期定額分十二階段增加,因此大部分資金較晚才進場,期末價值無法直接比較。 定期定額運用的資金較少 一年內投入的資金 單筆投入 每月投入 年初 年底 期末價值無法比較。 因此:用投入現金算 IRR。
一年內的單筆投入與定期定額:一次存入加上一條平的投入線,或是十二次存入形成的階梯。要用實際投入資本的單位報酬來評斷。

CAGR(年複合成長率)是把起始金額成長到最終價值的那個單一年化比率;資金加權報酬率(IRR)則是同樣的概念用在一連串存入上,也就是讓每一筆存款從存入那天起成長到最終價值的那個年化比率。

問題單筆投入定期定額
衡量什麼規則在固定資本上的表現規則加上存入時點
報酬衡量以起始金額計算的總報酬與 CAGR存入資金流的資金加權報酬率(IRR)
回撤衡量權益的高點到低點扣除存入金額後權益的高點到低點
部位大小起始金額能買的整張零股,或先存現金直到買得起一張
每筆交易成本少數幾筆大額交易很多筆小額買進,最低手續費很重要

定期定額回測有三件事要先定好:

  1. 存入日,例如每個月的第一個交易日,在下一個開盤成交。
  2. 存入的金額買不起一整張時怎麼辦:買零股,或是持有現金直到買得起為止。
  3. 回撤怎麼計算。回撤是從權益最高點到下一個最低點的下跌;在定期定額曲線中,必須用扣除存入金額之後的權益來衡量,否則新進的現金會掩蓋虧損。

免費的回撤計算器可以從你貼上的權益序列算出最大回撤與回復時間。定期定額的測試也要從幾個不同的起始月份各跑一次,因為從市場低點開始會讓結果好看,從高點開始則會讓結果難看。

0050 的第一次回測,一步一步看起來是什麼樣子?

0050 的第一次回測,在測試任何規則之前,先把資料、還原方式、成本與委託時點都固定下來,再拿規則和同一期間單純持有該 ETF 做比較,全部都在一個假設性範例裡進行。

順序很重要,因為後面每一步都承接前面的結果。如果在成本還沒設定前就測試規則,規則會依毛報酬被選出來,之後加進來的成本再把入圍的淘汰掉。

第一次 0050 回測的五個步驟:先固定還原資料、單邊成本與下一根 K 棒成交,再執行規則,最後與同期間持有 ETF 比較。 最後才測規則 首次 0050 回測五步驟 1 2 3 4 5 還原資料 單邊成本 下一根 K 棒成交 執行規則 與持有比較 先固定 成本太晚設,賺錢策略就消失。 所以:先定資料、成本、成交。
0050 第一次回測的五個步驟。規則最後才測試,在資料、成本與執行都固定之後,並且與同一期間持有該 ETF 做比較。
  1. 載入 0050 已還原的日 K 棒。挑選一個起始日期,要涵蓋至少一次大幅下跌與一次長期上漲;確認 2025 年的分割與每一筆股利都已經在序列裡,並對照交易所的假日行事曆檢查有沒有缺漏的日子。
  2. 輸入每一邊的成本。買賣兩邊你實際的手續費率、賣出端 0.1% 的稅,以及每邊一個跳動點的滑價。
  3. 把成交設在下一根 K 棒的開盤。讀取日收盤價的規則,無法在那個收盤價成交。下一個開盤是它最早能拿到的價格。
  4. 執行規則。第一條規則要簡單,只有一兩個參數,這樣你才能逐筆讀懂發生了什麼。
  5. 和同一期間的買進持有做比較。相同的序列、一買一賣的相同成本、相同的起訖日。兩邊都記錄總報酬、最大回撤、交易次數與支付的總成本。

假設性範例

資本 NT$1,000,000,十年的已還原日 K 棒。規則:收盤價向上穿越 200 日均線時,在下一個開盤買進;向下穿越時,在下一個開盤賣出。手續費每邊 0.1425%,賣出稅 0.1%,滑價每邊一個跳動點。這條規則做了 24 次來回,約付出 NT$150,000 的成本。假設規則最終是 NT$2,100,000,最大回撤 18%,而買進持有最終是 NT$2,700,000,最大回撤 32%。對規則來說,好的結果不是更高的最終價值;而是回撤較低,報酬上付出的代價是你願意付的,而且交易次數少到讓成本保持很小。壞的結果則是最終價值跟持有一樣、回撤更大,而且大部分獲利來自一兩筆交易。

接著一次只改一件事:均線長度、滑價、起始年份。如果長度稍微一變結果就翻轉,這條規則就是在擬合歷史,而不是在抓市場。AlphaPrime在期貨資料的回測上遵循同樣的紀律:手續費、滑價與下一根 K 棒成交都是每一次評估的一部分,所以排名已經反映了實際可以成交的結果。

有哪些免費的股票回測工具可用,它們在哪裡就不夠用了?

試算表、券商的定期定額模擬器與看盤平台的策略測試器,各自只能回答問題的一部分,你得自己補上的,通常是股利處理、台灣特有的成本,或是測試大量變化版本的能力。

試算表是最誠實的第一個工具,因為每一項假設都由你自己輸入:已還原的序列放一欄,規則放下一欄,成交價往下一列,稅只在賣出時計。它的限制是規模:多一個參數或多一檔 ETF,工作量就加倍。券商的定期定額模擬器能把一個問題答得很好,也就是每月存入形成的階梯,但它們很少讓你加入規則,有些還用沒含股利的原始價格,你可以檢查結果在除息日有沒有變化來發現。看盤平台的策略測試器,如TradingView 策略測試器:免費回測與第一步該檢查什麼所述,能執行以規則為基礎的進場與出場,並讓你設定手續費與滑價,但賣出端的稅要自己設,也要檢查該商品的序列有沒有還原。

各類免費工具留給你自己處理的部分:試算表需手動建立每個變體,券商定期定額模擬器需要你的進出場規則,看盤軟體的回測工具則需要賣出稅與每月投入金額。 自行補上的部分 免費工具,各有缺口 試算表 每個變體手動做 券商定期定額模擬器 你的進出場規則 看盤軟體回測 賣出稅與每月投入
你得自己補上的東西:每一種免費工具各留給你的一項設定。試算表:每個變化版本都要手動做。券商定期定額模擬器:你的進場與出場規則。看盤平台測試器:賣出端的稅與每月存入。
需求試算表券商定期定額模擬器看盤平台測試器
股利還原完整,只要你自己建立序列部分,取決於券商部分,取決於資料來源
台灣的稅與費用完整,手動輸入部分部分,手續費可以,賣出端的稅要手動
定期定額的資金流完整完整沒有,或用腳本實作
以規則為基礎的進場與出場部分,一次一條規則沒有完整
一次測試大量變化版本沒有沒有部分,一個商品,輸入參數要手動一次一次改

最後一列就是免費工具不夠用的地方,也是新風險開始的地方。測試大量變化版本再留下最好的那個,會讓結果膨脹,因為在許多隨機規則中,總有一些會因為運氣而看起來不錯;Bailey 等人(2014)說明了這種膨脹如何隨著試驗次數快速增加。能測試大量變化版本的工具,也必須幫你判斷最好的那個有多少成分是運氣;策略檢驗就是為此而存在。

哪些錯誤會讓台股回測看起來比實際好?

存活者偏誤、未還原的價格、同一根 K 棒成交,以及忽略證券交易稅,是最會讓台股回測膨脹的四個錯誤,每一個都有簡單的檢查方式。

存活者偏誤,是只用今天仍然存在的股票來測試,把每一家下市、合併或倒閉的公司都從歷史中拿掉的錯誤。就像只訪問完賽者來評斷一場馬拉松。一條在今天大型公司名單上測試的選股規則,在不知不覺中避開了過去十年的每一次失敗。像 0050 這樣的 ETF 大致上避開了這個問題,因為指數已經在成分股掉出去時把它們換掉了,但橫跨個股的台股回測,需要每一個過去日期當時的成分股名單。

存活者偏差:當年十檔股票中,有三檔已下市。今天的清單只剩仍在上市的七檔,用它建立的回測永遠看不到那三檔輸家。 今天的清單藏起了輸家 十檔股票,三檔下市 當年 仍上市 已下市 今天的清單 缺少 下市股票不會進入測試。 解法:使用各日期當時的清單。
存活者偏誤:十檔股票中有三檔在今天之前下市。用今天的名單建立的回測永遠看不到它們,所以它們造成的虧損就從歷史中消失了。
錯誤對結果的影響簡單檢查
存活者偏誤移除過去的輸家,拉高每一個選股結果把你的股票池在測試第一年的檔數,和交易所當年的實際名單比較
未還原的價格把股利算成虧損,把分割當成崩盤看權益曲線在一個已知的除息日,以及 0050 的 2025 年分割日的表現
同一根 K 棒成交在規則還沒看到的收盤價成交;是前視偏誤的一種把每一筆成交移到下一個開盤再比較;變化很大就表示優勢是來自時點
忽略證券交易稅在股票上每一次來回最多隱藏 0.3%把賣出次數乘以平均部位的 0.3%(ETF 是 0.1%),再與總報酬比較

在看表面的報酬之前,先把四項檢查都做完。通過檢查的回測仍然只是過去的紀錄,但那是一份依實際可以成交的方式還原的過去:資金流、成本與已經消失的公司都在其中。

如果你使用 AlphaPrime,這對你的意義是:本文四項決定中的兩項,每一邊的成本與下一根 K 棒成交,AlphaPrime 的回測在期貨上對每一次評估都會套用;想要用大量變化版本測試指數想法的交易人,常常會在台指期上執行,它和 0050 追蹤同一個市場,做法見如何貼近實際地回測台指期策略,然後再用 ETF 自己的成本,手動把留下來的規則帶回 ETF。

常見問題

0050 的回測需要股利還原的資料嗎?

需要。0050 一年配息不只一次,每個除息日參考價都會下調股利的金額。在原始價格上,回測會把每一筆股利算成虧損,還可能在那幾天觸發出場。請使用總報酬還原序列,或在除息日把每一筆股利記為現金。

台灣 ETF 一買一賣(來回)要花多少?

買賣兩邊的手續費,加上賣出時 0.1% 的證券交易稅。在每邊 0.1425% 的手續費上限下,計入滑價前來回是 0.385%;手續費有折扣就更低。股票的稅是 0.3%,所以同樣的來回在上限下要 0.585%。

我要怎麼公平地拿定期定額和單筆投入來做回測比較?

不要比較最終價值,因為定期定額在大部分期間投入的資本比較少。對存入的資金流使用資金加權報酬率(IRR),並用扣除存入金額後的權益來衡量回撤。定期定額的測試要從幾個不同的起始月份各跑一次,因為從市場低點開始會讓它好看。

我可以用免費的看盤平台策略測試器做台股回測嗎?

可以,用於以規則為基礎、含手續費與滑價的進場與出場。你必須檢查該商品的資料有沒有還原股利,並自己加上賣出端的證券交易稅,因為多數測試器兩邊收的是相同的成本。測試大量變化版本,通常意味著每一個版本都要手動改輸入再重跑一次。

為什麼同一條規則,我的股票回測看起來比 ETF 回測好?

檢查兩件事。如果你的股票池是用今天的名單建的,下市的輸家就不見了,這就是存活者偏誤。如果股票的稅設成 0.1% 或零,每一次來回就少付了最多 0.2%。兩者都修正後再重跑,然後才比較。

參考資料

  • Bailey, D. H., Borwein, J., López de Prado, M., & Zhu, Q. J. (2014). Pseudo-Mathematics and Financial Charlatanism: The Effects of Backtest Overfitting on Out-of-Sample Performance. Notices of the American Mathematical Society, 61(5), 458–471.