Отношение Sharpe для алгоритмического измерения эффективности торговли

Автор:Доброта, Создано: 2019-03-18 13:24:11, Обновлено:

При проведении алгоритмической стратегии торговли, очень легко считать годовую доходность как наиболее полезный показатель эффективности. Однако, есть много недостатков при использовании этой меры в изоляции. Расчет доходности для определенных стратегий не совсем прост. Это особенно верно для стратегий, которые не направлены, таких как рыночно-нейтральные варианты или стратегии, которые используют рычаг. Эти факторы затрудняют сравнение двух стратегий, основанных исключительно на их доходности.

Кроме того, если нам предлагают две стратегии с одинаковой доходностью, как мы узнаем, какая из них содержит больше риска? Кроме того, что мы имеем в виду под "больше риска"? В финансах мы часто беспокоимся о волатильности доходности и периодах снижения. Таким образом, если одна из этих стратегий имеет значительно более высокую волатильность доходности, мы, вероятно, найдем ее менее привлекательной, несмотря на то, что ее историческая доходность может быть похожей, если не идентичной.

Эти проблемы сравнения стратегий и оценки рисков мотивируют использование коэффициента Шарпа.

Определение коэффициента Шарпа

Уильям Форсайт Шарп - экономист, лауреат Нобелевской премии, который помог создать модель ценообразования капитальных активов (CAPM) и разработал коэффициент Шарпа в 1966 году (позже обновлен в 1994 году).

Отношение Шарпа S определяется следующим отношением:imgгде Ra представляет собой доходность периода актива или стратегии и Rb представляет собой доходность периода подходящего эталонного показателя.

Коэффициент сравнивает среднее среднее значение избыточной доходности актива или стратегии со стандартным отклонением этой доходности. Таким образом, более низкая волатильность доходности приведет к большему коэффициенту Шарпа, предполагая идентичные доходы.

Часто цитируемый теми, кто осуществляет торговые стратегии, Sharpe Ratio является годовым Sharpe, расчет которого зависит от периода торговли, в котором измеряются доходы.imgОбратите внимание, что сам коэффициент Шарпа ДОЛЖНО рассчитываться на основе типа Шарпа того или иного периода времени. Для стратегии, основанной на периоде торговли дней, N=252 (поскольку в году 252 торговых дня, а не 365), и Ra, Rb должны быть ежедневными доходами. Аналогично для часов N=252×6.5=1638, а не N=252×24=6048, поскольку в торговый день всего 6,5 часов.

Включение показателя

Формула для коэффициента Шарпа, приведенная выше, ссылается на использование эталонного показателя. эталонный показатель используется как yardstick или hurdle, которое конкретная стратегия должна преодолеть, чтобы оно стоило рассмотрения. Например, простая долгосрочная стратегия, использующая американские акции с большой капитализацией, должна надеяться обычно победить индекс S&P500 или соответствовать ему для меньшей волатильности.

Выбор бенчмарка иногда может быть неясным. Например, следует ли использовать секторный фонды биржевых сделок (ETF) в качестве бенчмарка эффективности для отдельных акций или сам S&P500? Почему не Russell 3000? Точно так же стратегия хедж-фонда должна сравнивать себя с рыночным индексом или индексом других хедж-фондов? Существует также сложность "бесрисковой ставки". Должны ли использоваться национальные государственные облигации? Корзина международных облигаций? Краткосрочные или долгосрочные векселя? Смесь? Очевидно, есть много способов выбора бенчмарка! Отношение Шарпа обычно использует безрисковую ставку США и часто для стратегий акций это основывается на 10-летних государственных казначейских векселях.

В одном конкретном случае, для рыночно-нейтральных стратегий, существует особое осложнение относительно того, использовать ли безрисковую ставку или нуль в качестве ориентира. Сам рыночный индекс не должен использоваться, поскольку стратегия по своей конструкции является рыночно-нейтральной. Правильным выбором для рыночно-нейтрального портфеля не является вычитание безрисковой ставки, потому что это самофинансирование. Поскольку вы получаете кредитный процент, Rf, от удержания маржи, фактический расчет доходности составляет: (Ra + Rf) −Rf = Ra. Следовательно, для нейтральных стратегий не существует фактического вычитания безрисковой ставки в долларах.

Ограничения

Несмотря на распространенность коэффициента Шарпа в области количественного финансирования, он испытывает некоторые ограничения.

Во-первых, коэффициент Шарпа является ретроспективным. Он учитывает только историческое распределение доходности и волатильность, а не те, которые произойдут в будущем. При вынесении суждений на основе коэффициента Шарпа есть неявное предположение, что прошлое будет аналогичным будущему. Очевидно, что это не всегда так, особенно при изменениях рыночного режима.

Расчет коэффициента Шарпа предполагает, что используемые доходы обычно распределены (т.е. гауссианские). К сожалению, рынки часто страдают от куртоза выше, чем у нормального распределения. По сути, распределение доходов имеет щедрые хвосты и, следовательно, экстремальные события более вероятны, чем Гауссианское распределение. Следовательно, коэффициент Шарпа плохо характеризует риск хвоста.

Это ясно видно в стратегиях, которые очень подвержены таким рискам. Например, продажа опционов на покупку (также известная как pennies under a steam roller). Устойчивый поток премий на покупку опционов генерируется продажей опционов на покупку с течением времени, что приводит к низкой волатильности доходности, с сильным превышением выше эталонного показателя.

Несмотря на то, что этот момент может показаться очевидным для некоторых, затраты на транзакции ДОЛЖНЫ быть включены в расчет коэффициента Шарпа, чтобы он был реалистичным. Существует бесчисленное количество примеров торговых стратегий, которые имеют высокий Sharpe (и, следовательно, вероятность большой прибыльности), только чтобы быть сведены к низким Sharpe, стратегии низкой прибыльности, как только реалистичные затраты были учтены. Это означает использование чистой доходности при расчете, превышающего эталон. Следовательно, затраты на транзакции должны быть учтены в начале расчета коэффициента Sharpe.

Практическое применение и примеры

Один очевидный вопрос, который остался без ответа до сих пор в этой статье, Что такое хорошее соотношение Шарпа для стратегии?. Прагматически, вы должны игнорировать любую стратегию, которая обладает годовым соотношением Шарпа S<1 после затрат на транзакции. Количественные хедж-фонды склонны игнорировать любые стратегии, которые обладают соотношениями Шарпа S<2. Один известный количественный хедж-фонд, с которым я знаком, даже не рассматривал бы стратегии, которые имели соотношения Шарпа S<3 во время исследования. Как розничный алгоритмический трейдер, если вы можете достичь соотношения Шарпа S>2, то вам очень хорошо.

Отношение Шарпа часто увеличивается с частотой торговли. Некоторые высокочастотные стратегии будут иметь высокие однозначные (и иногда низкие двузначные) коэффициенты Шарпа, так как они могут быть прибыльными почти каждый день и, конечно, каждый месяц. Эти стратегии редко страдают от катастрофического риска и, таким образом, минимизируют их волатильность доходности, что приводит к таким высоким коэффициентам Шарпа.

Примеры пропорций Шарпа

Это была довольно теоретическая статья до этого момента. Теперь мы обратим наше внимание на некоторые реальные примеры. Мы начнем просто, рассматривая только длительную покупку и удержание индивидуального акции, а затем рассмотрим нейтральную стратегию рынка. Оба этих примера были выполнены в библиотеке анализа данных Python panda.

Первая задача заключается в том, чтобы получить данные и поместить их в объект Panda DataFrame. В статье о реализации мастера ценных бумаг в Python и MySQL я создал систему для достижения этого. В качестве альтернативы мы можем использовать этот более простой код, чтобы получить данные Yahoo Finance напрямую и поместить их прямо в Panda DataFrame. В нижней части этого скрипта я создал функцию для расчета годового коэффициента Шарпа на основе потока временных периодов:

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 Finance и легко рассчитать годовое отношение Sharpe, мы можем протестировать стратегию покупки и хранения для двух акций.

Мы можем создать дополнительную функцию помощника, которая позволяет нам быстро увидеть покупку и удержание 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. Для Goldman Sachs это 0,2178:

  • Equity_sharpe ((GOOG)) 0,75013831274645904

  • Equity_sharpe ((GS) 0,21777027767830823

Теперь мы можем попробовать тот же расчет для нейтральной стратегии рынка. Цель этой стратегии - полностью изолировать производительность определенного акции от рынка в целом. Самый простой способ достичь этого - коротко обменять равную сумму (в долларах) биржевого торгового фонда (ETF), который предназначен для отслеживания такого рынка. Наиболее очевидным выбором для рынка крупных акций США является индекс S&P500, который отслеживается SPDR ETF, с тикером SPY.

Для расчета годового коэффициента Шарпа такой стратегии мы получим исторические цены на SPY и рассчитаем процентную доходность аналогичным образом, как и предыдущие запасы, за исключением того, что мы не будем использовать безрисковый бенчмарк. Мы будем рассчитывать чистую суточную доходность, которая требует вычитания разницы между длинной и короткой доходностью, а затем деления на 2, так как у нас теперь вдвое больше торгового капитала. Вот код Python / panda для выполнения этого:

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 соотношение Sharpe для долгой/короткой нейтральной стратегии рынка составляет 0,7597.

  • рынок_нейтрал_шаппе (( GOOG, SPY) 0,75966612163452329

  • рыночно-нейтральный Sharpe (GS, SPY) 0,29991401047248328 Несмотря на то, что коэффициент Шарпа используется практически везде в алгоритмической торговле, мы должны учитывать другие показатели эффективности и риска.


Больше