পূর্ববর্তী নিবন্ধে, আমি কীভাবে সমষ্টিগত ট্রেডিং ভলিউম মডেলিং করব এবং মূল্যের প্রভাবের ঘটনা বিশ্লেষণ করব তা পরিচয় করিয়ে দিয়েছিলাম। এই নিবন্ধে, আমি ট্রেড অর্ডার ডেটা বিশ্লেষণ চালিয়ে যাব। YGG সম্প্রতি বাইনান্স ইউ-ভিত্তিক চুক্তি চালু করেছে, এবং দামের ওঠানামা উল্লেখযোগ্য হয়েছে, একটি সময়ে ট্রেডিং ভলিউম বিটিসি ছাড়িয়ে গেছে। আজ, আমি এটি বিশ্লেষণ করব।
সাধারণভাবে, এটা অনুমান করা হয় যে অর্ডার আগমনের সময় একটি Poisson প্রক্রিয়া অনুসরণ করে।পিশন প্রক্রিয়াএখানে, আমি পরীক্ষামূলক প্রমাণ প্রদান করব।
আমি ৫ আগস্টের জন্য এগট্রেডস ডেটা ডাউনলোড করেছি, যা ১,৯৩১,১৯৩ টি ট্রেড নিয়ে গঠিত, যা বেশ গুরুত্বপূর্ণ। প্রথমে, আসুন ক্রয়ের অর্ডারগুলির বিতরণটি একবার দেখে নেওয়া যাক। আমরা 100ms এবং 500ms এর কাছাকাছি একটি মসৃণ স্থানীয় শিখর দেখতে পারি, যা সম্ভবত নিয়মিত ব্যবধানে ট্রেডিং বট দ্বারা স্থাপন করা আইসবার্গ অর্ডারগুলির কারণে ঘটে। এটি সেই দিনের অস্বাভাবিক বাজারের অবস্থার অন্যতম কারণ হতে পারে।
পয়েসন বন্টনের সম্ভাব্যতা ভর ফাংশন (পিএমএফ) নিম্নলিখিত সূত্র দ্বারা দেওয়া হয়ঃ
যেখানেঃ
একটি পয়েসন প্রক্রিয়ায়, ঘটনাগুলির মধ্যে সময় ব্যবধান একটি এক্সপোনেন্সিয়াল বন্টন অনুসরণ করে। এক্সপোনেন্সিয়াল বন্টনের সম্ভাব্যতা ঘনত্ব ফাংশন (পিডিএফ) নিম্নলিখিত সূত্র দ্বারা দেওয়া হয়ঃ
ফিটিং ফলাফলগুলি দেখায় যে পর্যবেক্ষণ করা ডেটা এবং প্রত্যাশিত পয়েসন বন্টনের মধ্যে উল্লেখযোগ্য পার্থক্য রয়েছে। পয়েসন প্রক্রিয়া দীর্ঘ সময়ের ব্যবধানের ফ্রিকোয়েন্সিকে কম মূল্যায়ন করে এবং স্বল্প সময়ের ব্যবধানের ফ্রিকোয়েন্সিকে অতিরিক্ত মূল্যায়ন করে। (অবসরগুলির প্রকৃত বন্টন একটি সংশোধিত প্যারেটো বন্টনের কাছাকাছি)
[1]:
from datetime import date,datetime
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
[2] এঃ
trades = pd.read_csv('YGGUSDT-aggTrades-2023-08-05.csv')
trades['date'] = pd.to_datetime(trades['transact_time'], unit='ms')
trades.index = trades['date']
buy_trades = trades[trades['is_buyer_maker']==False].copy()
buy_trades = buy_trades.groupby('transact_time').agg({
'agg_trade_id': 'last',
'price': 'last',
'quantity': 'sum',
'first_trade_id': 'first',
'last_trade_id': 'last',
'is_buyer_maker': 'last',
'date': 'last',
'transact_time':'last'
})
buy_trades['interval']=buy_trades['transact_time'] - buy_trades['transact_time'].shift()
buy_trades.index = buy_trades['date']
[১০] এঃ
buy_trades['interval'][buy_trades['interval']<1000].plot.hist(bins=200,figsize=(10, 5));
আউট[10]:
[২০] এঃ
Intervals = np.array(range(0, 1000, 5))
mean_intervals = buy_trades['interval'].mean()
buy_rates = 1000/mean_intervals
probabilities = np.array([np.mean(buy_trades['interval'] > interval) for interval in Intervals])
probabilities_s = np.array([np.e**(-buy_rates*interval/1000) for interval in Intervals])
plt.figure(figsize=(10, 5))
plt.plot(Intervals, probabilities)
plt.plot(Intervals, probabilities_s)
plt.xlabel('Intervals')
plt.ylabel('Probability')
plt.grid(True)
আউট[20]:
পয়েসন বন্টনের সাথে 1 সেকেন্ডের মধ্যে অর্ডার ঘটনার সংখ্যার বিতরণ তুলনা করার সময়, পার্থক্যটিও উল্লেখযোগ্য। পয়েসন বন্টন বিরল ইভেন্টগুলির ফ্রিকোয়েন্সিকে উল্লেখযোগ্যভাবে কম মূল্যায়ন করে। এর সম্ভাব্য কারণগুলি হ'লঃ
অন্য কথায়, বাস্তব জগতে, অর্ডারের ঘটনার ফ্রিকোয়েন্সি অস্থির, এবং এটি রিয়েল-টাইমে আপডেট করা দরকার। একটি উদ্দীপক প্রভাবও থাকতে পারে, যেখানে একটি নির্দিষ্ট সময়ের মধ্যে আরও অর্ডার আরও অর্ডারকে উদ্দীপিত করে। এটি কৌশলগুলিকে একক স্থির পরামিতির উপর নির্ভর করতে অক্ষম করে তোলে।
১৯০ সালেঃ
result_df = buy_trades.resample('1S').agg({
'price': 'count',
'quantity': 'sum'
}).rename(columns={'price': 'order_count', 'quantity': 'quantity_sum'})
[219]-এঃ
count_df = result_df['order_count'].value_counts().sort_index()[result_df['order_count'].value_counts()>20]
(count_df/count_df.sum()).plot(figsize=(10,5),grid=True,label='sample pmf');
from scipy.stats import poisson
prob_values = poisson.pmf(count_df.index, 1000/mean_intervals)
plt.plot(count_df.index, prob_values,label='poisson pmf');
plt.legend() ;
আউট[219]:
অর্ডার ব্যবধানের বিশ্লেষণ থেকে, এটি উপসংহারে উপনীত হতে পারে যে স্থির পরামিতিগুলি বাস্তব বাজারের অবস্থার জন্য উপযুক্ত নয়, এবং কৌশলটিতে বাজার বর্ণনা করে এমন মূল পরামিতিগুলিকে রিয়েল-টাইমে আপডেট করা দরকার। সবচেয়ে সহজ সমাধানটি হ'ল স্লাইডিং উইন্ডো চলমান গড় ব্যবহার করা। নীচের দুটি গ্রাফ 1 সেকেন্ডের মধ্যে ক্রয় আদেশের ফ্রিকোয়েন্সি এবং 1000 উইন্ডোর আকারের সাথে ব্যবসায়ের পরিমাণের গড় দেখায়। দেখা যায় যে ট্রেডিংয়ে একটি ক্লাস্টারিং ঘটনা রয়েছে, যেখানে অর্ডারগুলির ফ্রিকোয়েন্সি একটি নির্দিষ্ট সময়ের জন্য স্বাভাবিকের তুলনায় উল্লেখযোগ্যভাবে বেশি, এবং ভলিউমও সিঙ্ক্রোনভাবে বৃদ্ধি পায়। এখানে, পূর্ববর্তী মানগুলির গড়টি সর্বশেষ মানটি পূর্বাভাস দেওয়ার জন্য ব্যবহৃত হয় এবং অবশিষ্টগুলির গড় ত্রুটিটি পূর্বাভাসের মান পরিমাপ করতে ব্যবহৃত হয়।
গ্রাফ থেকে, আমরা বুঝতে পারি যে কেন অর্ডার ফ্রিকোয়েন্সি পয়েসন বিতরণ থেকে এত বেশি বিচ্যুত হয়। যদিও প্রতি সেকেন্ডে অর্ডারের গড় সংখ্যা মাত্র 8.5, চরম ক্ষেত্রে এই মান থেকে উল্লেখযোগ্যভাবে বিচ্যুত হয়।
এটি পাওয়া যায় যে পূর্বাভাসের জন্য পূর্ববর্তী দুই সেকেন্ডের গড় ব্যবহার করা সর্বনিম্ন অবশিষ্ট ত্রুটি দেয় এবং এটি কেবলমাত্র পূর্বাভাসের ফলাফলের জন্য গড় ব্যবহারের চেয়ে অনেক ভাল।
[২২১] এঃ
result_df['order_count'].rolling(1000).mean().plot(figsize=(10,5),grid=True);
আউট[221]:
[১৯৩] সালেঃ
result_df['quantity_sum'].rolling(1000).mean().plot(figsize=(10,5),grid=True);
আউট[193]:
[১৯৫] সালেঃ
(result_df['order_count'] - result_df['mean_count'].mean()).abs().mean()
আউট[195]:
6.985628185332997
[২০৫] এঃ
result_df['mean_count'] = result_df['order_count'].rolling(2).mean()
(result_df['order_count'] - result_df['mean_count'].shift()).abs().mean()
আউট[205]:
3.091737586730269
এই নিবন্ধটি পয়েসন প্রক্রিয়া থেকে অর্ডার সময় ব্যবধানের বিচ্যুতির কারণগুলি সংক্ষেপে ব্যাখ্যা করে, মূলত সময়ের সাথে সাথে পরামিতিগুলির পরিবর্তনের কারণে। সঠিকভাবে বাজারটি পূর্বাভাস দেওয়ার জন্য, কৌশলগুলিকে বাজারের মৌলিক পরামিতিগুলির রিয়েল-টাইম পূর্বাভাস দিতে হবে। অবশিষ্টগুলি পূর্বাভাসের গুণমান পরিমাপ করতে ব্যবহার করা যেতে পারে। উপরে প্রদত্ত উদাহরণটি একটি সহজ প্রদর্শন এবং নির্দিষ্ট সময় সিরিজ বিশ্লেষণ, অস্থিরতা ক্লাস্টারিং এবং অন্যান্য সম্পর্কিত বিষয়গুলিতে বিস্তৃত গবেষণা রয়েছে, উপরের প্রদর্শনটি আরও উন্নত করা যেতে পারে।