willbillionquant
willbillionquant

量化交易者, 數學愛好者, 歷史閱讀者, 籃球觀摩者 Medium: https://medium.com/@willbillionquant Patreon: https://www.patreon.com/willbillionquantsight FB: https://www.facebook.com/willbillionquant

評估交易系統的穩定盈利度 (Willbillion Medium 2019-03-27)

前言

本文轉載自筆者Medium 第一篇長篇著作, 並略作修改:

評估交易系統的穩定盈利度: 資本高速增長 vs 資本回撤

屈指一數, 已經一年半了. 人事翻新不知幾何, 翻讀一次自己手筆, 文中所述策略筆者曾真倉跟進, 今日束之高閣, 而最後結語部分, 有述領匯 (0823.HK) 當時為萬人迷股王, 而今從高位接近百元下挫最多近四成, 現見63元, 再回首過去18個月之大大小小社會風波, 不勝唏噓也. 就藉此作為筆者第一篇 Matters 的見面禮吧~~~


TL; DR 概要

  • 運用最大資本回測 (MDD) 量度策略風險. 
  • 運用Calmar ratio 去界定相同風險條件下的回報, 比率越大策略越穩定.
  • 複式下注所要承受的風險壓力是指數級上升的, 知易行難.


背景

量化交易對我而言, 不只是取代手動執行以及人腦判斷的工具, 更加是一種高度邏輯化與富有批判過程的思維模式. 構思一個交易策略的"大概"方向 , 把策略寫code寫進一個程式交易開發平台, 只是整個過程的開頭幾步而已. 

進場出場 (entry & exit), 注碼控制(position size control), 洽當的回溯測試 (proper backtesting), 策略參數優化 (strategy optimization), 才會放心將策略付諸模擬前測 (forward testing) 或者真倉上陣 (real-trade execution). 或許甚至要做walk-forward testing , 樣本內外的交叉驗證 (train-test-split cross-validation), 多策略的組合優化 (portfolio allocation optimization), ......

以上這些步驟, 均是量化交易走向穩定獲利的必備環節, 要在下寫幾十篇Thesis都只是以有涯隨無涯, 所以就抽取些自己相對熟悉的範疇探討下吧. 在下的確花費許多時間, 對許多算法策略的表現績效(performance result), 進行細緻入微的評估, 觀察魔鬼細節, 判斷是否安心以真金白銀運作. 所以這次的文章, 就敘述一下自己如何評估 風險調整回報 risk-adjusted return 這個相對基本的要素.


概念: 資本回撤 (Drawdown)

我做量化交易目前主力做期貨策略. 期貨是高度槓桿的工具, 高槓桿容易通過大幅加注而增加利潤以及操作空間, 從而令策略評估容易被扭曲. 假設A君與B君各有40萬港元, 操作 同一支策略 , A君用25%的倉位按金, 10萬港元, 操作一張恆指大期過去五年盈利12000點, 每點50港元, 就是50 * 12000 = 60萬港元. B君則動用一半按金, 雙倍下注2張大期, 盈利倍增到120萬港元, 但是大家所承受的風險水平根本不同, 單純比較盈利是以偏概全的. 所以應該引入 風險調整回報, 將大家的風險標準化(Standardize) 到一致水平, 大家再對比回報.

最大資本回撤 (Maximum Drawdown, MDD) 是比較容易感同身受到的風險量度, 尤其是在高槓桿操作. 資本回撤 就是 我現在的帳戶資本比起帳戶的歷史高位相差多少. 例如我的戶口曾經上過200萬, 然後曾經下滑到150萬, 那麼我的MDD金額就至少有50萬, 或者MDD 百分比 >= 25%.

下面用某個自家策略的Multicharts (MC) 回測報告說明 (Fig. 1). 該策略每次固定持有一張恆指大期, 顯示在Max # Contracts Held = 1. 回測期間為 Jan 2014 —Dec 2018, 總長60個月, 總盈利148萬, 對應每月平均493點. MDD 顯示在 Max Strategy Drawdown = 61870, 對應1238點.

Fig 1: 自家策略回測報告概要 (Backtest Report Summary) by Multicharts (MC)

策略的資本曲線(Equity curve) 由Fig. 2 的最上面subplot顯示. 中間的subplot顯示 回撤金額 (Drawdown amount), 永遠為負數或零, 只有當資產淨值創新高才會回到零. 最下面的subplot 是 回撤比率 (Drawdown percentage = 回撤金額 / 資產淨值). 留意到幾個feature:

  • MDD 出現在2016.1.27–2016.2.23 之間.
  • DD % 出現在2015年初, 在上述MDD 出現時, DD% 卻比之前下降了不少, 最近兩年的DD%更是遠低於MDD%.
Fig 2: 回測資本曲線 (Equity Curve)
  • 資本曲線大約呈平台上升型, 或者 對數增長型 (Logarithmic Growth). 雖然我們如果能夠trade到這種成績, 還是會蠻開心的, 但是再細心意想, 下面的增長曲線, 跟某些持續增長股如騰訊 (0700.HK) 的股價曲線相比 (Fig. 3), 欠缺了拋物型指數上升的成分.
Fig 3: 騰訊 (0700.HK) 股價曲線 2014–2017 by AAStocks

造成上述第2與3點觀察的成因不難懂, 就是因為 我們規定了每次固定操作一張大期. 從25萬本金, 五年累積下來的利潤令本金超過150萬, 但我們仍然操作一張大期, 而每月賺取接近500點的邊際收益 (marginal return) 遠遠低於本金只有25萬的時候. 這個就跟持續成長股不斷將盈利資本投入自身業務, 從而尋求持續的複式增長 (compound growth) 大相逕庭, 當我們對自己的操作策略的穩定度與靈活度(robustness) 有足夠的信賴, 也會適當地增加注碼, 從而效仿上述Fig 3 的指數式增長.


概念: 穩定度比率 Stability KPI

我會先探討固定張數模式下, 如何比較不同策略的風險回報收益, 這類指標我稱為 穩定度指標 (Stability KPI). 比較常用的穩定度指標是 資本淨利除以回撤比率(Return/MDD ratio). 舉例, 假設過去五年, 有兩個策略A與B.

  • 策略A: NP = 18000點, MDD = 1800點,
  • Return/MDD = 18000/1800 = 10倍
  • 策略B: NP = 12000點, MDD = 800點,
  • Return/MDD = 12000/800 = 15倍

如果大家都操作一張大期, 策略A盈利較多 (五年90萬港元), 但是帳戶回撤9萬. 策略B 就讓自己舒服得多, 帳戶最多回撤4萬元. 而且只要我資本額充足, 我做策略B兩張大期, MDD 也只有8萬, 比操作策略A一張大期還要少, 但我五年可以獲得120萬淨利, 比用50萬操作一張策略A多賺30萬, 資本運用效率好多了.

這裡有個前提, 是 回測期間完全一致. 上面例子兩者都是過去五年60個月的回測. 如果另外有策略C回測過去十年, 要做對比的考慮就複雜多了. 所以更加標準化的評估指標就是把return/MDD 再除以回測年數, 從而反映把return/MDD 平均攤分在一年裡面的效果.

Calmar Ratio = 總回報 / (MDD * 回測年數)

上面策略A與B的calmar ratio 分別是10/5 = 2倍與 15/5 = 3倍, 策略B更為優勝. 3倍的Calmar ratio, 可以理解成平均三分之一年(4個月)的盈利, 就贏回一個MDD金額回來, 為未來”正常”的回撤做準備. 再回顧上述自家策略 Fig. 1 & 2, Calmar ratio 為 23.9 / 5 = 4.784倍, 比起虛構的策略A與B績效更強, 平均來說 365/4.784 = 76天就足夠賺回一個歷史MDD.


深入研究: 注碼的複式增長

要複製好像Fig. 3 騰訊股價那種幾何級數上升的資本曲線, 運用同一策略必不可少的就是要讓注碼隨帳戶金額複式增長. 有不少備選方案可以進行注碼複式增長, 在下比較常用的是槓桿比率 Leverage ratio的概念. 目前一張大期的合約價值 contract value = 50 * 28000 = 140萬, 最低按金10萬. 上文提到運用25萬按金操作一張大期, 那麼帳戶的實際槓桿比率 (actual leverage ratio) 就是140 / 25 = 5.6倍.

要複製好像Fig. 3 騰訊股價那種幾何級數上升的資本曲線, 運用同一策略必不可少的就是要讓注碼隨帳戶金額複式增長. 有不少備選方案可以進行注碼複式增長, 在下比較常用的是槓桿比率 Leverage ratio的概念. 目前一張大期的合約價值 contract value = 50 * 28000 = 140萬, 最低按金10萬. 上文提到運用25萬按金操作一張大期, 那麼帳戶的實際槓桿比率 (actual leverage ratio) 就是140 / 25 = 5.6倍.

實際槓桿比率 = 持倉合約價值 Total Contract Value/ 帳戶資產淨值 NAV

假設我固定運用4倍槓桿開立期貨部位, 而我的起始資本 (initial capital) 是40萬, 以現價28000點來說, 我最多可以操作 40 * 4 / (28000 * 50) = 1.14張大期. 由於期貨合約數目只能是整數, 所以其實我只能操作一張大期.

一般來說, 我們能夠在網上找到的 Easylanguage 策略代碼 (MC/Tradestation所用的腳本語言), 都是假設固定注碼操作, 從而產生好像Fig 2那樣的平台型或者對數增長型的曲線, 例如

condition1 = ....
if condition1 then buy 1 contract next bar at market;condition2 = ....
if condition2 then sellshort 1 contract next bar at market;

而上述的固定槓桿比率的注碼, 可以用以下代碼:

inputs:  levratio(4), ptfactor(50);vars:    betsize(1);//Define number of contracts by fixed leverage ratio
betsize = floor(levratio*(InitialCapital+netprofit)/(ptfactor*close));//condition to long HSI Futures
condition1 = ....if condition1 then buy betsize contracts next bar at market;//condition to short HSI Futures
condition2 = ....    if condition2 then sellshort betsize contracts next bar at market;

上面的syntax 基本上跟英文類似, 讓我解釋一下幾個關鍵地方.

  • input就是declare hyperparameter 參數的地方, 在每一支bar 運作script的過程中數值維持不變. levratio(4) 就是代表我們使用固定4倍的槓桿比率. ptfactor(50)是指每點每張恆指大期50元.
  • vars 就是變量, 可以隨著每支bar的計算而改變. betsize就是我們每次的操作數量, 一開始設定為2.
  • betsize的公式計算裡面, floor() 就是提取某個數的整數部分. Initialcapital 是Easylanguage 的 保留字 (reserved word), 代表起始資金, 設定為40萬. netprofit 是從回測期開始的總利潤. Initialcapital+netprofit 就代表了每一時候的帳戶總金額. ptfactor*close就是最新的期貨合約價值. 所以整個公式就代表了4倍槓桿比率下, 每次開倉時的合約數目.

其實另外一個細節自己也會附加在上面的code, 就是無限制的注碼增長是不可能的, 如果從2張開始不斷增長到1000張, 數學上沒問題但實際操作根本不可能market order 做一千張而把滑價控制在很小範圍內. 所以我會增加限制到最多持有40張大期, 而這個改動反映在以下代碼:

inputs:  maxbet(40);betsize = minlist(floor(levratio*(InitialCapital+netprofit)/(ptfactor*close)), maxbet);

上面minlist是我很喜歡用的easylanguage function, 就是取兩個數最小者, 所以如果公式算到要持有100張, betsize也只會是maxbet=40張. 然後我設置恆指大期手續費每張19港元 (根據interactive brokers的佣金收費), 以及滑價每張單邊HK$300 (如果是固定2張我一般設置HK$200).


深入研究:  複式下注與回撤百分比 (MDD%)

把原來策略從固定張數改為固定槓桿比率, 其他核心邏輯不變, 然後就產生以下Fig. 4和Fig. 5 的回測報告概要以及資本曲線.

Fig 4. 策略複式下注的資本曲線

Fig. 4 我們發現資本曲線有了指數上升的形狀, 而複利模式下面, 我們應該是看MDD% 而不是MDD$, 因為200萬本金虧損40萬, 對比起2000萬十倍注碼虧損40萬所引起的資金損耗與心理落差都差很遠. 所以MDD 期間還是之前Fig 2 看到的2016.1.27 - 2016.2.23.

Fig 5. 策略4倍槓桿複式下注的回測概要


進階概念: 複利模式之穩定度指標 (Stability KPI)

回顧初中學過的複利率計算方法, 會計學的相關專業名詞是 CAGR (Compound Annual Growth Rate). 以符號^ 代表次方, 複利率/CAGR的基本公式為

期末金額 = 本金 * (1+CAGR)^回測年期
CAGR = (期末金額 /本金) ^(1 / 回測年期) - 1

套用到Fig. 4 的複利期貨策略,

期初本金 = 40萬, 利潤 = 1524萬, 期末金額 = 1524 + 40 = 1564萬

CAGR = (1564 / 40) ^ (1 / 5) - 1 = 108.1%

以22.94% MDD 換取CAGR 108.1% 的複利, 那麼如何對比其他複利策略的風險調整收益呢? 是否直接用CAGR% / MDD%呢? 其實不適合. 假設策略C 一年內從50萬本金增長到100萬, 然後回撤到50萬, 到年底重上100萬, 那麼CAGR=100%, MDD%=50%, CAGR / MDD% = 2, 但是我們發現 一整年的增長曾經被完全回撤掉, return/MDD等於1至少反映了這一點. 50% 的回撤, 需要通過100%的增長來挽回, 或者用數學公式表達:

1 / (1 - MDD%)^1 = (1 + CAGR) when MDD% = 50%, CAGR = 100%

上式出現的1 次方, 可以被推廣成 logarithmic-Calmar ratio (沒錯, 就是高中數學必學的對數logarithm, 書到用時方恨少吧哈哈):

(1 / (1 — MDD))^(log-calmar) = (1 + CAGR)
log-calmar = - log (1 + CAGR) / log (1-MDD)

因此Fig. 5的log-calmar ratio (Fig 1 策略, 4倍槓桿)為

log-calmar = -log (1 + 108.1%) / log (1- 22.94%) = 2.812

如果我們把4倍槓桿縮減為3倍槓桿, 會得到Fig. 6 回測報告:

Fig 6. 複式下注策略, 3倍槓桿回測

log-calmar ratio 計算如下:

CAGR = ((676+40) / 40) ^ (1 / 5) — 1 = 78.06%
MDD% = 17.19%
log-calmar = -log(1+0.7806) / log(1–0.1719) = 3.059

做一下逆向回顧, 從3倍槓桿上升到4倍槓桿持倉, 我們的複利回報的確增長不少 (回測而言, 是678萬利潤 vs 1500萬利潤), 但是log-calmar ratio 從3.059 下降到2.812倍, MDD金額 (一般是最近的回撤) 也從72萬上升到165萬. 這大概反映出當我們本金迅速飆升時, 繼續追求暴利所承受的資金回撤壓力, 是不成正比地增大, 而且真實操作比起上述的理論計算要更加殘酷.

如果這個策略的容量capacity可以無限大, 並且策略的有效期是無限長, 不限操作40張而是可以四千四萬張, 108%的CAGR, 用買一套香港樓的首期金額, 不消十幾年身家就可以超越巴菲特, 而這個是不可能的. 所以我必須寫上這些假設, “戴頭盔”在上述easylanguage code 裡面, 刻意加上 maxbet = 40這個限制, 一旦超過40張, 甚至只是20張, 基本上就要進入固定張數模式, 而策略能夠再向前運作三年而不打穿MDD則是更難得了.


總結: Buy-and-hold策略評估 & 結論

所以上述的比率 - calmar ratio, log-calmar, 或者基金界常用的sharpe ratio 等等 - 計算出來, 最主要是用來對不同的策略進行比對參照, 以及在合理資金容量以及風險管理要求下, 運用以上比率制定一個門檻 (threshold).

最後, 甚麼樣的門檻可以讓各位初入手量化交易的有志者參考呢? 一個no-brainer就是嘗試跑贏最簡單的指數ETF買入持有(buy-and-hold)策略.

盈富基金 (02800) - 互動圖表 Interactive Chart

從2014年1月頭, 以全倉1倍NAV, 23.55買入盈富基金(2800.HK), 至2018年12月末價格為26.05. 對於回測股票策略, 我們必須考慮 股價除淨 (dividend adjustment), 每年兩次除淨的股息會流入我們的戶口. 所以再從AAStocks獲取盈富基金五年股價除淨所收取的股息收益, 總共為$4.31:

盈富基金 (02800.HK) - 派息紀錄 Dividend History

根據互動圖表, 我們可以算出

期初本金 = $23.55, 期末金額 = $26.05 + $4.31 = $30.36

CAGR = (30.36 / 23.55) ^ (1/5) - 1 = 5.21%

MDD = 1-18.48 / 29.05 = 36.39% (2015.5.1–2016.2.12)

log-calmar =-log(1+0.0521) / log(1–0.3639) = 0.1122

由此可見, 過去五年買入持有香港指數, 的確並不甚理想, 或者再挑選某些股王buy-and-hold, e.g. 騰訊700.hk 進行對比:

期初本金 = $100.90, 期末金額 = $314.00 + $3.56 = $317.56

CAGR = (317.56 / 100.90) ^ (1/5) -1 = 25.77%

MDD = 1-251.4 / 476.6 = 47.25% (2018.3.20 - present)

log-calmar = -log(1+0.2577) / log(1–0.4725) = 0.3584

或者是歷經去年股災仍能創新高的領展823.hk (最能保持一直強勢的REITs):

期初本金 = $37.90, 期末金額 = $79.30 + $10.83 = $90.13

CAGR = (90.13 / 37.90) ^ (1/5) -1 = 18.92%

MDD = 1– 40.5 / 53.65 = 24.51% (2015.2.6 -2015.9.11)

log-calmar = -log(1+0.1892) / log(1–0.2451) = 0.6163

大家沒有看錯, 領展這類跟大市低相關, 低波幅卻持續能夠增長的強勢股, 超過0.6的複式log-calmar, 比起眾人皆為之瘋狂的騰訊更能穩定增值, 並不多見. 如果大家用MC或者excel/python苦苦尋覓能夠適用久一點的CTA程式策略時都踏破鐵鞋無覓處的話, 其實也可以把視野拓廣, 發掘比較貼近自己知識技術範疇的市場量化研究領域 (可以是研究公司企業基本面, 可以是多市場互動 intermarket trading, 也可以宏觀經濟/利率市場為基礎), 從而發掘屬於自己的alpha, 但最後都要贈一句互勉的說話, 就是~~~

天道酬勤~~~

CC BY-NC-ND 2.0 版权声明

喜欢我的文章吗?
别忘了给点支持与赞赏,让我知道创作的路上有你陪伴。

加载中…

发布评论