اس سلسلے کے پچھلے دو مضامین میں ہم نے اس بات پر تبادلہ خیال کیا ہے کہ ایونٹ سے چلنے والا بیک ٹیسٹنگ سسٹم کیا ہے اور ایونٹ آبجیکٹ کے لئے کلاس درجہ بندی۔ اس مضمون میں ہم اس بات پر غور کرنے جارہے ہیں کہ مارکیٹ کے اعداد و شمار کو تاریخی بیک ٹیسٹنگ کے تناظر میں اور براہ راست تجارت کے عمل درآمد کے لئے کس طرح استعمال کیا جاتا ہے۔
ایونٹ سے چلنے والے تجارتی نظام کے ساتھ ہمارے مقاصد میں سے ایک بیک ٹیسٹنگ عنصر اور براہ راست عملدرآمد عنصر کے مابین کوڈ کی نقل و حرکت کو کم سے کم کرنا ہے۔ مثالی طور پر ، تاریخی جانچ اور براہ راست تجارت دونوں کے لئے ایک ہی سگنل جنریشن طریقہ کار اور پورٹ فولیو مینجمنٹ اجزاء کو استعمال کرنا زیادہ سے زیادہ ہوگا۔ اس کے کام کرنے کے ل the حکمت عملی کا اعتراض جو سگنل تیار کرتا ہے ، اور پورٹ فولیو کا اعتراض جو ان پر مبنی آرڈر فراہم کرتا ہے ، کو تاریخی اور براہ راست چلانے دونوں کے لئے مارکیٹ فیڈ کے لئے ایک ہی انٹرفیس کا استعمال کرنا چاہئے۔
یہ ڈیٹا ہینڈلر آبجیکٹ پر مبنی کلاس درجہ بندی کے تصور کی حوصلہ افزائی کرتا ہے ، جو تمام ذیلی کلاسوں کو نظام کے اندر باقی اجزاء کو مارکیٹ کے اعداد و شمار فراہم کرنے کے لئے ایک انٹرفیس فراہم کرتا ہے۔ اس طرح کسی بھی ذیلی کلاس ڈیٹا ہینڈلر کو
مخصوص مثال ذیلی کلاسوں میں ہسٹریکل سی ایس وی ڈیٹا ہینڈلر ، کوئنٹل ڈیٹا ہینڈلر ، سیکیورٹیز ماسٹر ڈیٹا ہینڈلر ، انٹرایکٹو بروکرز مارکیٹ فیڈ ڈیٹا ہینڈلر وغیرہ شامل ہوسکتے ہیں۔ اس ٹیوٹوریل میں ہم صرف ایک تاریخی سی ایس وی ڈیٹا ہینڈلر کی تخلیق پر غور کرنے جارہے ہیں ، جو اسٹاک کے لئے انٹرا ڈے سی ایس وی ڈیٹا کو باروں کے اوپن-لو-ہائی-کلوز-ووولیم اوپن انٹرسٹ سیٹ میں لوڈ کرے گا۔ اس کے بعد اس کا استعمال بار بار بار کی بنیاد پر ڈیٹا کو حکمت عملی اور پورٹ فولیو کلاسوں میں کرنے کے لئے کیا جاسکتا ہے ، اس طرح نظام کے ہر دل کی دھڑکن پر نظرانداز ہونے سے بچنے کے ل.
پہلا کام ضروری لائبریریاں درآمد کرنا ہے۔ خاص طور پر ہم پانڈا اور تجریدی بیس کلاس ٹولز درآمد کرنے جارہے ہیں۔ چونکہ ڈیٹا ہینڈلر مارکیٹ ایونٹس تیار کرتا ہے لہذا ہمیں درآمد کرنے کی بھی ضرورت ہے۔event.pyجیسا کہ پچھلے سبق میں بیان کیا گیا ہے:
# data.py
import datetime
import os, os.path
import pandas as pd
سے abc درآمد ABCMeta، خلاصہ طریقہ
واقعہ درآمد سے MarketEvent ڈیٹا ہینڈلر ایک تجریدی بیس کلاس (اے بی سی) ہے ، جس کا مطلب ہے کہ کسی مثال کو براہ راست مثال بنانا ناممکن ہے۔ صرف ذیلی کلاسوں کو مثال بنانا ممکن ہے۔ اس کی وجہ یہ ہے کہ اے بی سی ایک انٹرفیس فراہم کرتا ہے جس پر تمام بعد کے ڈیٹا ہینڈلر ذیلی کلاسوں کو عمل کرنا چاہئے ، اس طرح ان کے ساتھ بات چیت کرنے والی دیگر کلاسوں کے ساتھ مطابقت کو یقینی بنانا۔
ہم استعمال کرتے ہیںمیٹا کلاساس کے علاوہ ہم @abstractmethod decorator کا استعمال کرتے ہیں تاکہ پیتھون کو معلوم ہو سکے کہ یہ ایک ABC ہے۔ اس کے علاوہ ہم پیتھون کو یہ بتانے کے لئے @abstractmethod decorator کا استعمال کرتے ہیں کہ اس طریقہ کار کو ذیلی کلاسوں میں اوور رائڈ کیا جائے گا (یہ سی ++ میں خالص مجازی طریقہ کار کے ساتھ مماثل ہے) ۔
دلچسپی کے دو طریقے get_latest_bars اور update_bars ہیں۔ سابقہ موجودہ دل کی دھڑکن کے ٹائم اسٹیمپ سے آخری N بار واپس کرتا ہے ، جو حکمت عملی کی کلاسوں میں درکار رولنگ حساب کتاب کے لئے مفید ہے۔ مؤخر الذکر طریقہ بار کی معلومات کو کسی نئے ڈیٹا ڈھانچے پر رکھنے کے لئے
# data.py
class DataHandler(object):
"""
DataHandler is an abstract base class providing an interface for
all subsequent (inherited) data handlers (both live and historic).
The goal of a (derived) DataHandler object is to output a generated
set of bars (OLHCVI) for each symbol requested.
This will replicate how a live strategy would function as current
market data would be sent "down the pipe". Thus a historic and live
system will be treated identically by the rest of the backtesting suite.
"""
__metaclass__ = ABCMeta
@abstractmethod
def get_latest_bars(self, symbol, N=1):
"""
Returns the last N bars from the latest_symbol list,
or fewer if less bars are available.
"""
raise NotImplementedError("Should implement get_latest_bars()")
@abstractmethod
def update_bars(self):
"""
Pushes the latest bar to the latest symbol structure
for all symbols in the symbol list.
"""
raise NotImplementedError("Should implement update_bars()")
ڈیٹا ہینڈلر اے بی سی کی وضاحت کے ساتھ ، اگلا مرحلہ تاریخی CSV فائلوں کے لئے ہینڈلر بنانا ہے۔ خاص طور پر ، تاریخی CSVDataHandler متعدد CSV فائلیں لے گا ، ہر علامت کے لئے ایک ، اور ان کو پانڈا ڈیٹا فریموں کی لغت میں تبدیل کرے گا۔
ڈیٹا ہینڈلر کو کچھ پیرامیٹرز کی ضرورت ہوتی ہے ، یعنی ایک ایونٹ کیو جس پر مارکیٹ ایونٹ کی معلومات کو آگے بڑھانا ہے ، CSV فائلوں کا مطلق راستہ اور علامتوں کی ایک فہرست۔ یہاں کلاس کا آغاز ہے:
# data.py
class HistoricCSVDataHandler(DataHandler):
"""
HistoricCSVDataHandler is designed to read CSV files for
each requested symbol from disk and provide an interface
to obtain the "latest" bar in a manner identical to a live
trading interface.
"""
def __init__(self, events, csv_dir, symbol_list):
"""
Initialises the historic data handler by requesting
the location of the CSV files and a list of symbols.
It will be assumed that all files are of the form
'symbol.csv', where symbol is a string in the list.
Parameters:
events - The Event Queue.
csv_dir - Absolute directory path to the CSV files.
symbol_list - A list of symbol strings.
"""
self.events = events
self.csv_dir = csv_dir
self.symbol_list = symbol_list
self.symbol_data = {}
self.latest_symbol_data = {}
self.continue_backtest = True
self._open_convert_csv_files()
یہ ضمنی طور پر
ہسٹریکل سی ایس وی ڈیٹا ہینڈلر کے اندر اندر پانڈوں کو ڈیٹا اسٹور کے طور پر استعمال کرنے کا ایک فائدہ یہ ہے کہ ٹریک کیے جانے والے تمام علامتوں کے انڈیکس کو ایک ساتھ ضم کیا جاسکتا ہے۔ اس سے لاپتہ ڈیٹا پوائنٹس کو ان خلاؤں کے اندر آگے ، پیچھے یا انٹروپولیٹ کرنے کی اجازت ملتی ہے تاکہ ٹکرز کا موازنہ بار سے بار کی بنیاد پر کیا جاسکے۔ یہ ضروری ہے ، مثال کے طور پر ، اوسط کو تبدیل کرنے کی حکمت عملیوں کے لئے۔ تمام علامتوں کے لئے انڈیکس کو جوڑتے وقت یونین اور دوبارہ انڈیکس کے طریقوں کا استعمال نوٹ کریں:
# data.py
def _open_convert_csv_files(self):
"""
Opens the CSV files from the data directory, converting
them into pandas DataFrames within a symbol dictionary.
For this handler it will be assumed that the data is
taken from DTN IQFeed. Thus its format will be respected.
"""
comb_index = None
for s in self.symbol_list:
# Load the CSV file with no header information, indexed on date
self.symbol_data[s] = pd.io.parsers.read_csv(
os.path.join(self.csv_dir, '%s.csv' % s),
header=0, index_col=0,
names=['datetime','open','low','high','close','volume','oi']
)
# Combine the index to pad forward values
if comb_index is None:
comb_index = self.symbol_data[s].index
else:
comb_index.union(self.symbol_data[s].index)
# Set the latest symbol_data to None
self.latest_symbol_data[s] = []
# Reindex the dataframes
for s in self.symbol_list:
self.symbol_data[s] = self.symbol_data[s].reindex(index=comb_index, method='pad').iterrows()
_get_new_bar طریقہ بار ڈیٹا کا فارمیٹ شدہ ورژن فراہم کرنے کے لئے ایک جنریٹر بناتا ہے۔ اس کا مطلب یہ ہے کہ اس طریقہ کار کو بعد میں کال کرنے سے علامت کے اعداد و شمار کے اختتام تک نیا بار مل جائے گا۔
# data.py
def _get_new_bar(self, symbol):
"""
Returns the latest bar from the data feed as a tuple of
(sybmbol, datetime, open, low, high, close, volume).
"""
for b in self.symbol_data[symbol]:
yield tuple([symbol, datetime.datetime.strptime(b[0], '%Y-%m-%d %H:%M:%S'),
b[1][0], b[1][1], b[1][2], b[1][3], b[1][4]])
ڈیٹا ہینڈلر سے لاگو ہونے والا پہلا تجریدی طریقہ get_latest_bars ہے۔ یہ طریقہ صرف تازہ ترین_سمبول_ڈیٹا ڈھانچے سے آخری N سلاخوں کی فہرست فراہم کرتا ہے۔ N = 1 کی ترتیب موجودہ بار (ایک فہرست میں لپیٹ) کی بازیافت کی اجازت دیتا ہے:
# data.py
def get_latest_bars(self, symbol, N=1):
"""
Returns the last N bars from the latest_symbol list,
or N-k if less available.
"""
try:
bars_list = self.latest_symbol_data[symbol]
except KeyError:
print "That symbol is not available in the historical data set."
else:
return bars_list[-N:]
آخری طریقہ ، اپ ڈیٹ_بارس ، ڈیٹا ہینڈلر کا دوسرا خلاصہ طریقہ ہے۔ یہ صرف ایک مارکیٹ ایونٹ تیار کرتا ہے جو قطار میں شامل ہوتا ہے کیونکہ یہ تازہ ترین سلاخوں کو تازہ ترین_سمبول_ڈیٹا میں شامل کرتا ہے:
# data.py
def update_bars(self):
"""
Pushes the latest bar to the latest_symbol_data structure
for all symbols in the symbol list.
"""
for s in self.symbol_list:
try:
bar = self._get_new_bar(s).next()
except StopIteration:
self.continue_backtest = False
else:
if bar is not None:
self.latest_symbol_data[s].append(bar)
self.events.put(MarketEvent())
اس طرح ہمارے پاس ڈیٹا ہینڈلر سے ماخوذ ایک آبجیکٹ ہے ، جسے باقی اجزاء مارکیٹ کے اعداد و شمار کو ٹریک کرنے کے لئے استعمال کرتے ہیں۔ حکمت عملی ، پورٹ فولیو اور ایگزیکشن ہینڈلر اشیاء کو موجودہ مارکیٹ کے اعداد و شمار کی ضرورت ہوتی ہے لہذا اسٹوریج کی نقل و حرکت سے بچنے کے لئے اسے مرکزی بنانے کا احساس ہوتا ہے۔
اگلے مضمون میں ہم حکمت عملی کلاس درجہ بندی پر غور کریں گے اور وضاحت کریں گے کہ کس طرح ایک حکمت عملی کو متعدد علامتوں کو سنبھالنے کے لئے ڈیزائن کیا جاسکتا ہے ، اس طرح پورٹ فولیو آبجیکٹ کے لئے متعدد سگنل ایونٹس پیدا ہوتے ہیں۔