
সম্প্রতি আমি Buu-এর পরিমাণগত ডায়েরিতে উল্লেখ করেছি যে আপনি মুদ্রা নির্বাচন করতে এবং মূল্যের পার্থক্যের সাফল্যের ভিত্তিতে মুনাফা করতে পজিশন খুলতে নেতিবাচকভাবে সম্পর্কযুক্ত মুদ্রা ব্যবহার করতে পারেন। ডিজিটাল মুদ্রাগুলি মূলত ইতিবাচকভাবে সম্পর্কযুক্ত কিছু মুদ্রা, যার মধ্যে প্রায়ই বিশেষ বাজারের প্রবণতা থাকে, যেমন কিছু সময় আগে MEME মুদ্রার স্বতন্ত্র বাজারের প্রবণতা একেবারেই অনুসরণ করেনি এই মুদ্রা এবং যুগান্তকারী পরে যান, এই পদ্ধতি নির্দিষ্ট বাজারের অবস্থার অধীনে লাভজনক হতে পারে. যাইহোক, পরিমাণগত ট্রেডিংয়ের ক্ষেত্রে সবচেয়ে সাধারণ পদ্ধতি হল পেয়ার ট্রেডিংয়ের জন্য ইতিবাচক সম্পর্ক ব্যবহার করা এই নিবন্ধটি সংক্ষেপে এই কৌশলটি উপস্থাপন করবে।
ডিজিটাল কারেন্সি পেয়ার ট্রেডিং হল পরিসংখ্যানগত সালিশের উপর ভিত্তি করে একটি ট্রেডিং কৌশল, যার মধ্যে দামের বিচ্যুতি থেকে মুনাফা পাওয়ার জন্য দুটি অত্যন্ত পারস্পরিক সম্পর্কযুক্ত ডিজিটাল কারেন্সি চিরস্থায়ী চুক্তি ক্রয় এবং বিক্রি করা জড়িত। এই নিবন্ধটি বিস্তারিতভাবে এই কৌশলটির নীতি, লাভের প্রক্রিয়া, মুদ্রা স্ক্রীন করার পদ্ধতি, সম্ভাব্য ঝুঁকি এবং কীভাবে এটিকে উন্নত করা যায় এবং কিছু ব্যবহারিক পাইথন কোড উদাহরণ প্রদান করবে।
পেয়ার ট্রেডিং কৌশল দুটি ডিজিটাল মুদ্রার দামের মধ্যে ঐতিহাসিক পারস্পরিক সম্পর্কের উপর নির্ভর করে। যখন দুটি মুদ্রার দাম একটি শক্তিশালী পারস্পরিক সম্পর্ক দেখায়, তখন তাদের মূল্য প্রবণতা সাধারণত সিঙ্ক হয়। যদি একটি নির্দিষ্ট মুহুর্তে উভয়ের মধ্যে মূল্য অনুপাত উল্লেখযোগ্যভাবে বিচ্যুত হয়, তবে এটি একটি অস্থায়ী অস্বাভাবিকতা হিসাবে বিবেচিত হতে পারে এবং মূল্য স্বাভাবিক স্তরে ফিরে যাওয়ার প্রবণতা থাকবে। ডিজিটাল মুদ্রা বাজার অত্যন্ত আন্তঃসংযুক্ত হয় যখন একটি প্রধান ডিজিটাল মুদ্রা (যেমন বিটকয়েন) উল্লেখযোগ্যভাবে ওঠানামা করে, তখন এটি সাধারণত অন্যান্য ডিজিটাল মুদ্রায় একটি সমন্বিত প্রতিক্রিয়া সৃষ্টি করে। কিছু মুদ্রার একটি খুব সুস্পষ্ট ইতিবাচক সম্পর্ক থাকতে পারে যা একই বিনিয়োগ প্রতিষ্ঠান, একই বাজার নির্মাতা এবং একই ট্র্যাকের কারণে স্থায়ী হতে পারে। কিছু মুদ্রা নেতিবাচকভাবে পারস্পরিক সম্পর্কযুক্ত, কিন্তু কম নেতিবাচকভাবে সম্পর্কযুক্ত মুদ্রা আছে, এবং যেহেতু সেগুলি সবই বাজারের প্রবণতা দ্বারা প্রভাবিত হয়, সেগুলি প্রায়শই সামঞ্জস্যপূর্ণ বাজারের প্রবণতা থাকে।
অনুমান করুন যে মুদ্রা A এবং মুদ্রা B এর উচ্চ মূল্যের সম্পর্ক রয়েছে। একটি নির্দিষ্ট মুহূর্তে, A/B মূল্য অনুপাতের গড় মান হল 1। যদি একটি নির্দিষ্ট মুহুর্তে, A/B মূল্য অনুপাত 0.001 এর বেশি বেড়ে যায় এবং বিচ্যুত হয়, অর্থাৎ এটি 1.001 ছাড়িয়ে যায়, আপনি নিম্নলিখিত উপায়ে ট্রেড করতে পারেন: B-এ একটি লং পজিশন এবং A-তে একটি ছোট অবস্থান খুলুন। বিপরীতে, যখন A/B মূল্য অনুপাত 0.999-এর চেয়ে কম হয়: A-তে একটি লং পজিশন এবং B-তে একটি ছোট অবস্থান খুলুন।
লাভের চাবিকাঠি মুনাফা মার্জিনে নিহিত থাকে যখন মূল্য বিচ্যুত হয় এবং স্বাভাবিক অবস্থায় ফিরে আসে। যেহেতু দামের বিচ্যুতি সাধারণত স্বল্পস্থায়ী হয়, তাই ব্যবসায়ীরা তাদের অবস্থান বন্ধ করে লাভ করতে পারে যখন দামগুলি গড় পর্যায়ে ফিরে আসে, পার্থক্যটি পকেটে রেখে।
এই কোডগুলি সরাসরি ব্যবহার করা যেতে পারে Anancoda ডাউনলোড করা এবং jupyer নোটবুকে ডিবাগ করা। সাধারণত ব্যবহৃত ডেটা বিশ্লেষণের জন্য প্যাকেজ সরাসরি অন্তর্ভুক্ত করা হয়।
import requests
from datetime import date,datetime
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import requests, zipfile, io
%matplotlib inline
Info = requests.get('https://fapi.binance.com/fapi/v1/exchangeInfo')
b_symbols = [s['symbol'] for s in Info.json()['symbols'] if s['contractType'] == 'PERPETUAL' and s['status'] == 'TRADING' and s['quoteAsset'] == 'USDT']
b_symbols = list(filter(lambda x: x[-4:] == 'USDT', [s.split('_')[0] for s in b_symbols]))
b_symbols = [x[:-4] for x in b_symbols]
print(b_symbols) # 获取所有的正在交易的交易对
GetKlines ফাংশনের প্রধান কাজ হল Binance Exchange থেকে নির্দিষ্ট ট্রেডিং পেয়ারের চিরস্থায়ী চুক্তির ঐতিহাসিক কে-লাইন ডেটা প্রাপ্ত করা এবং একটি পান্ডাস ডেটাফ্রেমে ডেটা সংরক্ষণ করা। কে-লাইন ডেটাতে খোলার মূল্য, সর্বোচ্চ মূল্য, সর্বনিম্ন মূল্য, বন্ধের মূল্য, ট্রেডিং ভলিউম এবং অন্যান্য তথ্য অন্তর্ভুক্ত থাকে। এই সময় আমরা প্রধানত ক্লোজিং প্রাইস ডেটা ব্যবহার করি।
def GetKlines(symbol='BTCUSDT',start='2020-8-10',end='2024-7-01',period='1h',base='fapi',v = 'v1'):
Klines = []
start_time = int(time.mktime(datetime.strptime(start, "%Y-%m-%d").timetuple()))*1000 + 8*60*60*1000
end_time = min(int(time.mktime(datetime.strptime(end, "%Y-%m-%d").timetuple()))*1000 + 8*60*60*1000,time.time()*1000)
intervel_map = {'m':60*1000,'h':60*60*1000,'d':24*60*60*1000}
while start_time < end_time:
time.sleep(0.3)
mid_time = start_time+1000*int(period[:-1])*intervel_map[period[-1]]
url = 'https://'+base+'.binance.com/'+base+'/'+v+'/klines?symbol=%s&interval=%s&startTime=%s&endTime=%s&limit=1000'%(symbol,period,start_time,mid_time)
res = requests.get(url)
res_list = res.json()
if type(res_list) == list and len(res_list) > 0:
start_time = res_list[-1][0]+int(period[:-1])*intervel_map[period[-1]]
Klines += res_list
if type(res_list) == list and len(res_list) == 0:
start_time = start_time+1000*int(period[:-1])*intervel_map[period[-1]]
if mid_time >= end_time:
break
df = pd.DataFrame(Klines,columns=['time','open','high','low','close','amount','end_time','volume','count','buy_amount','buy_volume','null']).astype('float')
df.index = pd.to_datetime(df.time,unit='ms')
return df
ডেটার পরিমাণ তুলনামূলকভাবে বেশি দ্রুত ডাউনলোড করার জন্য, শুধুমাত্র গত তিন মাসের কে-লাইন ডেটা পাওয়া যায়৷ df_close-এ সমস্ত মুদ্রার সমাপনী মূল্যের ডেটা থাকে
start_date = '2024-04-01'
end_date = '2024-07-05'
period = '1h'
df_dict = {}
for symbol in b_symbols:
print(symbol)
if symbol in df_dict.keys():
continue
df_s = GetKlines(symbol=symbol+'USDT',start=start_date,end=end_date,period=period)
if not df_s.empty:
df_dict[symbol] = df_s
df_close = pd.DataFrame(index=pd.date_range(start=start_date, end=end_date, freq=period),columns=df_dict.keys())
for symbol in symbols:
df_close[symbol] = df_dict[symbol].close
df_close = df_close.dropna(how='all')
একটি এক্সচেঞ্জ অবজেক্ট পরবর্তী ব্যাকটেস্টিংয়ের জন্য সংজ্ঞায়িত করা হয়
class Exchange:
def __init__(self, trade_symbols, fee=0.0002, initial_balance=10000):
self.initial_balance = initial_balance #初始的资产
self.fee = fee
self.trade_symbols = trade_symbols
self.account = {'USDT':{'realised_profit':0, 'unrealised_profit':0, 'total':initial_balance,
'fee':0, 'leverage':0, 'hold':0, 'long':0, 'short':0}}
for symbol in trade_symbols:
self.account[symbol] = {'amount':0, 'hold_price':0, 'value':0, 'price':0, 'realised_profit':0,'unrealised_profit':0,'fee':0}
def Trade(self, symbol, direction, price, amount):
cover_amount = 0 if direction*self.account[symbol]['amount'] >=0 else min(abs(self.account[symbol]['amount']), amount)
open_amount = amount - cover_amount
self.account['USDT']['realised_profit'] -= price*amount*self.fee #扣除手续费
self.account['USDT']['fee'] += price*amount*self.fee
self.account[symbol]['fee'] += price*amount*self.fee
if cover_amount > 0: #先平仓
self.account['USDT']['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount #利润
self.account[symbol]['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount
self.account[symbol]['amount'] -= -direction*cover_amount
self.account[symbol]['hold_price'] = 0 if self.account[symbol]['amount'] == 0 else self.account[symbol]['hold_price']
if open_amount > 0:
total_cost = self.account[symbol]['hold_price']*direction*self.account[symbol]['amount'] + price*open_amount
total_amount = direction*self.account[symbol]['amount']+open_amount
self.account[symbol]['hold_price'] = total_cost/total_amount
self.account[symbol]['amount'] += direction*open_amount
def Buy(self, symbol, price, amount):
self.Trade(symbol, 1, price, amount)
def Sell(self, symbol, price, amount):
self.Trade(symbol, -1, price, amount)
def Update(self, close_price): #对资产进行更新
self.account['USDT']['unrealised_profit'] = 0
self.account['USDT']['hold'] = 0
self.account['USDT']['long'] = 0
self.account['USDT']['short'] = 0
for symbol in self.trade_symbols:
if not np.isnan(close_price[symbol]):
self.account[symbol]['unrealised_profit'] = (close_price[symbol] - self.account[symbol]['hold_price'])*self.account[symbol]['amount']
self.account[symbol]['price'] = close_price[symbol]
self.account[symbol]['value'] = self.account[symbol]['amount']*close_price[symbol]
if self.account[symbol]['amount'] > 0:
self.account['USDT']['long'] += self.account[symbol]['value']
if self.account[symbol]['amount'] < 0:
self.account['USDT']['short'] += self.account[symbol]['value']
self.account['USDT']['hold'] += abs(self.account[symbol]['value'])
self.account['USDT']['unrealised_profit'] += self.account[symbol]['unrealised_profit']
self.account['USDT']['total'] = round(self.account['USDT']['realised_profit'] + self.initial_balance + self.account['USDT']['unrealised_profit'],6)
self.account['USDT']['leverage'] = round(self.account['USDT']['hold']/self.account['USDT']['total'],3)
পারস্পরিক সম্পর্ক গণনা হল পরিসংখ্যানের একটি পদ্ধতি যা দুটি ভেরিয়েবলের মধ্যে রৈখিক সম্পর্ক পরিমাপ করতে ব্যবহৃত হয়। সর্বাধিক ব্যবহৃত পারস্পরিক সম্পর্ক গণনা পদ্ধতি হল পিয়ারসন পারস্পরিক সম্পর্ক সহগ। পারস্পরিক সম্পর্ক গণনার নীতি, সূত্র এবং বাস্তবায়ন পদ্ধতি নিম্নে দেওয়া হল। পিয়ারসন পারস্পরিক সম্পর্ক সহগ দুটি ভেরিয়েবলের মধ্যে রৈখিক সম্পর্ক পরিমাপ করতে ব্যবহৃত হয়, যার মান -1 থেকে 1 পর্যন্ত:
পিয়ারসন পারস্পরিক সম্পর্ক সহগ দুটি ভেরিয়েবলের সহ-সম্পর্ক নির্ণয় করে তাদের সহভারিওয়েন্স এবং প্রমিত বিচ্যুতি গণনা করে। সূত্রটি নিম্নরূপ:
[ \rho_{X,Y} = \frac{\text{cov}(X,Y)}{\sigma_X \sigma_Y} ]
মধ্যে:
অবশ্যই, এটি কীভাবে গণনা করা হয় তা নিয়ে আপনাকে খুব বেশি চিন্তা করতে হবে না আপনি পাইথন কোডের একটি লাইন দিয়ে সমস্ত মুদ্রার পারস্পরিক সম্পর্ক গণনা করতে পারেন। চিত্রটি একটি পারস্পরিক সম্পর্কের তাপ মানচিত্র দেখায়, লাল ধনাত্মক পারস্পরিক সম্পর্ককে প্রতিনিধিত্ব করে, নীল রঙ যত গাঢ় হবে, সম্পর্ক তত শক্তিশালী। আপনি দেখতে পাচ্ছেন যে বৃহৎ এলাকাগুলি সমস্ত গাঢ় লাল, তাই ডিজিটাল মুদ্রার ইতিবাচক সম্পর্ক খুব শক্তিশালী।

import seaborn as sns
corr = df_close.corr()
plt.figure(figsize=(20, 20))
sns.heatmap(corr, annot=False, cmap='coolwarm', vmin=-1, vmax=1)
plt.title('Correlation Heatmap of Cryptocurrency Closing Prices', fontsize=20);
পারস্পরিক সম্পর্কের উপর ভিত্তি করে, শীর্ষ 20টি সবচেয়ে প্রাসঙ্গিক মুদ্রা জোড়া স্ক্রীন করা হয়। ফলাফল নিম্নরূপ. তাদের পারস্পরিক সম্পর্ক 0.99 এর উপরে, খুব শক্তিশালী।
MANA SAND 0.996562
ICX ZIL 0.996000
STORJ FLOW 0.994193
FLOW SXP 0.993861
STORJ SXP 0.993822
IOTA ZIL 0.993204
SAND 0.993095
KAVA SAND 0.992303
ZIL SXP 0.992285
SAND 0.992103
DYDX ZIL 0.992053
DENT REEF 0.991789
RDNT MANTA 0.991690
STMX STORJ 0.991222
BIGTIME ACE 0.990987
RDNT HOOK 0.990718
IOST GAS 0.990643
ZIL HOOK 0.990576
MATIC FLOW 0.990564
MANTA HOOK 0.990563
অনুরূপ কোড নিম্নরূপ:
corr_pairs = corr.unstack()
# 移除自身相关性(即对角线上的值)
corr_pairs = corr_pairs[corr_pairs != 1]
sorted_corr_pairs = corr_pairs.sort_values(kind="quicksort")
# 提取最相关和最不相关的前20个币种对
most_correlated = sorted_corr_pairs.tail(40)[::-2]
print("最相关的前20个币种对:")
print(most_correlated)
নির্দিষ্ট ব্যাকটেস্ট কোড নিম্নরূপ। প্রদর্শিত কৌশলের মূল ফোকাস হল দুটি ক্রিপ্টোকারেন্সির (IOTA এবং ZIL) মূল্য অনুপাত পর্যবেক্ষণ করা এবং এই অনুপাতের পরিবর্তনের উপর ভিত্তি করে বাণিজ্য করা। নির্দিষ্ট পদক্ষেপ নিম্নরূপ:
আরম্ভকরণ:
e, $10,000 এর প্রাথমিক ব্যালেন্স এবং 0.02% লেনদেন ফি সহ।avg。value = 1000。পুনরাবৃত্তিমূলকভাবে মূল্য ডেটা প্রক্রিয়া করুন:
df_close。diff。aim_value, প্রতি 0.01 বিচ্যুতির জন্য, একটি মান ট্রেড করা হয়। এবং বর্তমান অ্যাকাউন্টের অবস্থান এবং মূল্য পরিস্থিতির উপর ভিত্তি করে ক্রয়-বিক্রয় অপারেশনের সিদ্ধান্ত নিন।pair_a এবং কিনুনpair_b কাজpair_a এবং বিক্রিpair_b কাজসামঞ্জস্যপূর্ণ গড়:
avg, সর্বশেষ মূল্য অনুপাত প্রতিফলিত করার জন্য.অ্যাকাউন্ট এবং রেকর্ড আপডেট করুন:
res_list。ফলাফল আউটপুট:
res_list ডেটাফ্রেমে রূপান্তর করুনres, আরও বিশ্লেষণ এবং প্রদর্শনের জন্য।pair_a = 'IOTA'
pair_b = "ZIL"
e = Exchange([pair_a,pair_b], fee=0.0002, initial_balance=10000) #Exchange定义放在评论区
res_list = []
index_list = []
avg = df_close[pair_a][0] / df_close[pair_b][0]
value = 1000
for idx, row in df_close.iterrows():
diff = (row[pair_a] / row[pair_b] - avg)/avg
aim_value = -value * diff / 0.01
if -aim_value + e.account[pair_a]['amount']*row[pair_a] > 0.5*value:
e.Sell(pair_a,row[pair_a],(-aim_value + e.account[pair_a]['amount']*row[pair_a])/row[pair_a])
e.Buy(pair_b,row[pair_b],(-aim_value - e.account[pair_b]['amount']*row[pair_b])/row[pair_b])
if -aim_value + e.account[pair_a]['amount']*row[pair_a] < -0.5*value:
e.Buy(pair_a, row[pair_a],(aim_value - e.account[pair_a]['amount']*row[pair_a])/row[pair_a])
e.Sell(pair_b, row[pair_b],(aim_value + e.account[pair_b]['amount']*row[pair_b])/row[pair_b])
avg = 0.99*avg + 0.01*row[pair_a] / row[pair_b]
index_list.append(idx)
e.Update(row)
res_list.append([e.account['USDT']['total'],e.account['USDT']['hold'],
e.account['USDT']['fee'],e.account['USDT']['long'],e.account['USDT']['short']])
res = pd.DataFrame(data=res_list, columns=['total','hold', 'fee', 'long', 'short'],index = index_list)
res['total'].plot(grid=True);
মোট 4 টি গোষ্ঠীর মুদ্রার ব্যাকটেস্ট করা হয়েছিল, এবং ফলাফলগুলি তুলনামূলকভাবে সন্তোষজনক ছিল। বর্তমান পারস্পরিক সম্পর্ক গণনা ভবিষ্যতে ডেটা ব্যবহার করে, তাই এটি খুব সঠিক নয়। এই নিবন্ধটি পূর্বের মধ্যে পারস্পরিক সম্পর্ক এবং পরবর্তীতে লেনদেনের ব্যাকটেস্টিংয়ের উপর ভিত্তি করে ডেটাকে দুটি ভাগে ভাগ করে। ফলাফল একটু খারাপ হলেও খারাপ হয়নি। এটি ব্যবহারকারীর উপর ছেড়ে দেওয়া হয় যে তারা নিজেরাই যাচাইকরণ অনুশীলন করবে।

যদিও পেয়ার ট্রেডিং কৌশল তাত্ত্বিকভাবে লাভজনক হতে পারে, বাস্তবে এখনও কিছু ঝুঁকি রয়েছে: মুদ্রার মধ্যে পারস্পরিক সম্পর্ক সময়ের সাথে পরিবর্তিত হতে পারে, যার ফলে বাজারের চরম অবস্থার মধ্যে কৌশলটি ব্যর্থ হতে পারে, দামের বিচ্যুতি তীব্র হতে পারে, যার ফলে বড় ক্ষতি হয়; কিছু মুদ্রার কম তরলতা লেনদেন সম্পাদন করা কঠিন করে তুলতে পারে বা ঘন ঘন লেনদেনের ফলে উত্পন্ন ফি মুনাফা হ্রাস করতে পারে;
ঝুঁকি কমাতে এবং কৌশলের স্থিতিশীলতা উন্নত করতে, আপনি নিম্নলিখিত উন্নতির পদক্ষেপগুলি বিবেচনা করতে পারেন: মুদ্রার মধ্যে পারস্পরিক সম্পর্ক নিয়মিতভাবে পুনঃগণনা করুন এবং একটি সময়মত ট্রেডিং জোড়া সামঞ্জস্য করুন এবং একটি সর্বাধিক ক্ষতি নিয়ন্ত্রণ করতে লাভ পয়েন্ট সেট করুন; একক লেনদেন একই সময়ে কারেন্সি জোড়ায় একাধিক লেনদেন ঝুঁকি ছড়িয়ে দিতে।
ডিজিটাল কারেন্সি পেয়ার ট্রেডিং স্ট্র্যাটেজি মুদ্রার দামের পারস্পরিক সম্পর্ককে ব্যবহার করে সালিসি ক্রিয়াকলাপ সঞ্চালনের জন্য যখন দামগুলি বিচ্যুত হয়, যার ফলে লাভ হয়। এই কৌশল উচ্চ তাত্ত্বিক সম্ভাব্যতা আছে. এই কৌশলের উপর ভিত্তি করে একটি সাধারণ বাস্তব অফার কৌশল সোর্স কোড পরে প্রকাশিত হবে। আপনার যদি আরও প্রশ্ন থাকে বা আরও আলোচনার প্রয়োজন হয়, অনুগ্রহ করে নির্দ্বিধায় চ্যাট করুন।