アルゴリズムによる取引パフォーマンスの測定のためのシャープ比率

作者: リン・ハーン優しさ作成日: 2019-03-18 13:24:11,更新日:

アルゴリズム的な取引戦略を実行する際には,年間収益を最も有用なパフォーマンスメトリックとみなす誘惑があります.しかし,この指標を孤立して使用するには多くの欠陥があります.特定の戦略の収益の計算は完全に単純ではありません.これは特に市場中立型やレバレッジを使用する戦略などの方向性のない戦略に当てはまります.これらの要因により,収益のみに基づいて2つの戦略を比較することは困難です.

さらに,同じリターンを有する2つの戦略が提示された場合,どちらがリスクが高いかをどのように知ることができますか? さらに",より多くのリスク"とは何を意味しますか? 金融では,私たちはしばしばリターンの変動と引き下げ期間に関わります. したがって,これらの戦略のうちの1つがリターンの変動が著しく高い場合,歴史的なリターンが類似している場合でも同一でない場合でも,それはあまり魅力的ではありません.

これらの戦略比較とリスク評価の問題は,シャープ比率の使用を動機づけています.

シャープ比率の定義

ウィリアム・フォースイス・シャープはノーベル賞を受賞した経済学者で,資本資産定価モデル (CAPM) を作成し,1966年にシャープ比率を開発した (後に1994年に更新された).

シャープ比 S は次の関係で定義される.img対象資産または戦略の期間利回りであり,適正なベンチマークの期間利回りである.

この比率は,資産または戦略の過剰リターンの平均平均を,それらのリターンの標準偏差と比較する.したがって,リターンの変動が低い場合,同一のリターンを前提に,より高いシャープ比率につながります.

取引戦略を実行する者によってしばしば引用される"シャープ比率"は,収益が測定される取引期間によって計算される年額シャープである.年にN回の取引期間があると仮定すると,年額シャープは次のように計算される.imgシャープ比率は,その特定の時間期型のシャープに基づいて計算されなければならないことに注意してください. 取引期間をベースとした戦略では,N=252 (年間には252日ではなく365日があり),Ra,Rbは日々のリターンでなければなりません.同様に,取引日に6.5時間しかないため,N=252×6.5=1638ではなく,N=252×24=6048で,時間帯は N=252×6.5=1638です.

バンチマークの含有

上記のシャープ比率の式は,ベンチマークの使用を指す.ベンチマークは,特定の戦略が検討に値するものであるために克服しなければならない"ヤードスティック"または"障害物"として使用される.例えば,米国の大額資本証券を使用する単純なロング戦略は,平均的にS&P500指数に勝る,または変動が少ないためにそれに匹敵することを期待すべきである.

ベンチマークの選択は時に不明確である.例えば,セクターエクスチェンジ・トレード・ファンド (ETF) が個々の株式のパフォーマンスベンチマークとして利用されるべきか,またはS&P500自体なのか?なぜラッセル3000ではないのか?同様にヘッジファンド戦略は,市場指数または他のヘッジファンドの指数と比較してベンチマークされるべきか?また,リスクフリーレートの複雑性もあります.国債を使用すべきか?国際債券のバスケット?短期または長期債券?混合物?明らかにベンチマークを選択する方法がたくさんあります.シャープ比率は一般的にリスクフリーレートを利用し,しばしば,株式戦略では,これは10年間の政府国債に基づいています.

市場中立戦略では,リスクフリーレートまたはゼロを基準値として使用するかどうかの問題がある.市場指数自体は,戦略が設計上市場中立であるため,使用すべきではない.市場中立ポートフォリオの正しい選択は,自己資金化であるため,リスクフリーレートを引くものではない.あなたが利息を保持することからクレジット利息,Rfを得ているので,収益の実際の計算は: (Ra+Rf) −Rf=Raである.したがって,中立戦略のリスクフリードルレートの実際の引出はありません.

制限

シェープ比率は定量金融における普及にもかかわらず,いくつかの限界があります.

まず,シャープ比率は過去を振り返るものである.それは過去の収益分布と変動のみを考慮し,将来発生するものは考慮していない.シャープ比率に基づく判断を行うとき,過去は将来に似ているという暗黙の仮定がある.これは明らかに常にそうではない.特に市場体制の変化下で.

シャープ比率計算は,使用されているリターンが正常分布 (すなわちガウス比率) であることを前提としています. 残念ながら,市場は通常分布よりも高いクルトーシスに苦しんでいます.本質的に,リターンの分布は"ファッターテール"があり,したがって,ガウス分布が私たちに信じさせるよりも極端な出来事が起こる可能性が高いのです.したがって,シャープ比率は尾リスクを特徴付けるのに劣っています.

この傾向は,そのようなリスクに非常に弱い戦略で見られる.例えば,コールオプションの販売 (蒸気ローラーの下のペニー).コールオプションの販売により,時間の経過とともに安定したオプションプレミアムが生成され,利回りの変動が低く,基準値を超える強度の過剰になります.この場合,戦略は高いシャープ比率 (歴史的なデータに基づいて) を有します.しかし,そのようなオプションが呼び出されることが可能であることを考慮していません.これは株式曲線で有意で突然の引き下げ (または消去) につながる可能性があります.したがって,アルゴリズム取引戦略のパフォーマンスのあらゆる測定量と同様に,シャープ比率は孤立して使用することはできません.

この点は,ある人にとって明白に見えるかもしれませんが,取引コストは,シャープ比率の計算に含まれなければならない. 高いシャープ (したがって,大きな収益性の可能性) を有する取引戦略の無数の例がありますが,現実的なコストを考慮すると,低いシャープ,低収益性の戦略に縮小されます. これは,基準値を超えた計算時に純利益を使用することを意味します. したがって,取引コストは,シャープ比率の計算の上流に考慮する必要があります.

実用 的 な 用法 と 例

この記事では,これまで答えられていない明らかな質問の一つは,戦略のための良いシャープ比率は何ですか. 実践的に,取引コストの後に年間シャープ比率S<1を持つ戦略を無視するべきです. 量的なヘッジファンドは,シャープ比率S<2を持つ戦略を無視する傾向があります. 私が知っているある著名な量的なヘッジファンドは,研究中にシャープ比率S<3を持つ戦略を考慮しないでしょう. 小売アルゴリズムトレーダーとして,S>2のシャープ比率を達成できれば,あなたは非常にうまくやっています.

シャープ比率は,取引頻度によってしばしば増加する.一部の高頻度戦略は,ほぼ毎日,そして間違いなく毎月利益を得ることができるため,高単位数 (時には低二位数) のシャープ比率を有する.これらの戦略は滅多に災害リスクに苦しんでおり,その結果,高いシャープ比率につながる収益の変動を最小限に抑える.

シャープ比率 の 例

この時点でかなり理論的な記事でした.今,私たちは実際の例に注意を向けます.私たちは単純に,個々の株式の長期のみの購入と保有を検討し,市場中立戦略を検討することによって始めます.これらの例はどちらもPython pandasデータ分析ライブラリで実行されています.

最初のタスクは,実際にデータを取得し,パンダデータフレームオブジェクトに入力することです. Python と MySQL での証券マスター実装に関する記事では,これを達成するためのシステムを作成しました. 代替として,このよりシンプルなコードを使用して,Yahoo Finance のデータを直接取得し,パンダデータフレームに直接入れることができます. このスクリプトの底には,時間周期リターンストリームに基づいて年次シャール比率を計算する関数を作成しました:

import datetime
import numpy as np
import pandas as pd
import urllib2


def get_historic_data(ticker,
                      start_date=(2000,1,1),
                      end_date=datetime.date.today().timetuple()[0:3]):
    """
    Obtains data from Yahoo Finance and adds it to a pandas DataFrame object.

    ticker: Yahoo Finance ticker symbol, e.g. "GOOG" for Google, Inc.
    start_date: Start date in (YYYY, M, D) format
    end_date: End date in (YYYY, M, D) format
    """

    # Construct the Yahoo URL with the correct integer query parameters
    # for start and end dates. Note that some parameters are zero-based!
    yahoo_url = "http://ichart.finance.yahoo.com/table.csv?s=%s&a=%s&b=%s&c=%s&d=%s&e=%s&f=%s" % \
        (ticker, start_date[1] - 1, start_date[2], start_date[0], end_date[1] - 1, end_date[2], end_date[0])
    
    # Try connecting to Yahoo Finance and obtaining the data
    # On failure, print an error message
    try:
        yf_data = urllib2.urlopen(yahoo_url).readlines()
    except Exception, e:
        print "Could not download Yahoo data: %s" % e

    # Create the (temporary) Python data structures to store
    # the historical data
    date_list = []
    hist_data = [[] for i in range(6)]

    # Format and copy the raw text data into datetime objects
    # and floating point values (still in native Python lists)
    for day in yf_data[1:]:  # Avoid the header line in the CSV
        headers = day.rstrip().split(',')
        date_list.append(datetime.datetime.strptime(headers[0],'%Y-%m-%d'))
        for i, header in enumerate(headers[1:]):
            hist_data[i].append(float(header))

    # Create a Python dictionary of the lists and then use that to
    # form a sorted Pandas DataFrame of the historical data
    hist_data = dict(zip(['open', 'high', 'low', 'close', 'volume', 'adj_close'], hist_data))
    pdf = pd.DataFrame(hist_data, index=pd.Index(date_list)).sort()

    return pdf

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()

Yahoo金融からデータを入手し,年収のシャープ比率を簡単に計算できるようになった今,私たちは2つの株式の購入・保有戦略をテストすることができます.Google (GOOG) とゴールドマン・サックス (GS) を2000年1月1日から2013年5月29日まで (この記事を書いたとき) 活用します.

同じ期間の (ハードコード) 複数の株式でSharpeの買取と保有を迅速に見ることができます.

def equity_sharpe(ticker):
    """
    Calculates the annualised Sharpe ratio based on the daily
    returns of an equity ticker symbol listed in Yahoo Finance.

    The dates have been hardcoded here for the QuantStart article 
    on Sharpe ratios.
    """

    # Obtain the equities daily historic data for the desired time period
    # and add to a pandas DataFrame
    pdf = get_historic_data(ticker, start_date=(2000,1,1), end_date=(2013,5,29))

    # Use the percentage change method to easily calculate daily returns
    pdf['daily_ret'] = pdf['adj_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'])

Googleでは,Sharpeの買取・保有比率は0.7501で,ゴールドマン・サックスでは0.2178です.

  • エクイティ_シャープ (GOOG) 0.75013831274645904

  • エクイティ_シャープ (株) 0.21777027767830823

現在,市場中立戦略の同じ計算を試みることができます.この戦略の目標は,特定の株式のパフォーマンスを市場全体から完全に分離することです.これを達成する最も簡単な方法は,そのような市場を追跡するように設計された取引所取引基金 (ETF) の等額 (ドルで) を短縮することです.米国の大資本株式市場にとって最も明らかな選択肢は,SPYのティッカーでSPDR ETFによって追跡されるS&P500指数です.

このような戦略の年額シャープ比率を計算するには,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'.
    """

    # 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 = get_historic_data(ticker, start_date=(2000,1,1), end_date=(2013,5,29))
    bench = get_historic_data(benchmark, start_date=(2000,1,1), end_date=(2013,5,29))
    
    # Calculate the percentage returns on each of the time series
    tick['daily_ret'] = tick['adj_close'].pct_change()
    bench['daily_ret'] = bench['adj_close'].pct_change()
    
    # Create a new DataFrame to store the strategy information
    # The net returns are (long - short)/2, since there is twice 
    # 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.7597である.ゴールドマン・サックスでは,0.2999である:

  • 市場中立なシャープ 0.75966612163452329

  • 市場中立なシャープ (GS,SPY) 0.29991401047248328 シャープ比率は,アルゴリズム取引のほぼすべての場所で使用されているにもかかわらず,パフォーマンスとリスクの他の指標を検討する必要があります.後の記事では,引き下げと戦略を実行するか否かの決定にどのように影響するかについて議論します.


もっと