পূর্ববর্তী নিবন্ধে, আমি কীভাবে সমৃদ্ধ ট্রেডিংয়ের মডেলিং করব এবং দামের ধাক্কা দেওয়ার সহজ বিশ্লেষণ সম্পর্কে আলোচনা করেছি। এই নিবন্ধটি ট্রেড অর্ডার ডেটার চারপাশে বিশ্লেষণ অব্যাহত রাখবে।
সাধারণত অর্ডার আসার সময়টি প্যারিস প্রক্রিয়ার সাথে সামঞ্জস্যপূর্ণ বলে অনুমান করা হয়। এখানে একটি নিবন্ধ রয়েছে যা এটি সম্পর্কে ব্যাখ্যা করে।পারসুন প্রক্রিয়া☞ আমি নীচে প্রমাণ করব।
৫ আগস্টের AggTrades ডাউনলোড করুন, মোট ১৯৩১১৯৩টি ট্রেড, খুব অতিরঞ্জিত। প্রথমত, প্রথমে পেমেন্টের বন্টনটি দেখুন, আপনি দেখতে পাবেন যে প্রায় ১০০ms এবং ৫০০ms এ একটি মসৃণ স্থানীয় শিখর রয়েছে, যা সম্ভবত হিমশৈলীর দ্বারা অর্পিত রোবট টাইমিং অর্ডারের কারণে হতে পারে, যা দিনের ব্যতিক্রমী ক্রিয়াকলাপের অন্যতম কারণ হতে পারে।
পারসন বন্টনের সম্ভাব্যতা ভর ফাংশন (PMF) নিম্নলিখিত সূত্র দ্বারা দেওয়া হয়ঃ
এর মধ্যে রয়েছেঃ
প্যারাসন প্রক্রিয়ার সময়, ঘটনাগুলির মধ্যে সময়ের ব্যবধানটি সূচকীয় বন্টনের অধীনে থাকে। সূচকীয় বন্টনের সম্ভাব্যতা ঘনত্ব ফাংশন (PDF) নিম্নলিখিত সূত্র দ্বারা দেওয়া হয়ঃ
ফ্যাশনের মাধ্যমে দেখা যায় যে ফলাফল এবং প্যারাসন বন্টনের প্রত্যাশিত পার্থক্য বেশি, প্যারাসন প্রক্রিয়া দীর্ঘ বিরতি সময়ের ফ্রিকোয়েন্সিকে কম মূল্যায়ন করে এবং কম বিরতি সময়ের ফ্রিকোয়েন্সিকে বেশি মূল্যায়ন করে। (প্রকৃত বিরতি বন্টন সংশোধিত প্যারাসন বন্টনের কাছাকাছি)
from datetime import date,datetime
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
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));
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)
পরিসংখ্যানগতভাবে 1s-এর মধ্যে অর্ডারের ঘটনার সংখ্যার বন্টন, পারসন বন্টনের সাথে তুলনা করা হলে, পার্থক্যটিও খুব স্পষ্ট। পারসন বন্টনটি ছোট সম্ভাব্যতার ঘটনার ঘটনার ফ্রিকোয়েন্সিকে উল্লেখযোগ্যভাবে কম মূল্যায়ন করে। সম্ভাব্য কারণঃ
অর্থাৎ, বাস্তব পরিবেশে, অর্ডারের ঘটনার ফ্রিকোয়েন্সি অস্থির, রিয়েল-টাইম আপডেটের প্রয়োজন, এবং একটি প্রেরণামূলক কার্যকারিতা রয়েছে, অর্থাৎ নির্দিষ্ট সময়ের মধ্যে আরও অর্ডার আরও অর্ডারকে উদ্দীপিত করে। এটি কৌশলটিকে একটি একক পরামিতি স্থির করতে পারে না।
result_df = buy_trades.resample('0.1S').agg({
'price': 'count',
'quantity': 'sum'
}).rename(columns={'price': 'order_count', 'quantity': 'quantity_sum'})
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() ;
পূর্ববর্তী অর্ডার ব্যবধান বিশ্লেষণের মাধ্যমে সিদ্ধান্ত নেওয়া যেতে পারে যে, স্থির পরামিতিগুলি বাস্তব বাজারের জন্য উপযুক্ত নয়, কৌশলটির বাজারের বিবরণ সম্পর্কে মূল পরামিতিগুলি রিয়েল-টাইম আপডেটের প্রয়োজন। সবচেয়ে সহজ সমাধানটি স্লাইড উইন্ডোর চলমান গড়। নীচের দুটি চিত্র যথাক্রমে 1 সেকেন্ডের মধ্যে অর্থ প্রদানের ফ্রিকোয়েন্সি এবং লেনদেনের পরিমাণের 1000 উইন্ডোর গড় মান। এটি দেখা যায় যে একটি সময় আছে যখন অর্ডারগুলির ফ্রিকোয়েন্সি স্বাভাবিকের তুলনায় উল্লেখযোগ্যভাবে বেশি, এবং এই সময়ে পরিমাণটিও সমন্বিতভাবে বড়। এখানে সর্বশেষ এক সেকেন্ডের প্রত্যাশিত মানের জন্য উপরের গড় ব্যবহার করা হয়, পূর্বাভাসের ভাল বা খারাপ পরিমাপ করার জন্য প্রত্যাশিত অবশিষ্টের গড় মানের নিরঙ্কুশ ভুলের গড় মান।
গ্রাফ থেকে এটাও বোঝা যায় যে কেন অর্ডারের ফ্রিকোয়েন্সি প্যারাসন ডিভিশন থেকে এত বেশি বিচ্যুত হয়, যদিও প্রতি সেকেন্ডে অর্ডারের গড় সংখ্যা মাত্র ৮.৫ বার, কিন্তু চরম পরিস্থিতিতে প্রতি সেকেন্ডে অর্ডারের গড় সংখ্যা অনেক বেশি বিচ্যুত হয়।
এখানে দেখা গেছে যে, প্রথম দুই সেকেন্ডের গড় মান দিয়ে পূর্বাভাসের প্যারামিটার ত্রুটি সর্বনিম্ন এবং সহজ গড় মান পূর্বাভাসের তুলনায় অনেক ভাল।
result_df['order_count'][::10].rolling(1000).mean().plot(figsize=(10,5),grid=True);
result_df
order_count | পরিমাণ_সংখ্যা | |
---|---|---|
2023-08-05 03:30:06.100 | 1 | 76.0 |
2023-08-05 03:30:06.200 | 0 | 0.0 |
2023-08-05 03:30:06.300 | 0 | 0.0 |
2023-08-05 03:30:06.400 | 1 | 416.0 |
2023-08-05 03:30:06.500 | 0 | 0.0 |
… | … | … |
2023-08-05 23:59:59.500 | 3 | 9238.0 |
2023-08-05 23:59:59.600 | 0 | 0.0 |
2023-08-05 23:59:59.700 | 1 | 3981.0 |
2023-08-05 23:59:59.800 | 0 | 0.0 |
2023-08-05 23:59:59.900 | 2 | 534.0 |
result_df['quantity_sum'].rolling(1000).mean().plot(figsize=(10,5),grid=True);
(result_df['order_count'] - result_df['mean_count'].mean()).abs().mean()
6.985628185332997
result_df['mean_count'] = result_df['order_count'].ewm(alpha=0.11, adjust=False).mean()
(result_df['order_count'] - result_df['mean_count'].shift()).abs().mean()
0.6727616961866929
result_df['mean_quantity'] = result_df['quantity_sum'].ewm(alpha=0.1, adjust=False).mean()
(result_df['quantity_sum'] - result_df['mean_quantity'].shift()).abs().mean()
4180.171479076811
এই নিবন্ধটি অর্ডার সময় ব্যবধানের বিচ্যুতির কারণগুলিকে সংক্ষেপে বর্ণনা করে, প্রধানত কারণ পরামিতিগুলি সময়ের সাথে সাথে পরিবর্তিত হয়। বাজারের পূর্বাভাস দেওয়ার জন্য কৌশলগুলিকে আরও সঠিকভাবে বাজারের মৌলিক পরামিতিগুলির জন্য বাস্তব সময়ের পূর্বাভাস দেওয়ার প্রয়োজন হয়। অবশিষ্টাংশের সাহায্যে পূর্বাভাসের ভাল বা খারাপ পরিমাপ করা যায়। উপরে দেওয়া সবচেয়ে সহজ উদাহরণটি হ'ল, নির্দিষ্ট সময় সিরিজ বিশ্লেষণ, উদ্বায়ী হার সংগ্রহ ইত্যাদি সম্পর্কিত গবেষণা অনেক বেশি, যা আরও উন্নত করা যেতে পারে।