利用 0050 的概念,優化選股的績效

簡介

ETF 的起源

台灣在 2000 年代初期,股市的交易量非常小,很多股票的價格都不穩定,所以很多人都不敢買股票。但是在 2003 年,台灣證券交易所推出了 ETF,讓投資人可以透過 ETF 來投資台灣股市,而代號0050 的元大寶來台灣卓越50),就是台灣的第一檔ETF。有了 ETF,投資人就不用擔心股票的流動性問題。

如今台灣股市的交易量已經增加,大多數股票的價格都非常穩定,理論上不再需要 ETF 來投資台灣股市。然而,ETF 有一個很大的優勢,就是可以透過 ETF 來投資台灣股市,不需要花時間去選股票,也不需要花時間去分析股票。

而 ETF 近期也推出非常多種類型的 ETF,例如科技、金融、生技,還有不同的屬性,例如槓桿 ETF、反向 ETF ,以及不同特性,例如配息 ETF、低波動 ETF 等等,所以投資人可以利用 ETF,選一籃子的股票池,來分散風險。

ETF 衍生的問題

ETF有一個明顯的問題,在於 ETF 的市值可能很高,就必須要有很好的流動性,不然當 ETF 再平衡時,股價就會大幅影響。有一個對普通人來說,大於1000 張的每日流動性,並不是必要的,台灣上市上櫃快 2000 檔股票,要通過這個的門檻,只剩300檔股票。

所以買 ETF 等於限制自己在 300 檔股票在選股。這樣會讓投資人錯過很多潛力股。所以接下來,我們就要透過程式來選股,來在歷史績效上,打敗 ETF。我們會先複製 0050 的資產配置組合,然後透過程式來優化。

0050 介紹

0050 是台灣最大的 ETF,也是台灣股市中的第一檔 ETF,專門用來當台灣股市的全市場參考,衡量股市漲跌的指標之一。

究竟要不要買 0050 ?

有些人覺得投資 0050 就是指數化投資,但要達到真正的指數化投資,就必須要買進全球股市的股票,而非只買台灣股市的股票。所以我認為 VT 等等包含了全球股市的股票,才是真正的指數化投資。現在透過一般券商,如永豐證券,一般人其實就可以輕鬆買到。

撇除了指數化投資,為什麼要買 0050?假如你覺得台灣的優勢是有很多科技股,那 0052 針對台灣的科技股的 ETF,可能會更適合你,而 0052 長期來說,歷史績效是比 0050 還要好的。

現代券商可以跨國買美股和其ETF,可以買到全球股市的股票,所以 0050 在現代的投資組合中,可能就不再是必要的選擇,然而,它還是全台灣市值最大的 ETF,大家都會關注它的表現,來當作是市場漲跌的參考。

0050 實做

我們先複製 0050 的資產配置組合,然後透過程式來優化。首先我們先選擇台灣前 50 大市值的股票,然後依照市值來分配權重,可以參考公開說明書

除了市值外,0050還有額外的規則,必須要將市值乘以「公眾流通量係數」,這個是為了避免有些股票的流通量太小,計算方式很複雜,我們化簡成:「1-董監持股佔比」更詳細的計算方式,可以參考公開說明書。

另外,還有一些流動性篩檢,以及公司審核的部分,由於程式較複雜,但影響估計不大,篇幅考量,我們就不再細說。

from finlab import data

# 市值
market_cap = data.get('etl:market_value')

# 公眾流通量係數
float_ratio = (100 - data.get('internal_equity_changes:董監持有股數占比')) / 100

# 權重
weight = market_cap * float_ratio

# 前 50 大權重,並且依照權重分配投資的比例
position = weight.is_largest(50) * weight

# 回測,3,6,9,12月第3個星期五後的下一個交易日進行交易。
r1 = backtest.sim(position, resample='Q', resample_offset='3W', upload=False)
r1.display()

程式碼在此執行

image 1
台灣 50 模仿策略

近 10 年平均報酬率是 12%,跟大盤差不多,算是達到了 0050 的初衷,追蹤大盤指數。
從分析結果來看,確實有著非凡的流動性,然而在其他方面,例如獲利能力,或抵抗風險的能力,都不甚理想,這也是為什麼我們要透過程式來優化,來在績效上打敗 0050。不過 ETF 也擁有更多元化優勢,投資者應根據個人投資風格做出選擇。

關於市值的分析

既然 0050 是市值前 50 大的股票,那我們就來分析市值的特性,並且透過市值來研發投資組合。我們將市值由小到大分成 5 組,然後觀察每一組的報酬率。
藍色為最小市值,紅色為大市值。

image 2


可以發現,長期持有最小市值的組別,報酬率反而最高,而最大市值的組別,報酬率最低。所以結論是,在台灣,除非想要追求穩定的報酬率,否則市值越小的股票,報酬率越高。當然從常理來說,市值小的股票,風險也比較高,所以建議投資者依據自己的風險承受能力進行投資。

所以接下來我們就來研發小市值的策略,雖然跟 0050 是完全相反的,但我想用這個實驗,藉此證明 ETF 高流動性、與大市值,所犧牲的小型股,是多麼的可惜,所以本篇接下來主要用非常簡單的步驟,來篩選出中小型股,組成自己的 ETF。

不過當前研究所提供的優化策略,是基於過去數據進行回測,可能存在過度擬合的問題,使得策略在未來的市場環境中表現不佳,請使用者自行斟酌。

0050 優化:步驟一,小市值成交量

小型股的問題在於,流動性不足,有時候買賣並沒有這麼方便,要掛單造成不必要的等待與價差,所以首先我們要先來確認小型股流動性問題,我們先來看小市值(市場上市值小於20%的股票)股票的每日成交量分布圖:

image 4
小市值的股票成交量(張數)

可以看到小市值的股票,每日平均交易張數大都小於200張,這樣的股票雖不至於不能買,但確實會有流動性的問題。在小市值的股票中,究竟成交量高,還是成交量小的股票報酬率比較好?下圖中,流動性越低(藍色)的股票,長期持有報酬率越好

image 5
藍色為成交量低,紅色為成交量高

雖然我們知道小市值、低成交量,有很好的報酬率,然而 FinLab 部落格畢竟每月上萬人的流量,盡量以成交量中高以上的策略進行研發,是比較適合的。所以針對「小市值低成交量」的研究,就交給各位來進行了。我們就先以上圖中的紅色與粉紅色,小市值中的中高成交量,來進行選股的製作。

選擇市值小的股票,我們在此設定門檻為日成交量 200 張以上,長期持有,每季換股,報酬率如下:

image 3
小市值50小,成交量200張以上,每季換股

看起來雖然平均來說,效果比 0050 好,但是在2020年以前並不理想。不過別擔心,因為小型股有很多明顯的選股特性,很適合加入進來,例如均線。

0050 優化:步驟二,均線

所以接下來,我們希望可以過濾一些風險較高的股票,而均線是非常有用的方法,可以過濾掉一些未來可能下跌的股票,我們來看看效果如何,程式碼可在此執行:

from finlab import backtest
from finlab import data

cap = data.get('etl:market_value')
vol = data.get('price:成交股數')
close = data.get('price:收盤價')

position = cap[
    (vol.average(20) > 200_000)
    & (close > close.average(60)) 
    & (close > close.average(120))
    & (close > close.average(250))
].is_smallest(50)

report = backtest.sim(position, resample='Q')
image 6
新增股價大於 60 日、120日、250日均線的條件後

當前我們透過簡單的均線,就能夠將策略的報酬率明顯提升,產生出一個0050小市值策略了!各位可以測測看用一樣的方法,但排序選取大市值的股票,效果並不會太好。

從自己主觀的經驗來說,成交量或市值越低的股票,越可能有超額報酬,有可能的原因是關注度比較低,價格反應並沒有像是大型股這麼即時。

0050 優化:步驟三,減少檔數

此時還是有問題,我們是要自己拿來投資的,怎麼可能買 50 檔股票呢?所以為了讓我們可以實際的來買賣,必須要讓股票的檔數變少才行,最簡單的方式,就是進一步選擇市值最小的 15 檔股票。

但你就會發現,股票的檔數變少,你的投資組合會有波動更劇烈。所以我加入了波動指標,過濾大起大落的股票標的,來確保我們的投資組合雖然標的少,但是能保持類似的穩定程度,我們來看看效果如何。

image 7
新增波動指標,過濾波動大於 30% 的股票

0050 與優化後的績效比較

根據上述的回測結果,優化後的策略相較於優化前有顯著的改善,在多項指標上表現更佳。

  1. 年化回報率 (Annual Return):優化後的策略從+13%增加到+37%,表明策略的盈利能力大幅提升。
  2. 阿爾法值 (Alpha):從0%提高到+29%,顯示優化後的策略相對於基準的超額回報有明顯的提升。當然 0050 本來就希望 alpha 是 0,這樣比並不是很公平啦XD。
  3. 貝塔值 (Beta):從1.08降低到0.70,這意味著優化後的策略相對於市場整體風險的敏感度降低,更穩健。
  4. 平均持股數 (AvgNStock) 和最大持股數 (MaxNStock):從50降至15,顯示優化後的策略更加集中,選股更為精確。
  5. 最大回撤 (Max Drawdown):優化後略有降低,從-33%降到-31%,表示策略的損失風險略微下降。
  6. 平均回撤 (Avg Drawdown) 和平均回撤天數 (Avg Drawdown Days):這兩個指標變化不大,保持穩定。
  7. 風險價值 (Value at Risk) 和條件風險價值 (Conditional Value at Risk):雖然風險略有上升,但考慮到回報率的大幅提升,這種風險的增加是可以接受的。
  8. 夏普比率 (Sharpe Ratio)索提諾比率 (Sortino Ratio)卡瑪比率 (Calmar Ratio):這些風險調整後的回報率指標均顯示顯著提升,表明優化後策略的風險調整回報大幅優於優化前。
  9. 波動性 (Volatility):略有增加,從0.17上升到0.18,但考慮到收益的增加,這一增加是合理的。

與 00639 台灣50正二 比較

相比 00639 台灣 50 正二,我們研發的策略並不遜色。

  1. 年化回報率 (Annual Return):優化後的策略+37% 對比 00639 為 +24%,表明不需要開 2 倍槓桿,就能有很好的效果。
  2. 最大回撤 (Max Drawdown):兩倍槓桿最大的壞處就是,當下跌時,虧損也是 2 倍(甚至更多)。小市值策略最大下跌風險為 -31%,對比 00639 為 -52%,更為安全。
  3. 波動性 (Volatility):本策略的波動程度: 0.18,小於台灣 50 正二的 0.32。所以要是你真的想要投資台灣 50 正二,那還不如投資我們這個台灣15小型股。

本篇介紹的策略,其並未開槓桿,而各項指標績效遠比 00632 好,與其開槓桿,優化選股組合是一個比較安穩且同時享有超額報酬的方式。

如何開槓桿?需要有更多停損、停利,及擇時,然而從量化交易回測的角度,由於參數較多,往往會有過擬合之現象,屬於更進階的投資方法。

結論

總體而言,優化後的策略在盈利能力、風險調整回報和市場風險敏感度方面都有明顯改善,表現出更高的效率和穩定性。優化措施有效提升了策略的整體表現,使其更適合於風險偏好較低且追求高效率的投資者。

未來改進的方向

可以試試看,結合更多指標,如財務健康、業績增長率、股息率等,進行更全面的股票評估和選擇,以建立更均衡和具有競爭力的投資組合。

P.S. 策略一不小心做得太好了,所以最完整策略只好先分享給本平台 VIP 使用。但基本上有心的話,透過本篇的蛛絲馬跡,已經非常足夠重現此策略。

FinLab - 韓承佑

嗨大家好,我是韓承佑,FinLab創辦人,畢業於巴黎薩克雷大學資工博士,目前擔任臺灣量化交易協會 學術顧問、台北商業大學 創新育成中心 創業技術顧問與上市科技公司 量化交易顧問。當初,我喜歡寫程式、無意間因為軟體比賽接觸Fintech,從此開始了財經跟程式的學習之路。我們成立 FinLab 量化投資部落格,用自己研發的軟體,對台灣股市做大量快速的實驗。希望可以在量化投資的路上,當大家的「武器製造商」!