此文章為VIP限定
之前在小型股噴發的日子結束了?ADLs 指標顯示:接下來是決定性的時刻!提到,將ADLs用在中小型股指數 00733 富邦臺灣中小型股指數上,有非常不錯的成效,可以避開「所有00733」的大跌。
這次的目的是進一步研究,實測四種避開大盤空頭的濾網,並同時進行參數優化,實測哪種對大盤最有效。希望往後撰寫策略時可以當成一項通用濾網,同時提高Sharp Ratio並降低Max Drawdown!
四種指標簡介
這次實驗我分別使用了漲跌家數、Vix、融資維持率、多空頭家數,並用這四種指標畫出了一長一短的兩條均線,以長短期均線交叉作為持有和空手的分界。
ADLs
ADLs = 上漲家數 / 總家數 – 0.5
ADL假如大於零,代表當天比較多檔股票上漲,自然大部分的就是賺錢的,市場比較有信心,而當ADLs 小於零,則代表大部分的人都是虧錢的。所以 ADLs + 均線,就代表一段時間,市場平均的勝率(不是很精確的說法,但是容易瞭解)。
大家都賺了錢,自然就很開心,於是希望可以賺更多,市場一片喜氣洋洋,反之,就是大家都有點恐懼,造成市場信心潰散,就是比較危險的時刻了。
下面我以月線作為短期均線,季線作為長期均線做一個例子,畫出2020年後的圖形讓大家更容易理解。
因此若ADLs的短期均線<長期均線,這時候市場比較容易有恐慌性賣壓,也是比較危險的時候,可能是空頭即將來臨的訊號。
若想要更了解ADLs,在這篇有更詳細的介紹大家可以翻回去複習!
Vix
這邊使用的Vix,代表的是S&P500指數未來30天的隱含波動率,一旦有某些因素造成市場恐慌、或讓投資人對未來感到不確定,投資人就會傾向於買入期權,進而導致期權的價格上漲。
因此Vix同時也被稱作恐慌指數,當此數值愈高,表示投資人對於股市的前景感到不安、無法預期。
以下我畫出了加權指數和Vix在2020年以後的走勢圖。
- 綠色 : 臺灣加權指數
- 紅色 : S&P500 Vix指數
可以很明顯發現Vix和台灣加權指數呈現高度負相關。當Vix上漲時,加權指數往往呈現下跌的趨勢。
因此當恐慌指數的短期均線>長期均線時,代表投資人的情緒在短期內變得十分不安,且接下來的股市波動可能變得相對劇烈,有可能是空頭即將來臨的訊號之一。
融資維持率
融資維持率=股票現值 / 融資金額
舉例:買進100元的股票,融資成數6成,融資維持率=100/60=1.67
最初買進股票時的融資維持率為166%,因此若融資維持率高於166%,代表融資有賺錢,低於166%則代表套牢。
將融資維持率應用到大盤可使用下列公式計算:
市場個股融資張數*股價現值/整體市場融資餘額
我們可以藉此得知整體融資股票在市場的存活狀況,接著我們應用融資維持率於大盤,當短期均線<長期均線時,代表短期內套牢的人越來越多,因此我將期視為空頭即將來臨的訊號,出清持股。
融資維持率在這篇有更詳細的介紹。
多空頭家數排列
當一檔個股的短ma>中ma>長ma,我們將稱其為多頭排列,反之為空頭排列。
一檔股票若呈現多頭排列,代表買方的力量強大,目前的短線投機者和中長期投資者一致看好行情,股票供不應求。
但如果今天大盤多頭排列的股票家數越來越少,而空頭排列家數越來越多,代表許多個股的空方力量大過多方的力量,這時候大盤的狀況就不太樂觀了。
因此當空頭排列家數>多頭排列家數,我認為是空頭即將來臨的預兆,出清持股。
資料切割
在進行優化參數之前,我們需要將歷史資料分成兩個資料集。先用第一份資料集找出適合的參數,再用一模一樣的參數檢驗能否在第二個資料集也能有同樣好的表現。
以下是加權指數2007年~2021年的走勢圖。
我們希望在切分資料集的時候,能讓兩組資料集都經歷過市場的多空循環 這樣挑出來的參數較具有參考性 。
因此這邊將資料集切割如下:
- 訓練資料(train dataset) : 2007~2017
- 測試資料(test dataset) : 2018~2021
參數優化(以Vix為例)
在雙參數的選股模型中,我們可以根據回測training set各種參數組合,畫出熱力圖如下。
- x軸 : 短期均線
- y軸 : 長期均線
- 格子的顏色 : 總報酬
熱力圖上的每一塊代表著某一組參數組合的表現,舉個例子,右上角那一塊代表著當Vix的5ma<100ma,該策略就做出清持股的動作,而方塊的顏色就代表了總報酬。
我們可以很輕易地觀察到在左上角的紅色三角形區塊顏色較淺,代表著總報酬普遍較高(成功避開大跌),這些可能就是很好的VIX策略的參數,接下來我們試試看這些參數在test set上面表現如何。
好消息! 我們可以發現左上角的三角形區塊仍然有很好的表現,代表這附近的參數組合有極強的穿透性,在不同的時間段內都有不錯的表現,在面臨未來不同的行情下也能有更好的適應力。
當然我想大家也注意到了下方綠色圓圈部分,意思是當Vix上漲時買進下跌賣出,這績效怎麼也這麼好!?
這是跟2020疫情崩跌和極速V轉的極端行情有關,除非你相信未來的下跌行情都會複製此種模式。否則當你使用這邊的參數組合,遇到緩跌的空頭來臨時,極有可能受重傷(看看這些參數組合在training set的表現就知道)。
這也是一個很好的反例,提醒我們切分資料集的重要性。
程式實作(以融資維持率為例)
首先我們定義了一個function,輸入短期、長期均線的參數,並在短均>長均的時候,買入全市場的股票,反之則全部出清維持空手。
在這個function中,我們首先取得市場整體的融資總餘額,再藉由每支股票各自的融資餘額乘上最新的收盤價算出目前的融資總餘額市值。最後將目前的融資總餘額市值除以市場整體的融資總餘額,就是我們需要的融資維持率。
以下為完整的程式碼(附上註解),大家可以直接複製到Colab上面執行!
完整程式碼
! pip install finlab
from finlab.backtest import sim
from finlab import data
def margin_position(short_par, long_par): # 給定短期均線&長期均線的參數,計算並輸出融資維持率的濾網position
融資券總餘額 = data.get('margin_balance:融資券總餘額').fillna(method='ffill') # 填補空缺資料
融資今日餘額 = data.get('margin_transactions:融資今日餘額')
close = data.get('price:收盤價')
融資總餘額 = 融資券總餘額[['上市融資交易金額', '上櫃融資交易金額']].sum(axis=1) # 融資總餘額=上市融資餘額+上櫃融資餘額
# 融資總餘額市值=融資總餘額*各自的股票最新收盤價
融資總餘額市值 = (融資今日餘額*close*1000).sum(axis=1)[融資今日餘額.index]
mt_rate = (融資總餘額市值/融資總餘額) # 融資維持率
mt_rate = mt_rate.dropna() # 刪除nan值
short_ma = mt_rate.rolling(short_par).mean() # 用融資維持率所算出來的短期均線
long_ma = mt_rate.rolling(long_par).mean() # 用融資維持率所算出來的長期均線
entry = short_ma >= long_ma # 融資維持率短均>長均 => 持有
cond = ~close.isna() # 找出所有收盤價不為0的股票(避免下市、停牌等例外狀況)
position = cond & entry # 當融資維持率短均>長均,挑出所有正常交易(收盤價不為0)的股票全部持有
return position
position = margin_position(5, 20) # 以最常使用的 5ma & 20ma 為例
report = sim(position, trade_at_price='open', tax_ratio=0.003*0,
fee_ratio=0.001425*0, upload=True) # 零手續費(目的是檢測大盤濾網效度,並不是真的要買賣)
執行結果
回測結果
考慮到單純作為濾網,以後使用時會搭配其他選股條件降低交易頻率,因此在進行參數優化時我並沒有考慮手續費。
幫大家節省時間,接下來我會附上自己回測四種方法,並進行參數優化後,以最好的那組參數進行回測的結果。
- 藍色 : 策略報酬率
- 紅色 : 回檔幅度(drawdown)
- 灰色 : 同期間大盤的表現
ADLs
Vix
融資維持率
ps 因為從2009年後才有融資相關的資料,因此融資維持率策略測試的時間段會從2009年後才開始。
多空頭排列家數
我們可以發現四種濾網都有著很不錯的效果,MMD只有大盤的一半,同時能獲得更優異的報酬!
結論
接下來是我整理後的結論,供大家參考!
表中的數字代表名次,就實驗結果來看多空頭排列家數策略在參數的穿透性(一致性) 、 回檔的幅度 、 績效等等表現都非常好。當然這不完全代表策略彼此間的優劣,端看大家怎麼進一步進行優化,譬如我認為若將S&P500的Vix改成台指Vix,濾網的效果可能會好上不少,這就留給大家去研究啦!
總結來說,四種結果都比單純持有大盤來的更好,但可能隨著搭配不同的進出場條件,適合的大盤濾網也隨之改變,所以建議撰寫策略時大家可以四種方法都試看看!
最後的最後,獻上含有手續費版本的多空頭排列家數濾網,即便沒有其他選股條件也是挺不錯的策略呢!
好啦,這次的研究結果圓滿成功,那我也要睡啦!
窩4阿榤,下次見,掰! (⁎⁍̴̛ᴗ⁍̴̛⁎)