Apabila menjalankan strategi dagangan algoritma, ia menggoda untuk menganggap pulangan tahunan sebagai metrik prestasi yang paling berguna. Walau bagaimanapun, terdapat banyak kelemahan dengan menggunakan ukuran ini secara berasingan. Pengiraan pulangan untuk strategi tertentu tidak sepenuhnya mudah. Ini terutama berlaku untuk strategi yang tidak berarah seperti varian neutral pasaran atau strategi yang menggunakan leverage. Faktor-faktor ini menjadikan sukar untuk membandingkan dua strategi berdasarkan pulangan mereka sahaja.
Di samping itu, jika kita dibentangkan dengan dua strategi yang mempunyai pulangan yang sama bagaimana kita tahu mana yang mengandungi lebih banyak risiko? Selanjutnya, apa yang kita maksudkan dengan
Masalah perbandingan strategi dan penilaian risiko ini mendorong penggunaan Sharpe Ratio.
William Forsyth Sharpe adalah ahli ekonomi pemenang Hadiah Nobel, yang membantu mewujudkan Model Harga Aset Modal (CAPM) dan membangunkan Nisbah Sharpe pada tahun 1966 (kemudian dikemas kini pada tahun 1994).
Nisbah Sharpe S ditakrifkan oleh hubungan berikut:Di mana Ra adalah pulangan tempoh aset atau strategi dan Rb adalah pulangan tempoh penanda aras yang sesuai.
Nisbah ini membandingkan purata purata pulangan melebihi aset atau strategi dengan penyimpangan standard pulangan tersebut.
Rumus untuk nisbah Sharpe di atas merujuk kepada penggunaan penanda aras. Penanda aras digunakan sebagai
Pilihan penanda aras kadang-kadang tidak jelas. Sebagai contoh, adakah dana perdagangan pertukaran sektor (ETF) harus digunakan sebagai penanda aras prestasi untuk ekuiti individu, atau S&P500 itu sendiri? Mengapa tidak Russell 3000? Sama ada strategi dana lindung nilai harus membandingkan dirinya dengan indeks pasaran atau indeks dana lindung nilai lain? Terdapat juga kerumitan kadar bebas risiko. Adakah bon kerajaan domestik digunakan? Keranjang bon antarabangsa? Tagihan jangka pendek atau jangka panjang? Campuran? Jelas terdapat banyak cara untuk memilih penanda aras! Nisbah Sharpe umumnya menggunakan kadar bebas risiko AS dan sering, untuk strategi ekuiti, ini berdasarkan tagihan Perbendaharaan kerajaan 10 tahun.
Dalam satu contoh tertentu, untuk strategi netral pasaran, terdapat kesukaran khusus mengenai sama ada untuk menggunakan kadar bebas risiko atau sifar sebagai penanda aras. Indeks pasaran itu sendiri tidak boleh digunakan kerana strategi itu, dengan reka bentuk, netral pasaran. Pilihan yang betul untuk portfolio netral pasaran bukan untuk mengurangkan kadar bebas risiko kerana ia adalah pembiayaan sendiri. Oleh kerana anda mendapat kepentingan kredit, Rf, dari memegang margin, pengiraan sebenar untuk pulangan adalah: (Ra + Rf) − Rf = Ra. Oleh itu, tidak ada pengurangan sebenar kadar dolar bebas risiko untuk strategi netral.
Walaupun kelaziman nisbah Sharpe dalam kewangan kuantitatif, ia memang mengalami beberapa batasan.
Pertama, nisbah Sharpe adalah melihat ke belakang. Ia hanya mengambil kira pengedaran pulangan sejarah dan turun naik, bukan yang berlaku di masa depan. Apabila membuat pertimbangan berdasarkan nisbah Sharpe terdapat andaian tersirat bahawa masa lalu akan sama dengan masa depan. Ini jelas tidak selalu berlaku, terutamanya di bawah perubahan rejim pasaran.
Pengiraan nisbah Sharpe mengandaikan bahawa pulangan yang digunakan diedarkan secara normal (iaitu Gaussian). Malangnya, pasaran sering mengalami kurtosis di atas pembahagian normal. Pada dasarnya pembahagian pulangan mempunyai ekor yang lebih besar dan dengan itu peristiwa melampau lebih mungkin berlaku daripada pembahagian Gaussian yang akan membawa kita percaya. Oleh itu, nisbah Sharpe lemah dalam mencirikan risiko ekor.
Ini dapat dilihat dengan jelas dalam strategi yang sangat terdedah kepada risiko seperti itu. Sebagai contoh, penjualan pilihan panggilan (alias
Walaupun titik ini mungkin kelihatan jelas kepada sesetengah orang, kos transaksi DIBUTU dimasukkan dalam pengiraan nisbah Sharpe agar ia realistik. Terdapat banyak contoh strategi dagangan yang mempunyai Sharpe yang tinggi (dan dengan itu kemungkinan keuntungan yang besar) hanya dikurangkan kepada strategi Sharpe yang rendah, keuntungan yang rendah setelah kos realistik telah diambil kira. Ini bermakna menggunakan pulangan bersih ketika mengira melebihi penanda aras. Oleh itu, kos transaksi mesti diambil kira di hulu daripada pengiraan nisbah Sharpe.
Satu soalan yang jelas yang belum dijawab setakat ini dalam artikel ini adalah
Rasio Sharpe sering meningkat dengan kekerapan perdagangan. Beberapa strategi frekuensi tinggi akan mempunyai nisbah Sharpe satu digit tinggi (dan kadang-kadang rendah dua digit), kerana mereka boleh menguntungkan hampir setiap hari dan pasti setiap bulan. Strategi ini jarang mengalami risiko bencana dan dengan itu meminimumkan turun naik pulangan mereka, yang membawa kepada nisbah Sharpe yang tinggi.
Ini telah menjadi artikel yang agak teori sehingga titik ini. Kini kita akan beralih perhatian kita kepada beberapa contoh sebenar. Kita akan bermula dengan mudah, dengan mempertimbangkan pembelian dan memegang saham individu yang panjang dan kemudian mempertimbangkan strategi netral pasaran. Kedua-dua contoh ini telah dijalankan dalam perpustakaan analisis data panda Python.
Tugas pertama adalah untuk mendapatkan data dan meletakkannya ke dalam objek panda DataFrame. Dalam artikel mengenai pelaksanaan induk sekuriti dalam Python dan MySQL saya mencipta sistem untuk mencapai ini. Sebagai alternatif, kita boleh menggunakan kod yang lebih mudah ini untuk mengambil data Yahoo Finance secara langsung dan meletakkannya terus ke dalam panda DataFrame. Di bahagian bawah skrip ini saya telah membuat fungsi untuk mengira nisbah Sharpe tahunan berdasarkan aliran pulangan tempoh masa:
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()
Sekarang kita mempunyai keupayaan untuk mendapatkan data dari Yahoo Kewangan dan dengan mudah mengira nisbah Sharpe tahunan, kita boleh menguji strategi beli dan pegang untuk dua ekuiti.
Kita boleh mencipta fungsi tambahan yang membolehkan kita melihat dengan cepat membeli-dan-memegang Sharpe merentasi pelbagai ekuiti untuk tempoh yang sama (hardcoded):
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'])
Bagi Google, nisbah Sharpe untuk membeli dan memegang adalah 0.7501.
equity_sharpe ((
equity_sharpe ((
Sekarang kita boleh mencuba pengiraan yang sama untuk strategi netral pasaran. Matlamat strategi ini adalah untuk mengasingkan sepenuhnya prestasi ekuiti tertentu dari pasaran secara umum. Cara paling mudah untuk mencapai ini adalah untuk pergi pendek jumlah yang sama (dalam dolar) Dana Perdagangan Bursa (ETF) yang direka untuk mengesan pasaran sedemikian. Pilihan yang paling jelas untuk pasaran ekuiti modal besar AS adalah indeks S & P500, yang dikesan oleh SPDR ETF, dengan ticker SPY.
Untuk mengira nisbah Sharpe tahunan dari strategi sedemikian, kita akan mendapatkan harga sejarah untuk SPY dan mengira pulangan peratusan dengan cara yang sama dengan stok sebelumnya, dengan pengecualian bahawa kita tidak akan menggunakan penanda aras bebas risiko. Kita akan mengira pulangan harian bersih yang memerlukan pengurangan perbezaan antara pulangan panjang dan pendek dan kemudian membahagikan dengan 2, kerana kita kini mempunyai dua kali lebih banyak modal dagangan. Berikut adalah kod Python / panda untuk melakukan ini:
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'])
Bagi Google, nisbah Sharpe untuk strategi long/short neutral pasaran ialah 0.7597.
market_neutral_sharpe ((
pasaran_neutral_sharpe ((