تجارت میں مشین لرننگ ٹیکنالوجی کا اطلاق

مصنف:لیدیہ, تخلیق: 2022-12-30 10:53:07, تازہ کاری: 2023-09-20 09:30:09

img

تجارت میں مشین لرننگ ٹیکنالوجی کا اطلاق

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

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

ان دو مضامین کے پتے یہاں ہیں:https://www.fmz.com/digest-topic/9862اورhttps://www.fmz.com/digest-topic/9863.

تحقیق کے ماحول کے قیام کے بارے میں

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

  • FMZ کوانٹ ڈوکر انسٹال کریں اور Anaconda ترتیب دیں

FMZ کوانٹ پلیٹ فارمFMZ.COMیہ نہ صرف اہم مرکزی دھارے کے تبادلے کے لئے اعلی معیار کے ڈیٹا ذرائع فراہم کرتا ہے ، بلکہ ڈیٹا تجزیہ مکمل کرنے کے بعد خودکار لین دین کرنے میں ہماری مدد کرنے کے لئے بھرپور API انٹرفیس کا ایک سیٹ بھی فراہم کرتا ہے۔ انٹرفیس کے اس سیٹ میں عملی ٹولز شامل ہیں ، جیسے اکاؤنٹ کی معلومات کی استفسار کرنا ، اعلی ، کھلی ، کم ، رسید کی قیمت ، تجارتی حجم ، اور مختلف عام طور پر استعمال ہونے والے تکنیکی تجزیہ اشارے مختلف مرکزی دھارے کے تبادلے۔ خاص طور پر ، یہ اصل تجارتی عمل میں بڑے مرکزی دھارے کے تبادلے کو مربوط کرنے والے عوامی API انٹرفیس کے لئے مضبوط تکنیکی مدد فراہم کرتا ہے۔

مذکورہ بالا تمام خصوصیات کو ڈوکر جیسے نظام میں شامل کیا گیا ہے۔ ہمیں اپنی کلاؤڈ کمپیوٹنگ خدمات خریدنے یا لیز پر لینے اور ڈوکر سسٹم کو تعینات کرنے کی ضرورت ہے۔

ایف ایم زیڈ کوانٹ پلیٹ فارم کے سرکاری نام میں ، ڈوکر سسٹم کو ڈوکر سسٹم کہا جاتا ہے۔

براہ کرم میرے پچھلے مضمون کا حوالہ دیں کہ ڈوکر اور روبوٹ کو کیسے تعینات کیا جائے:https://www.fmz.com/bbs-topic/9864.

قارئین جو اپنے ڈاکرز کو تعینات کرنے کے لئے اپنا کلاؤڈ کمپیوٹنگ سرور خریدنا چاہتے ہیں وہ اس مضمون کا حوالہ دے سکتے ہیں:https://www.fmz.com/digest-topic/5711.

کلاؤڈ کمپیوٹنگ سرور اور ڈوکر سسٹم کو کامیابی کے ساتھ تعینات کرنے کے بعد، اگلا ہم پائیتھون کے موجودہ سب سے بڑے آرٹیفیکٹ انسٹال کریں گے: اناکونڈا

اس مضمون میں درکار تمام متعلقہ پروگرام ماحول (تبعیت لائبریریاں ، ورژن مینجمنٹ ، وغیرہ) کو سمجھنے کے ل the ، آسان ترین طریقہ ایناکونڈا کا استعمال کرنا ہے۔ یہ پیتھون ڈیٹا سائنس ماحولیاتی نظام اور انحصار لائبریری مینیجر ہے۔

چونکہ ہم Anaconda کو کلاؤڈ سروس پر انسٹال کرتے ہیں، لہذا ہم تجویز کرتے ہیں کہ کلاؤڈ سرور میں لینکس سسٹم اور Anaconda کا کمانڈ لائن ورژن انسٹال کریں۔

Anaconda کی تنصیب کے طریقہ کار کے لئے، برائے مہربانی Anaconda کے سرکاری گائیڈ سے رجوع کریں:https://www.anaconda.com/distribution/.

اگر آپ تجربہ کار پائتھون پروگرامر ہیں اور اگر آپ کو لگتا ہے کہ آپ کو اناکونڈا استعمال کرنے کی ضرورت نہیں ہے تو ، یہ بالکل کوئی مسئلہ نہیں ہے۔ میں فرض کروں گا کہ آپ کو ضروری منحصر ماحول کی تنصیب کے دوران مدد کی ضرورت نہیں ہے۔ آپ براہ راست اس حصے کو چھوڑ سکتے ہیں۔

تجارتی حکمت عملی تیار کریں

تجارتی حکمت عملی کی حتمی پیداوار کو مندرجہ ذیل سوالات کا جواب دینا چاہئے:

  • سمت: اس بات کا تعین کریں کہ اثاثہ سستا ہے، مہنگا ہے یا منصفانہ قیمت ہے.

  • افتتاحی پوزیشن کی شرائط: اگر اثاثہ سستا یا مہنگا ہے، تو آپ کو طویل یا مختصر جانا چاہئے.

  • بند ہونے والی پوزیشن کی تجارت: اگر اثاثہ کی قیمت مناسب ہے اور ہمارے پاس اثاثہ میں پوزیشن ہے (پچھلی خرید یا فروخت) ، کیا آپ کو پوزیشن بند کرنی چاہئے؟

  • قیمت کی حد: وہ قیمت (یا حد) جس پر پوزیشن کھولی گئی تھی۔

  • مقدار: تجارت کی جانے والی رقم کی مقدار (مثال کے طور پر، ڈیجیٹل کرنسی کی مقدار یا اجناس کے فیوچر کی بہت سی تعداد) ۔

مشین لرننگ کا استعمال ان میں سے ہر ایک سوال کا جواب دینے کے لئے کیا جا سکتا ہے، لیکن اس مضمون کے باقی حصے کے لئے، ہم پہلے سوال پر توجہ مرکوز کریں گے، جو تجارت کی سمت ہے.

اسٹریٹجک نقطہ نظر

حکمت عملیوں کی تعمیر کے لئے دو قسم کے نقطہ نظر ہیں: ایک ماڈل پر مبنی ہے۔ دوسرا ڈیٹا مائننگ پر مبنی ہے۔ یہ دونوں طریقے بنیادی طور پر ایک دوسرے کے مخالف ہیں۔

ماڈل پر مبنی حکمت عملی کی تعمیر میں ، ہم مارکیٹ کی عدم کارکردگی کے ماڈل سے شروع کرتے ہیں ، ریاضیاتی اظہار (جیسے قیمت اور منافع) بناتے ہیں اور طویل عرصے میں ان کی تاثیر کی جانچ کرتے ہیں۔ یہ ماڈل عام طور پر ایک حقیقی پیچیدہ ماڈل کا ایک آسان ورژن ہوتا ہے ، اور اس کی طویل مدتی اہمیت اور استحکام کی تصدیق کرنے کی ضرورت ہوتی ہے۔ مندرجہ ذیل عام رجحان ، مطلب ریورس اور ثالثی کی حکمت عملی اس زمرے میں آتی ہے۔

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

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

کوڈ مثال FMZ کوانٹ پلیٹ فارم اور ایک خودکار ٹرانزیکشن API انٹرفیس پر مبنی بیک ٹیسٹنگ ٹول کا استعمال کرتی ہے۔ ڈوکر کو تعینات کرنے اور مذکورہ بالا حصے میں اناکونڈا انسٹال کرنے کے بعد ، آپ کو صرف ڈیٹا سائنس تجزیہ لائبریری انسٹال کرنے کی ضرورت ہے جس کی ہمیں ضرورت ہے اور مشہور مشین لرننگ ماڈل سککیٹ لرن۔ ہم اس حصے پر دوبارہ نہیں جائیں گے۔

pip install -U scikit-learn

تجارتی حکمت عملی سگنل بنانے کے لئے مشین سیکھنے کا استعمال کریں

- ڈیٹا مائننگ اس سے پہلے کہ ہم شروع کریں، ایک معیاری مشین لرننگ مسئلہ نظام مندرجہ ذیل شکل میں دکھایا گیا ہے:

img

مشینی سیکھنے کا مسئلہ نظام

ہم جس خصوصیت کو تخلیق کرنے جارہے ہیں اس میں کچھ پیش گوئی کی صلاحیت (X) ہونی چاہئے۔ ہم ہدف متغیر (Y) کی پیش گوئی کرنا چاہتے ہیں اور تاریخی اعداد و شمار کا استعمال ایم ایل ماڈل کو تربیت دینے کے لئے کرتے ہیں جو Y کی اصل قدر کے قریب پیش گوئی کرسکتا ہے۔ آخر میں ، ہم اس ماڈل کا استعمال نئے اعداد و شمار پر پیش گوئی کرنے کے لئے کرتے ہیں جہاں Y نامعلوم ہے۔ اس سے ہمیں پہلا مرحلہ ملتا ہے:

پہلا مرحلہ: اپنا سوال پیش کریں

  • آپ کیا پیش گوئی کرنا چاہتے ہیں؟ اچھی پیش گوئی کیا ہے؟ آپ پیش گوئی کے نتائج کا اندازہ کیسے لگاتے ہیں؟

یعنی، ہمارے اوپر کے فریم ورک میں، Y کیا ہے؟

img

آپ کیا پیش گوئی کرنا چاہتے ہیں؟

کیا آپ مستقبل کی قیمتوں کی پیش گوئی کرنا چاہتے ہیں، مستقبل کی واپسی / Pnl، خرید / فروخت سگنل، پورٹ فولیو کی تقسیم کو بہتر بنانے اور ٹرانزیکشن کو مؤثر طریقے سے انجام دینے کی کوشش کرنا چاہتے ہیں؟

فرض کریں کہ ہم اگلی ٹائم اسٹیمپ پر قیمتوں کی پیش گوئی کرنے کی کوشش کرتے ہیں۔ اس معاملے میں ، Y (t) = قیمت (t + 1). اب ہم اپنے فریم ورک کو مکمل کرنے کے لئے تاریخی اعداد و شمار کا استعمال کرسکتے ہیں۔

نوٹ کریں کہ Y (t) صرف بیک ٹسٹ میں جانا جاتا ہے ، لیکن جب ہم اپنا ماڈل استعمال کرتے ہیں تو ، ہم وقت t کی قیمت (t + 1) نہیں جان پائیں گے۔ ہم اپنے ماڈل کو Y (توقع شدہ ، t) کی پیش گوئی کرنے اور اس کا اصل قدر سے صرف وقت t + 1 میں موازنہ کرنے کے لئے استعمال کرتے ہیں۔ اس کا مطلب یہ ہے کہ آپ Y کو پیش گوئی کے ماڈل میں ایک خصوصیت کے طور پر استعمال نہیں کرسکتے ہیں۔

ایک بار جب ہم ہدف Y جانتے ہیں تو ، ہم یہ بھی فیصلہ کرسکتے ہیں کہ اپنی پیش گوئیوں کا اندازہ کیسے لگایا جائے۔ یہ ضروری ہے کہ ہم جس ڈیٹا کی کوشش کریں گے اس کے مختلف ماڈلز میں فرق کریں۔ ہم جس مسئلے کو حل کر رہے ہیں اس کے مطابق اپنے ماڈل کی کارکردگی کی پیمائش کرنے کے لئے ایک اشارے کا انتخاب کریں۔ مثال کے طور پر ، اگر ہم قیمتوں کی پیش گوئی کرتے ہیں تو ، ہم روٹ میڈین اسکوائر غلطی کو بطور اشارے استعمال کرسکتے ہیں۔ کچھ عام طور پر استعمال ہونے والے اشارے (EMA ، MACD ، تغیر اسکور ، وغیرہ) کو ایف ایم زیڈ کوانٹ ٹول باکس میں پہلے سے کوڈ کیا گیا ہے۔ آپ ان اشارے کو عالمی سطح پر API انٹرفیس کے ذریعے کال کرسکتے ہیں۔

img

مستقبل کی قیمتوں کی پیشن گوئی کے لئے ML فریم ورک

مظاہرے کے مقاصد کے لئے ہم ایک پیش گوئی ماڈل تخلیق کریں گے جس میں ایک فرضی سرمایہ کاری کے اعتراض کے متوقع مستقبل کے بینچ مارک (بنیادی) قدر کی پیش گوئی کی جائے گی ، جہاں:

basis = Price of Stock — Price of Future

basis(t)=S(t)−F(t)

Y(t) = future expected value of basis = Average(basis(t+1),basis(t+2),basis(t+3),basis(t+4),basis(t+5))

چونکہ یہ رجعت کا مسئلہ ہے ، لہذا ہم ماڈل کا اندازہ RMSE (روٹ میڈین اسکوائر غلطی) پر کریں گے۔ ہم اندازہ کے معیار کے طور پر کل Pnl بھی استعمال کریں گے۔

نوٹ: براہ کرم بیڈو انسائیکلوپیڈیا سے رجوع کریں تاکہ RMSE کے متعلقہ ریاضیاتی علم حاصل کریں۔

  • ہمارا مقصد: ایک ایسا ماڈل بنانا جس سے پیش گوئی کی گئی قدر Y کے قریب ہو سکے.

مرحلہ 2: قابل اعتماد ڈیٹا اکٹھا کریں

جمع اور صاف اعداد و شمار جو آپ کو ہاتھ میں مسئلہ کو حل کرنے میں مدد کر سکتے ہیں.

آپ کو کون سے اعداد و شمار پر غور کرنے کی ضرورت ہے جو ہدف متغیر Y کی پیش گوئی کرسکیں؟ اگر ہم قیمت کی پیش گوئی کرتے ہیں تو ، آپ سرمایہ کاری کے اعتراض کی قیمت کے اعداد و شمار ، سرمایہ کاری کے اعتراض کے تجارتی مقدار کے اعداد و شمار ، متعلقہ سرمایہ کاری کے اعتراض کے اسی طرح کے اعداد و شمار ، سرمایہ کاری کے اعتراض کی انڈیکس کی سطح اور دیگر مجموعی مارکیٹ کے اشارے ، اور دیگر متعلقہ اثاثوں کی قیمت استعمال کرسکتے ہیں۔

آپ کو ان اعداد و شمار کے لئے ڈیٹا تک رسائی کی اجازتیں مرتب کرنے کی ضرورت ہے اور اس بات کو یقینی بنانا ہے کہ آپ کے اعداد و شمار درست ہیں ، اور کھوئے ہوئے اعداد و شمار کو حل کریں (ایک بہت عام مسئلہ) ۔ اسی وقت ، اس بات کو یقینی بنائیں کہ آپ کے اعداد و شمار غیر جانبدار ہیں اور مارکیٹ کے تمام حالات کی مکمل نمائندگی کرتے ہیں (مثال کے طور پر ، منافع اور نقصان کے اسی تعداد کے منظرنامے) تاکہ ماڈل میں تعصب سے بچ سکے۔ آپ کو منافع ، تقسیم سرمایہ کاری کے اہداف ، تسلسل وغیرہ حاصل کرنے کے لئے ڈیٹا کو صاف کرنے کی بھی ضرورت ہوسکتی ہے۔

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

اس مضمون کی نمائش میں آسانی کے ل we ، ہم مندرجہ ذیل اعداد و شمار کو ورچوئل انویسٹمنٹ ٹارگٹ کے MQK کے طور پر استعمال کرتے ہیں۔ ہم ایک بہت ہی آسان مقداری ٹول بھی استعمال کریں گے جسے Auquans ٹول باکس کہا جاتا ہے۔ مزید معلومات کے لئے ، براہ کرم ملاحظہ کریں:https://github.com/Auquan/auquan-toolbox-python.

# Load the data
from backtester.dataSource.quant_quest_data_source import QuantQuestDataSource
cachedFolderName = '/Users/chandinijain/Auquan/qq2solver-data/historicalData/'
dataSetId = 'trainingData1'
instrumentIds = ['MQK']
ds = QuantQuestDataSource(cachedFolderName=cachedFolderName,
                                    dataSetId=dataSetId,
                                    instrumentIds=instrumentIds)
def loadData(ds):
    data = None
    for key in ds.getBookDataByFeature().keys():
        if data is None:
            data = pd.DataFrame(np.nan, index = ds.getBookDataByFeature()[key].index, columns=[])
        data[key] = ds.getBookDataByFeature()[key]
    data['Stock Price'] =  ds.getBookDataByFeature()['stockTopBidPrice'] + ds.getBookDataByFeature()['stockTopAskPrice'] / 2.0
    data['Future Price'] = ds.getBookDataByFeature()['futureTopBidPrice'] + ds.getBookDataByFeature()['futureTopAskPrice'] / 2.0
    data['Y(Target)'] = ds.getBookDataByFeature()['basis'].shift(-5)
    del data['benchmark_score']
    del data['FairValue']
    return data
data = loadData(ds)

مندرجہ بالا کوڈ کے ساتھ ، Auquans ٹول باکس نے ڈیٹا فریم ڈکشنری میں ڈیٹا ڈاؤن لوڈ اور لوڈ کیا ہے۔ اب ہمیں اپنی پسند کے فارمیٹ میں ڈیٹا تیار کرنے کی ضرورت ہے۔ فنکشن ds.getBookDataByFeature() ڈیٹا فریموں کا ڈکشنری لوٹاتا ہے ، ہر خصوصیت کے لئے ایک۔ ہم تمام خصوصیات کے ساتھ اسٹاک کے لئے نئے ڈیٹا فریم بناتے ہیں۔

مرحلہ 3: ڈیٹا کو تقسیم کریں

  • ٹریننگ سیٹ بنائیں، کراس تصدیق کریں اور ان ڈیٹا سیٹوں کو ڈیٹا سے ٹیسٹ کریں۔

یہ ایک بہت اہم قدم ہے!اس سے پہلے کہ ہم آگے بڑھیں ، ہمیں اپنے ماڈل کو تربیت دینے کے لئے ڈیٹا کو ٹریننگ ڈیٹا سیٹوں میں تقسیم کرنا چاہئے۔ ماڈل کی کارکردگی کا اندازہ کرنے کے لئے ٹیسٹ ڈیٹا سیٹ۔ ان کو 60-70 training ٹریننگ سیٹوں اور 30-40٪ ٹیسٹ سیٹوں میں تقسیم کرنے کی سفارش کی جاتی ہے۔

img

ٹریننگ سیٹ اور ٹیسٹ سیٹ میں ڈیٹا تقسیم کریں

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

img

اعداد و شمار کو ٹریننگ سیٹ، تصدیق سیٹ اور ٹیسٹ سیٹ میں تقسیم کریں

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

اس مسئلے کو حل کرنے کے لئے ، ہم ایک علیحدہ توثیق ڈیٹا سیٹ تشکیل دے سکتے ہیں۔ اب ، آپ ڈیٹا کو تربیت دے سکتے ہیں ، توثیق کے ڈیٹا کی کارکردگی کا اندازہ کرسکتے ہیں ، اس وقت تک اصلاح کرسکتے ہیں جب تک کہ آپ کارکردگی سے مطمئن نہ ہوں ، اور آخر میں ٹیسٹ کے ڈیٹا کی جانچ کریں۔ اس طرح ، ٹیسٹ کے ڈیٹا کو آلودہ نہیں کیا جائے گا ، اور ہم اپنے ماڈل کو بہتر بنانے کے لئے ٹیسٹ کے ڈیٹا میں کوئی معلومات استعمال نہیں کریں گے۔

یاد رکھیں ، ایک بار جب آپ نے اپنے ٹیسٹ کے اعداد و شمار کی کارکردگی کی جانچ پڑتال کرلی ہے تو ، واپس نہ جائیں اور اپنے ماڈل کو مزید بہتر بنانے کی کوشش نہ کریں۔ اگر آپ کو معلوم ہوتا ہے کہ آپ کا ماڈل اچھے نتائج نہیں دیتا ہے تو ، ماڈل کو مکمل طور پر ضائع کردیں اور دوبارہ شروع کریں۔ یہ تجویز کیا جاتا ہے کہ 60٪ ٹریننگ ڈیٹا ، 20٪ توثیقی ڈیٹا اور 20٪ ٹیسٹ ڈیٹا کو تقسیم کیا جاسکتا ہے۔

ہمارے سوال کے لئے، ہمارے پاس تین دستیاب ڈیٹا سیٹ ہیں۔ ہم ایک کو ٹریننگ سیٹ کے طور پر استعمال کریں گے، دوسرا تصدیق سیٹ کے طور پر، اور تیسرا ہمارے ٹیسٹ سیٹ کے طور پر.

# Training Data
dataSetId =  'trainingData1'
ds_training = QuantQuestDataSource(cachedFolderName=cachedFolderName,
                                    dataSetId=dataSetId,
                                    instrumentIds=instrumentIds)
training_data = loadData(ds_training)
# Validation Data
dataSetId =  'trainingData2'
ds_validation = QuantQuestDataSource(cachedFolderName=cachedFolderName,
                                    dataSetId=dataSetId,
                                    instrumentIds=instrumentIds)
validation_data = loadData(ds_validation)
# Test Data
dataSetId =  'trainingData3'
ds_test = QuantQuestDataSource(cachedFolderName=cachedFolderName,
                                    dataSetId=dataSetId,
                                    instrumentIds=instrumentIds)
out_of_sample_test_data = loadData(ds_test)

ان میں سے ہر ایک کے لئے، ہم ہدف متغیر Y شامل کرتے ہیں، جو اگلے پانچ بیس اقدار کے اوسط کے طور پر بیان کیا جاتا ہے.

def prepareData(data, period):
    data['Y(Target)'] = data['basis'].rolling(period).mean().shift(-period)
    if 'FairValue' in data.columns:
        del data['FairValue']
    data.dropna(inplace=True)
period = 5
prepareData(training_data, period)
prepareData(validation_data, period)
prepareData(out_of_sample_test_data, period)

مرحلہ 4: خصوصیت انجینئرنگ

اعداد و شمار کے رویے کا تجزیہ کریں اور پیش گوئی کی خصوصیات بنائیں

اب اصل پروجیکٹ کی تعمیر شروع ہوگئی ہے۔ خصوصیت کے انتخاب کا سنہری اصول یہ ہے کہ پیش گوئی کی صلاحیت بنیادی طور پر خصوصیات سے آتی ہے ، ماڈلز سے نہیں۔ آپ کو معلوم ہوگا کہ خصوصیات کے انتخاب کا ماڈل کے انتخاب سے کہیں زیادہ کارکردگی پر اثر پڑتا ہے۔ خصوصیات کے انتخاب کے لئے کچھ غور:

  • ہدف متغیر کے ساتھ تعلقات کی تلاش کے بغیر نمایاں خصوصیات کا ایک بڑا سیٹ تصادفی طور پر منتخب نہ کریں.

  • ہدف متغیر کے ساتھ بہت کم یا کوئی تعلق نہیں زیادہ فٹ ہونے کا باعث بن سکتا ہے.

  • آپ کی منتخب کردہ خصوصیات ایک دوسرے سے بہت متعلق ہوسکتی ہیں، اس صورت میں ایک چھوٹی سی تعداد میں خصوصیات بھی ہدف کی وضاحت کرسکتے ہیں.

  • میں عام طور پر کچھ بدیہی خصوصیات بناتا ہوں، ہدف متغیر اور ان خصوصیات کے درمیان تعلق کی جانچ پڑتال کرتا ہوں، اور ان کے درمیان تعلق کا فیصلہ کرنے کے لئے کہ کون سا استعمال کرنا ہے.

  • آپ زیادہ سے زیادہ معلومات کے گتانک (ایم آئی سی) کے مطابق امیدوار خصوصیات کو ترتیب دینے کے لئے اہم اجزاء تجزیہ (پی سی اے) اور دیگر طریقوں کو انجام دینے کی کوشش بھی کرسکتے ہیں۔

خصوصیت کی تبدیلی / معمول:

ایم ایل ماڈل معمول کے لحاظ سے اچھی کارکردگی کا مظاہرہ کرتے ہیں۔ تاہم ، وقت کی سیریز کے اعداد و شمار سے نمٹنے کے لئے معمول بنانا مشکل ہے ، کیونکہ مستقبل کی ڈیٹا رینج نامعلوم ہے۔ آپ کا ڈیٹا معمول کی حد سے باہر ہوسکتا ہے ، جس سے ماڈل کی غلطیاں پیدا ہوسکتی ہیں۔ لیکن آپ پھر بھی کچھ حد تک استحکام کو مجبور کرنے کی کوشش کرسکتے ہیں۔

  • اسکیلنگ: معیاری انحراف یا کوارٹائل رینج کے ذریعہ خصوصیات کو تقسیم کرنا۔

  • سینٹرنگ: موجودہ قدر سے تاریخی اوسط قدر کو گھٹائیں۔

  • معمول: اوپر کی دو retrospective ادوار (x - اوسط) /stdev.

  • باقاعدہ معمول: اعداد و شمار کو -1 سے +1 تک کی حد میں معیاری بنائیں اور بیک ٹریکنگ مدت (x-min) / ((max min) کے اندر مرکز کو دوبارہ طے کریں۔

نوٹ کریں کہ چونکہ ہم بیک ٹریکنگ پیریڈ کے بعد تاریخی مسلسل اوسط قدر ، معیاری انحراف ، زیادہ سے زیادہ یا کم سے کم اقدار کا استعمال کرتے ہیں ، لہذا خصوصیت کی معمول کی معیاری قیمت مختلف اوقات میں مختلف اصل اقدار کی نمائندگی کرے گی۔ مثال کے طور پر ، اگر خصوصیت کی موجودہ قیمت 5 ہے اور لگاتار 30 ادوار کی اوسط قیمت 4.5 ہے تو ، اسے مرکز بندی کے بعد 0.5 میں تبدیل کردیا جائے گا۔ اس کے بعد ، اگر لگاتار 30 ادوار کی اوسط قیمت 3 ہوجاتی ہے تو ، 3.5 کی قیمت 0.5 ہوجائے گی۔ یہ غلط ماڈل کی وجہ ہوسکتی ہے۔ لہذا ، معمول سازی مشکل ہے ، اور آپ کو یہ معلوم کرنا ہوگا کہ ماڈل کی کارکردگی کو بہتر بنانے کے لئے کیا ہے (اگر واقعی کوئی ہے) ۔

ہمارے مسئلے میں پہلی تکرار کے لئے ، ہم نے مخلوط پیرامیٹرز کا استعمال کرتے ہوئے بڑی تعداد میں خصوصیات تیار کیں۔ بعد میں ہم یہ دیکھنے کی کوشش کریں گے کہ کیا ہم خصوصیات کی تعداد کو کم کرسکتے ہیں۔

def difference(dataDf, period):
    return dataDf.sub(dataDf.shift(period), fill_value=0)
def ewm(dataDf, halflife):
    return dataDf.ewm(halflife=halflife, ignore_na=False,
                      min_periods=0, adjust=True).mean()
def rsi(data, period):
    data_upside = data.sub(data.shift(1), fill_value=0)
    data_downside = data_upside.copy()
    data_downside[data_upside > 0] = 0
    data_upside[data_upside < 0] = 0
    avg_upside = data_upside.rolling(period).mean()
    avg_downside = - data_downside.rolling(period).mean()
    rsi = 100 - (100 * avg_downside / (avg_downside + avg_upside))
    rsi[avg_downside == 0] = 100
    rsi[(avg_downside == 0) & (avg_upside == 0)] = 0
return rsi
def create_features(data):
    basis_X = pd.DataFrame(index = data.index, columns =  [])
    
    basis_X['mom3'] = difference(data['basis'],4)
    basis_X['mom5'] = difference(data['basis'],6)
    basis_X['mom10'] = difference(data['basis'],11)
    
    basis_X['rsi15'] = rsi(data['basis'],15)
    basis_X['rsi10'] = rsi(data['basis'],10)
    
    basis_X['emabasis3'] = ewm(data['basis'],3)
    basis_X['emabasis5'] = ewm(data['basis'],5)
    basis_X['emabasis7'] = ewm(data['basis'],7)
    basis_X['emabasis10'] = ewm(data['basis'],10)
    basis_X['basis'] = data['basis']
    basis_X['vwapbasis'] = data['stockVWAP']-data['futureVWAP']
    
    basis_X['swidth'] = data['stockTopAskPrice'] -
                        data['stockTopBidPrice']
    basis_X['fwidth'] = data['futureTopAskPrice'] -
                        data['futureTopBidPrice']
    
    basis_X['btopask'] = data['stockTopAskPrice'] -
                         data['futureTopAskPrice']
    basis_X['btopbid'] = data['stockTopBidPrice'] -
                         data['futureTopBidPrice']

    basis_X['totalaskvol'] = data['stockTotalAskVol'] -
                             data['futureTotalAskVol']
    basis_X['totalbidvol'] = data['stockTotalBidVol'] -
                             data['futureTotalBidVol']
    
    basis_X['emabasisdi7'] = basis_X['emabasis7'] -
                             basis_X['emabasis5'] + 
                             basis_X['emabasis3']
    
    basis_X = basis_X.fillna(0)
    
    basis_y = data['Y(Target)']
    basis_y.dropna(inplace=True)
    
    print("Any null data in y: %s, X: %s"
            %(basis_y.isnull().values.any(), 
             basis_X.isnull().values.any()))
    print("Length y: %s, X: %s"
            %(len(basis_y.index), len(basis_X.index)))
    
    return basis_X, basis_y
basis_X_train, basis_y_train = create_features(training_data)
basis_X_test, basis_y_test = create_features(validation_data)

مرحلہ 5: ماڈل کا انتخاب

منتخب سوالات کے مطابق مناسب شماریاتی/ML ماڈل کا انتخاب کریں

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

img

زیر نگرانی یا غیر زیر نگرانی سیکھنا

img

رجعت یا درجہ بندی

کچھ عام نگرانی سیکھنے کے الگورتھم آپ کو شروع کرنے میں مدد کرسکتے ہیں:

  • لکیری رجسٹریشن (پیرامیٹرز، رجسٹریشن)

  • لاجسٹک رجسٹریشن (پیرامیٹر، درجہ بندی)

  • K-Nearest Neighbor (KNN) الگورتھم (کیس پر مبنی، رجسٹریشن)

  • ایس وی ایم، ایس وی آر (پیرا میٹر، درجہ بندی اور رجسٹریشن)

  • فیصلے کا درخت

  • فیصلے کا جنگل

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

مرحلہ 6: تربیت، توثیق اور اصلاح (مرحلہ 4-6 دہرائیں)

img

آپ کے ماڈل کو تربیت اور بہتر بنانے کے لئے تربیت اور توثیق کے ڈیٹا سیٹ کا استعمال کریں

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

صرف جب آپ کے پاس آپ کا پسندیدہ ماڈل ہو، پھر اگلے مرحلے پر جائیں.

ہمارے مظاہرے کے مسئلے کے لئے، ایک سادہ لکیری رجسٹریشن کے ساتھ شروع کرتے ہیں:

from sklearn import linear_model
from sklearn.metrics import mean_squared_error, r2_score
def linear_regression(basis_X_train, basis_y_train,
                      basis_X_test,basis_y_test):
    
    regr = linear_model.LinearRegression()
    # Train the model using the training sets
    regr.fit(basis_X_train, basis_y_train)
    # Make predictions using the testing set
    basis_y_pred = regr.predict(basis_X_test)
    # The coefficients
    print('Coefficients: \n', regr.coef_)
    
    # The mean squared error
    print("Mean squared error: %.2f"
          % mean_squared_error(basis_y_test, basis_y_pred))
    
    # Explained variance score: 1 is perfect prediction
    print('Variance score: %.2f' % r2_score(basis_y_test,
                                            basis_y_pred))
    # Plot outputs
    plt.scatter(basis_y_pred, basis_y_test,  color='black')
    plt.plot(basis_y_test, basis_y_test, color='blue', linewidth=3)
    plt.xlabel('Y(actual)')
    plt.ylabel('Y(Predicted)')
    plt.show()
    
    return regr, basis_y_pred
_, basis_y_pred = linear_regression(basis_X_train, basis_y_train, 
                                    basis_X_test,basis_y_test)

img

معمول کے بغیر لکیری رجسٹریشن

('Coefficients: \n', array([ -1.0929e+08, 4.1621e+07, 1.4755e+07, 5.6988e+06, -5.656e+01, -6.18e-04, -8.2541e-05,4.3606e-02, -3.0647e-02, 1.8826e+07, 8.3561e-02, 3.723e-03, -6.2637e-03, 1.8826e+07, 1.8826e+07, 6.4277e-02, 5.7254e-02, 3.3435e-03, 1.6376e-02, -7.3588e-03, -8.1531e-04, -3.9095e-02, 3.1418e-02, 3.3321e-03, -1.3262e-06, -1.3433e+07, 3.5821e+07, 2.6764e+07, -8.0394e+06, -2.2388e+06, -1.7096e+07]))
Mean squared error: 0.02
Variance score: 0.96

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

def normalize(basis_X, basis_y, period):
    basis_X_norm = (basis_X - basis_X.rolling(period).mean())/
                    basis_X.rolling(period).std()
    basis_X_norm.dropna(inplace=True)
    basis_y_norm = (basis_y - 
                    basis_X['basis'].rolling(period).mean())/
                    basis_X['basis'].rolling(period).std()
    basis_y_norm = basis_y_norm[basis_X_norm.index]
    
    return basis_X_norm, basis_y_norm
norm_period = 375
basis_X_norm_test, basis_y_norm_test = normalize(basis_X_test,basis_y_test, norm_period)
basis_X_norm_train, basis_y_norm_train = normalize(basis_X_train, basis_y_train, norm_period)
regr_norm, basis_y_pred = linear_regression(basis_X_norm_train, basis_y_norm_train, basis_X_norm_test, basis_y_norm_test)
basis_y_pred = basis_y_pred * basis_X_test['basis'].rolling(period).std()[basis_y_norm_test.index] + basis_X_test['basis'].rolling(period).mean()[basis_y_norm_test.index]

img

معمول کے ساتھ لکیری رجسٹریشن

Mean squared error: 0.05
Variance score: 0.90

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

آئیے ہم کوفیشینٹس کو دیکھیں:

for i in range(len(basis_X_train.columns)):
    print('%.4f, %s'%(regr_norm.coef_[i], basis_X_train.columns[i]))

نتائج یہ ہیں:

19.8727, emabasis4
-9.2015, emabasis5
8.8981, emabasis7
-5.5692, emabasis10
-0.0036, rsi15
-0.0146, rsi10
0.0196, mom10
-0.0035, mom5
-7.9138, basis
0.0062, swidth
0.0117, fwidth
2.0883, btopask
2.0311, btopbid
0.0974, bavgask
0.0611, bavgbid
0.0007, topaskvolratio
0.0113, topbidvolratio
-0.0220, totalaskvolratio
0.0231, totalbidvolratio

ہم واضح طور پر دیکھ سکتے ہیں کہ کچھ خصوصیات میں دوسروں کے مقابلے میں زیادہ گتانک ہوتے ہیں، اور ان کی پیش گوئی کی صلاحیت زیادہ مضبوط ہو سکتی ہے۔

آئیے مختلف خصوصیات کے درمیان تعلق دیکھیں.

import seaborn

c = basis_X_train.corr()
plt.figure(figsize=(10,10))
seaborn.heatmap(c, cmap='RdYlGn_r', mask = (np.abs(c) <= 0.8))
plt.show()

img

خصوصیات کے درمیان تعلق

سیاہ سرخ علاقوں کو انتہائی correlated متغیرات کی نمائندگی کرتے ہیں. چلو دوبارہ کچھ خصوصیات تخلیق / تبدیل کریں اور ہمارے ماڈل کو بہتر بنانے کی کوشش کریں.

مثال کے طور پر، میں آسانی سے emabasisdi7 جیسے خصوصیات کو خارج کر سکتا ہوں، جو صرف دیگر خصوصیات کے لکیری مجموعے ہیں.

def create_features_again(data):
    basis_X = pd.DataFrame(index = data.index, columns =  [])
    basis_X['mom10'] = difference(data['basis'],11)
    basis_X['emabasis2'] = ewm(data['basis'],2)
    basis_X['emabasis5'] = ewm(data['basis'],5)
    basis_X['emabasis10'] = ewm(data['basis'],10)
    basis_X['basis'] = data['basis']
    basis_X['totalaskvolratio'] = (data['stockTotalAskVol']
                                 - data['futureTotalAskVol'])/
                                   100000
    basis_X['totalbidvolratio'] = (data['stockTotalBidVol']
                                 - data['futureTotalBidVol'])/
                                   100000
    basis_X = basis_X.fillna(0)
    
    basis_y = data['Y(Target)']
    basis_y.dropna(inplace=True)
    return basis_X, basis_y
basis_X_test, basis_y_test = create_features_again(validation_data)
basis_X_train, basis_y_train = create_features_again(training_data)
_, basis_y_pred = linear_regression(basis_X_train, basis_y_train, basis_X_test,basis_y_test)
basis_y_regr = basis_y_pred.copy()

img

('Coefficients: ', array([ 0.03246139,
0.49780982, -0.22367172,  0.20275786,  0.50758852,
-0.21510795, 0.17153884]))
Mean squared error: 0.02
Variance score: 0.96

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

ہم زیادہ پیچیدہ ماڈل بھی آزما سکتے ہیں تاکہ دیکھیں کہ ماڈل میں تبدیلی کارکردگی کو بہتر بنا سکتی ہے۔

  • K-Nearest Neighbor (KNN) الگورتھم
from sklearn import neighbors
n_neighbors = 5
model = neighbors.KNeighborsRegressor(n_neighbors, weights='distance')
model.fit(basis_X_train, basis_y_train)
basis_y_pred = model.predict(basis_X_test)
basis_y_knn = basis_y_pred.copy()

img

  • ایس وی آر
from sklearn.svm import SVR
model = SVR(kernel='rbf', C=1e3, gamma=0.1)
model.fit(basis_X_train, basis_y_train)
basis_y_pred = model.predict(basis_X_test)
basis_y_svr = basis_y_pred.copy()

img

  • فیصلے کا درخت
model=ensemble.ExtraTreesRegressor()
model.fit(basis_X_train, basis_y_train)
basis_y_pred = model.predict(basis_X_test)
basis_y_trees = basis_y_pred.copy()

img

مرحلہ 7: ٹیسٹ کے اعداد و شمار کا بیک ٹیسٹ کریں

اصل نمونے کے اعداد و شمار کی کارکردگی کی جانچ پڑتال کریں

img

ٹیسٹ کے اعداد و شمار کے سیٹوں پر بیک ٹسٹنگ کی کارکردگی (غیر متاثرہ)

یہ ایک اہم لمحہ ہے۔ ہم اپنے حتمی اصلاحاتی ماڈل کو ٹیسٹ کے اعداد و شمار کے آخری مرحلے سے چلاتے ہیں، ہم اسے شروع میں ایک طرف رکھتے ہیں اور ہم نے ابھی تک اعداد و شمار کو نہیں چھوا ہے۔

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

اگر آپ کو ٹیسٹ کے اعداد و شمار کے بیک ٹیسٹ کے نتائج پسند نہیں ہیں تو ، براہ کرم ماڈل کو ضائع کریں اور دوبارہ شروع کریں۔ کبھی بھی واپس نہ جائیں یا اپنے ماڈل کو دوبارہ بہتر نہ بنائیں ، جس سے زیادہ فٹ ہونے کا سبب بنے گا! (ایک نیا ٹیسٹ ڈیٹا سیٹ بنانے کی بھی سفارش کی جاتی ہے ، کیونکہ یہ ڈیٹا سیٹ اب آلودہ ہے ، جب ماڈل کو ضائع کرتے وقت ، ہم پہلے ہی ڈیٹا سیٹ کے مواد کو ضمنی طور پر جانتے ہیں) ۔

یہاں ہم اب بھی Auquan کا ٹول باکس استعمال کریں گے:

import backtester
from backtester.features.feature import Feature
from backtester.trading_system import TradingSystem
from backtester.sample_scripts.fair_value_params import FairValueTradingParams
class Problem1Solver():
def getTrainingDataSet(self):
        return "trainingData1"
def getSymbolsToTrade(self):
        return ['MQK']
def getCustomFeatures(self):
        return {'my_custom_feature': MyCustomFeature}
def getFeatureConfigDicts(self):
                            
        expma5dic = {'featureKey': 'emabasis5',
                 'featureId': 'exponential_moving_average',
                 'params': {'period': 5,
                              'featureName': 'basis'}}
        expma10dic = {'featureKey': 'emabasis10',
                 'featureId': 'exponential_moving_average',
                 'params': {'period': 10,
                              'featureName': 'basis'}}                     
        expma2dic = {'featureKey': 'emabasis3',
                 'featureId': 'exponential_moving_average',
                 'params': {'period': 3,
                              'featureName': 'basis'}}
        mom10dic = {'featureKey': 'mom10',
                 'featureId': 'difference',
                 'params': {'period': 11,
                              'featureName': 'basis'}}
        
        return [expma5dic,expma2dic,expma10dic,mom10dic]    
    
    def getFairValue(self, updateNum, time, instrumentManager):
        # holder for all the instrument features
        lbInstF = instrumentManager.getlookbackInstrumentFeatures()
        mom10 = lbInstF.getFeatureDf('mom10').iloc[-1]
        emabasis2 = lbInstF.getFeatureDf('emabasis2').iloc[-1]
        emabasis5 = lbInstF.getFeatureDf('emabasis5').iloc[-1]
        emabasis10 = lbInstF.getFeatureDf('emabasis10').iloc[-1] 
        basis = lbInstF.getFeatureDf('basis').iloc[-1]
        totalaskvol = lbInstF.getFeatureDf('stockTotalAskVol').iloc[-1] - lbInstF.getFeatureDf('futureTotalAskVol').iloc[-1]
        totalbidvol = lbInstF.getFeatureDf('stockTotalBidVol').iloc[-1] - lbInstF.getFeatureDf('futureTotalBidVol').iloc[-1]
        
        coeff = [ 0.03249183, 0.49675487, -0.22289464, 0.2025182, 0.5080227, -0.21557005, 0.17128488]
        newdf['MQK'] = coeff[0] * mom10['MQK'] + coeff[1] * emabasis2['MQK'] +\
                      coeff[2] * emabasis5['MQK'] + coeff[3] * emabasis10['MQK'] +\
                      coeff[4] * basis['MQK'] + coeff[5] * totalaskvol['MQK']+\
                      coeff[6] * totalbidvol['MQK']
                    
        newdf.fillna(emabasis5,inplace=True)
        return newdf
problem1Solver = Problem1Solver()
tsParams = FairValueTradingParams(problem1Solver)
tradingSystem = TradingSystem(tsParams)
tradingSystem.startTrading(onlyAnalyze=False, 
                           shouldPlot=True,
                           makeInstrumentCsvs=False)

img

بیک ٹیسٹنگ کے نتائج، پی این ایل کا حساب امریکی ڈالر میں کیا جاتا ہے (پی این ایل ٹرانزیکشن لاگت اور دیگر فیسوں میں شامل نہیں ہے)

مرحلہ 8: ماڈل کو بہتر بنانے کے دیگر طریقے

رولنگ کی تصدیق، سیٹ سیکھنے، بیگنگ اور فروغ

مزید اعداد و شمار جمع کرنے، بہتر خصوصیات بنانے یا مزید ماڈلز کی کوشش کرنے کے علاوہ، آپ کو بہتر بنانے کی کوشش کر سکتے ہیں کہ چند مزید نکات ہیں.

1. رولنگ کی تصدیق

img

رولنگ کی تصدیق

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

یہ بہتر ہو سکتا ہے کہ آگے بڑھنے والی تصدیق کی کوشش کی جائے، جیسے جنوری سے فروری تک تربیت، مارچ میں تصدیق، اپریل سے مئی تک دوبارہ تربیت، جون میں تصدیق وغیرہ.

۲. سیٹ لرننگ

img

سیٹ سیکھنا

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

img

پیکنگ

img

حوصلہ افزائی

مختصری کی خاطر، میں ان طریقوں کو چھوڑ دوں گا، لیکن آپ آن لائن مزید معلومات تلاش کر سکتے ہیں۔

چلو ہمارے مسئلہ کے لئے ایک سیٹ طریقہ کار کی کوشش کریں:

basis_y_pred_ensemble = (basis_y_trees + basis_y_svr +
                         basis_y_knn + basis_y_regr)/4

img

Mean squared error: 0.02
Variance score: 0.95

اب تک ہم نے بہت علم اور معلومات جمع کی ہیں۔ آئیے ایک مختصر جائزہ لیتے ہیں:

  • اپنے مسئلے کو حل کریں؛

  • قابل اعتماد اعداد و شمار جمع کریں اور اعداد و شمار کو صاف کریں؛

  • اعداد و شمار کو تربیت، تصدیق اور ٹیسٹ سیٹوں میں تقسیم کریں؛

  • خصوصیات بنائیں اور ان کے رویے کا تجزیہ کریں؛

  • رویے کے مطابق مناسب تربیتی ماڈل کا انتخاب کریں؛

  • آپ کے ماڈل کو تربیت دینے اور پیش گوئی کرنے کے لئے تربیت کے اعداد و شمار کا استعمال کریں؛

  • تصدیق سیٹ پر کارکردگی کی جانچ پڑتال کریں اور دوبارہ بہتر بنائیں؛

  • ٹیسٹ سیٹ کی حتمی کارکردگی کی تصدیق کریں۔

کیا یہ آپ کے ذہن میں نہیں آیا؟ لیکن یہ ابھی تک ختم نہیں ہوا ہے۔ آپ کے پاس صرف ایک قابل اعتماد پیش گوئی کا ماڈل ہے۔ یاد رکھیں کہ ہم اپنی حکمت عملی میں واقعی کیا چاہتے تھے؟ لہذا آپ کو ضرورت نہیں ہے:

  • تجارتی سمتوں کی نشاندہی کرنے کے لئے پیش گوئی ماڈلز پر مبنی سگنل تیار کریں؛

  • کھلی اور بند پوزیشنوں کی نشاندہی کے لئے مخصوص حکمت عملی تیار کریں؛

  • پوزیشنوں اور قیمتوں کی نشاندہی کرنے کے لئے نظام کو چلائیں.

مذکورہ بالا ایف ایم زیڈ کوانٹ پلیٹ فارم کا استعمال کریں گے (FMZ.COM) ۔ ایف ایم زیڈ کوانٹ پلیٹ فارم پر ، انتہائی انکیپسولڈ اور کامل API انٹرفیسز ، نیز آرڈرنگ اور تجارتی افعال موجود ہیں جن کو عالمی سطح پر بلایا جاسکتا ہے۔ آپ کو ایک کے بعد ایک مختلف تبادلے کے API انٹرفیس کو مربوط کرنے اور شامل کرنے کی ضرورت نہیں ہے۔ ایف ایم زیڈ کوانٹ پلیٹ فارم کے اسٹریٹیجی اسکوائر میں ، بہت ساری پختہ اور کامل متبادل حکمت عملییں ہیں جو اس مضمون میں مشین لرننگ کے طریقہ کار سے ملتی ہیں ، اس سے آپ کی مخصوص حکمت عملی زیادہ طاقتور ہوگی۔ اسٹریٹیجی اسکوائر میں واقع ہے:https://www.fmz.com/square.

** لین دین کے اخراجات کے بارے میں اہم نوٹ: ** آپ کا ماڈل آپ کو بتائے گا کہ جب منتخب کردہ اثاثہ طویل یا مختصر ہو رہا ہے۔ تاہم ، اس میں فیس / لین دین کے اخراجات / دستیاب تجارتی مقدار / اسٹاپ نقصان وغیرہ پر غور نہیں کیا جاتا ہے۔ لین دین کے اخراجات عام طور پر منافع بخش لین دین کو نقصان میں بدل دیتے ہیں۔ مثال کے طور پر ، $ 0.05 کی متوقع قیمت میں اضافے کے ساتھ ایک اثاثہ خرید ہے ، لیکن اگر آپ کو اس لین دین کے لئے $ 0.10 ادا کرنا پڑتا ہے تو ، آپ کو آخر کار $ 0.05 کا خالص نقصان ہوگا۔ بروکر کے کمیشن ، ایکسچینج فیس اور پوائنٹ فرق کو مدنظر رکھنے کے بعد ، ہمارے اوپر کا بڑا منافع چارٹ اس طرح لگتا ہے:

img

ٹریڈنگ فیس اور پوائنٹ فرق کے بعد بیک ٹیسٹ کا نتیجہ، پی این ایل امریکی ڈالر ہے۔

ٹرانزیکشن فیس اور قیمت کے فرق ہمارے PNL کا 90 فیصد سے زیادہ حصہ بناتے ہیں۔ ہم ان پر تفصیلی بحث کریں گے اگلے مضمون میں۔

آخر میں، آئیے کچھ عام فتنوں پر ایک نظر ڈالتے ہیں۔

کیا کرنا ہے اور کیا نہیں کرنا

  • اپنی پوری طاقت کے ساتھ زیادہ فٹ ہونے سے بچیں!

  • ہر ڈیٹا پوائنٹ کے بعد دوبارہ تربیت نہ کریں: یہ ایک عام غلطی ہے جو لوگ مشین لرننگ کی ترقی میں کرتے ہیں۔ اگر آپ کے ماڈل کو ہر ڈیٹا پوائنٹ کے بعد دوبارہ تربیت دینے کی ضرورت ہے تو ، یہ بہت اچھا ماڈل نہیں ہوسکتا ہے۔ یعنی ، اسے باقاعدگی سے دوبارہ تربیت دینے کی ضرورت ہے ، اور صرف مناسب تعدد پر تربیت دینے کی ضرورت ہے (مثال کے طور پر ، اگر دن کے اندر پیش گوئی کی جاتی ہے تو ، اسے ہر ہفتے کے آخر میں دوبارہ تربیت دینے کی ضرورت ہوتی ہے۔)

  • تعصب سے بچیں ، خاص طور پر مستقبل کی طرف دیکھنے والی تعصب: یہ ایک اور وجہ ہے کہ ماڈل کیوں کام نہیں کرتا ہے ، اور اس بات کو یقینی بنائیں کہ آپ مستقبل کی کوئی معلومات استعمال نہیں کرتے ہیں۔ زیادہ تر معاملات میں ، اس کا مطلب یہ ہے کہ ہدف متغیر Y ماڈل میں بطور خصوصیت استعمال نہیں ہوتا ہے۔ آپ بیک ٹسٹنگ کے دوران اس کا استعمال کرسکتے ہیں ، لیکن جب آپ ماڈل کو اصل میں چلاتے ہیں تو یہ دستیاب نہیں ہوگا ، جس سے آپ کا ماڈل ناقابل استعمال ہوجائے گا۔

  • ڈیٹا مائننگ تعصب سے بچیں: چونکہ ہم اپنے اعداد و شمار پر ماڈلنگ کا ایک سلسلہ کرنے کی کوشش کر رہے ہیں تاکہ یہ معلوم کیا جاسکے کہ آیا یہ مناسب ہے ، اگر کوئی خاص وجہ نہیں ہے تو ، براہ کرم یقینی بنائیں کہ آپ بے ترتیب موڈ کو اصل موڈ سے الگ کرنے کے لئے سخت ٹیسٹ چلاتے ہیں۔ مثال کے طور پر ، لکیری رجسٹریشن اوپر کی طرف رجحان پیٹرن کی وضاحت کرتا ہے ، لیکن اس کا امکان ہے کہ بڑے بے ترتیب گھومنے پھرنے کا ایک حصہ بن جائے!

زیادہ سے زیادہ فٹ ہونے سے بچیں

یہ بہت اہم ہے۔ مجھے لگتا ہے کہ اس کا دوبارہ ذکر کرنا ضروری ہے۔

  • تجارت کی حکمت عملیوں میں زیادہ سے زیادہ فٹنگ سب سے خطرناک جال ہے۔

  • ایک پیچیدہ الگورتھم بیک ٹسٹ میں بہت اچھی کارکردگی کا مظاہرہ کرسکتا ہے ، لیکن یہ نئے پوشیدہ اعداد و شمار پر بری طرح ناکام ہوجاتا ہے۔ یہ الگورتھم واقعی اعداد و شمار کا کوئی رجحان ظاہر نہیں کرتا ہے ، اور نہ ہی اس میں پیش گوئی کی حقیقی صلاحیت ہے۔ یہ ان اعداد و شمار کے لئے بہت موزوں ہے جو یہ دیکھتا ہے۔

  • اپنے سسٹم کو جتنا ممکن ہو سکے آسان رکھیں۔ اگر آپ کو معلوم ہوتا ہے کہ ڈیٹا کی ترجمانی کے ل you آپ کو بہت سارے پیچیدہ افعال کی ضرورت ہے تو ، آپ زیادہ فٹ ہوسکتے ہیں۔

  • اپنے دستیاب ڈیٹا کو تربیت اور ٹیسٹ کے ڈیٹا میں تقسیم کریں ، اور حقیقی وقت کے لین دین کے لئے ماڈل استعمال کرنے سے پہلے ہمیشہ حقیقی نمونہ ڈیٹا کی کارکردگی کی تصدیق کریں۔


متعلقہ

مزید