Cuando se lleva a cabo una estrategia de negociación algorítmica, es tentador considerar el rendimiento anualizado como la métrica de rendimiento más útil. Sin embargo, hay muchos defectos al usar esta medida de forma aislada. El cálculo de los rendimientos para ciertas estrategias no es completamente sencillo. Esto es especialmente cierto para las estrategias que no son direccionales, como las variantes neutrales del mercado o las estrategias que utilizan apalancamiento. Estos factores dificultan la comparación de dos estrategias basadas únicamente en sus rendimientos.
Además, si se nos presentan dos estrategias con rendimientos idénticos, ¿cómo sabemos cuál contiene más riesgo? Además, ¿qué queremos decir con "más riesgo"? En finanzas, a menudo nos preocupamos por la volatilidad de los rendimientos y los períodos de retirada. Por lo tanto, si una de estas estrategias tiene una volatilidad significativamente mayor de los rendimientos, es probable que la encontremos menos atractiva, a pesar del hecho de que sus rendimientos históricos pueden ser similares si no idénticos.
Estos problemas de comparación de estrategias y evaluación de riesgos motivan el uso de la proporción de Sharpe.
William Forsyth Sharpe es un economista ganador del Premio Nobel, que ayudó a crear el Modelo de Precios de Activos de Capital (CAPM) y desarrolló la Relación Sharpe en 1966 (más tarde actualizada en 1994).
La proporción de Sharpe S está definida por la siguiente relación:Donde Ra es el rendimiento del período del activo o de la estrategia y Rb es el rendimiento del período de un índice de referencia adecuado.
La relación compara la media media de los rendimientos excedentes del activo o la estrategia con la desviación estándar de esos rendimientos.
El ratio de Sharpe es el Sharpe anualizado, cuyo cálculo depende del período de negociación en el que se miden los rendimientos.Tenga en cuenta que el índice de Sharpe en sí DEBE calcularse basándose en el tipo de Sharpe de ese período de tiempo en particular. Para una estrategia basada en el período de negociación de días, N=252 (ya que hay 252 días de negociación en un año, no 365), y Ra, Rb deben ser los rendimientos diarios. Del mismo modo, para las horas N=252×6.5=1638, no N=252×24=6048, ya que solo hay 6.5 horas en un día de negociación.
La fórmula para el índice Sharpe anterior alude al uso de un índice de referencia. Un índice de referencia se utiliza como un
La elección del índice de referencia a veces puede ser poco clara. Por ejemplo, ¿debe un sector de Exchange Traded Fund (ETF) ser utilizado como un índice de rendimiento para las acciones individuales, o el propio S&P500? ¿Por qué no el Russell 3000? Igualmente, una estrategia de fondo de cobertura debe ser compararse con un índice de mercado o un índice de otros fondos de cobertura? También está la complicación de la
En un caso particular, para las estrategias neutras en el mercado, existe una complicación particular con respecto a si se debe utilizar la tasa libre de riesgo o cero como referencia. El índice de mercado en sí no debe utilizarse ya que la estrategia es, por diseño, neutral en el mercado. La elección correcta para una cartera neutral en el mercado no es restar la tasa libre de riesgo porque es autofinanciante. Dado que se obtiene un interés de crédito, Rf, de la tenencia de un margen, el cálculo real de los rendimientos es: (Ra + Rf) −Rf = Ra. Por lo tanto, no hay una sustracción real de la tasa libre de riesgo en dólares para las estrategias neutras.
A pesar de la prevalencia del índice Sharpe dentro de las finanzas cuantitativas, sufre algunas limitaciones.
En primer lugar, el índice Sharpe es retrospectivo. Sólo tiene en cuenta la distribución de rendimientos históricos y la volatilidad, no los que ocurren en el futuro. Al hacer juicios basados en el índice Sharpe hay una suposición implícita de que el pasado será similar al futuro.
El cálculo de la proporción de Sharpe asume que los rendimientos que se utilizan están distribuidos normalmente (es decir, gaussiano). Desafortunadamente, los mercados a menudo sufren de kurtosis por encima de la de una distribución normal.
Esto se puede ver claramente en las estrategias que son muy propensas a tales riesgos. Por ejemplo, la venta de opciones de compra (también conocido como
Aunque este punto puede parecer obvio para algunos, los costos de transacción DEBEN incluirse en el cálculo de la proporción Sharpe para que sea realista. Hay innumerables ejemplos de estrategias comerciales que tienen altos Sharpe (y por lo tanto una probabilidad de gran rentabilidad) solo para ser reducidas a estrategias de baja Sharpe, baja rentabilidad una vez que se han tenido en cuenta los costos realistas. Esto significa hacer uso de los rendimientos netos al calcular en exceso del índice de referencia. Por lo tanto, los costos de transacción deben tenerse en cuenta en la parte anterior del cálculo de la proporción Sharpe.
Una pregunta obvia que ha permanecido sin respuesta hasta ahora en este artículo es
Algunas estrategias de alta frecuencia tendrán altos índices de Sharpe de un solo dígito (y a veces bajos de doble dígito), ya que pueden ser rentables casi todos los días y ciertamente todos los meses.
Este ha sido un artículo bastante teórico hasta este punto. Ahora dirigiremos nuestra atención a algunos ejemplos reales. Comenzaremos simplemente, considerando una compra y retención de una acción individual de largo plazo y luego consideraremos una estrategia neutral en el mercado. Ambos ejemplos se han realizado en la biblioteca de análisis de datos de Python pandas.
La primera tarea es obtener los datos y ponerlos en un objeto Panda DataFrame. En el artículo sobre la implementación del maestro de valores en Python y MySQL, creé un sistema para lograr esto. Alternativamente, podemos utilizar este código más simple para obtener datos de Yahoo Finance directamente y ponerlos directamente en un Panda DataFrame. En la parte inferior de este script, he creado una función para calcular la proporción de Sharpe anualizada basada en un flujo de retornos de período de tiempo:
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()
Ahora que tenemos la capacidad de obtener datos de Yahoo Finance y calcular directamente el índice Sharpe anualizado, podemos probar una estrategia de compra y retención para dos acciones.
Podemos crear una función auxiliar adicional que nos permita ver rápidamente Sharpe de compra y retención en múltiples acciones para el mismo período (codificado):
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'])
Para Google, la relación Sharpe para comprar y mantener es 0.7501. para Goldman Sachs es 0.2178:
¿Qué es esto? En el caso de las empresas de la Unión Europea:
el valor de las acciones de la sociedad En el caso de las empresas de la Unión Europea,
Ahora podemos probar el mismo cálculo para una estrategia neutral en el mercado. El objetivo de esta estrategia es aislar completamente el rendimiento de una acción en particular del mercado en general. La forma más simple de lograr esto es ir corto de una cantidad igual (en dólares) de un fondo negociado en bolsa (ETF) que está diseñado para rastrear tal mercado. La opción más obvia para el mercado de acciones de gran capitalización de los Estados Unidos es el índice S&P500, que es rastreado por el SPDR ETF, con el ticker de SPY.
Para calcular la relación Sharpe anualizada de tal estrategia obtendremos los precios históricos de SPY y calcularemos los rendimientos porcentuales de manera similar a las existencias anteriores, con la excepción de que no usaremos el índice de referencia libre de riesgo.
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'])
Para Google, la relación Sharpe para la estrategia de largo / corto neutro en el mercado es 0,7597.
¿Qué es esto? ¿Qué es esto? - ¿Qué quiere decir?
En el caso de las empresas que no participan en el mercado, la información que se proporciona en el apartado 1 del presente artículo no se incluye en la lista. - ¿Por qué no lo haces? A pesar de que la proporción de Sharpe se utiliza casi en todas partes en el comercio algorítmico, necesitamos considerar otras métricas de rendimiento y riesgo.