پیتھون کے ساتھ ایونٹ سے چلنے والی بیک ٹیسٹنگ - حصہ VII

مصنف:نیکی, تخلیق: 2019-03-26 10:52:49, تازہ کاری:

ایونٹ سے چلنے والے بیک ٹیسٹر سیریز کے آخری مضمون میں ہم نے ایک بنیادی ایگزیکشن ہینڈلر درجہ بندی پر غور کیا۔ اس مضمون میں ہم اس بات پر تبادلہ خیال کرنے جارہے ہیں کہ پورٹ فولیو آبجیکٹ میں پہلے سے تیار کردہ ایکویٹی وکر ڈیٹا فریم کا استعمال کرتے ہوئے بیک ٹیسٹ کے بعد حکمت عملی کی کارکردگی کا اندازہ کیسے لگایا جائے۔

کارکردگی کی پیمائش

ہم نے پہلے ہی ایک پچھلے مضمون میں شارپ ریشو پر غور کیا ہے۔ اس مضمون میں میں نے اس بات کا خاکہ پیش کیا ہے کہ (سالانہ) شارپ ریشو کا حساب:img

جہاں Ra ایکویٹی وکر کی واپسی کا سلسلہ ہے اور Rb ایک بینچ مارک ہے، جیسے مناسب سود کی شرح یا ایکویٹی انڈیکس۔

زیادہ سے زیادہ ڈراؤنڈ اور ڈراؤنڈ کی مدت دو اضافی اقدامات ہیں جو سرمایہ کار اکثر پورٹ فولیو میں خطرے کا اندازہ کرنے کے لئے استعمال کرتے ہیں۔ سابقہ مقدار ایکویٹی وکر کی کارکردگی میں سب سے زیادہ چوٹی سے نیچے کی کمی ہے ، جبکہ مؤخر الذکر کو تجارتی ادوار کی تعداد کے طور پر بیان کیا گیا ہے جس پر یہ واقع ہوتا ہے۔

اس مضمون میں ہم شارپ تناسب ، زیادہ سے زیادہ ڈراؤنڈ اور ڈراؤنڈ کی مدت کو پائتھون پر مبنی ایونٹ سے چلنے والے بیک ٹیسٹنگ سوٹ میں استعمال کرنے کے لئے پورٹ فولیو کی کارکردگی کے اقدامات کے طور پر نافذ کریں گے۔

پائیتھون کا نفاذ

پہلا کام ایک نئی فائل تخلیق کرنا ہےperformance.py، جو شارپ تناسب اور ڈراونگ انفارمیشن کا حساب لگانے کے لئے افعال کو اسٹور کرتا ہے۔ جیسا کہ ہمارے زیادہ تر حساب سے بھاری کلاسوں کے ساتھ ہمیں نمپائی اور پانڈوں کو درآمد کرنے کی ضرورت ہے۔

# performance.py

import numpy as np
import pandas as pd

نوٹ کریں کہ شارپ کا تناسب خطرہ سے فائدہ اٹھانے کا ایک اقدام ہے (حقیقت میں یہ بہت سے میں سے ایک ہے) ۔ اس میں ایک ہی پیرامیٹر ہے ، جو سالانہ قیمت تک بڑھانے پر ایڈجسٹ کرنے والے ادوار کی تعداد ہے۔

عام طور پر یہ قدر 252 پر طے کی جاتی ہے ، جو ہر سال امریکہ میں تجارتی دنوں کی تعداد ہے۔ تاہم ، اگر آپ کی حکمت عملی ایک گھنٹے کے اندر تجارت کرتی ہے تو آپ کو اسے سالانہ طور پر درست کرنے کے لئے شارپ کو ایڈجسٹ کرنے کی ضرورت ہے۔ لہذا آپ کو ادوار کو 2526.5=1638 پر طے کرنے کی ضرورت ہے ، جو ایک سال کے اندر امریکی تجارتی گھنٹوں کی تعداد ہے۔ اگر آپ منٹ کی بنیاد پر تجارت کرتے ہیں تو ، اس عنصر کو 2526.560=98280 پر طے کرنا ہوگا۔

create_sharpe_ratio فنکشن ایک پانڈا سیریز آبجیکٹ پر کام کرتا ہے جسے واپسی کہا جاتا ہے اور صرف مدت فیصد واپسی اور مدت فیصد واپسی معیاری انحرافات کے درمیان تناسب کا حساب لگاتا ہے جو ادوار فیکٹر کی طرف سے پیمانے پر ہے:

# performance.py

def create_sharpe_ratio(returns, periods=252):
    """
    Create the Sharpe ratio for the strategy, based on a 
    benchmark of zero (i.e. no risk-free rate information).

    Parameters:
    returns - A pandas Series representing period percentage returns.
    periods - Daily (252), Hourly (252*6.5), Minutely(252*6.5*60) etc.
    """
    return np.sqrt(periods) * (np.mean(returns)) / np.std(returns)

جبکہ شارپ تناسب کی خصوصیت یہ ہے کہ اثاثوں کے راستے کے معیاری انحراف کے مطابق) فی یونٹ منافع میں کتنا خطرہ لیا جارہا ہے ، drawdown کو ایکویٹی وکر کے ساتھ سب سے بڑی چوٹی سے نیچے کی کمی کے طور پر بیان کیا گیا ہے۔

ذیل میں تخلیق_ڈراؤنڈ فنکشن اصل میں زیادہ سے زیادہ ڈراؤنڈ اور زیادہ سے زیادہ ڈراؤنڈ کی مدت دونوں فراہم کرتا ہے۔ سابقہ مذکورہ بالا سب سے بڑا چوٹی سے نیچے کی کمی ہے ، جبکہ مؤخر الذکر کو ان ادوار کی تعداد کے طور پر بیان کیا گیا ہے جن پر یہ کمی واقع ہوتی ہے۔

ڈراؤن ڈور کی تشریح میں کچھ لطافت کی ضرورت ہے کیونکہ یہ تجارتی ادوار کو شمار کرتا ہے اور اس طرح براہ راست days جیسے وقتی یونٹ میں ترجمہ نہیں کیا جاسکتا ہے۔

اس فنکشن کا آغاز دو پانڈا سیریز آبجیکٹ بنانے سے ہوتا ہے جو ہر ٹریڈنگ بار پر ڈراؤ ڈاؤن اور مدت کی نمائندگی کرتے ہیں۔ پھر موجودہ اعلی واٹر مارک (ایچ ڈبلیو ایم) کا تعین اس بات کا تعین کرکے کیا جاتا ہے کہ آیا ایکویٹی وکر تمام پچھلی چوٹیوں سے تجاوز کرتا ہے۔

اس کے بعد ڈرا ڈاؤن صرف موجودہ ایچ ڈبلیو ایم اور ایکویٹی وکر کے مابین فرق ہے۔ اگر یہ قدر منفی ہے تو ، اس وقت تک ہر بار کے لئے مدت میں اضافہ ہوتا ہے جب تک کہ اگلے ایچ ڈبلیو ایم تک نہیں پہنچ جاتا ہے۔ اس کے بعد فنکشن صرف دو سیریز میں سے ہر ایک کی زیادہ سے زیادہ رقم واپس کرتا ہے۔

# performance.py

def create_drawdowns(equity_curve):
    """
    Calculate the largest peak-to-trough drawdown of the PnL curve
    as well as the duration of the drawdown. Requires that the 
    pnl_returns is a pandas Series.

    Parameters:
    pnl - A pandas Series representing period percentage returns.

    Returns:
    drawdown, duration - Highest peak-to-trough drawdown and duration.
    """

    # Calculate the cumulative returns curve 
    # and set up the High Water Mark
    # Then create the drawdown and duration series
    hwm = [0]
    eq_idx = equity_curve.index
    drawdown = pd.Series(index = eq_idx)
    duration = pd.Series(index = eq_idx)

    # Loop over the index range
    for t in range(1, len(eq_idx)):
        cur_hwm = max(hwm[t-1], equity_curve[t])
        hwm.append(cur_hwm)
        drawdown[t]= hwm[t] - equity_curve[t]
        duration[t]= 0 if drawdown[t] == 0 else duration[t-1] + 1
    return drawdown.max(), duration.max()

ان کارکردگی کے اقدامات کو استعمال کرنے کے لئے ہمیں ان کا حساب لگانے کا ایک ذریعہ درکار ہے جب بیک ٹسٹ کیا گیا ہو ، یعنی جب ایک مناسب ایکویٹی وکر دستیاب ہو!

ہمیں حساب کتاب کو کسی خاص آبجیکٹ درجہ بندی سے بھی وابستہ کرنے کی ضرورت ہے۔ چونکہ کارکردگی کے اقدامات کا حساب پورٹ فولیو کی بنیاد پر کیا جاتا ہے ، لہذا کارکردگی کے حساب کتاب کو پورٹ فولیو کلاس درجہ بندی پر ایک طریقہ سے منسلک کرنا سمجھ میں آتا ہے جس پر ہم نے اس مضمون میں تبادلہ خیال کیا ہے۔

پہلا کام کھلنا ہےportfolio.pyکے طور پر گزشتہ مضمون میں بحث کی اور کارکردگی کے افعال درآمد:

# portfolio.py

..  # Other imports

from performance import create_sharpe_ratio, create_drawdowns

چونکہ پورٹ فولیو ایک تجریدی بیس کلاس ہے ، لہذا ہم اس کے مشتق کلاسوں میں سے ایک میں ایک طریقہ منسلک کرنا چاہتے ہیں ، جو اس معاملے میں نائن پورٹ فولیو ہوگا۔ لہذا ہم آؤٹ پٹ_سمری_ اسٹیٹس نامی ایک طریقہ کار بنائیں گے جو شارپ اور ڈراؤنڈ کی معلومات پیدا کرنے کے لئے پورٹ فولیو ایکویٹی وکر پر عمل کرے گا۔

یہ طریقہ آسان ہے۔ یہ صرف کارکردگی کے دو اقدامات کا استعمال کرتا ہے اور انہیں براہ راست ایکویٹی وکر پانڈا ڈیٹا فریم پر لاگو کرتا ہے ، اعدادوشمار کو فارمیٹ دوستانہ انداز میں ٹوپلز کی فہرست کے طور پر آؤٹ پٹ کرتا ہے۔

# portfolio.py

..
..

class NaivePortfolio(object):

    ..
    ..

    def output_summary_stats(self):
        """
        Creates a list of summary statistics for the portfolio such
        as Sharpe Ratio and drawdown information.
        """
        total_return = self.equity_curve['equity_curve'][-1]
        returns = self.equity_curve['returns']
        pnl = self.equity_curve['equity_curve']

        sharpe_ratio = create_sharpe_ratio(returns)
        max_dd, dd_duration = create_drawdowns(pnl)

        stats = [("Total Return", "%0.2f%%" % ((total_return - 1.0) * 100.0)),
                 ("Sharpe Ratio", "%0.2f" % sharpe_ratio),
                 ("Max Drawdown", "%0.2f%%" % (max_dd * 100.0)),
                 ("Drawdown Duration", "%d" % dd_duration)]
        return stats

واضح طور پر یہ ایک پورٹ فولیو کے لئے ایک بہت ہی آسان کارکردگی کا تجزیہ ہے۔ اس میں تجارت کی سطح کا تجزیہ یا خطرہ / انعام کے دیگر اقدامات پر غور نہیں کیا جاتا ہے۔ تاہم اس میں مزید طریقوں کو شامل کرکے اس کی توسیع کرنا آسان ہے۔performance.pyاور پھر ضرورت کے مطابق output_summary_stat میں ان کو شامل.


مزید