Skip to main content

【程式交易實戰 03】策略績效度量的方法(下)

· 14 min read

歡迎來到 程式交易實戰 的第三堂課,還記得上週學到衡量策略績效的方法嗎?本堂課會繼續介紹衡量策略績效的方法,但會比較著重在衡量「風險」以及「交易週期」的部分。 另外,也將帶大家揭開坊間常見技術指標的回測績效!

讀完本篇文,您將學會...

  • 熟悉衡量策略績效的方法:最大回檔、夏普比率、與大盤比較
  • 熟悉波段交易策略:均線策略、布林通道策略、 MACD 策略
  • 實作波段策略的績效回測

如何衡量策略績效

上週文章經由幾個情境的引導,我們了解報酬率並不是唯一的參考指標,過程中資金的變化也十分重要, 因為實單交易時,我們不一定能夠承受自己的真金白銀在交易過程中有這麼大的虧損,所以除了報酬率外,我們也需要能夠反應過程的評估指標。廢話不多說,馬上介紹以下指標給大家參考:

最大回檔 (Max Drawdown, MDD)

MDD 是量化交易中會特別重視的指標,主要目的是讓交易者能夠先預期此策略的虧損性,了解此策略在過去所隱藏的風險,進而分配合適的資金來執行策略。

說明圖例如下:

week3_01

假設有一策略的初始資金為 1000,在達到紅線時資金為 1600,隨後持續下跌到最低點時為 1100, 產生的 MDD 為 (1100/1600-1)*100% = -31.25%

有了以上數據,我們即可自行評估,若使用此策略,是否能夠冷靜地在虧損 30% 後還持續持有,等待後續走勢的反轉呢?

如果最大回檔已超出您平常可承擔的範圍,很可能會導致您未來面對虧損時無法冷靜、忠實的執行這個策略,建議您需降低資金在此策略的投入比例!

夏普比率(Sharpe ratio)

除了 MDD 之外,夏普比率也是一個能夠協助我們評估交易過程資金變化的重要指標之一,公式如下:

夏普比率=年化(每日)報酬率無風險利率每筆報酬率之標準差夏普比率 = \frac{年化(每日)報酬率 - 無風險利率}{每筆報酬率之標準差}

夏普比率反映在一定的波動(風險)下,可以得到的報酬。 在同樣的風險下,夏普比率較高的策略會有較高的報酬;換句話說,在同樣的報酬下,夏普比率高的策略會承擔較低的風險。

與大盤比較

除了以上指標,大盤也是一個相當重要的參考依據之一!通常當我們得到一個策略的回測結果,我們也會和大盤走勢相比較,假設回測結果差於大盤許多,代表此策略相對沒那麼有意義(不如 buy and hold 0050 等大盤型 ETF 跟著台股市場走),交易付出了許多精力又需承受了交易的緊張感,勢必得獲得比 0050 更優秀的報酬來當作目標吧?

下圖點出兩種交易者的風險及他們所承受的心理壓力,若最後的終點沒有比較高,那何必這麼辛苦呢?所以與大盤報酬比較也是十分重要的。

week3_02

source: https://en.bitcoinwiki.org/wiki/Hodl

因此 報酬與夏普比率高於大盤且 MDD 低於大盤,就是我們正在追求的策略!

實作策略績效 - 回測常見的波段策略

前兩篇文章已經介紹了當沖策略以及回測當沖策略的績效表現,接著要帶大家了解市場常見的波段策略績效到底是如何呢?

均線策略

在市場上我們時常聽到投顧老師常說「X日均線、X日均線黃金交叉買進!」,我們就來驗證一下投顧老師的真實性,看看這樣的交易策略在歷史的交易上是否能夠真的獲利呢?

為了驗證這個策略,我們需要開始撰寫程式來進行回測,而回測又需要大量齊全的歷史資料,對於初入量化交易的讀者們來說應該都十分困擾,幸好 Finlab 回測平台 已經幫我們準備好相當齊全的回測工具了!本文章的回測程式將以 Finlab 平台展示,讀者們也可以去體驗看看唷!

均線代表的是週期內股價的趨勢,若將多週期的均線做排列可以幫助我們判斷整體的趨勢是屬於「多頭」、「空頭」或是「盤整」階段。均線也可被視為是過去一段時間內投資人買進的「平均成本」,若股價保持在均線的上方,代表在週期內買進的投資人多為獲利的狀態,所以均線可能會發揮支撐的作用;相反的,若股價保持在均線的下方,代表在週期內的投資人多為虧損的狀態,當股價上漲至均線時很可能會有投資人些微認賠賣出而有「解套賣壓」,使得股價又下跌。

簡單解釋均線代表的意義後,我們就知道為什麼常會有人說黃金交叉買進、死亡交叉賣出了,因為他們分別表示著一段可能發生「多頭」、「空頭」行情的起點,以下我們就以「5 日線與 10 日線黃金交叉買進、5 日線與 60 日(季)線死亡交叉賣出」並延續前面幾堂課的測試標的選擇長榮 (2603.tw) 作為範例:

# 安裝相關套件
!pip install finlab
!pip install talib-binary # 若您尚未安裝 TA-Lib 計算技術指標的套件,建議您先安裝
# 載入相關套件
from finlab import data
from finlab.backtest import sim

close=data.get('price:收盤價')
ma5 = data.indicator('SMA', resample='D', timeperiod=5)
ma10 = data.indicator('SMA', resample='D', timeperiod=10)
ma60 = data.indicator('SMA', resample='D', timeperiod=60)

entries = ma5 > ma10 # 進場條件
exits = ma60 > ma5 # 出場條件

symbol = ['2603'] # 可換成其他個股或多檔個股

position = entries.hold_until(exits)[symbol]
report = sim(position, upload=True, mae_mfe_window = 40, name = '均線策略範例') # 查看視覺化回測結果
trade_record = report.trades # 可查看透過此策略的逐筆交易紀錄

week3_MA 上圖顯示均線策略模擬買賣長榮的回測結果,我們從中發現雖然近兩年的報酬明顯優於大盤,但夏普值只有 0.4 代表當承受 1% 風險時,只能得到 0.4% 的報酬; MDD 也高達 75.5%,若您從過去持續追隨此策略的過程中,須先承受 75.5% 的虧損,才有機會在近兩年獲得優於大盤的報酬,這其實對投資人來說相當不容易,多少人在不斷虧損時,就開始自我檢視甚至是捨棄掉此交易策略了呢?

了解均線後,接著我們來認識加入統計概念的技術指標 - 布林通道!

布林通道策略

布林通道(BBand)也是一個非常知名的指標,它結合了均線和標準差的概念進行交易,分為上軌、中軸、下軌等 3 條線。

  • 上軌線:壓力線,由中軌線 + 數倍標準差所形成
  • 中軸線:數日均線
  • 下軌線:壓力線,由中軌線 - 數倍標準差所形成

week3_03

布林通道策略分為逆勢交易與順勢交易:

  • 逆勢交易策略

    逆勢策略有個前提假設是認為「股價會在一定區間內震盪」,當股價到達上軌線代表股價接近超漲很可能會回檔;當股價到達下軌線代表股價接近超跌很可能會反彈。所以逆勢策略的研究重點為尋找「震盪的範圍」,它可能可以透過統計股價在一段期間內波動的分布或是以某些指標作為判斷方法。

  • 順勢交易策略

    富果直送的 < 技術指標介紹 > 曾提到,當大趨勢發生時,股價往往會偏離原有的軌道區間;因此當股價突破上軌線時順勢買進,當股價跌破下軌線時順勢賣出,作為跟隨趨勢的策略操作邏輯。

以下使用 20 日(月)線和 2 倍標準差等參數作為布林通道順勢策略的範例,讀者在了解基本概念後,也立即動手試試吧!

close=data.get('price:收盤價')
upperband, middleband, lowerband = data.indicator('BBANDS', resample='D', nbdevup=2.0, nbdevdn=2.0, timeperiod=20)

entries = close > upperband # 收盤價大於上軌線
exits = lowerband > close # 收盤價小於下軌線

symbol = ['2603']

position = entries.hold_until(exits)[symbol]
report = sim(position, upload=True, mae_mfe_window=40, name='布林通道範例')
trade_record = report.trades # 可查看透過此策略的逐筆交易紀錄

week3_04 回測結果顯示,與均線策略相比,此標的較適合布林通道順勢策略,但 MDD 61.7% 也不算低,也須留意自身是否能承受此虧損!

MACD 策略

MACD 指標也是市場上投資人常用的指標之ㄧ,「 MACD 黃金交叉、柱體翻紅」等都是被時常拿來做為交易訊號使用,MACD 指標也分為 3 個子項:

  • 快線:兩條不同週期的 EMA 之差
  • 慢線:任意週期的快線 EMA
  • MACD:(快線 - 慢線)* 2

MACD 可協助投資人判斷目前股價的狀態為何,若快線和慢線出現黃金交叉,通常代表預期發生一段上漲行情;若快線和慢線出現死亡交叉,則代表預期有一段下跌行情。

若以上為真實發生的情況,那我們即可將此訊號作為買賣依據,採取「黃金交叉買進,死亡交叉賣出」策略作為範例如下:

close = data.get('price:收盤價')
MACD, MACDsignal, MACDhist = data.indicator('MACD', resample='D', fastperiod=12, slowperiod=26,signalperiod=9)

entries = MACD > MACDsignal
exits = MACDsignal > MACD

symbol = ['2603']

position = entries.hold_until(exits)[symbol]
report = sim(position,upload=True,mae_mfe_window=40, name='MACD')
trade_record = report.trades

week3_05 回測結果顯示,一樣有 MDD 稍大的問題。但對於波動較大的股票,您可以試試加入停損機制,在損失固定比例時先認賠出場,或許能大幅降低 MDD!

推薦延伸閱讀:【關鍵報告】想用程式自動下單,需要了解哪些常見技術指標與原理?

結語

本週課程我們認識了量化交易中最常用來評估風險的指標包含「夏普比率」、「最大回檔」,能夠讓投資人預先評估資金的變化率是否能夠接受,並可以藉此進一步調整策略或是資金分配比例。另外,我們也實作了 3 種常見的技術指標以及了解其原理與意義。下一步,讀者可以透過 Finlab 回測平台更方便地進行參數修改或將不同指標疊加做成新的訊號來進行回測,快去試試吧!