ایونٹ سے چلنے والے بیک ٹیسٹر سیریز کے آخری مضمون میں ہم نے ایک بنیادی ایگزیکشن ہینڈلر درجہ بندی پر غور کیا۔ اس مضمون میں ہم اس بات پر تبادلہ خیال کرنے جارہے ہیں کہ پورٹ فولیو آبجیکٹ میں پہلے سے تیار کردہ ایکویٹی وکر ڈیٹا فریم کا استعمال کرتے ہوئے بیک ٹیسٹ کے بعد حکمت عملی کی کارکردگی کا اندازہ کیسے لگایا جائے۔
ہم نے پہلے ہی ایک پچھلے مضمون میں شارپ ریشو پر غور کیا ہے۔ اس مضمون میں میں نے اس بات کا خاکہ پیش کیا ہے کہ (سالانہ) شارپ ریشو کا حساب:
جہاں Ra ایکویٹی وکر کی واپسی کا سلسلہ ہے اور Rb ایک بینچ مارک ہے، جیسے مناسب سود کی شرح یا ایکویٹی انڈیکس۔
زیادہ سے زیادہ ڈراؤنڈ اور ڈراؤنڈ کی مدت دو اضافی اقدامات ہیں جو سرمایہ کار اکثر پورٹ فولیو میں خطرے کا اندازہ کرنے کے لئے استعمال کرتے ہیں۔ سابقہ مقدار ایکویٹی وکر کی کارکردگی میں سب سے زیادہ چوٹی سے نیچے کی کمی ہے ، جبکہ مؤخر الذکر کو تجارتی ادوار کی تعداد کے طور پر بیان کیا گیا ہے جس پر یہ واقع ہوتا ہے۔
اس مضمون میں ہم شارپ تناسب ، زیادہ سے زیادہ ڈراؤنڈ اور ڈراؤنڈ کی مدت کو پائتھون پر مبنی ایونٹ سے چلنے والے بیک ٹیسٹنگ سوٹ میں استعمال کرنے کے لئے پورٹ فولیو کی کارکردگی کے اقدامات کے طور پر نافذ کریں گے۔
پہلا کام ایک نئی فائل تخلیق کرنا ہےperformance.py، جو شارپ تناسب اور ڈراونگ انفارمیشن کا حساب لگانے کے لئے افعال کو اسٹور کرتا ہے۔ جیسا کہ ہمارے زیادہ تر حساب سے بھاری کلاسوں کے ساتھ ہمیں نمپائی اور پانڈوں کو درآمد کرنے کی ضرورت ہے۔
# performance.py
import numpy as np
import pandas as pd
نوٹ کریں کہ شارپ کا تناسب خطرہ سے فائدہ اٹھانے کا ایک اقدام ہے (حقیقت میں یہ بہت سے میں سے ایک ہے) ۔ اس میں ایک ہی پیرامیٹر ہے ، جو سالانہ قیمت تک بڑھانے پر ایڈجسٹ کرنے والے ادوار کی تعداد ہے۔
عام طور پر یہ قدر 252 پر طے کی جاتی ہے ، جو ہر سال امریکہ میں تجارتی دنوں کی تعداد ہے۔ تاہم ، اگر آپ کی حکمت عملی ایک گھنٹے کے اندر تجارت کرتی ہے تو آپ کو اسے سالانہ طور پر درست کرنے کے لئے شارپ کو ایڈجسٹ کرنے کی ضرورت ہے۔ لہذا آپ کو ادوار کو 252
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)
جبکہ شارپ تناسب کی خصوصیت یہ ہے کہ اثاثوں کے راستے کے معیاری انحراف کے مطابق) فی یونٹ منافع میں کتنا خطرہ لیا جارہا ہے ،
ذیل میں تخلیق_ڈراؤنڈ فنکشن اصل میں زیادہ سے زیادہ ڈراؤنڈ اور زیادہ سے زیادہ ڈراؤنڈ کی مدت دونوں فراہم کرتا ہے۔ سابقہ مذکورہ بالا سب سے بڑا چوٹی سے نیچے کی کمی ہے ، جبکہ مؤخر الذکر کو ان ادوار کی تعداد کے طور پر بیان کیا گیا ہے جن پر یہ کمی واقع ہوتی ہے۔
ڈراؤن ڈور کی تشریح میں کچھ لطافت کی ضرورت ہے کیونکہ یہ تجارتی ادوار کو شمار کرتا ہے اور اس طرح براہ راست
اس فنکشن کا آغاز دو پانڈا سیریز آبجیکٹ بنانے سے ہوتا ہے جو ہر ٹریڈنگ
اس کے بعد ڈرا ڈاؤن صرف موجودہ ایچ ڈبلیو ایم اور ایکویٹی وکر کے مابین فرق ہے۔ اگر یہ قدر منفی ہے تو ، اس وقت تک ہر بار کے لئے مدت میں اضافہ ہوتا ہے جب تک کہ اگلے ایچ ڈبلیو ایم تک نہیں پہنچ جاتا ہے۔ اس کے بعد فنکشن صرف دو سیریز میں سے ہر ایک کی زیادہ سے زیادہ رقم واپس کرتا ہے۔
# 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 میں ان کو شامل.