第十二章 績效度量

“績效度量”是基於一本量化交易書: “Successful Algorithmic Trading”第十二章的翻譯。互聯網上可以找到這本書的英文版本。

這一章主要描述如何對策略績效進行度量,如何評估策略的好與壞。


分割線

績效度量是算法交易中非常重要的組成部分。沒有績效評估,沒有持續的記錄,很難判斷我們的策略收益到底是來自於運氣還是真正的市場優勢。

爲了在算法交易中獲得成功,有必要明白影響交易盈利情況和最終策略的所有因素。我們應該不斷地去尋找所有算法交易棧的方方面面的改進。特別是我們應該總是盡力減少我們的交易成本(交易費,佣金以及滑點),改進軟件和硬件,改善數據源的質量以及持續尋找新的策略增加到投資組合中。所有這些領域的績效度量提供了一種標準,可以用於度量其他可選方案。

算法交易最根本是產生利潤。因此多尺度度量績效是非常重要的,可以搞清楚如何以及爲什麼我們的系統產生這些盈利。這些都激發了績效評估,在交易的層面進行評估,在策略和投資組合的層面進行評估。特別是我們正在尋找:

  • 是否已經編碼進入到策略裏面的系統規則真正產生持續的回報,是否策略在回測中擁有正收益。

  • 是否策略在實盤中能維持正收益,是否策略已經過期要被淘汰。

  • 比較多個策略和投資組合的能力,比如減少因爲分配有限的交易資本有關的機會成本。

我們感興趣的績效量化分析有如下幾項:

回報 - 交易策略最明顯的關注點,回測或者實盤的收益百分比。兩個主要的績效度量是總回報(TR)和組合年度增長率(CAGR)

回撤 - 策略或者投資組合的資金曲線之前有最高峯。我們將在下面有更具體的定義,你能想象一下你的績效圖表上有向下的坡度。

風險 - 風險有許多方面構成,我們將在後面的章節花大量的時間講解,總的來說,風險指的是資本損失,比如回報的回撤和波動,後者經常通過回報的年度標準差來計算。

風險/獎勵比率 - 機構投資者主要關心經過風險調整後的回報。更高的波動經常會導致更高的回報,當然附帶着更大的回撤。他們總是關心每單位的回報會有多少風險。因此一系列的績效度量被髮明出來用於量化策略這方面的風險,比如Sharpe Ratio(夏普比率),Sortino Ratio(索提諾比率)和 CALMAR Ratio(卡瑪比率)等等。討論策略績效時,樣本外夏普比率是機構投資者首先考慮的。

交易分析 - 先前的績效度量都是針對策略和投資組合。考察單個交易的績效也是很有意義的,也存在很多方法描述這些績效。我們將量化盈虧的交易次數,交易的平均盈利以及盈虧比等等。

交易是算法策略最基本的方面,因此我們首先進行交易分析。

12.1 交易分析

分析任何策略的第一步就是考察實際交易的績效。像這樣的指標在不同策略之間可能完全不同。經典的例子就是趨勢跟蹤策略和均值迴歸策略的績效差別。

趨勢跟蹤策略通常由許多虧損的交易,每個虧損的交易可能損失很小。當趨勢建立以後,少量盈利的交易會產生,來自這些盈利的交易的績效可能明顯超出大量虧損交易的績效。配對交易-均值迴歸策略恰恰相反。它們總是由大量微小盈利的交易組成。而且,價格序列沒有預期地迴歸均值,也可能會導致後續的損失。這可能抵消掉大量的微小收益。

本質上,你需要意識到策略的盈利和你的心理預期盈利,兩者需要一起比較。否則,你將發現在一段時間的劇烈回撤時你可能無法堅持。

我們現在看看一些交易級別的統計。

12.1.1 摘要統計

考察交易時,我們對下列的統計感興趣。這裏的“週期”指包含OHLCV(譯者注:開,高,低,收,交易量)的Bar數據覆蓋的時間週期。對於長期週期來說,經常會用到每日Bar數據。對於高頻策略,經常會用到小時或者分鐘Bar數據。

  • 總盈利/虧損(PnL)- 總的收益,表示是否策略盈利還是虧損。

  • 平均週期PnL - 平均值,在一定週期內,每個Bar平均產生的收益。

  • 最大週期盈利 - 最大值,在一定週期內,最大盈利的Bar對應的收益。

  • 最大週期虧損 - 最小值,在一定週期內,虧損最大的Bar對應的虧損。

  • 平均週期盈利 - 平均值,在一定週期內,盈利的Bar的平均收益。

  • 平均週期虧損 - 平均值,在一定週期內,虧損的Bar的平均虧損。

  • 盈利週期數 - 總的週期數,盈利的Bar的數量。

  • 虧損週期數 - 總的週期數,虧損的Bar的數量。

  • 盈利/虧損週期數百分比 - 比率,盈利週期數 / 虧損週期數。在這個指標上,趨勢跟蹤策略和均值迴歸策略之間會有顯著差異。

令人欣慰的是我們投資組合工具直接輸出了這些信息,不用再手工記錄。但是,這將導致我們從未停止過分析數據!

每個月至少評估交易1到2次,這是非常重要的。這可以幫助我們進行早期預警:當策略開始退化時能夠識別出來。這比簡單的使用累計PnL要好的多。

12.2 策略和投資組合分析

交易級別的分析對於長期策略是相當有用的,特別是有複雜交易的,比如那些涉及到衍生品的。對於高頻策略來說,對單個交易不感興趣,感興趣的是策略級別的績效度量。顯然,長期策略同樣對策略級別的績效感興趣。我們主要感興趣下面三個關鍵點:

  • 回報分析 - 策略的回報囊括了盈利的概念。在機構環境中,通常採用淨費用以及投資多少錢賺多少錢。特別是有現金流入流出時,回報計算簡單。

  • 風險/獎勵分析 - 外部投資者首先考慮的是策略的樣本外夏普比率(後面章節會描述)。這是一個業界標準尺度,嘗試描述多少風險帶來多少回報。

  • 回撤分析 - 機構環境中,這可能是三個要素中最重要的。策略,投資組合或者基金的收益和回撤範圍形成了風險管理的一個關鍵組成部分。我們將在後面的章節定義回撤。

儘管我們強調的是機構的績效,作爲個人交易者,這些仍然是高度重要的尺度,有了這些適當的風險管理(看下一章節),將形成持續策略評估的基礎。

12.2.1 回報分析

個人和機構交易者討論策略績效時最廣泛引用的數據經常是總回報,年度回報和月度回報。看到帶有月度回報表格的套保基金績效新聞是相當平常的。另外,每個人都想知道策略的“回報”到底是什麼。

在沒有外部投資或者現金流入/流出的個人交易者來說,總回報計算相對直接,百分比計算公式爲:

rt = (Pf - Pi) / Pi * 100

這裏rt是總回報,Pf是最後投資組合的美元價值,Pi是初始投資組合的美元價值。我們最感興趣的是淨回報,那就是扣除交易/業務手續費以後的投資組合/基金價值。

注意,這個公式僅僅應用於做多和無槓桿的投資組合。如果希望增加賣出或者槓桿操作,我們需要修改回報計算公式,因爲交易的是借來的更大的投資組合,這叫做保證金交易。

舉個例子,一個交易策略買進1000美金的某個品種,然後賣出1000美金的另外一個品種。這是以美元爲中心的投資組合,名義交易總量爲2000美金。如果這個策略生成200美金的收益,那麼這個交易的總回報爲10%。當你考慮借貸費用和槓桿利率時,這將變得更復雜。去除這些成本將會得到淨總回報,這就是經常引用的“總回報”。

資金曲線

假如這個基金做的很好,資金曲線通常是基於基金績效報告最重要的可視化成果之一。它是總的時間與投資組合淨值的圖表。本質上,它用於展示基金從成立開始賬戶的增長情況。同樣,對於個人交易者,它展示了賬戶資產在整個交易期間的增長情況。下圖是一個典型的資金曲線圖:

典型日內策略資金曲線

像這樣的圖有什麼用處?本質上它是策略過去波動的“調味劑”,也是一個可視化指標,從圖像中可以看出策略運行過程中,是否存在很長一段時間的停滯時期或者回撤。它也揭示了策略交易期結束時總回報如何計算。

在資金曲線中,我們可以找到不尋常的歷史事件如何影響策略。比如,一個常見的問題就是2008年策略是否有過度的波動。另一個問題則可能關心回報的一致性。

解釋資金曲線時必須小心的是它總是顯示“向上傾斜的線”.通過分割曲線,我們能看到劇烈波動時期或者可能在整個時間段並不嚴重的持續回撤。因而資金曲線需要考慮其他一些分析,特別是風險/獎勵分析和回撤分析。

12.2.2 風險/獎勵分析

上面我們提到的風險/獎勵分析在機構環境中是非常重要的。當然,作爲個人投資者也不能忽視。你應該密切注意策略的風險/獎勵度量,因爲它們將影響策略的回撤,槓桿和總的複合增長率。

這些概念將在下一章“風險和資金管理”進一步講解。現在我們將討論一般的比率,比如夏普比率,在金融領域非常普遍的比較手段。它在量化交易中有非常高的關注,因此我們將更詳細的討論它。

夏普比率

考慮這樣的情形:我們有兩個回報相同的策略。我們如何知道哪個策略有更高的風險?更進一步,更高的風險指的是什麼?在金融領域,我們經常關心回報的波動和回撤週期。因而當其中一個策略的回報有明顯高的波動,我們可能認爲它是不夠吸引人的,儘管它的歷史回報可能是相似或者一樣的。這些策略比較的問題和風險評價激發了夏普比率的使用。

William Forsyth Sharpe 是諾貝爾經濟學獎獲得者,他於1966年創建了資產定價模型(CAPM)和開發了夏普比率。

夏普比率 S 定義如下:

這裏Ra是資產或者策略的回報,Rb是基準的回報,比如無風險利率。

這個比率實際是回報的均值除以回報的標準偏差。因此,在同樣的回報均值的情況下,回報的更低的波動將會導致更大的夏普比率。

經常會被用到的是年度夏普比率,它的計算依賴交易週期,假定一年有N個交易日,年度夏普比率定義如下:

注意,夏普比率本身也需要基於時間週期來計算。比如一個基於“天”週期的策略,N = 252 (一年有252個交易日,不是365),Ra,Rb是每天的回報。類似基於“小時”週期的策略,N = 252 * 6.5 = 1638, 不是 N = 252 * 24 = 6048,因爲在美國股票市場,一個交易日只有6.5小時。

上面的夏普比率公式暗含了基準的使用。基準作爲一個衡量尺度,衡量策略是否值得考慮。比如,一個操作美國大盤股的簡單做多策略平均下來收益應該能戰勝S&P500指數,或者有更小的波動,否則直接投資指數有更低的管理費,更划算。

基準的選擇有時是不清晰的。ETF指數基金應該作爲個股的績效基準嗎?還是S&P500?爲什麼不是Russell 3000?同樣地對衝基金策略應該與市場指數進行比較還是應該與其他對衝基金比較呢?

“無風險利率”也有爭議。指國債利率?或者一攬子國際債券利率?又或者短期或長期票據利率?又或者幾者混合?很明顯,有很多方式選擇基準。針對美股策略,夏普比率一般選擇10年期國庫券利率作爲無風險利率。

也有特例,針對市場中性策略,選擇使用無風險利率還是0作爲基準是一個難點。市場指數本身不是市場中性的。對於市場中性策略,不應該減去無風險利率,它是自給的。因爲你持有保證金也能夠獲得貸款利息Rf, 實際回報的計算如下:

(Ra + Rf) - Rf = Ra. 因此,市場中性的策略沒有真正減去無風險利率。

儘管在量化金融領域,夏普比率非常流行,但是它也有很多限制。夏普比率是“後向”指標,它只是統計歷史回報分佈和波動,不代表將來。當我們通過夏普比率來做決策時,一個明顯的假定就是過去與未來相似。這明顯不總是這樣,特別是市場機制改變的時候。

夏普比率計算假定回報是正太分佈(高斯分佈)。不幸的是,市場經常遭遇超過正態分佈的尖峯。本質上回報的分佈是“厚尾”分佈, 我們相信極端事件比高斯分佈更可能出現。因此,夏普比率很難刻畫“尾部風險”。策略中像這樣的風險很明顯,比如看漲期權的銷售又叫做“滾動的便士”。隨着看漲期權的銷售,期權溢價源源不斷的產生,這將導致低波動的,遠遠超過基準的回報。這個例子中,策略擁有高夏普比率。但是它沒有考慮到像這樣的期權可能被“召回”,導致明顯的回撤甚至歸零。因此夏普比率不能被孤立的使用。

顯而易見地,爲了更加真實,交易費用應該包含在夏普比率的計算當中。有很多交易策略的例子中,它們有高的夏普比率和大的盈利可能性,一旦考慮了真實的交易成本,實際上變成低的夏普比率和低的盈利策略。這意味着我們計算夏普比率時時應該採用淨回報,計算過程中應該考慮交易成本。

一個顯而易見的未解決的問題是“一個好的交易策略的夏普比率應該是多少?”。這真正是一個很難回答的問題,因爲不同的投資者有不同的風險偏好。一般的規則是:年度夏普比率 S < 1 的量化策略通常不應該被考慮使用。但是這也有例外,特別是期貨市場中的趨勢跟蹤策略。

量化基金通常忽略夏普比率 S < 2的策略。我熟悉的一個有影響力的量化對衝基金甚至不會考慮使用夏普比率 S < 3的策略。作爲個人算法交易者,如果你能夠獲得樣本外(或者實盤交易)夏普比率 S > 2的策略,你將可以做的很好。

夏普比率通常隨着交易頻率的增加而增加。一些高頻策略有高1位數字(有時低2位數字)的夏普比率。因爲這些策略幾乎能夠每天每月都能盈利。這些策略很少遭受災難性風險(比如大的損失),並且能夠減小回報的波動,這導致了相當高的夏普比率。意識到像這樣的高頻策略也可能突然失去作用,但這是風險的另一個方面,並不會完全反映在夏普比率上。

現在我們看看夏普比率實際的例子。我們考慮一個簡單的,只買多,只買單個股票,買入並持有的市場中性策略。我們用Pandas來完成這些例子代碼。

第一個任務是獲取數據,然後把它置入Pandas DataFrame對象。先前的章節我們用Python和MySQL實現了這些。另外,我們可以用簡單的代碼抓取Google金融數據。這段代碼的最後我創建了一個方法,基於回報的時間序列來計算年度夏普比率。代碼如下:

#!/usr/bin/python

# -*- coding: utf-8 -*-

# sharpe.py

from __future__ import print_function

import datetime

import numpy as np import pandas as pd

import pandas.io.data as web

def annualised_sharpe(returns, N=252): 

    """

    Calculate the annualised Sharpe ratio of a returns stream

    based on a number of trading periods, N. N defaults to 252, which then 

    assumes a stream of daily returns.

    The function assumes that the returns are the excess of

    those compared to a benchmark.

    """

    return np.sqrt(N) * returns.mean() / returns.std()

現在我們可以直接從Google金融數據來計算年度夏普比率,我們可以針對2個股票來測試購買持有策略。我們將採用2000年1月1日到2013年1月1日的Google金融數據。

可以創建一個工具方法幫助我們快速的查看相同週期,跨多個股票的購買持有策略的夏普比率。

代碼如下:

def equity_sharpe(ticker): 

    """

    Calculates the annualised Sharpe ratio based on the daily

    returns of an equity ticker symbol listed in Google Finance.

    The dates have been hardcoded here for brevity. 

    """

    start = datetime.datetime(2000,1,1)

    end = datetime.datetime(2013,1,1) 

    # Obtain the equities daily historic data for the desired time period # and     

    add to a pandas DataFrame

    pdf = web.DataReader(ticker, ’google’, start, end)

    # Use the percentage change method to easily calculate daily returns

    pdf[’daily_ret’] = pdf[’Close’].pct_change()

    # Assume an average annual risk-free rate over the period of 5%

    pdf[’excess_daily_ret’] = pdf[’daily_ret’] - 0.05/252

    # Return the annualised Sharpe ratio based on the excess daily returns

    return annualised_sharpe(pdf[’excess_daily_ret’])

對於谷歌股票,買入持有策略的夏普比率爲0.703:

>>> equity_sharpe(’GOOG’)

0.70265563285799615

現在我們可以針對市場中性策略做同樣的計算。市場中性的策略的目標通常是特定股票的績效。通過做空相同金額的ETF基金可以達到這個目標,ETF基金是用來跟蹤市場的。對於美國股票市場,顯而易見的是選擇 S&P500指數,它是用來跟蹤 SPDR ETF的,股票代碼:SPY。

爲了計算像這種策略的年度夏普比率,我們獲取SPY的歷史價格,跟之前的股票一樣計算回報的百分比。這裏的例外是我們不使用無風險基準利率,我們將計算淨回報,通過減去做多和做空的回報,並且除以2,因爲我們使用了2倍的交易成本。下面是Python/pandas代碼:

def market_neutral_sharpe(ticker, benchmark):

    """

    Calculates the annualised Sharpe ratio of a market

    neutral long/short strategy inolving the long of ’ticker’ with a  

    corresponding short of the ’benchmark’.

    """

    start = datetime.datetime(2000, 1, 1)

    end = datetime.datetime(2013, 1, 1)

    # Get historic data for both a symbol/ticker and a benchmark ticker

    # The dates have been hardcoded, but you can modify them as you see fit!    

    tick = web.DataReader(ticker, ’google’, start, end)

    bench = web.DataReader(benchmark, ’google’, start, end)

    # Calculate the percentage returns on each of the time series

    tick[’daily_ret’] = tick[’Close’].pct_change() 

    bench[’daily_ret’] = bench[’Close’].pct_change()

    # Create a new DataFrame to store the strategy information # The net returns   

    #are (long - short)/2, since there is twice # the trading capital for this           

    #strategy

    strat = pd.DataFrame(index=tick.index)

    strat[’net_ret’] = (tick[’daily_ret’] - bench[’daily_ret’])/2.0

    # Return the annualised Sharpe ratio for this strategy

    return annualised_sharpe(strat[’net_ret’])

對於Google股票,多空市場中性策略的夏普比率是0.832:

>>> market_neutral_sharpe(’GOOG’, 'SPY')

0.83197496084314604

我們下面將討論其他的風險/獎勵比率。

索提諾比率

夏普比率同時捕捉向上和向下的波動,但是,投資者(對衝基金經理)總的來說不會被明顯向上的波動困擾。風險管理中感興趣的主要是向下的波動和回撤週期。因此索提諾比率被定義成回報均值除以向下的波動的偏差:

索提諾比率在機構環境裏會被使用,但很確定的是不如夏普比率那麼普遍。

卡馬比率

有人可能會爭論投資者或者交易者也關心最大回撤,而不是平均回撤。CALMAR(加利福利亞管理賬戶報告)比率由此產生,也叫做回撤比率,它定義爲回報均值除以最大回撤:

再次說明,卡馬比率不像夏普比率使用那麼廣泛。

12.2.3 回撤分析

我認爲,回撤是算法交易系統最重要的一個方面。簡單的說,如果你的賬戶資金被消滅了,什麼績效指標都不重要。回撤分析關心賬戶資金從高水位的點下降的幅度。高水位的點定義爲最近賬戶資金在資金曲線上的峯值。

在機構環境中,回撤特別重要因爲大多數對衝基金只有當賬戶資金持續創新高才有酬勞。也就是說,一個基金經理沒有績效費如果基金維持在“水位以下”,比如賬戶資金回撤了一段時間。

當一個基金有10%的回撤時,大多數投資者會擔心,並且將會贖回他們的投資一旦回撤超過30%。在個人環境中,這種情形非常不同。個人可能可以承受較大的回撤來換取更高的回報。

最大回撤與回撤持續時間

兩個關鍵的回撤指標是最大回撤和回撤持續時間。前一個描述賬戶資金從前一個高峯位置最大比例的回撤到當前位置或者前一個低谷。在機構環境中交易基金時經常被使用。個人交易者也對這個數據保持極大的關注。後一個描述回撤的持續時間。這個數據經常以“天”爲單位來表示,但是更高頻策略會用細粒度的時間週期。

在回測中,這些方法提供了一些主意供我們判斷策略在將來會如何表現。整體而言,資金曲線可能看起來非常誘人,但是,向上的資金曲線可能很容易掩飾先前經歷的回撤有多麼困難。

當一個策略的回撤低於10%,或者低於20%時,需要強大意志力來繼續執行這個策略。儘管策略可能在歷史上,在回測中,經歷過類似的時期。對於算法交易和系統交易都面臨同樣的問題。這也自然地激發了設置回撤邊界和特定的規則,比如當回撤達到設置的級別時賬戶止損。

回撤曲線

重要的是感受最大回撤和回撤持續時間,看策略回撤的時間序列圖表肯定更有吸引力。

Fig 12.2.3很清晰的表明這個策略遭遇了相當長時間的回撤從2010第三季度到2011年第二季度,最大回撤達到14.8%。然而策略本身在想當長的時間持續明顯的盈利,這個特定時期非常困難值得忍耐。另外,這是迄今爲止目前發生的最大歷史回撤,策略有可能在將來發生更大的回撤。有必要和其他績效方法一樣關注回撤曲線。

Figure 12.2: 典型日內策略回撤曲線

在下面的章節我們將討論量化風險管理的概念和描述能幫我們最小化回撤和最大化回報的技術,始終保持風險在合理的程度。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章