3
پر توجہ دیں
1444
پیروکار

پروگرامی ٹریڈرز کے لیے ایک طاقتور ٹول: اوسط اور تغیر کا حساب لگانے کے لیے اضافی اپ ڈیٹ الگورتھم

میں تخلیق کیا: 2023-11-08 16:28:36, تازہ کاری: 2024-11-08 09:13:54
comments   0
hits   1735

پروگرامی ٹریڈرز کے لیے ایک طاقتور ٹول: اوسط اور تغیر کا حساب لگانے کے لیے اضافی اپ ڈیٹ الگورتھم

تعارف

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

سادہ مطلب اور تغیر

اگر ہم \(\mu_n\) کو \(n\)th ڈیٹا پوائنٹ کی اوسط کی نمائندگی کرنے کے لیے استعمال کرتے ہیں، یہ فرض کرتے ہوئے کہ ہم نے پہلے ہی \({n-1}\)th ڈیٹا پوائنٹ کے \(\mu_{n-1}\) کی اوسط کا حساب لگا لیا ہے۔ ، اب ہمیں ایک نیا ڈیٹا پوائنٹ \(x__{n}\) موصول ہوا ہے۔ ہم نئے اوسط \(\mu__{n}\) کی گنتی کرنا چاہتے ہیں جس میں یہ نیا ڈیٹا پوائنٹ شامل ہے۔ ذیل میں تفصیلی اخذ کیا گیا ہے۔

\(\mu_n = \frac{1}{n} \sum_{i=1}^{n} x_i\) \(\mu_n = \frac{1}{n} \left( x_n + \sum_{i=1}^{n-1} x_i \right)\) \(\mu_{n-1} = \frac{1}{n-1} \sum_{i=1}^{n-1} x_i\) \((n-1)\mu_{n-1} = \sum_{i=1}^{n-1} x_i\) \(\mu_n = \frac{1}{n} \left( x_n + (n-1)\mu_{n-1} \right)\) \(\mu_n = \mu_{n-1} + \frac{1}{n} (x_n - \mu_{n-1})\)

تغیرات کی تازہ کاری کے عمل کو درج ذیل مراحل میں تحلیل کیا جا سکتا ہے۔

\(S_n = \sum_{i=1}^{n} (x_i - \mu_n)^2\) \(S_n = \sum_{i=1}^{n} x_i^2 - n\mu_n^2\) \(S_n - S_{n-1} = x_n^2 - n\mu_n^2 + (n - 1)\mu_{n-1}^2\) \(S_n - S_{n-1} = (x_n - \mu_{n-1})(x_n - \mu_n)\) \(S_n = S_{n-1} + (x_n - \mu_{n-1})(x_n - \mu_n)\) \(\sigma_n^2 = \frac{S_n}{n}\)

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

تیزی سے وزن والا مطلب

تیزی سے وزنی اوسط کی وضاحت درج ذیل تکراری تعلق سے کی جا سکتی ہے۔

\(\mu_t = \alpha x_t + (1 - \alpha) \mu_{t-1}\)

جہاں \(\mu_t\) وقت پوائنٹ \(t\) پر تیزی سے وزنی اوسط ہے، \(x_t\) وقت نقطہ \(t\) پر مشاہدہ شدہ قدر ہے، \(\alpha\) وزن کا عنصر ہے، اور \(\mu_{t-1}\) یہ پچھلے ٹائم پوائنٹ کی تیزی سے وزنی اوسط ہے۔

تیزی سے وزنی تغیر

تغیر کے لیے، ہمیں ہر وقت کے نقطہ پر مربع انحراف کی تیزی سے وزنی اوسط کا حساب لگانا ہوگا۔ یہ مندرجہ ذیل تکرار تعلق کے ذریعے حاصل کیا جا سکتا ہے:

\(S_n = \alpha S_{n-1} + (1 - \alpha)(x_n - \mu_n)(x_n - \mu_{n-1})\)

جہاں \(\sigma_t^2\) وقتی نقطہ \(t\) پر تیزی سے وزنی تغیر ہے، اور \(\sigma_{t-1}^2\) پچھلے ٹائم پوائنٹ پر تیزی سے وزنی تغیر ہے۔

تیزی سے وزن والے وسط اور تغیرات کا مشاہدہ کریں کہ وہ دونوں ماضی کی قدر کا حصہ برقرار رکھتے ہیں: https://fanf2.user srcf.net/hermes/doc/antiforgery/stats.pdf

سادہ موونگ ایوریج (SMA) بمقابلہ Exponential Moving Average (EMA)

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

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

EMA اور SMA تخمینی تبدیلی کا طریقہ

اگرچہ سادہ اوسط اور تیزی سے وزنی اوسط تصوراتی طور پر مختلف ہیں، لیکن ہم \(\alpha\) کی مناسب قدر کا انتخاب کرکے مشاہدات کی ایک مخصوص تعداد کے لیے تیزی سے وزنی اوسط کو ایک سادہ اوسط بنا سکتے ہیں۔ اس تخمینی تعلق کو مؤثر نمونے کے سائز سے بیان کیا جا سکتا ہے، جو کہ وزن کے عنصر \(\alpha\) کا ایک فنکشن ہے جو تیزی سے وزنی اوسط میں ہے۔

سادہ موونگ ایوریج (SMA) دی گئی ٹائم ونڈو کے اندر تمام قیمتوں کا حسابی اوسط ہے۔ ٹائم ونڈو \(N\) کے لیے، SMA (جہاں کا مطلب ہے) کے سینٹرایڈ کو سمجھا جا سکتا ہے:

\(\text{SMA centroid} = frac{1 + N}{2}\)

ایکسپونینشل موونگ ایوریج (EMA) ایک وزنی اوسط ہے جہاں حالیہ ڈیٹا پوائنٹس کا وزن زیادہ ہوتا ہے۔ EMA کا وزن وقت کے ساتھ تیزی سے کم ہوتا ہے۔ مندرجہ ذیل سیریز کا خلاصہ کر کے EMA کا سنٹرائڈ حاصل کیا جا سکتا ہے۔

\(\text{EMA centroid} = \alpha \times \left[1 + 2(1 - \alpha) + 3(1 - \alpha)^2 + \cdots \right] = \frac{1}{\alpha}\)

جب ہم فرض کرتے ہیں کہ ایس ایم اے اور ای ایم اے کا ماس کا ایک ہی مرکز ہے، تو ہمیں ملتا ہے:

\(\frac{1 + N}{2} = \frac{1}{\alpha}\)

اس مساوات کو حل کرتے ہوئے، ہم \(\alpha\) اور \(N\) کے درمیان تعلق حاصل کر سکتے ہیں:

\(\alpha = \frac{2}{N + 1}\)

اس کا مطلب ہے کہ، ایک دیے گئے \(N\)-day SMA کے لیے، متعلقہ \(\alpha\) قدر کو “مساوی” EMA کا حساب لگانے کے لیے استعمال کیا جا سکتا ہے جیسے کہ دونوں کا مرکز ایک ہی ہے اور نتائج بہت ملتے جلتے ہیں۔

مختلف اپ ڈیٹ فریکوئنسی کے ساتھ EMA کی تبدیلی

فرض کریں کہ ہمارے پاس ایک EMA ہے جو ہر سیکنڈ میں \(\alpha_1\) کے وزن کے عنصر کے ساتھ اپ ڈیٹ ہوتا ہے۔ اس کا مطلب یہ ہے کہ ہر سیکنڈ، EMA میں \(\alpha_1\) کے وزن کے ساتھ ایک نیا ڈیٹا پوائنٹ شامل کیا جاتا ہے، جب کہ پرانے ڈیٹا پوائنٹس کے اثرات کو \(1 - \alpha_1\) سے ضرب دیا جاتا ہے۔

اگر ہم اپ ڈیٹ کی فریکوئنسی کو تبدیل کرتے ہیں، ہر \(f\) سیکنڈ میں اپ ڈیٹ کرنے کے لیے کہتے ہیں، ہم وزن کا ایک نیا عنصر \(\alpha_2\) تلاش کرنا چاہتے ہیں کہ \(f\) سیکنڈ کے اندر ڈیٹا پوائنٹ کا کل اثر ہر سیکنڈ کو اپ ڈیٹ کرتے وقت وہی ہو۔ .

\(f\) سیکنڈ سے زیادہ، اگر کوئی اپ ڈیٹ نہیں کیا جاتا ہے، تو پرانے ڈیٹا پوائنٹس کا اثر مسلسل \(f\) بار زوال پذیر ہوگا، ہر بار \(1 - \alpha_1\) سے ضرب۔ اس لیے، \(f\) سیکنڈز کے بعد کُل کشی کا عنصر \((1 - \alpha_1)^f\) ہے۔

EMA کو ہر \(f\) سیکنڈ میں اپ ڈیٹ کرنے کے لیے ایک اپ ڈیٹ سائیکل میں ویسا ہی زوال کا اثر ہوتا ہے جیسا کہ EMA فی سیکنڈ میں ایک بار اپ ڈیٹ ہوتا ہے، ہم نے \(f\) سیکنڈز کے بعد کُل کشی عنصر کو ایک اپ ڈیٹ میں زوال کے عنصر کے برابر مقرر کیا ہے۔ سائیکل:

\((1 - \alpha_1)^f = 1 - \alpha_2\)

اس مساوات کو حل کرتے ہوئے، ہمیں وزن کا نیا عنصر \(\alpha_2\) ملتا ہے:

\(\alpha_2 = 1 - (1 - \alpha_1)^f\)

یہ فارمولہ نئے وزن کے عنصر \(\alpha_2\) کا تخمینہ دیتا ہے جو اپ ڈیٹ فریکوئنسی تبدیل ہونے پر EMA ہموار اثر کو مستقل رکھتا ہے۔ مثال کے طور پر، ہم قیمت کا مطلب \(\alpha_1\) کو 0.001 کے حساب سے لگاتے ہیں، اور ہر 10 سیکنڈ میں تازہ ترین قیمت کو اپ ڈیٹ کرتے ہیں، تو اس کے برابر \(\alpha_2\) تقریباً 0.01 ہے۔

ازگر کوڈ کا نفاذ

class ExponentialWeightedStats:
    def __init__(self, alpha):
        self.alpha = alpha
        self.mu = 0
        self.S = 0
        self.initialized = False

    def update(self, x):
        if not self.initialized:
            self.mu = x
            self.S = 0
            self.initialized = True
        else:
            temp = x - self.mu
            new_mu = self.mu + self.alpha * temp
            self.S = self.alpha * self.S + (1 - self.alpha) * temp * (x - self.mu)
            self.mu = new_mu

    @property
    def mean(self):
        return self.mu

    @property
    def variance(self):
        return self.S

# 使用示例
alpha = 0.05  # 权重因子
stats = ExponentialWeightedStats(alpha)
data_stream = [] # 数据流
for data_point in data_stream:
    stats.update(data_point)

خلاصہ کریں۔

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