量化交易者, 數學愛好者, 歷史閱讀者, 籃球觀摩者 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點.
策略的資本曲線(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%.
- 資本曲線大約呈平台上升型, 或者 對數增長型 (Logarithmic Growth). 雖然我們如果能夠trade到這種成績, 還是會蠻開心的, 但是再細心意想, 下面的增長曲線, 跟某些持續增長股如騰訊 (0700.HK) 的股價曲線相比 (Fig. 3), 欠缺了拋物型指數上升的成分.
造成上述第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 我們發現資本曲線有了指數上升的形狀, 而複利模式下面, 我們應該是看MDD% 而不是MDD$, 因為200萬本金虧損40萬, 對比起2000萬十倍注碼虧損40萬所引起的資金損耗與心理落差都差很遠. 所以MDD 期間還是之前Fig 2 看到的2016.1.27 - 2016.2.23.
進階概念: 複利模式之穩定度指標 (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 回測報告:
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, 但最後都要贈一句互勉的說話, 就是~~~
天道酬勤~~~
喜欢我的文章吗?
别忘了给点支持与赞赏,让我知道创作的路上有你陪伴。
发布评论…