Rasio Sharpe untuk Pengukuran Prestasi Dagangan Algoritma

Penulis:Kebaikan, Dicipta: 2019-03-18 13:24:11, Dikemas kini:

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 lebih banyak risiko? Dalam kewangan, kita sering prihatin dengan turun naik pulangan dan tempoh penarikan. Oleh itu jika salah satu daripada strategi ini mempunyai turun naik pulangan yang jauh lebih tinggi kita mungkin akan mendapati ia kurang menarik, walaupun fakta bahawa pulangan sejarahnya mungkin serupa jika tidak sama.

Masalah perbandingan strategi dan penilaian risiko ini mendorong penggunaan Sharpe Ratio.

Definisi Nisbah Sharpe

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:imgDi 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.

Sharpe Ratio yang sering dipetik oleh mereka yang menjalankan strategi dagangan adalah Sharpe tahunan, pengiraan yang bergantung kepada tempoh dagangan di mana pulangan diukur. Dengan mengandaikan terdapat N tempoh dagangan dalam setahun, Sharpe tahunan dikira seperti berikut:imgPerhatikan bahawa nisbah Sharpe itu sendiri mesti dikira berdasarkan Sharpe jenis tempoh masa tertentu. Untuk strategi berdasarkan tempoh dagangan hari, N = 252 (kerana terdapat 252 hari dagangan dalam setahun, bukan 365), dan Ra, Rb mestilah pulangan harian. Begitu juga untuk jam N = 252 × 6.5 = 1638, bukan N = 252 × 24 = 6048, kerana hanya terdapat 6,5 jam dalam satu hari dagangan.

Penyertaan Penanda aras

Rumus untuk nisbah Sharpe di atas merujuk kepada penggunaan penanda aras. Penanda aras digunakan sebagai yardstick atau hindaran yang mesti diatasi oleh strategi tertentu agar layak dipertimbangkan. Sebagai contoh, strategi panjang yang mudah menggunakan ekuiti besar AS harus berharap untuk mengalahkan indeks S & P500 secara purata, atau menyamai untuk turun naik yang kurang.

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.

Batasan

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 pennies under a steam roller). Aliran premium pilihan yang stabil dihasilkan oleh penjualan pilihan panggilan dari masa ke masa, yang membawa kepada turun naik yang rendah dalam pulangan, dengan kelebihan yang kuat di atas penanda aras. Dalam kes ini strategi akan mempunyai nisbah Sharpe yang tinggi (berdasarkan data sejarah). Walau bagaimanapun, ia tidak mengambil kira bahawa pilihan tersebut boleh dipanggil, yang membawa kepada penarikan yang signifikan dan tiba-tiba (atau bahkan menghapus) dalam kurva ekuiti. Oleh itu, seperti dengan sebarang ukuran prestasi strategi perdagangan algoritmik, nisbah Sharpe tidak boleh digunakan secara berasingan.

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.

Penggunaan Praktis dan Contoh

Satu soalan yang jelas yang belum dijawab setakat ini dalam artikel ini adalah Apakah nisbah Sharpe yang baik untuk strategi?. Secara pragmatik, anda harus mengabaikan mana-mana strategi yang mempunyai nisbah Sharpe tahunan S<1 selepas kos transaksi. Dana lindung nilai kuantitatif cenderung mengabaikan mana-mana strategi yang mempunyai nisbah Sharpe S<2. Satu dana lindung nilai kuantitatif terkemuka yang saya kenal tidak akan mempertimbangkan strategi yang mempunyai nisbah Sharpe S<3 semasa dalam penyelidikan. Sebagai peniaga algoritma runcit, jika anda dapat mencapai nisbah Sharpe S>2 maka anda melakukannya dengan sangat baik.

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.

Contoh Nisbah Sharpe

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

  • equity_sharpe ((GS) 0.21777027767830823

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 ((GOOG, SPY) 0.75966612163452329

  • pasaran_neutral_sharpe ((GS, SPY) 0.29991401047248328 Walaupun nisbah Sharpe digunakan hampir di mana-mana dalam perdagangan algoritma, kita perlu mempertimbangkan metrik prestasi dan risiko lain.


Lebih lanjut