ڈیٹا سے چلنے والی ٹکنالوجی کے ذریعہ جوڑے کی تجارت

مصنف:نیکی, تخلیق: 2019-08-21 13:50:23, تازہ کاری: 2023-10-19 21:01:31

img

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

بنیادی اصول

假设你有一对投资标的X和Y具有一些潜在的关联,例如两家公司生产相同的产品,如百事可乐和可口可乐。你希望这两者的价格比率或基差(也称为差价)随时间的变化而保持不变。然而,由于临时供需变化,如一个投资标的的大买/卖订单,对其中一家公司的重要新闻的反应等,这两对之间的价差可能会不时出现分歧。在这种情况下,一只投资标的向上移动而另一只投资标的相对于彼此向下移动。如果你希望这种分歧随着时间的推移恢复正常,你就可以发现交易机会(或套利机会)。此种套利机会在数字货币市场或者国内商品期货市场比比皆是,比如BTC与避险资产的关系;期货中豆粕,豆油与大豆品种之间的关系.

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

اس طرح، جوڑی ٹریڈنگ ایک غیر جانبدار مارکیٹ ٹریڈنگ کی حکمت عملی ہے جو تاجروں کو تقریبا کسی بھی مارکیٹ کی حالت سے فائدہ اٹھانے کی اجازت دیتا ہے: بڑھتی ہوئی رجحان، نیچے کی رجحان یا افقی ایڈجسٹمنٹ.

تصور کی وضاحت: دو فرض شدہ سرمایہ کاری کے نشانات

  • ہم نے اپنی تحقیق کے ماحول کو انوینٹرز کی کوٹیفیکیشن پلیٹ فارم پر بنایا ہے۔

سب سے پہلے، کام کو ہموار کرنے کے لئے، ہمیں اپنے تحقیق کے ماحول کی تعمیر کرنے کی ضرورت ہے، اور اس مضمون میں ہم انوینٹرز کو کیوٹیفیکیشن پلیٹ فارم کا استعمال کرتے ہیں.FMZ.COMاس کے علاوہ ، اس کے پاس ایک ایپلی کیشن ہے جس کا نام ڈوکر ہے۔ اس کے علاوہ ، اس کے پاس ایک ایپلی کیشن ہے جس کا نام ڈوکر ہے۔ اس کے علاوہ ، اس کے پاس ایک ایپلی کیشن ہے جس کا نام ڈوکر ہے۔

ڈوکر سسٹم کو مینیجر سسٹم کہا جاتا ہے۔

اس کے علاوہ ، آپ کو یہ بھی جاننے کی ضرورت ہے کہ کس طرح ہاسٹلروں اور روبوٹ کو تعینات کرنا ہے۔https://www.fmz.com/bbs-topic/4140

اگر آپ اپنے کلاؤڈ کمپیوٹنگ سرورز کی تعیناتی کے لئے میزبان خریدنا چاہتے ہیں تو ، آپ کو اس مضمون کا حوالہ دینا چاہئے:https://www.fmz.com/bbs-topic/2848

ایک بار جب ہم نے کلاؤڈ سروسز اور مینیجر سسٹم کو کامیابی کے ساتھ تعینات کرلیا ہے، تو اگلا مرحلہ یہ ہے کہ ہم اب تک کی سب سے بڑی Python ٹیمپلیٹ: Anaconda کو انسٹال کریں.

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

Anaconda انسٹال کرنے کے لئے، براہ کرم Anaconda کی سرکاری گائیڈ دیکھیں:https://www.anaconda.com/distribution/

本文还将用到numpy和pandas这两个目前在Python科学计算方面十分流行且重要的库.

مندرجہ بالا بنیادی کام بھی میرے پچھلے مضمون میں حوالہ دیتے ہیں، جہاں میں نے Anaconda ماحول اور دونوں لائبریریوں، numpy اور pandas کو ترتیب دینے کے بارے میں بات کی تھی، تفصیلات کے لئے ملاحظہ کریں:https://www.fmz.com/digest-topic/4169

اگلا، ہم کوڈ کے ساتھ ایک "دو مفروضہ سرمایہ کاری کے معیار" کو لاگو کرتے ہیں.

import numpy as np
import pandas as pd

import statsmodels
from statsmodels.tsa.stattools import coint
# just set the seed for the random number generator
np.random.seed(107)

import matplotlib.pyplot as plt

ٹھیک ہے، ہم اس کے ساتھ ساتھ استعمال کر رہے ہیں ایک بہت ہی مشہور Python کی گرافک لائبریری، matplotlib.

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

# Generate daily returns
Xreturns = np.random.normal(0, 1, 100) 
# sum them and shift all the prices up
X = pd.Series(np.cumsum(
    Xreturns), name='X') 
    + 50
X.plot(figsize=(15,7))
plt.show()

img

ایک سرمایہ کاری کے نشان کے X، ایک عام تقسیم کی طرف سے اس کی روزانہ کی واپسی کا نقشہ کرنے کے لئے

اب ہم Y اور X کو پیدا کرتے ہیں جو ایک دوسرے کے ساتھ بہت مضبوط طور پر منسلک ہیں، لہذا Y کی قیمت X میں تبدیلی کے ساتھ بہت ملتی جلتی ہونا چاہئے. ہم اس کے لئے ماڈلنگ کرتے ہیں X کو لے کر، اسے اوپر کی طرف منتقل کریں اور کچھ بے ترتیب شور شامل کریں جو عام تقسیم سے نکالا گیا ہے.

noise = np.random.normal(0, 1, 100)
Y = X + 5 + noise
Y.name = 'Y'
pd.concat([X, Y], axis=1).plot(figsize=(15,7))
plt.show()

img

سرمایہ کاری کے اشارے کے X اور Y کو مربوط کریں

ہم آہنگی

协整非常类似于相关性,意味着两个数据系列之间的比率将在平均值附近变化.Y和X这两个系列遵循以下内容:

Y = X + e

جہاں r مستقل تناسب ہے اور e شور ہے۔

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

(Y/X).plot(figsize=(15,7)) 
plt.axhline((Y/X).mean(), color='red', linestyle='--') 
plt.xlabel('Time')
plt.legend(['Price Ratio', 'Mean'])
plt.show()

img

دو متفقہ سرمایہ کاری اشارے کی قیمتوں کے درمیان تناسب اور اوسط

ہم آہنگی ٹیسٹ

ایک آسان ٹیسٹنگ کا طریقہ یہ ہے کہ آپ statsmodels.tsa.stattools کا استعمال کریں۔ ہمیں ایک بہت ہی کم p ویلیو نظر آنا چاہئے کیونکہ ہم نے دو ڈیٹا سیریز کو مصنوعی طور پر تخلیق کیا ہے جو ممکنہ طور پر زیادہ سے زیادہ مربوط ہیں۔

# compute the p-value of the cointegration test
# will inform us as to whether the ratio between the 2 timeseries is stationary
# around its mean
score, pvalue, _ = coint(X,Y)
print pvalue

نتائج: 1.81864477307e-17

نوٹ: مطابقت اور ہم آہنگی

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

X.corr(Y)

نتیجہ: 0.951

جیسا کہ ہم توقع کرتے ہیں ، یہ بہت زیادہ ہے۔ لیکن دو متعلقہ لیکن متضاد سیریز کے بارے میں کیا خیال ہے؟ ایک سادہ مثال دو متضاد اعداد و شمار کی سیریز ہے۔

ret1 = np.random.normal(1, 1, 100)
ret2 = np.random.normal(2, 1, 100)

s1 = pd.Series( np.cumsum(ret1), name='X')
s2 = pd.Series( np.cumsum(ret2), name='Y')

pd.concat([s1, s2], axis=1 ).plot(figsize=(15,7))
plt.show()
print 'Correlation: ' + str(X_diverging.corr(Y_diverging))
score, pvalue, _ = coint(X_diverging,Y_diverging)
print 'Cointegration test p-value: ' + str(pvalue)

img

دو متعلقہ سیریز (مشتمل نہیں)

متعلقہ عوامل: 0.998 ہم آہنگی کی جانچ پڑتال p: 0.258

غیر متعلقہ ہم آہنگی کی سادہ مثالوں میں باقاعدہ تقسیم کی ترتیب اور مربع لہر ہیں۔

Y2 = pd.Series(np.random.normal(0, 1, 800), name='Y2') + 20
Y3 = Y2.copy()
Y3[0:100] = 30
Y3[100:200] = 10
Y3[200:300] = 30
Y3[300:400] = 10
Y3[400:500] = 30
Y3[500:600] = 10
Y3[600:700] = 30
Y3[700:800] = 10
Y2.plot(figsize=(15,7))
Y3.plot()
plt.ylim([0, 40])
plt.show()
# correlation is nearly zero
print 'Correlation: ' + str(Y2.corr(Y3))
score, pvalue, _ = coint(Y2,Y3)
print 'Cointegration test p-value: ' + str(pvalue)

img

متعلقہ: 0.007546 ہم آہنگی کی جانچ پڑتال p: 0.0

اس کا مطلب یہ نہیں ہے کہ ہم اس کے بارے میں بات نہیں کر رہے ہیں ، لیکن ہم اس کے بارے میں بات کر رہے ہیں ، اور ہم اس کے بارے میں بات کر رہے ہیں۔

کیا آپ کو معلوم ہے کہ آپ کو کیا کرنا چاہئے؟

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

واپس اوپر Y = X + e میں X اور Y ، تاکہ تناسب ((Y / X) اس کی اوسط قیمت کی چوٹی کے ارد گرد منتقل ہو ، ہم اوسط واپسی کے تناسب کے ذریعہ پیسہ کماتے ہیں۔ اس کے ل we ، ہم اس صورتحال پر دھیان دیتے ہیں جب X اور Y بہت دور ہیں ، یعنی اس کی حد بہت زیادہ یا بہت کم ہے:

  • زیادہ تناسب: یہ اس وقت ہوتا ہے جب تناسب بہت چھوٹا ہوتا ہے اور ہم اس کے بڑے ہونے کی توقع کرتے ہیں۔ مندرجہ بالا مثال میں ، ہم زیادہ Y کرکے اور خالی X کرکے تجارت کرتے ہیں۔

  • خالی کرنے کا تناسب: یہ اس وقت ہوتا ہے جب تناسب بہت زیادہ ہوتا ہے اور ہم اس کی توقع کرتے ہیں کہ یہ گھنٹوں بدل جائے گا۔ مندرجہ بالا مثال میں ، ہم خالی Y اور زیادہ X کرکے تجارت کرتے ہیں۔

نوٹ کریں کہ ہمارے پاس ہمیشہ ہیجنگ پوزیشن کا ایک ہیج ہوتا ہے: اگر ٹریڈنگ اشارے کی قیمت میں خرابی ہوتی ہے تو ، خالی پوزیشن پیسہ کماتی ہے ، اور اس کے برعکس ، لہذا ہم مجموعی طور پر مارکیٹ کی نقل و حرکت سے محفوظ ہیں۔

اگر ہم ایک دوسرے کے مقابلے میں ایکس اور وائی کی طرف بڑھتے ہیں تو ہم پیسہ کماتے ہیں یا نقصان اٹھاتے ہیں۔

اعداد و شمار کا استعمال کرتے ہوئے تلاش کرنے کے لئے اسی طرح کے ٹریڈنگ اشارے

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

ایک سے زیادہ موازنہ انحرافیہ اس صورت حال کا حوالہ دیتا ہے جس میں بہت سارے ٹیسٹ چلاتے وقت غلط طریقے سے اہم پی وی ایل پیدا کرنے کا موقع بڑھ جاتا ہے ، کیونکہ ہمیں بہت سارے ٹیسٹ چلانے کی ضرورت ہے۔ اگر ہم 100 بار کسی بے ترتیب اعداد و شمار پر جانچ کرتے ہیں تو ، ہمیں 5 پی وی ایل 0.05 سے کم دیکھنا چاہئے۔ اگر آپ کو مجموعی طور پر تعاون کرنے کے لئے n ٹرانزیکشنز کا موازنہ کرنے کی ضرورت ہے تو ، آپ n ((n-1) / 2 موازنہ کریں گے ، آپ کو بہت سارے غلط پی وی ایل نظر آئیں گے ، جو آپ کے ٹیسٹ کے نمونے میں اضافے کے ساتھ ساتھ بڑھتے جائیں گے۔ اس صورتحال سے بچنے کے لئے ، چند تجارتوں کے جوڑے کو منتخب کریں جن کے بارے میں آپ کو یقین ہے کہ آپ تعاون کرسکتے ہیں ، اور پھر ان کو الگ الگ جانچیں۔ اس سے بہت کم ہوگا۔ایک سے زیادہ موازنہ انحراف

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

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

def find_cointegrated_pairs(data):
    n = data.shape[1]
    score_matrix = np.zeros((n, n))
    pvalue_matrix = np.ones((n, n))
    keys = data.keys()
    pairs = []
    for i in range(n):
        for j in range(i+1, n):
            S1 = data[keys[i]]
            S2 = data[keys[j]]
            result = coint(S1, S2)
            score = result[0]
            pvalue = result[1]
            score_matrix[i, j] = score
            pvalue_matrix[i, j] = pvalue
            if pvalue < 0.02:
                pairs.append((keys[i], keys[j]))
    return score_matrix, pvalue_matrix, pairs

نوٹ: ہم نے اعداد و شمار میں مارکیٹ بیچ مارک (SPX) شامل کیا ہے - مارکیٹ میں بہت سے ٹریڈنگ اشارے کی نقل و حرکت چلتی ہے، عام طور پر آپ کو دو تجارتی اشارے مل سکتے ہیں جو ایک دوسرے کے ساتھ مل کر کام کرتے ہیں؛ لیکن حقیقت میں وہ ایک دوسرے کے ساتھ نہیں بلکہ مارکیٹ کے ساتھ مل کر کام کرتے ہیں. یہ ایک مخلوط متغیر کہا جاتا ہے. آپ کو کسی بھی تعلقات میں مارکیٹ کی شرکت کی جانچ پڑتال کرنا ضروری ہے.

from backtester.dataSource.yahoo_data_source import YahooStockDataSource
from datetime import datetime
startDateStr = '2007/12/01'
endDateStr = '2017/12/01'
cachedFolderName = 'yahooData/'
dataSetId = 'testPairsTrading'
instrumentIds = ['SPY','AAPL','ADBE','SYMC','EBAY','MSFT','QCOM',
                 'HPQ','JNPR','AMD','IBM']
ds = YahooStockDataSource(cachedFolderName=cachedFolderName,
                            dataSetId=dataSetId,
                            instrumentIds=instrumentIds,
                            startDateStr=startDateStr,
                            endDateStr=endDateStr,
                            event='history')
data = ds.getBookDataByFeature()['Adj Close']
data.head(3)

img

اب آئیے ہم اپنے طریقہ کار کا استعمال کرتے ہوئے ہم آہنگ ٹرانزیکشن جوڑے تلاش کرنے کی کوشش کرتے ہیں۔

# Heatmap to show the p-values of the cointegration test
# between each pair of stocks
scores, pvalues, pairs = find_cointegrated_pairs(data)
import seaborn
m = [0,0.2,0.4,0.6,0.8,1]
seaborn.heatmap(pvalues, xticklabels=instrumentIds, 
                yticklabels=instrumentIds, cmap=’RdYlGn_r’, 
                mask = (pvalues >= 0.98))
plt.show()
print pairs
[('ADBE', 'MSFT')]

img

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

S1 = data['ADBE']
S2 = data['MSFT']
score, pvalue, _ = coint(S1, S2)
print(pvalue)
ratios = S1 / S2
ratios.plot()
plt.axhline(ratios.mean())
plt.legend([' Ratio'])
plt.show()

img

MSFT اور ADBE کے درمیان قیمتوں کا تناسب 2008-2017

یہ تناسب واقعی ایک مستحکم اوسط کی طرح لگتا ہے۔ مطلق تناسب اعدادوشمار میں بہت مفید نہیں ہے۔ اس کو z اسکور کے طور پر دیکھ کر ہمارے اشارے کو معیاری بنانا زیادہ مددگار ہے۔ z اسکور کی تعریف:

Z سکور (قیمت) = (قیمت اوسط) / معیاری انحراف

انتباہ

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

def zscore(series):
    return (series - series.mean()) / np.std(series)
zscore(ratios).plot()
plt.axhline(zscore(ratios).mean())
plt.axhline(1.0, color=’red’)
plt.axhline(-1.0, color=’green’)
plt.show()

img

MSFT اور ADBE کے درمیان Z قیمت کا تناسب 2008-2017

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

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

  • قابل اعتماد ڈیٹا اکٹھا کریں اور ڈیٹا کو صاف کریں

  • اعداد و شمار سے ٹرانزیکشن سگنل / منطق کی شناخت کے لئے تخلیق کی خصوصیات

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

  • ان خصوصیات کا استعمال کرتے ہوئے تجارتی سگنل تیار کریں ، یعنی کون سے سگنل خریدیں ، بیچیں یا خالی پوزیشن دیکھیں

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

انوینٹرز کوٹیفیکیشن پلیٹ فارمز میں، جہاں مختلف قسم کے بڑے پیمانے پر تبادلے کے انٹرفیس پیک کیے جاتے ہیں، ہمیں صرف ان API کو کال کرنے کی ضرورت ہوتی ہے، اور باقی بنیادی منطق کو لاگو کرنے کے لئے، جو پیشہ ور ٹیم نے پہلے سے ہی تیار کیا ہے.

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

آئیے شروع کرتے ہیں:

پہلا مرحلہ: اپنے مسائل مرتب کریں

یہاں، ہم ایک سگنل بنانے کی کوشش کر رہے ہیں جو ہمیں بتاتا ہے کہ اگلی گھڑی میں یہ شرح خریدنے یا فروخت کرنے کے لئے ہے، لہذا ہمارے پیش گوئی متغیر Y:

Y = تناسب خرید (1) یا فروخت (-1) ہے

Y ((t) = Sign ((Ratio ((t+1) Ratio ((t))

نوٹ کریں کہ ہمیں اصل ٹریڈنگ اشارے کی قیمت کی پیش گوئی کرنے کی ضرورت نہیں ہے ، اور نہ ہی ہم شرح کی اصل قیمت کی پیش گوئی کرنے کی ضرورت ہے (اگرچہ ہم کر سکتے ہیں) ، صرف شرح کی اگلی سمت کی پیش گوئی کرنے کی ضرورت ہے۔

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

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

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

تیسرا مرحلہ: اعداد و شمار کو تقسیم کرنا

ماڈل کی درستگی کی جانچ کرنے کے لئے یہ بہت اہم قدم مت بھولنا. ہم مندرجہ ذیل اعداد و شمار کے ساتھ تربیت / توثیق / ٹیسٹ تقسیم کر رہے ہیں.

  • تربیت 7 سال ~ 70٪

  • ٹیسٹ ~ 3 سال 30٪

ratios = data['ADBE'] / data['MSFT']
print(len(ratios))
train = ratios[:1762]
test = ratios[1762:]

مثالی طور پر ، ہمیں بھی ایک ویکیوم سیٹ بنانا چاہئے ، لیکن ہم فی الحال ایسا نہیں کریں گے۔

چوتھا مرحلہ: خصوصیت کی تعمیر

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

ہم مندرجہ ذیل خصوصیات استعمال کرتے ہیں:

  • 60 دن کی اوسط شرح: اوسط کی پیمائش

  • 5 دن کی اوسط شرح: اوسط کی موجودہ قیمت کی پیمائش

  • 60 دن معیاری فرق

  • z سکور: ((5d MA - 60d MA) / 60d SD

ratios_mavg5 = train.rolling(window=5,
                               center=False).mean()
ratios_mavg60 = train.rolling(window=60,
                               center=False).mean()
std_60 = train.rolling(window=60,
                        center=False).std()
zscore_60_5 = (ratios_mavg5 - ratios_mavg60)/std_60
plt.figure(figsize=(15,7))
plt.plot(train.index, train.values)
plt.plot(ratios_mavg5.index, ratios_mavg5.values)
plt.plot(ratios_mavg60.index, ratios_mavg60.values)
plt.legend(['Ratio','5d Ratio MA', '60d Ratio MA'])
plt.ylabel('Ratio')
plt.show()

img

60d اور 5d MA کی قیمت کا تناسب

plt.figure(figsize=(15,7))
zscore_60_5.plot()
plt.axhline(0, color='black')
plt.axhline(1.0, color='red', linestyle='--')
plt.axhline(-1.0, color='green', linestyle='--')
plt.legend(['Rolling Ratio z-Score', 'Mean', '+1', '-1'])
plt.show()

img

60-5 زیڈ سکور قیمت کا تناسب

اور یہ کہ Z اسکور جو کہ ایک رولنگ میڈین ہے، واقعی اس تناسب کی میڈین ریگونیشن کو ظاہر کرتا ہے!

پانچواں مرحلہ: ماڈل کا انتخاب

آئیے ایک بہت ہی آسان ماڈل سے شروع کریں۔ z اسکور چارٹ کو دیکھیں اور ہم دیکھ سکتے ہیں کہ جب بھی z اسکور بہت زیادہ یا بہت کم ہوتا ہے تو یہ واپس آجاتا ہے۔ آئیے + 1 / -1 کو اپنے حد کے طور پر استعمال کریں تاکہ بہت زیادہ اور بہت کم کی وضاحت کی جاسکے ، اور پھر ہم مندرجہ ذیل ماڈل کا استعمال کرتے ہوئے تجارتی سگنل تیار کرسکتے ہیں:

  • جب z -1.0 سے کم ہے، تو تناسب خریدنے کے لئے ہے ((1) ، کیونکہ ہم توقع کرتے ہیں کہ z 0 پر واپس آئے گا، لہذا تناسب میں اضافہ ہوتا ہے.

  • جب z 1.0 سے زیادہ ہوتا ہے، تو تناسب فروخت ہوتا ہے (−1) ، کیونکہ ہم توقع کرتے ہیں کہ z 0 پر واپس آئے گا، لہذا تناسب کم ہوتا ہے

چھٹا مرحلہ: تربیت، توثیق اور اصلاح

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

# Plot the ratios and buy and sell signals from z score
plt.figure(figsize=(15,7))
train[60:].plot()
buy = train.copy()
sell = train.copy()
buy[zscore_60_5>-1] = 0
sell[zscore_60_5<1] = 0
buy[60:].plot(color=’g’, linestyle=’None’, marker=’^’)
sell[60:].plot(color=’r’, linestyle=’None’, marker=’^’)
x1,x2,y1,y2 = plt.axis()
plt.axis((x1,x2,ratios.min(),ratios.max()))
plt.legend([‘Ratio’, ‘Buy Signal’, ‘Sell Signal’])
plt.show()

img

خریدنے اور فروخت کرنے کی شرح سگنل

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

# Plot the prices and buy and sell signals from z score
plt.figure(figsize=(18,9))
S1 = data['ADBE'].iloc[:1762]
S2 = data['MSFT'].iloc[:1762]
S1[60:].plot(color='b')
S2[60:].plot(color='c')
buyR = 0*S1.copy()
sellR = 0*S1.copy()
# When buying the ratio, buy S1 and sell S2
buyR[buy!=0] = S1[buy!=0]
sellR[buy!=0] = S2[buy!=0]
# When selling the ratio, sell S1 and buy S2 
buyR[sell!=0] = S2[sell!=0]
sellR[sell!=0] = S1[sell!=0]
buyR[60:].plot(color='g', linestyle='None', marker='^')
sellR[60:].plot(color='r', linestyle='None', marker='^')
x1,x2,y1,y2 = plt.axis()
plt.axis((x1,x2,min(S1.min(),S2.min()),max(S1.max(),S2.max())))
plt.legend(['ADBE','MSFT', 'Buy Signal', 'Sell Signal'])
plt.show()

img

MSFT اور ADBE اسٹاک خریدنے اور فروخت کرنے کے لئے سگنل

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

ہم تربیت کے اعداد و شمار کے اشارے سے خوش ہیں۔ آئیے دیکھتے ہیں کہ اس اشارے سے کیا منافع مل سکتا ہے۔ جب تناسب کم ہوتا ہے تو ہم ایک سادہ ریٹرو میٹر بنا سکتے ہیں ، 1 تناسب خریدتے ہیں ((1 ADBE اسٹاک خریدیں اور فروخت کا تناسب ایکس MSFT اسٹاک) جب یہ زیادہ ہوتا ہے تو 1 تناسب فروخت کرتا ہے ((1 ADBE اسٹاک فروخت کریں اور خریدنے کا تناسب ایکس MSFT اسٹاک) اور ان تناسب کے PnL تجارت کا حساب لگاتا ہے۔

# Trade using a simple strategy
def trade(S1, S2, window1, window2):
    
    # If window length is 0, algorithm doesn't make sense, so exit
    if (window1 == 0) or (window2 == 0):
        return 0
    
    # Compute rolling mean and rolling standard deviation
    ratios = S1/S2
    ma1 = ratios.rolling(window=window1,
                               center=False).mean()
    ma2 = ratios.rolling(window=window2,
                               center=False).mean()
    std = ratios.rolling(window=window2,
                        center=False).std()
    zscore = (ma1 - ma2)/std
    
    # Simulate trading
    # Start with no money and no positions
    money = 0
    countS1 = 0
    countS2 = 0
    for i in range(len(ratios)):
        # Sell short if the z-score is > 1
        if zscore[i] > 1:
            money += S1[i] - S2[i] * ratios[i]
            countS1 -= 1
            countS2 += ratios[i]
            print('Selling Ratio %s %s %s %s'%(money, ratios[i], countS1,countS2))
        # Buy long if the z-score is < 1
        elif zscore[i] < -1:
            money -= S1[i] - S2[i] * ratios[i]
            countS1 += 1
            countS2 -= ratios[i]
            print('Buying Ratio %s %s %s %s'%(money,ratios[i], countS1,countS2))
        # Clear positions if the z-score between -.5 and .5
        elif abs(zscore[i]) < 0.75:
            money += S1[i] * countS1 + S2[i] * countS2
            countS1 = 0
            countS2 = 0
            print('Exit pos %s %s %s %s'%(money,ratios[i], countS1,countS2))
            
            
    return money
trade(data['ADBE'].iloc[:1763], data['MSFT'].iloc[:1763], 60, 5)

نتائج: 1783.375

لہذا یہ حکمت عملی منافع بخش لگتی ہے! اب، ہم اس کے ساتھ ساتھ اس کی کارکردگی میں بہتری کو چیک کر سکتے ہیں، جیسے کہ ایک منتقل اوسط وقت کی ونڈو کو تبدیل کرکے، خریدنے / فروخت کرنے کے لئے ایک خاموش پوزیشن کی حد کو تبدیل کرکے، اور تصدیق کے اعداد و شمار کو چیک کریں.

ہم زیادہ پیچیدہ ماڈلز جیسے لاجسٹک ریگریشن، ایس وی ایم وغیرہ پر بھی کوشش کر سکتے ہیں تاکہ 1/-1 کی پیش گوئی کی جاسکے۔

اب، آئیے اس ماڈل کو آگے بڑھاتے ہیں، اور یہ ہمیں لے جاتا ہے

ساتواں مرحلہ: ٹیسٹ کے اعداد و شمار کو دوبارہ جانچنا

یہاں ایک بار پھر ایجاد کنندہ کوالٹی پلیٹ فارم کا ذکر کیا گیا ہے ، جو اعلی کارکردگی کا مظاہرہ کرنے والے کیو پی ایس / ٹی پی ایس ریٹیسٹنگ انجن کا استعمال کرتا ہے ، تاریخی ماحول کو حقیقی طور پر دوبارہ پیش کرتا ہے ، عام کوالٹی ریٹیسٹنگ کے خطرات کو ختم کرتا ہے ، اور حکمت عملی کی کمی کو بروقت دریافت کرتا ہے ، تاکہ حقیقی سرمایہ کاری میں بہتر مدد ملے۔

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

یہ بہت آسان ہے، ہم مندرجہ بالا فنکشن کا استعمال کرتے ہوئے جانچ کے اعداد و شمار کے PnL کو دیکھنے کے لئے کر سکتے ہیں

trade(data[‘ADBE’].iloc[1762:], data[‘MSFT’].iloc[1762:], 60, 5)

نتائج: 5262.868

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

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

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

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

# Find the window length 0-254 
# that gives the highest returns using this strategy
length_scores = [trade(data['ADBE'].iloc[:1762], 
                data['MSFT'].iloc[:1762], l, 5) 
                for l in range(255)]
best_length = np.argmax(length_scores)
print ('Best window length:', best_length)
('Best window length:', 40)

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

# Find the returns for test data
# using what we think is the best window length
length_scores2 = [trade(data['ADBE'].iloc[1762:], 
                  data['MSFT'].iloc[1762:],l,5) 
                  for l in range(255)]
print (best_length, 'day window:', length_scores2[best_length])
# Find the best window length based on this dataset, 
# and the returns using this window length
best_length2 = np.argmax(length_scores2)
print (best_length2, 'day window:', length_scores2[best_length2])
(40, 'day window:', 1252233.1395)
(15, 'day window:', 1449116.4522)

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

plt.figure(figsize=(15,7))
plt.plot(length_scores)
plt.plot(length_scores2)
plt.xlabel('Window length')
plt.ylabel('Score')
plt.legend(['Training', 'Test'])
plt.show()

img

ہم دیکھ سکتے ہیں کہ 20 سے 50 کے درمیان کچھ بھی وقت کی ونڈو کے لئے ایک اچھا انتخاب ہے۔

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

اگلا قدم

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

  • ہسٹر انڈیکس

  • Ornstein-Uhlenbeck عمل سے اخذ کردہ اوسط واپسی کی نصف عمر

  • کارل مین فلٹر


متعلقہ

مزید

bk_fundیہ پیکیج نہیں ملا

bk_fundbacktester.dataSource.yahoo_data_source کہاں نصب کیا جا سکتا ہے