При проведении алгоритмической стратегии торговли, очень легко считать годовую доходность как наиболее полезный показатель эффективности. Однако, есть много недостатков при использовании этой меры в изоляции. Расчет доходности для определенных стратегий не совсем прост. Это особенно верно для стратегий, которые не направлены, таких как рыночно-нейтральные варианты или стратегии, которые используют рычаг. Эти факторы затрудняют сравнение двух стратегий, основанных исключительно на их доходности.
Кроме того, если нам предлагают две стратегии с одинаковой доходностью, как мы узнаем, какая из них содержит больше риска? Кроме того, что мы имеем в виду под "больше риска"? В финансах мы часто беспокоимся о волатильности доходности и периодах снижения. Таким образом, если одна из этих стратегий имеет значительно более высокую волатильность доходности, мы, вероятно, найдем ее менее привлекательной, несмотря на то, что ее историческая доходность может быть похожей, если не идентичной.
Эти проблемы сравнения стратегий и оценки рисков мотивируют использование коэффициента Шарпа.
Уильям Форсайт Шарп - экономист, лауреат Нобелевской премии, который помог создать модель ценообразования капитальных активов (CAPM) и разработал коэффициент Шарпа в 1966 году (позже обновлен в 1994 году).
Отношение Шарпа S определяется следующим отношением:где Ra представляет собой доходность периода актива или стратегии и Rb представляет собой доходность периода подходящего эталонного показателя.
Коэффициент сравнивает среднее среднее значение избыточной доходности актива или стратегии со стандартным отклонением этой доходности. Таким образом, более низкая волатильность доходности приведет к большему коэффициенту Шарпа, предполагая идентичные доходы.
Часто цитируемый теми, кто осуществляет торговые стратегии,
Формула для коэффициента Шарпа, приведенная выше, ссылается на использование эталонного показателя. эталонный показатель используется как
Выбор бенчмарка иногда может быть неясным. Например, следует ли использовать секторный фонды биржевых сделок (ETF) в качестве бенчмарка эффективности для отдельных акций или сам S&P500? Почему не Russell 3000? Точно так же стратегия хедж-фонда должна сравнивать себя с рыночным индексом или индексом других хедж-фондов? Существует также сложность "бесрисковой ставки". Должны ли использоваться национальные государственные облигации? Корзина международных облигаций? Краткосрочные или долгосрочные векселя? Смесь? Очевидно, есть много способов выбора бенчмарка! Отношение Шарпа обычно использует безрисковую ставку США и часто для стратегий акций это основывается на 10-летних государственных казначейских векселях.
В одном конкретном случае, для рыночно-нейтральных стратегий, существует особое осложнение относительно того, использовать ли безрисковую ставку или нуль в качестве ориентира. Сам рыночный индекс не должен использоваться, поскольку стратегия по своей конструкции является рыночно-нейтральной. Правильным выбором для рыночно-нейтрального портфеля не является вычитание безрисковой ставки, потому что это самофинансирование. Поскольку вы получаете кредитный процент, Rf, от удержания маржи, фактический расчет доходности составляет: (Ra + Rf) −Rf = Ra. Следовательно, для нейтральных стратегий не существует фактического вычитания безрисковой ставки в долларах.
Несмотря на распространенность коэффициента Шарпа в области количественного финансирования, он испытывает некоторые ограничения.
Во-первых, коэффициент Шарпа является ретроспективным. Он учитывает только историческое распределение доходности и волатильность, а не те, которые произойдут в будущем. При вынесении суждений на основе коэффициента Шарпа есть неявное предположение, что прошлое будет аналогичным будущему. Очевидно, что это не всегда так, особенно при изменениях рыночного режима.
Расчет коэффициента Шарпа предполагает, что используемые доходы обычно распределены (т.е. гауссианские). К сожалению, рынки часто страдают от куртоза выше, чем у нормального распределения. По сути, распределение доходов имеет
Это ясно видно в стратегиях, которые очень подвержены таким рискам. Например, продажа опционов на покупку (также известная как
Несмотря на то, что этот момент может показаться очевидным для некоторых, затраты на транзакции ДОЛЖНЫ быть включены в расчет коэффициента Шарпа, чтобы он был реалистичным. Существует бесчисленное количество примеров торговых стратегий, которые имеют высокий Sharpe (и, следовательно, вероятность большой прибыльности), только чтобы быть сведены к низким Sharpe, стратегии низкой прибыльности, как только реалистичные затраты были учтены. Это означает использование чистой доходности при расчете, превышающего эталон. Следовательно, затраты на транзакции должны быть учтены в начале расчета коэффициента Sharpe.
Один очевидный вопрос, который остался без ответа до сих пор в этой статье,
Отношение Шарпа часто увеличивается с частотой торговли. Некоторые высокочастотные стратегии будут иметь высокие однозначные (и иногда низкие двузначные) коэффициенты Шарпа, так как они могут быть прибыльными почти каждый день и, конечно, каждый месяц. Эти стратегии редко страдают от катастрофического риска и, таким образом, минимизируют их волатильность доходности, что приводит к таким высоким коэффициентам Шарпа.
Это была довольно теоретическая статья до этого момента. Теперь мы обратим наше внимание на некоторые реальные примеры. Мы начнем просто, рассматривая только длительную покупку и удержание индивидуального акции, а затем рассмотрим нейтральную стратегию рынка. Оба этих примера были выполнены в библиотеке анализа данных 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 ((
Equity_sharpe ((
Теперь мы можем попробовать тот же расчет для нейтральной стратегии рынка. Цель этой стратегии - полностью изолировать производительность определенного акции от рынка в целом. Самый простой способ достичь этого - коротко обменять равную сумму (в долларах) биржевого торгового фонда (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.
рынок_нейтрал_шаппе ((
рыночно-нейтральный Sharpe (GS, SPY) 0,29991401047248328 Несмотря на то, что коэффициент Шарпа используется практически везде в алгоритмической торговле, мы должны учитывать другие показатели эффективности и риска.