護國神山抄底策略

俄烏戰地風雲讓資本市場遍地烽火,股市逆風吹,世局紛擾,通膨被火上加油。今年以來多數市場指數都呈現下跌,還有再漲的多是原物料大國如巴西、阿根廷、印尼…俄羅斯封盤墊底,歐元區國家即將跌入20%熊市,美國科技股也被k了-15%,台股在去年高基期下的跌幅還算輕,表現贏過亞股裡的中港日韓。

在這樣淒風苦雨的環境下,也是左側交易者或是抄底搶反彈投機客大展身手的時候!有沒有什麼標的平常貴鬆鬆買不下手,現在難得打折了?

2022主要股市表現回顧

護國神山抄底抄起來?

台積電這類法人機構影響力大的標的,擁有高效率市場特性,很難從已知的基本面佔到優勢,還記得1月初台積電法說會前後,當時外資紛紛樂觀調高目標價到千元,股價攻高到680波段高點,若當時見到法說利多攻進去,現在就面臨套牢的窘況,雖然台積電的基本面仍很好。

高效率市場特性的標的最好的買點就是大環境全面崩壞、投資人紛紛逃出的時候。近日戰爭與通膨剛堅強的護國神山也扛不住了,一週被外資狂賣30萬張,跌破600元,外資報告跟著調低目標價 (仍有800多元),而本土投顧、法人則喊600元以下台積電是天上掉下來的禮物,趕快買就對了。
如今台積電已從高點回檔18%,今天看到新聞標題:「台積電大跌狂撿甜甜價,他一路抄底4次「綠到發慌」。」

你也抄底抄到手軟了嗎?若買在600,短短幾天賬損也到6%,若你攤平前沒有做過數據分析,那你很難先對「抄到沒錢時,股價繼續下跌。」有所準備,只是憑直覺去猜。

布林通道逆勢策略

抄底就是所謂的逆勢策略,能不能用量化的方式實測呢?
布林通道是最廣為人知的逆勢方法,原理是運用均線和標準差,大部分 K 線都涵蓋在 d日 MA 上下,並在 n 個標準差的範圍之內操作。d數值越大,價格曲線越平滑,能減少波動雜訊,n數值越大,能產生越極端狀況的訊號,一般範圍設定在1-3。
當股價跌破下軌通道,可能出現超賣訊號,會再之後均值回歸,產生反彈到中軌通道附近。

策略實作

finlab套件能很輕易讓我們實作上述的策略來驗證想法,如果你還沒裝過finlab量化回測套件,可以參考我們的文檔,快速安裝來體驗。這邊以2.5個標準差、40日平均線週期設定布林通道,讀者可自行使用其他數值做簡單實驗。

from finlab import data
from finlab.backtest import sim

close=data.get('price:收盤價')
upperband, middleband, lowerband = data.indicator('BBANDS', resample='D', nbdevup=2.5, nbdevdn=2.5,timeperiod=40)
entries = lowerband>close
exits = close>middleband

position = entries.hold_until(exits,nstocks_limit=100000)
report=sim(position,upload=False)
# 產生交易紀錄
trade_record=report.trades
trade_record=trade_record[trade_record['stock_id']=='2330']
# 產生交易歷程的波動紀錄
mae_mfe_exit=report.mae_mfe.loc[trade_record.index]['exit']
mae_mfe_exit=mae_mfe_exit.drop(columns=['return'])
df=pd.concat([trade_record,mae_mfe_exit],axis=1)
df

回測數據分析

  • win ratio: 86.96
  • return_mean: 4.93
  • mae_mean: -3.63
  • bmfe_mean: 2.25
  • gmfe_mean: 6.06
  • mdd_mean: -9.01


台積電歷往出現的訊號次數不多,要讓護國神山山崩不太容易,每次都發生在大環境崩壞的時刻,2007年後共出現過23次,平均持有20日,每筆平均搶到4.9%獲利,勝率87%。
不過要注意的是MAE (最大不利方向幅度)、MDD (最大回撤)都有一定的數值,代表抄底買進後往往都還有回檔、持有過程震盪不小,難有抄在最低點這回事。
gmfe_mean比return_mean大,代表持股歷程中的最大平均漲幅比最終平均報酬還高,我們可能有停利空間可以操作。俗話說搶反彈如搶銀行,行動要快狠準,不求多,可以設獲利10%時就出場,有機會取得比平均報酬5%以上更高的獲利。只要在hold_until的function就可以設置停利 (takeprofit),是不是很簡單呢?

from finlab import data
from finlab.backtest import sim

close=data.get('price:收盤價')#[['2330']]
upperband, middleband, lowerband = data.indicator('BBANDS', resample='D', nbdevup=2.5, nbdevdn=2.5,timeperiod=40)
entries = lowerband>close
exits = close>middleband

position = entries.hold_until(exits,nstocks_limit=100000,takeprofit=0.1)  #,takeprofit=0.1
report=sim(position,upload=False)
# 產生交易紀錄
trade_record=report.trades
trade_record=trade_record[trade_record['stock_id']=='2330']
# 產生交易歷程的波動紀錄
mae_mfe_exit=report.mae_mfe.loc[trade_record.index]['exit']
mae_mfe_exit=mae_mfe_exit.drop(columns=['return'])
df=pd.concat([trade_record,mae_mfe_exit],axis=1)
print(f"win ratio: {round(len(df[df['return']>0])/len(df)*100,2)}")
print(f"return_mean: {round(df['return'].mean()*100,2)}")
print(f"mae_mean: {round(df['mae'].mean()*100,2)}")
print(f"bmfe_mean: {round(df['bmfe'].mean()*100,2)}")
print(f"gmfe_mean: {round(df['gmfe'].mean()*100,2)}")
print(f"mdd_mean: {round(df['mdd'].mean()*100,2)}")

  • win ratio: 86.96 return_mean: 5.27
  • mae_mean: -3.31
  • bmfe_mean: 1.34
  • gmfe_mean: 6.06
  • mdd_mean: -8.75
  • 加入停利後,可以發現報酬率提升一點點,MAE和MDD縮小,持股歷程更舒服了。

    結論

    拜外資瘋狂倒貨所致,這個少見的抄底訊號在昨日出現,神山要倒也只有這個時候,3/8以563元買入,最終會如何呢?
    藉由布林通道,我們能知道何時會有相對低點的極端反轉機會,藉由report.trades與report.mae_mf,我們可以取得回測結果的波動分析,了解反彈報酬目標、可能回檔範圍、停損停利空間的輪廓,進而知道應對進退,而不是跟投顧老師一樣”避著眼睛買”!
    如果你對台積電很有愛,可以複習另一篇台積電均線策略的範例。也許你能夠有更多想法,開發出更棒的策略!

    程式碼範例

    檔案連結

    Ben

    Python軟體工程師與內容編輯。 鑽研ETL、網頁後端、資料視覺化的程式應用。 投資主力在台股市場,量化策略為主、質化分析為輔,逐步將觸角延伸到美股、加密貨幣,朝更全面的交易人邁進。