संसाधन लोड हो रहा है... लोड करना...

एल्गोरिथमिक ट्रेडिंग प्रदर्शन माप के लिए शार्प अनुपात

लेखक:अच्छाई, बनाया गयाः 2019-03-18 13:24:11, अद्यतन किया गयाः

एक एल्गोरिथम ट्रेडिंग रणनीति को अंजाम देते समय, वार्षिक रिटर्न को सबसे उपयोगी प्रदर्शन मीट्रिक के रूप में विचार करने का लालच होता है। हालांकि, इस उपाय को अलग से उपयोग करने में कई खामियां हैं। कुछ रणनीतियों के लिए रिटर्न की गणना पूरी तरह से सीधा नहीं है। यह विशेष रूप से उन रणनीतियों के लिए सच है जो दिशाहीन नहीं हैं जैसे कि बाजार-तटस्थ वेरिएंट या लीवरेज का उपयोग करने वाली रणनीतियां। ये कारक केवल उनके रिटर्न के आधार पर दो रणनीतियों की तुलना करना मुश्किल बनाते हैं।

इसके अतिरिक्त, यदि हमें दो रणनीतियों के साथ प्रस्तुत किया जाता है जिनमें समान रिटर्न होते हैं, तो हम कैसे जानते हैं कि किसमें अधिक जोखिम होता है? इसके अलावा, "अधिक जोखिम" से हमारा क्या मतलब है? वित्त में, हम अक्सर रिटर्न की अस्थिरता और ड्रॉडाउन की अवधि से संबंधित होते हैं। इस प्रकार यदि इनमें से किसी एक रणनीति में रिटर्न की काफी अधिक अस्थिरता है, तो हम इसे कम आकर्षक पाएंगे, इस तथ्य के बावजूद कि इसके ऐतिहासिक रिटर्न समान हो सकते हैं यदि समान नहीं हैं।

रणनीति तुलना और जोखिम आकलन की ये समस्याएं शार्प अनुपात के उपयोग को प्रेरित करती हैं।

शार्प अनुपात की परिभाषा

विलियम फोर्सिथ शार्प एक नोबेल पुरस्कार विजेता अर्थशास्त्री हैं, जिन्होंने कैपिटल एसेट प्राइसिंग मॉडल (सीएपीएम) बनाने में मदद की और 1966 में शार्प अनुपात विकसित किया (बाद में 1994 में अद्यतन किया गया) ।

शार्प अनुपात S निम्नलिखित संबंध द्वारा परिभाषित किया गया हैःimgजहां Ra परिसंपत्ति या रणनीति की अवधि प्रतिफल है और Rb उपयुक्त बेंचमार्क की अवधि प्रतिफल है।

अनुपात परिसंपत्ति या रणनीति के अतिरिक्त प्रतिफलों के औसत औसत की तुलना उन प्रतिफलों के मानक विचलन के साथ करता है। इस प्रकार प्रतिफलों की कम अस्थिरता से समान प्रतिफलों को मानकर एक बड़ा शार्प अनुपात होगा।

शार्प अनुपात जो व्यापारिक रणनीतियों को अंजाम देने वालों द्वारा अक्सर उद्धृत किया जाता है, वह वार्षिक शार्प है, जिसकी गणना उस व्यापारिक अवधि पर निर्भर करती है जिसके रिटर्न को मापा जाता है। यह मानते हुए कि एक वर्ष में N व्यापारिक अवधि होती है, वार्षिक शार्प की गणना इस प्रकार की जाती हैःimgध्यान दें कि शार्प अनुपात की गणना उस विशेष समय अवधि के शार्प के आधार पर की जानी चाहिए। दिनों की ट्रेडिंग अवधि पर आधारित रणनीति के लिए, N = 252 (क्योंकि एक वर्ष में 252 ट्रेडिंग दिन होते हैं, 365 नहीं), और Ra, Rb दैनिक रिटर्न होना चाहिए। इसी तरह घंटों के लिए N = 252 × 6.5 = 1638, न कि N = 252 × 24 = 6048, क्योंकि एक ट्रेडिंग दिन में केवल 6.5 घंटे होते हैं।

बेंचमार्क को शामिल करना

ऊपर दिए गए शार्प अनुपात के लिए सूत्र एक बेंचमार्क के उपयोग का संकेत देता है। एक बेंचमार्क एक यार्डस्टिक या एक अवरोध के रूप में उपयोग किया जाता है जिसे एक विशेष रणनीति को विचार करने लायक होने के लिए दूर करना चाहिए। उदाहरण के लिए, अमेरिकी लार्ज-कैप इक्विटी का उपयोग करने वाली एक सरल लंबी-केवल रणनीति को औसत पर एस एंड पी 500 सूचकांक को हराने की उम्मीद करनी चाहिए, या कम अस्थिरता के लिए इसे मेल खाना चाहिए।

बेंचमार्क की पसंद कभी-कभी अस्पष्ट हो सकती है। उदाहरण के लिए, क्या किसी सेक्टर एक्सचेंज ट्रेडेड फंड (ईटीएफ) का उपयोग व्यक्तिगत इक्विटी के लिए प्रदर्शन बेंचमार्क के रूप में किया जाना चाहिए, या एस एंड पी 500 स्वयं? रसेल 3000 क्यों नहीं? समान रूप से एक हेज फंड रणनीति को खुद को बाजार सूचकांक या अन्य हेज फंड के सूचकांक के खिलाफ बेंचमार्क करना चाहिए? जोखिम मुक्त दर की जटिलता भी है। क्या घरेलू सरकारी बांड का उपयोग किया जाना चाहिए? अंतर्राष्ट्रीय बांड की टोकरी? अल्पकालिक या दीर्घकालिक बिल? एक मिश्रण? स्पष्ट रूप से एक बेंचमार्क चुनने के बहुत सारे तरीके हैं! शार्प अनुपात आम तौर पर जोखिम मुक्त अमेरिकी दर का उपयोग करता है और अक्सर, इक्विटी रणनीतियों के लिए, यह 10 साल के सरकारी ट्रेजरी बिल पर आधारित होता है।

एक विशेष उदाहरण में, बाजार-तटस्थ रणनीतियों के लिए, जोखिम-मुक्त दर या शून्य का उपयोग करने के संदर्भ में एक विशेष जटिलता है। बाजार सूचकांक का उपयोग नहीं किया जाना चाहिए क्योंकि रणनीति, डिजाइन द्वारा, बाजार-तटस्थ है। बाजार-तटस्थ पोर्टफोलियो के लिए सही विकल्प जोखिम-मुक्त दर को घटाना नहीं है क्योंकि यह स्व-वित्तपोषण है। चूंकि आप मार्जिन रखने से क्रेडिट ब्याज, आरएफ प्राप्त करते हैं, इसलिए रिटर्न की वास्तविक गणना हैः (रा + आरएफ) -आरएफ = रा। इसलिए तटस्थ रणनीतियों के लिए जोखिम-मुक्त डॉलर दर का कोई वास्तविक घटाव नहीं है।

सीमाएँ

मात्रात्मक वित्त में शार्प अनुपात के प्रचलन के बावजूद, इसमें कुछ सीमाएं हैं।

सबसे पहले, शार्प अनुपात पीछे की ओर देखने वाला है। यह केवल ऐतिहासिक रिटर्न वितरण और अस्थिरता को ध्यान में रखता है, न कि भविष्य में होने वाले लोगों को। शार्प अनुपात के आधार पर निर्णय लेने पर एक निहित धारणा है कि अतीत भविष्य के समान होगा। यह स्पष्ट रूप से हमेशा ऐसा नहीं होता है, विशेष रूप से बाजार शासन परिवर्तन के तहत।

शार्प अनुपात की गणना यह मानती है कि उपयोग किए जा रहे रिटर्न सामान्य रूप से वितरित हैं (यानी गौसियन) । दुर्भाग्य से, बाजार अक्सर सामान्य वितरण से ऊपर की कर्टोसिस से पीड़ित होते हैं। अनिवार्य रूप से रिटर्न के वितरण में फटर पूंछ होती है और इस प्रकार चरम घटनाओं के होने की अधिक संभावना होती है। इसलिए, शार्प अनुपात पूंछ जोखिम की विशेषता में खराब है।

यह उन रणनीतियों में स्पष्ट रूप से देखा जा सकता है जो इस तरह के जोखिमों के लिए अत्यधिक प्रवण हैं। उदाहरण के लिए, कॉल विकल्पों की बिक्री (उर्फ स्टीम रोलर के तहत पेनी) । समय के साथ कॉल विकल्पों की बिक्री से विकल्प प्रीमियम की एक स्थिर धारा उत्पन्न होती है, जिससे रिटर्न की कम अस्थिरता होती है, एक बेंचमार्क से ऊपर एक मजबूत अधिशेष के साथ। इस मामले में रणनीति में एक उच्च शार्प अनुपात (ऐतिहासिक डेटा के आधार पर) होगा। हालांकि, यह ध्यान में नहीं रखता है कि ऐसे विकल्पों को बुलाया जा सकता है, जिससे इक्विटी वक्र में महत्वपूर्ण और अचानक ड्रॉडाउन (या यहां तक कि मिटा) हो सकता है। इसलिए, एल्गोरिथम ट्रेडिंग रणनीति प्रदर्शन के किसी भी उपाय के साथ, शार्प अनुपात को अलग से उपयोग नहीं किया जा सकता है।

हालांकि यह बिंदु कुछ लोगों के लिए स्पष्ट लग सकता है, लेकिन शार्प अनुपात की गणना में लेनदेन की लागत को शामिल किया जाना चाहिए ताकि यह यथार्थवादी हो सके। ऐसी अनगिनत उदाहरण हैं जहां उच्च शार्प (और इसलिए बड़ी लाभप्रदता की संभावना) वाली ट्रेडिंग रणनीतियों को कम शार्प, कम लाभप्रदता वाली रणनीतियों में कम किया जाता है। इसका मतलब है कि बेंचमार्क से अधिक गणना करते समय शुद्ध रिटर्न का उपयोग करना। इसलिए, शार्प अनुपात की गणना के अपस्ट्रीम में लेनदेन की लागत को शामिल किया जाना चाहिए।

व्यावहारिक उपयोग और उदाहरण

एक स्पष्ट प्रश्न जो इस लेख में अब तक अनुत्तरित रहा है वह है एक रणनीति के लिए एक अच्छा शार्प अनुपात क्या है?। व्यावहारिक रूप से, आपको किसी भी रणनीति को अनदेखा करना चाहिए जिसमें लेनदेन लागत के बाद वार्षिक शार्प अनुपात S<1 है। मात्रात्मक हेज फंड किसी भी रणनीति को अनदेखा करते हैं जिसमें शार्प अनुपात S<2 होता है। एक प्रमुख मात्रात्मक हेज फंड जिसके साथ मैं परिचित हूं, अनुसंधान के दौरान शार्प अनुपात S<3 वाली रणनीतियों पर भी विचार नहीं करेगा। एक खुदरा एल्गोरिथम व्यापारी के रूप में, यदि आप शार्प अनुपात S>2 प्राप्त कर सकते हैं तो आप बहुत अच्छा कर रहे हैं।

शार्प अनुपात अक्सर ट्रेडिंग आवृत्ति के साथ बढ़ेगा। कुछ उच्च आवृत्ति रणनीतियों में उच्च एकल (और कभी-कभी कम डबल) अंकों के शार्प अनुपात होंगे, क्योंकि वे लगभग हर दिन और निश्चित रूप से हर महीने लाभदायक हो सकते हैं। ये रणनीतियाँ शायद ही कभी विनाशकारी जोखिम से पीड़ित होती हैं और इस प्रकार रिटर्न की अस्थिरता को कम करती हैं, जिससे ऐसे उच्च शार्प अनुपात होते हैं।

शार्प अनुपात के उदाहरण

यह इस बिंदु तक काफी सैद्धांतिक लेख रहा है। अब हम कुछ वास्तविक उदाहरणों पर अपना ध्यान आकर्षित करेंगे। हम केवल एक व्यक्तिगत इक्विटी के लंबे समय तक खरीदने और पकड़ने पर विचार करके शुरू करेंगे और फिर बाजार-तटस्थ रणनीति पर विचार करेंगे। ये दोनों उदाहरण पायथन पांडा डेटा विश्लेषण पुस्तकालय में किए गए हैं।

पहला कार्य वास्तव में डेटा प्राप्त करना है और इसे एक पांडा डेटाफ्रेम ऑब्जेक्ट में डालना है। पायथन और MySQL में प्रतिभूति मास्टर कार्यान्वयन पर लेख में मैंने इसे प्राप्त करने के लिए एक प्रणाली बनाई है। वैकल्पिक रूप से, हम इस सरल कोड का उपयोग याहू फाइनेंस डेटा को सीधे लेने और इसे सीधे पांडा डेटाफ्रेम में डालने के लिए कर सकते हैं। इस स्क्रिप्ट के निचले भाग में मैंने समय अवधि रिटर्न स्ट्रीम के आधार पर वार्षिक शार्प अनुपात की गणना करने के लिए एक फ़ंक्शन बनाया हैः

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

अब जब हमारे पास याहू फाइनेंस से डेटा प्राप्त करने और वार्षिक शार्प अनुपात की गणना करने की क्षमता है, तो हम दो इक्विटी के लिए एक खरीद और पकड़ रणनीति का परीक्षण कर सकते हैं। हम Google (GOOG) और गोल्डमैन सैक्स (GS) का उपयोग 1 जनवरी 2000 से 29 मई 2013 तक करेंगे (जब मैंने यह लेख लिखा था!

हम एक अतिरिक्त सहायक फ़ंक्शन बना सकते हैं जो हमें एक ही (हार्डकोड) अवधि के लिए कई इक्विटी में तेजी से शार्प खरीदने और रखने की अनुमति देता हैः

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'])

गूगल के लिए, खरीदने और रखने के लिए शार्प अनुपात 0.7501 है। गोल्डमैन सैक्स के लिए यह 0.2178 हैः

  • इक्विटी_शार्प ((GOOG) 0.75013831274645904

  • equity_sharpe ((GS) 0.21777027767830823

अब हम एक बाजार-तटस्थ रणनीति के लिए एक ही गणना का प्रयास कर सकते हैं। इस रणनीति का लक्ष्य सामान्य रूप से बाजार से एक विशेष इक्विटी के प्रदर्शन को पूरी तरह से अलग करना है। इसे प्राप्त करने का सबसे सरल तरीका एक एक्सचेंज ट्रेडेड फंड (ईटीएफ) की समान राशि (डॉलर में) को छोटा करना है जिसे इस तरह के बाजार को ट्रैक करने के लिए डिज़ाइन किया गया है। अमेरिकी लार्ज-कैप इक्विटी बाजार के लिए सबसे स्पष्ट विकल्प एस एंड पी 500 सूचकांक है, जिसे एसपीडीआर ईटीएफ द्वारा ट्रैक किया जाता है, जिसमें एसपीवाई का टिकर होता है।

इस तरह की रणनीति के वार्षिक शार्प अनुपात की गणना करने के लिए हम एसपीवाई के लिए ऐतिहासिक कीमतों को प्राप्त करेंगे और पिछले स्टॉक के समान तरीके से प्रतिशत रिटर्न की गणना करेंगे, सिवाय इसके कि हम जोखिम मुक्त बेंचमार्क का उपयोग नहीं करेंगे। हम शुद्ध दैनिक रिटर्न की गणना करेंगे जिसके लिए लंबे और छोटे रिटर्न के बीच अंतर को घटाने की आवश्यकता है और फिर 2 से विभाजित करें, क्योंकि अब हमारे पास दो बार अधिक ट्रेडिंग पूंजी है। यहाँ इसे करने के लिए पायथन / पांडा कोड हैः

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'])

गूगल के लिए लंबी/छोटी बाजार-तटस्थ रणनीति के लिए शार्प अनुपात 0.7597 है। गोल्डमैन सैक्स के लिए यह 0.2999 हैः

  • market_neutral_sharpe ((GOOG, SPY) 0.75966612163452329

  • बाजार-तटस्थ_शार्प (GS, SPY) 0.29991401047248328 यद्यपि शार्प अनुपात का उपयोग एल्गोरिदमिक ट्रेडिंग में लगभग हर जगह किया जाता है, लेकिन हमें प्रदर्शन और जोखिम के अन्य मापदंडों पर विचार करने की आवश्यकता है। बाद के लेखों में हम ड्रॉडाउन पर चर्चा करेंगे और वे रणनीति चलाने या नहीं करने के निर्णय को कैसे प्रभावित करते हैं।


अधिक