হাই ফ্রিকোয়েন্সি ট্রেডিং কৌশল সম্পর্কে চিন্তাভাবনা (5)

লেখক:ঘাস, সৃষ্টিঃ ২০২৩-০৮-০৯ ১৮ঃ১৩ঃ১৬, আপডেটঃ ২০২৩-০৯-১৮ ১৯ঃ৫১ঃ৫৯

img

পূর্ববর্তী নিবন্ধটি বিভিন্ন মধ্যবর্তী মূল্য গণনা পদ্ধতির একটি প্রাথমিক ভূমিকা দেয় এবং মধ্যবর্তী মূল্যের একটি সংশোধন দেয়, যা এই বিষয়ে আরও গভীরতর হয়।

প্রয়োজনীয় তথ্য

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

from datetime import date,datetime
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import ast
%matplotlib inline
tick_size = 0.0001
trades = pd.read_csv('YGGUSDT_aggTrade.csv',names=['type','event_time', 'agg_trade_id','symbol', 'price', 'quantity', 'first_trade_id', 'last_trade_id',
       'transact_time', 'is_buyer_maker'])
trades = trades.groupby(['transact_time','is_buyer_maker']).agg({
    'transact_time':'last',
    'agg_trade_id': 'last',
    'price': 'first',
    'quantity': 'sum',
    'first_trade_id': 'first',
    'last_trade_id': 'last',
    'is_buyer_maker': 'last',
})
trades.index = pd.to_datetime(trades['transact_time'], unit='ms')
trades.index.rename('time', inplace=True)
trades['interval'] = trades['transact_time'] - trades['transact_time'].shift()
depths = pd.read_csv('YGGUSDT_depth.csv',names=['type','event_time', 'transact_time','symbol', 'u1', 'u2', 'u3', 'bids','asks'])
depths = depths.iloc[:100000]
depths['bids'] = depths['bids'].apply(ast.literal_eval).copy()
depths['asks'] = depths['asks'].apply(ast.literal_eval).copy()
def expand_bid(bid_data):
    expanded = {}
    for j, (price, quantity) in enumerate(bid_data):
        expanded[f'bid_{j}_price'] = float(price)
        expanded[f'bid_{j}_quantity'] = float(quantity)
    return pd.Series(expanded)
def expand_ask(ask_data):
    expanded = {}
    for j, (price, quantity) in enumerate(ask_data):
        expanded[f'ask_{j}_price'] = float(price)
        expanded[f'ask_{j}_quantity'] = float(quantity)
    return pd.Series(expanded)
# 应用到每一行,得到新的df
expanded_df_bid = depths['bids'].apply(expand_bid)
expanded_df_ask = depths['asks'].apply(expand_ask)
# 在原有df上进行扩展
depths = pd.concat([depths, expanded_df_bid, expanded_df_ask], axis=1)
depths.index = pd.to_datetime(depths['transact_time'], unit='ms')
depths.index.rename('time', inplace=True);
trades = trades[trades['transact_time'] < depths['transact_time'].iloc[-1]]

প্রথমত, এই ২০টি ফাইলের বাজারের বন্টন দেখুন, যা প্রত্যাশার সাথে সামঞ্জস্যপূর্ণ, যেহেতু ব্যবসায়ের দূরত্ব যত বেশি, সাধারণত আরও বেশি তালিকাভুক্ত হয়, এবং ক্রয় তালিকাভুক্ত এবং বিক্রয় তালিকাভুক্ত প্রায় সমান্তরাল।

bid_mean_list = []
ask_mean_list = []
for i in range(20):
    bid_mean_list.append(round(depths[f'bid_{i}_quantity'].mean(),0))
    ask_mean_list.append(round(depths[f'ask_{i}_quantity'].mean(),0))
plt.figure(figsize=(10, 5))
plt.plot(bid_mean_list);
plt.plot(ask_mean_list);
plt.grid(True)

img

গভীরতার তথ্য এবং লেনদেনের তথ্য একত্রিত করা হয়, যা পূর্বাভাসের সঠিকতা মূল্যায়ন করতে সহায়তা করে। এখানে নিশ্চিত করা হয় যে লেনদেনের তথ্য গভীরতার তথ্যের পরে আসে এবং বিলম্বের বিবেচনায় না নিয়ে সরাসরি পূর্বাভাসের মান এবং প্রকৃত লেনদেনের মূল্যের গড় ত্রুটি গণনা করে। এটি পূর্বাভাসের সঠিকতা পরিমাপ করতে ব্যবহৃত হয়।

ফলস্বরূপ, কেনা-বেচা একটি গড় মূল্যের মধ্যম_মূল্যের ত্রুটি সর্বাধিক, ওজন_মধ্যম_মূল্য পরিবর্তন করার পরে, ত্রুটিটি তাত্ক্ষণিকভাবে অনেক ছোট হয়ে যায়, ওজনযুক্ত মধ্যম মূল্যের সমন্বয় করে আরও কিছুটা উন্নতি করে। গতকালের নিবন্ধটি প্রকাশের পরে, কেউ প্রতিক্রিয়া জানিয়েছিল কেবলমাত্র আই ^ 3 / 2 দিয়ে, এখানে পরীক্ষা করে দেখেছিল এবং ফলাফলটি আরও ভাল ছিল। নিম্নলিখিত কারণগুলি বিবেচনা করে, ঘটনাটির ফ্রিকোয়েন্সির পার্থক্য হওয়া উচিত, আই -1 এবং 1 এর কাছাকাছি কম সম্ভাব্যতার ঘটনা, এই নিম্ন সম্ভাব্যতা সংশোধন করার জন্য, উচ্চ-প্রায় ঘটনার পূর্বাভাসটি কম সঠিক নয়, তাই উচ্চ-প্রায় ঘটনার ক্ষেত্রে আরও যত্ন নেওয়ার ক্ষেত্রে, আমি আবারও নিম্নলিখিতটি সংশোধন করেছি ((এটি বিশুদ্ধভাবে পরীক্ষিত রেফারেন্সের জন্য একটি পরামিতি, বাস্তবতা খুব বেশি নয়):

img

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

df = pd.merge_asof(trades, depths, on='transact_time', direction='backward')
df['spread'] = round(df['ask_0_price'] - df['bid_0_price'],4)
df['mid_price'] = (df['bid_0_price']+ df['ask_0_price']) / 2
df['I'] = (df['bid_0_quantity'] - df['ask_0_quantity']) / (df['bid_0_quantity'] + df['ask_0_quantity'])
df['weight_mid_price'] = df['mid_price'] + df['spread']*df['I']/2
df['adjust_mid_price'] = df['mid_price'] + df['spread']*(df['I'])*(df['I']**8+1)/4
df['adjust_mid_price_2'] = df['mid_price'] + df['spread']*df['I']*(df['I']**2+1)/4
df['adjust_mid_price_3'] = df['mid_price'] + df['spread']*df['I']**3/2
df['adjust_mid_price_4'] = df['mid_price'] + df['spread']*(df['I']+0.3)*(df['I']**4+0.7)/3.8
print('平均值     mid_price的误差:', ((df['price']-df['mid_price'])**2).sum())
print('挂单量加权 mid_price的误差:', ((df['price']-df['weight_mid_price'])**2).sum())
print('调整后的   mid_price的误差:', ((df['price']-df['adjust_mid_price'])**2).sum())
print('调整后的 mid_price_2的误差:', ((df['price']-df['adjust_mid_price_2'])**2).sum())
print('调整后的 mid_price_3的误差:', ((df['price']-df['adjust_mid_price_3'])**2).sum())
print('调整后的 mid_price_4的误差:', ((df['price']-df['adjust_mid_price_4'])**2).sum())
平均值     mid_price的误差: 0.0048751924999999845
挂单量加权 mid_price的误差: 0.0048373440193987035
调整后的   mid_price的误差: 0.004803654771638586
调整后的 mid_price_2的误差: 0.004808216498329721
调整后的 mid_price_3的误差: 0.004794984755260528
调整后的 mid_price_4的误差: 0.0047909595497071375

দ্বিতীয় স্তরের গভীরতা বিবেচনা করুন

এখানে একটি ধারণা ব্যবহার করা হয়েছে যে, একটি প্যারামিটারকে প্রভাবিত করে এমন বিভিন্ন মূল্য নির্ধারণের পরিসীমা, লেনদেনের দামের পরিবর্তনগুলি পরিমাপ করার জন্য এই প্যারামিটারের মধ্যবর্তী দামের অবদান। যেমন প্রথম গ্রেড গভীরতার চিত্রটি, লেনদেনের দামের সাথে সাথে আই বৃদ্ধি পেয়েছে, লেনদেনের দাম পরবর্তী পরিবর্তনের দিকে পরিবর্তিত হওয়ার সম্ভাবনা বেশি, এটি ইঙ্গিত দেয় যে আমি ইতিবাচক অবদান রেখেছি।

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

অবদানের মাত্রার উপর নির্ভর করে, এই তিনটি শ্রেণীর ভারসাম্যহীনতার পরামিতিগুলিকে বিভিন্ন ওজন দেওয়া হয়, প্রকৃতপক্ষে বিভিন্ন গণনার পদ্ধতির জন্য পরীক্ষা করা হয় এবং পূর্বাভাসের ভুল আরও হ্রাস পায়।

bins = np.linspace(-1, 1, 50)
df['change'] = (df['price'].pct_change().shift(-1))/tick_size
df['I_bins'] = pd.cut(df['I'], bins, labels=bins[1:])
df['I_2'] = (df['bid_1_quantity'] - df['ask_1_quantity']) / (df['bid_1_quantity'] + df['ask_1_quantity'])
df['I_2_bins'] = pd.cut(df['I_2'], bins, labels=bins[1:])
df['I_3'] = (df['bid_2_quantity'] - df['ask_2_quantity']) / (df['bid_2_quantity'] + df['ask_2_quantity'])
df['I_3_bins'] = pd.cut(df['I_3'], bins, labels=bins[1:])
df['I_4'] = (df['bid_3_quantity'] - df['ask_3_quantity']) / (df['bid_3_quantity'] + df['ask_3_quantity'])
df['I_4_bins'] = pd.cut(df['I_4'], bins, labels=bins[1:])
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(8, 5))


axes[0][0].plot(df.groupby('I_bins')['change'].mean())
axes[0][0].set_title('I')
axes[0][0].grid(True)

axes[0][1].plot(df.groupby('I_2_bins')['change'].mean())
axes[0][1].set_title('I 2')
axes[0][1].grid(True)

axes[1][0].plot(df.groupby('I_3_bins')['change'].mean())
axes[1][0].set_title('I 3')
axes[1][0].grid(True)

axes[1][1].plot(df.groupby('I_4_bins')['change'].mean())
axes[1][1].set_title('I 4')
axes[1][1].grid(True)
plt.tight_layout();

img

df['adjust_mid_price_4'] = df['mid_price'] + df['spread']*(df['I']+0.3)*(df['I']**4+0.7)/3.8
df['adjust_mid_price_5'] = df['mid_price'] + df['spread']*(0.7*df['I']+0.3*df['I_2'])/2
df['adjust_mid_price_6'] = df['mid_price'] + df['spread']*(0.7*df['I']+0.3*df['I_2'])**3/2
df['adjust_mid_price_7'] = df['mid_price'] + df['spread']*(0.7*df['I']+0.3*df['I_2']+0.3)*((0.7*df['I']+0.3*df['I_2'])**4+0.7)/3.8
df['adjust_mid_price_8'] = df['mid_price'] + df['spread']*(0.7*df['I']+0.2*df['I_2']+0.1*df['I_3']+0.3)*((0.7*df['I']+0.3*df['I_2']+0.1*df['I_3'])**4+0.7)/3.8
print('调整后的 mid_price_4的误差:', ((df['price']-df['adjust_mid_price_4'])**2).sum())
print('调整后的 mid_price_5的误差:', ((df['price']-df['adjust_mid_price_5'])**2).sum())
print('调整后的 mid_price_6的误差:', ((df['price']-df['adjust_mid_price_6'])**2).sum())
print('调整后的 mid_price_7的误差:', ((df['price']-df['adjust_mid_price_7'])**2).sum())
print('调整后的 mid_price_8的误差:', ((df['price']-df['adjust_mid_price_8'])**2).sum())
调整后的 mid_price_4的误差: 0.0047909595497071375
调整后的 mid_price_5的误差: 0.0047884350488318714
调整后的 mid_price_6的误差: 0.0047778319053133735
调整后的 mid_price_7的误差: 0.004773578540592192
调整后的 mid_price_8的误差: 0.004771415189297518

লেনদেনের তথ্য বিবেচনা করুন

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

ফর্মটি বিবেচনা করে, অর্ডারের গড় আগমনের সংখ্যা সংজ্ঞায়িত করা হয় ভারসাম্যহীন VI, Vb, Vs যথাক্রমে ক্রয় এবং বিক্রয় আদেশের একক ইভেন্টের মধ্যে গড় সংখ্যা।

img

ফলাফলগুলি দেখিয়েছে যে স্বল্প সময়ের মধ্যে আগত সংখ্যাটি মূল্য পরিবর্তনের পূর্বাভাসের উপর সবচেয়ে উল্লেখযোগ্য, যখন VI ০.১-০.৯ এর মধ্যে থাকে, তখন দামের সাথে নেতিবাচকভাবে সম্পর্কিত হয়, যখন ব্যাপ্তির বাইরে এটি দ্রুত মূল্যের সাথে সম্পর্কিত হয়। এটি ইঙ্গিত দেয় যে যখন বাজারে চরম হয় না, যখন উত্তেজনা মূল হয়, তখন দামগুলি সমতা ফিরে আসে, যখন চরম বাজারে দেখা যায়, যেমন প্রচুর পরিমাণে কেনা-বিক্রয় ওভারসেলিং হয়, তখন এটি প্রবণতা থেকে বেরিয়ে আসে। এমনকি এই নিম্ন সম্ভাব্যতার পরিস্থিতিগুলি বিবেচনা না করেও, সহজ অনুমান যে প্রবণতা এবং VI নেতিবাচক রৈখিক সম্পর্ক পূরণ করে, মধ্যবর্তী দামের পূর্বাভাসের ভুলের পার্থক্যটি হ্রাস পায়।

img

alpha=0.1
df['avg_buy_interval'] = None
df['avg_sell_interval'] = None
df.loc[df['is_buyer_maker'] == True, 'avg_buy_interval'] = df[df['is_buyer_maker'] == True]['transact_time'].diff().ewm(alpha=alpha).mean()
df.loc[df['is_buyer_maker'] == False, 'avg_sell_interval'] = df[df['is_buyer_maker'] == False]['transact_time'].diff().ewm(alpha=alpha).mean()
df['avg_buy_quantity'] = None
df['avg_sell_quantity'] = None
df.loc[df['is_buyer_maker'] == True, 'avg_buy_quantity'] = df[df['is_buyer_maker'] == True]['quantity'].ewm(alpha=alpha).mean()
df.loc[df['is_buyer_maker'] == False, 'avg_sell_quantity'] = df[df['is_buyer_maker'] == False]['quantity'].ewm(alpha=alpha).mean()
df['avg_buy_quantity'] = df['avg_buy_quantity'].fillna(method='ffill')
df['avg_sell_quantity'] = df['avg_sell_quantity'].fillna(method='ffill')
df['avg_buy_interval'] = df['avg_buy_interval'].fillna(method='ffill')
df['avg_sell_interval'] = df['avg_sell_interval'].fillna(method='ffill')

df['avg_buy_rate'] = 1000 / df['avg_buy_interval']
df['avg_sell_rate'] =1000 / df['avg_sell_interval']

df['avg_buy_volume'] = df['avg_buy_rate']*df['avg_buy_quantity']
df['avg_sell_volume'] = df['avg_sell_rate']*df['avg_sell_quantity']
df['I'] = (df['bid_0_quantity']- df['ask_0_quantity']) / (df['bid_0_quantity'] + df['ask_0_quantity'])
df['OI'] = (df['avg_buy_rate']-df['avg_sell_rate']) / (df['avg_buy_rate'] + df['avg_sell_rate'])
df['QI'] = (df['avg_buy_quantity']-df['avg_sell_quantity']) / (df['avg_buy_quantity'] + df['avg_sell_quantity'])
df['VI'] = (df['avg_buy_volume']-df['avg_sell_volume']) / (df['avg_buy_volume'] + df['avg_sell_volume'])
bins = np.linspace(-1, 1, 50)
df['VI_bins'] = pd.cut(df['VI'], bins, labels=bins[1:])
plt.plot(df.groupby('VI_bins')['change'].mean());
plt.grid(True)

img

df['adjust_mid_price'] = df['mid_price'] + df['spread']*df['I']/2
df['adjust_mid_price_9'] = df['mid_price'] + df['spread']*(-df['OI'])*2
df['adjust_mid_price_10'] = df['mid_price'] + df['spread']*(-df['VI'])*1.4
print('调整后的mid_price   的误差:', ((df['price']-df['adjust_mid_price'])**2).sum())
print('调整后的mid_price_9 的误差:', ((df['price']-df['adjust_mid_price_9'])**2).sum())
print('调整后的mid_price_10的误差:', ((df['price']-df['adjust_mid_price_10'])**2).sum())
调整后的mid_price   的误差: 0.0048373440193987035
调整后的mid_price_9 的误差: 0.004629586542840461
调整后的mid_price_10的误差: 0.004401790287167206

সমন্বিত মধ্যম মূল্য

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

শেষ পর্যন্ত পূর্বাভাসের ত্রুটি 0.00487 থেকে 0.0043 এ নেমে এসেছে, এখানে আরও গভীরতর যেতে হবে না, মধ্যবর্তী দামগুলি খনির জন্য আরও অনেক কিছু রয়েছে, সর্বোপরি, মধ্যবর্তী দামগুলি পূর্বাভাসের দামের মধ্যে রয়েছে, আপনি নিজেরাই চেষ্টা করতে পারেন।

#注意VI需要延后一个使用
df['price_change'] = np.log(df['price']/df['price'].rolling(40).mean())
df['CI'] = -1.5*df['VI'].shift()+0.7*(0.7*df['I']+0.2*df['I_2']+0.1*df['I_3'])**3 + 150*df['price_change'].shift(1)
df['adjust_mid_price_11'] = df['mid_price'] + df['spread']*(df['CI'])
print('调整后的mid_price_11的误差:', ((df['price']-df['adjust_mid_price_11'])**2).sum())
调整后的mid_price_11的误差: 0.00421125960463469

সংক্ষিপ্তসার

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


আরো

mztcoinপরবর্তী আপডেটের জন্য অপেক্ষা করুন

লুইসকে জানে?

সিকিটিআর উঁচু ও নিকটাত্মীয়,