3
ফোকাস
1253
অনুসারী

প্রোগ্রাম্যাটিক ট্রেডারদের জন্য একটি শক্তিশালী হাতিয়ার: গড় এবং ভ্যারিয়েন্স গণনা করার জন্য বর্ধিত আপডেট অ্যালগরিদম

তৈরি: 2023-11-08 16:28:36, আপডেট করা হয়েছে: 2024-11-08 09:13:54
comments   0
hits   1021

প্রোগ্রাম্যাটিক ট্রেডারদের জন্য একটি শক্তিশালী হাতিয়ার: গড় এবং ভ্যারিয়েন্স গণনা করার জন্য বর্ধিত আপডেট অ্যালগরিদম

ভূমিকা

প্রোগ্রাম করা ট্রেডিং-এ, প্রায়শই গড় এবং প্রকরণ গণনা করা প্রয়োজন, যেমন চলমান গড় এবং অস্থিরতার মতো সূচকগুলি গণনা করার সময়। যখন আমাদের উচ্চ-ফ্রিকোয়েন্সি এবং দীর্ঘমেয়াদী গণনার প্রয়োজন হয়, তখন আমাদের দীর্ঘমেয়াদী ঐতিহাসিক ডেটা ধরে রাখতে হবে, যা অপ্রয়োজনীয় এবং সময়সাপেক্ষ এবং সম্পদ-সাপেক্ষ। এই নিবন্ধটি ওজনযুক্ত গড় এবং ভিন্নতা গণনা করার জন্য একটি অনলাইন আপডেট অ্যালগরিদম প্রবর্তন করে, যা রিয়েল-টাইম ডেটা স্ট্রিম প্রক্রিয়াকরণ এবং গতিশীলভাবে ট্রেডিং কৌশলগুলি, বিশেষ করে উচ্চ-ফ্রিকোয়েন্সি কৌশলগুলিকে গতিশীলভাবে সামঞ্জস্য করার জন্য বিশেষভাবে গুরুত্বপূর্ণ। নিবন্ধটি প্রকৃত লেনদেনে এই অ্যালগরিদমটি দ্রুত স্থাপন এবং প্রয়োগ করতে ব্যবসায়ীদের সহায়তা করার জন্য সংশ্লিষ্ট পাইথন কোড বাস্তবায়ন প্রদান করে।

সরল গড় এবং ভিন্নতা

যদি আমরা \(\mu_n\) ব্যবহার করি \(n\)th ডেটা পয়েন্টের গড় উপস্থাপন করতে, ধরে নিই যে আমরা \({n-1}\) ডেটা পয়েন্টের গড় \(\mu_{n-1}\) গণনা করেছি, এখন আমরা A নতুন ডেটা পয়েন্ট \(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) বনাম এক্সপোনেনশিয়াল মুভিং এভারেজ (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}\)

যখন আমরা ধরে নিই যে SMA এবং EMA এর ভরের কেন্দ্র একই, তখন আমরা পাই:

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

এই সমীকরণটি সমাধান করে, আমরা \(\alpha\) এবং \(N\)-এর মধ্যে সম্পর্ক পেতে পারি:

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

এর মানে হল, একটি প্রদত্ত \(N\)-দিনের SMA-এর জন্য, সংশ্লিষ্ট \(\alpha\) মানটি একটি “সমতুল্য” EMA গণনা করতে ব্যবহার করা যেতে পারে যাতে দুটির ভর কেন্দ্র একই থাকে এবং ফলাফলগুলি খুব একই রকম হয়।

বিভিন্ন EMA আপডেট ফ্রিকোয়েন্সির রূপান্তর

ধরুন আমাদের একটি EMA আছে যা প্রতি সেকেন্ডে \(\alpha_1\) এর ওজন ফ্যাক্টর সহ আপডেট হয়। এর মানে হল যে প্রতি সেকেন্ডে, \(\alpha_1\) এর ওজন সহ EMA-তে নতুন ডেটা পয়েন্ট যোগ করা হয়, যখন পুরানো ডেটা পয়েন্টগুলির প্রভাব \(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)

সারসংক্ষেপ

উচ্চ-ফ্রিকোয়েন্সি প্রোগ্রাম্যাটিক ট্রেডিংয়ে, রিয়েল-টাইম ডেটার দ্রুত প্রক্রিয়াকরণ অত্যন্ত গুরুত্বপূর্ণ। কম্পিউটেশনাল দক্ষতা উন্নত করতে এবং রিসোর্স খরচ কমাতে, এই পেপারটি ডাটা স্ট্রীমের ওজনযুক্ত গড় এবং বৈচিত্র্যের ক্রমাগত গণনা করার জন্য একটি অনলাইন আপডেট অ্যালগরিদম প্রবর্তন করে। রিয়েল টাইমে ক্রমবর্ধমান আপডেটের গণনা বিভিন্ন পরিসংখ্যানগত ডেটা এবং সূচকগুলি গণনা করতেও ব্যবহার করা যেতে পারে, যেমন দুটি সম্পদের দামের মধ্যে পারস্পরিক সম্পর্ক, রৈখিক ফিটিং ইত্যাদি, যার প্রচুর সম্ভাবনা রয়েছে। ক্রমবর্ধমান আপডেট ডেটাকে একটি সংকেত সিস্টেম হিসাবে বিবেচনা করে, এবং আপেক্ষিক এবং নির্দিষ্ট সময়ের গণনা ধারণাগুলির একটি বিবর্তন। যদি আপনার কৌশলটি ঐতিহাসিক ডেটার গণনাও অন্তর্ভুক্ত করে, তাহলে আপনি এই ধারণা অনুসারে এটিকে সংশোধন করতে পারেন এবং শুধুমাত্র সিস্টেমের অবস্থার অনুমান রেকর্ড করতে পারেন যখন নতুন ডেটা আসে, সিস্টেমের অবস্থা আপডেট করুন ইত্যাদি।