알고리즘적 거래 성능 측정에 대한 샤프 비율

저자:선함, 2019-03-18 13:24:11, 업데이트:

알고리즘 상거래 전략을 수행 할 때 연간 수익을 가장 유용한 성능 측정량으로 간주하는 것이 유혹적입니다. 그러나이 척도를 고립적으로 사용하는 데는 많은 단점이 있습니다. 특정 전략의 수익을 계산하는 것은 완전히 간단하지 않습니다. 이것은 특히 시장 중립 변수 또는 레버리지를 사용하는 전략과 같은 방향성이없는 전략에 적용됩니다. 이러한 요인은 수익을 기반으로 한 두 전략을 비교하는 것을 어렵게 만듭니다.

또한, 동일한 수익률을 가진 두 가지 전략이 제시되면 어느 전략이 더 많은 위험을 포함하는지 어떻게 알 수 있습니까? 더 나아가, 우리는 "더 많은 위험"으로 무엇을 의미합니까? 금융에서 우리는 종종 수익률의 변동성과 마감 기간에 대해 걱정합니다. 따라서 이러한 전략 중 하나가 수익률의 현저히 높은 변동성을 가지고 있다면 역사적 수익률이 동일하지 않은 경우도 비슷 할 수 있음에도 불구하고 매력적이지 않을 것입니다.

이러한 전략 비교와 위험 평가의 문제들은 샤르프 비율의 사용에 동기를 부여합니다.

샤프 비율의 정의

윌리엄 포시스 샤프는 노벨 경제학상 수상자로, 자본자산가격 모델 (CAPM) 을 만들고 1966년에 샤프 비율을 개발 (이후 1994년에 업데이트) 하는 데 도움을 주었다.

샤르프 비율 S는 다음과 같은 관계로 정의됩니다.img여기서 Ra는 자산 또는 전략의 기간 수익률이고 Rb는 적절한 벤치마크의 기간 수익률입니다.

이 비율은 자산 또는 전략의 초과 수익의 평균 평균을 그 수익의 표준편차와 비교합니다. 따라서 수익의 낮은 변동성은 동일한 수익을 가정하면 더 큰 샤프 비율로 이어집니다.

거래 전략 수행자들에 의해 종종 인용되는 샤르프 비율은 연간 셰르프이며, 그 계산은 수익이 측정되는 거래 기간에 따라 달라집니다. 1 년에 N 개의 거래 기간이 있다고 가정하면 연간 셰르프는 다음과 같이 계산됩니다.img샤르프 비율 자체는 특정 기간 유형의 샤르프에 기초하여 계산되어야 함을 참고하십시오. 거래 기간에 기초한 전략의 경우 N=252 (해에 365가 아니라 252가 거래일) 이며 Ra, Rb는 일일 수익률이어야합니다. 마찬가지로 시간 N=252×6.5=1638, N=252×24=6048이 아니라 거래일에 6.5시간만 있기 때문에.

벤치마크 포함

상기의 샤프 비율의 공식은 벤치마크의 사용을 암시한다. 벤치마크는 특정 전략이 고려할 가치가 있기 위해 극복해야 할 yardstick 또는 hurdle로 사용됩니다. 예를 들어, 미국 대기업 주식을 사용하는 간단한 장기 전략은 평균적으로 S&P500 지수를 이길 수 있기를 희망하거나 변동성이 적을 수 있습니다.

벤치마크의 선택은 때때로 불분명할 수 있다. 예를 들어, 부문 거래 상장 펀드 (ETF) 를 개별 주식 또는 S&P500 자체의 성능 벤치마크로 사용해야 하는가? 왜 러셀 3000이 아닌가? 마찬가지로 헤지 펀드 전략은 시장 지수 또는 다른 헤지 펀드 지수와 비교하여 벤치마크를 해야 하는가? 또한 "위험 없는 금리"의 복잡성이 있다. 국내 정부 채권이 사용되어야 하는가? 국제 채권의 바구니? 단기 또는 장기 채권? 혼합? 분명히 벤치마크를 선택할 수있는 많은 방법이 있다! 샤프 비율은 일반적으로 위험 없는 미국 금리를 사용하고 종종 주식 전략의 경우, 이것은 10년 정부 재무채권에 기초한다.

시장중립적 전략의 경우, 위험 없는 금리 또는 0을 기준으로 사용할지 여부에 대한 특별한 복잡성이 있다. 시장 지수는 전략이 설계에 따라 시장중립적이기 때문에 자체적으로 사용해서는 안 된다. 시장중립적 포트폴리오의 올바른 선택은 자기 자금화이기 때문에 위험 없는 금리를 빼는 것이 아니다. 마진을 보유함으로써 신용 지분인 Rf를 얻는 것이기 때문에 수익률의 실제 계산은: (Ra+Rf) −Rf=Ra이다. 따라서 중립적 전략에 대한 위험 없는 달러율을 실질적으로 빼는 것은 없다.

제한

양적 금융에서 샤르프 비율이 유행하고 있음에도 불구하고, 그것은 몇 가지 한계를 겪고 있습니다.

첫째, 샤르프 비율은 과거를 돌아보는 것이다. 그것은 단지 역사적인 수익 분배와 변동성을 설명하는데, 미래에 발생하는 것은 아니다. 샤르프 비율에 기초한 판단을 할 때 과거가 미래와 비슷할 것이라는 암시적 가정이 있다. 이것은 분명히 항상 그렇지 않다. 특히 시장 체제 변화에 따라.

샤르프 비율 계산은 사용되는 수익률이 정상적으로 분포되어 있다고 가정합니다. 불행히도 시장은 종종 정상적인 분포보다 높은 커토시스에 시달립니다. 본질적으로 수익률의 분포는 더 꼬리을 가지고 있으며 따라서 가우스 분포가 우리를 믿게 할 수있는 것보다 극단적인 사건이 발생할 가능성이 높습니다. 따라서 샤르프 비율은 꼬리 위험을 특징짓는 데 좋지 않습니다.

이러한 위험에 매우 취약한 전략에서 명확하게 볼 수 있습니다. 예를 들어, 콜 옵션의 판매 (증기 롤러 아래의 페니). 콜 옵션의 판매로 시간이 지남에 따라 옵션 프리미엄의 안정적인 흐름이 발생하여 수익률의 낮은 변동성이 발생하며 기준보다 높은 과도기가 있습니다. 이 경우 전략은 높은 샤프 비율을 가지고 있습니다. 그러나 이러한 옵션이 호출 될 수 있다는 것을 고려하지 않으며 주식 곡선에서 중요하고 갑작스러운 마감 (또는 심지어 지워버리) 로 이어질 수 있습니다. 따라서 알고리즘 거래 전략 성과 측정과 마찬가지로 샤프 비율은 고립되어 사용할 수 없습니다.

이 지점은 일부에게 명백한 것처럼 보일 수 있지만, 거래 비용은 현실적이기 위해 샤르프 비율의 계산에 포함되어야합니다. 높은 샤르프 (그리고 따라서 높은 수익률의 확률) 을 가진 거래 전략의 무수히 많은 예가 있습니다. 현실적인 비용이 고려되면 낮은 샤르프, 낮은 수익성 전략으로 축소됩니다. 이것은 벤치마크를 초과하여 계산할 때 순수 수익을 사용하는 것을 의미합니다. 따라서 거래 비용은 샤르프 비율 계산의 전류에 고려해야합니다.

실용적 사용 과 예 들

이 문서에서 지금까지 답되지 않은 명백한 질문은 "전략에 대한 좋은 샤프 비율은 무엇입니까?"입니다. 실용적으로, 거래 비용 이후 연간 샤프 비율 S<1을 가진 모든 전략을 무시해야합니다. 양적 헤지 펀드는 샤프 비율 S<2을 가진 모든 전략을 무시하는 경향이 있습니다. 제가 익숙한 한 대표적인 양적 헤지 펀드는 연구 중에 샤프 비율 S<3을 가진 전략을 고려하지 않을 것입니다. 소매 알고리즘 트레이더로서, 당신이 샤프 비율 S>2를 달성 할 수 있다면 당신은 매우 잘하고 있습니다.

샤르프 비율은 종종 거래 빈도에 따라 증가합니다. 일부 고 빈도 전략은 거의 매일, 그리고 확실히 매달 수익성이있을 수 있기 때문에 높은 단일 (그리고 때로는 낮은 이중) 숫자 샤르프 비율을 가질 것입니다. 이러한 전략은 거의 재앙의 위험에 시달리므로 수익의 변동성을 최소화하여 높은 샤르프 비율로 이어집니다.

샤프 비율의 예

이것은 지금까지는 이론적인 기사였습니다. 이제 우리는 몇 가지 실제 사례에 관심을 돌릴 것입니다. 우리는 단순히 개인 주식의 장기적 구매 및 보유를 고려하여 시장 중립 전략을 고려하여 시작할 것입니다. 이 두 가지 예는 파이썬 판다 데이터 분석 라이브러리에서 수행되었습니다.

첫 번째 작업은 실제로 데이터를 얻고 판다 데이터 프레임 객체에 넣는 것입니다. 파이썬과 MySQL에서 증권 마스터 구현에 관한 기사에서 나는 이것을 달성하기위한 시스템을 만들었습니다. 대안으로, 우리는 이 더 간단한 코드를 사용하여 야후 금융 데이터를 직접 가져와 판다 데이터 프레임에 넣을 수 있습니다. 이 스크립트의 하단에 나는 시간 기간 반환 스트림을 기반으로 연간 샤프 비율을 계산하는 함수를 만들었습니다.

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

이제 우리는 야후 파이낸스에서 데이터를 얻고 연간 셔프 비율을 직접 계산할 수 있습니다. 우리는 두 개의 주식을 위한 구매 및 보유 전략을 테스트 할 수 있습니다. 우리는 2000년 1월 1일부터 2013년 5월 29일까지 구글 (GOOG) 과 골드만삭스 (GS) 를 사용할 것입니다.

우리는 같은 기간 동안 여러 주식에서 빠르게 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'])

구글의 경우, 구매 및 보유에 대한 샤프 비율은 0.7501입니다. 골드만삭스의 경우 0.2178입니다:

  • 엑위티_셔프 (equity_sharpe) 0.75013831274645904

  • 엑위티_셔프 (equity_sharpe) 0.21777027767830823

이제 우리는 시장 중립 전략에 대해 동일한 계산을 시도 할 수 있습니다. 이 전략의 목표는 특정 주식 성능을 일반적으로 시장에서 완전히 격리하는 것입니다. 이를 달성하는 가장 간단한 방법은 그러한 시장을 추적하도록 설계된 거래소 거래 자금 (ETF) 의 동등한 금액 (달러로) 을 단축하는 것입니다. 미국 대기업 주식 시장의 가장 명백한 선택은 SPY의 틱을 가진 SPDR ETF에 의해 추적되는 S&P500 지수입니다.

이러한 전략의 연간 샤르프 비율을 계산하기 위해 우리는 SPY의 역사적 가격을 얻고 이전 주식과 유사한 방식으로 수익률을 계산할 것입니다. 위험 없는 벤치마크를 사용하지 않을 것이라는 점을 제외하고. 우리는 긴 수익률과 짧은 수익률 사이의 차이를 빼고 2로 나눌 필요가있는 순 일일 수익률을 계산합니다. 우리는 이제 두 배의 거래 자본을 가지고 있습니다. 여기에 이것을 수행하기위한 파이썬 / 판다스 코드가 있습니다:

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'])

구글의 경우, 시장중립적인 장기/단기 전략의 샤프 비율은 0.7597이며, 골드만삭스의 경우 0.2999입니다.

  • 시장중립적 (GOOG, SPY) 0.75966612163452329

  • 시장중립적 (GS, SPY) 0.29991401047248328 샤르프 비율은 알고리즘 거래에서 거의 모든 곳에서 사용되고 있음에도 불구하고, 우리는 성과와 위험의 다른 측정 기준을 고려해야합니다. 후기 기사에서 우리는 드라우다운과 전략 실행에 대한 결정에 어떻게 영향을 미치는지 논의 할 것입니다.


더 많은