২০২১ সাল শেষ হতে চলেছে, এবং ডিইএফআই থেকে গেমএফআই পর্যন্ত হটস্পটগুলি একটি অন্তহীন স্রোতে উদ্ভূত হচ্ছে, এবং সামগ্রিকভাবে বাজারটি এখনও একটি ষাঁড়ের বাজার। এখন ফিরে তাকান এবং সংক্ষিপ্তসার করুন, আপনি ২০২১ সালে কতটা অর্জন করেছেন? আপনি কোন সুযোগগুলি মিস করেছেন? কিছু সফল বিনিয়োগ কী ছিল? সম্প্রতি, আমি গত বছরের ঐতিহাসিক বাজারে একবার তাকিয়েছিলাম এবং একটি অপ্রত্যাশিত সহজ মুনাফা কৌশল পেয়েছি, যা একটি মাল্টি-মুদ্রা সূচক।
এক্সচেঞ্জে অনেকগুলি মুদ্রা রয়েছে, যার মধ্যে অনেকগুলি অজানা হওয়ার জন্য নির্ধারিত এবং এমনকি ট্রেডিং থেকে প্রত্যাহার করা যেতে পারে। এখানে আমরা বাজারে ব্যবহৃত বিন্যান্স চিরস্থায়ী চুক্তির মুদ্রাটি বেছে নিই। এগুলি সাধারণত মূলধারার মুদ্রা হিসাবে পরীক্ষা করা হয় এবং স্বীকৃত হয়, যা তুলনামূলকভাবে নিরাপদ। সহজ স্ক্রিনিংয়ের পরে, কিছু সূচক মুদ্রা সরিয়ে ফেলা হয়েছিল এবং 134 টি মুদ্রা অবশেষে পাওয়া গেছে।
[1]:
import requests
from datetime import date,datetime
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
[১৪৪] এঃ
## Current trading pairs
Info = requests.get('https://fapi.binance.com/fapi/v1/exchangeInfo')
symbols = [s['symbol'] for s in Info.json()['symbols']]
[১৫৪] এঃ
symbols_f = list(set(filter(lambda x: x[-4:] == 'USDT', [s.split('_')[0] for s in symbols]))-
set(['1000SHIBUSDT','1000XECUSDT','BTCDOMUSDT','DEFIUSDT','BTCSTUSDT'])) + ['SHIBUSDT','XECUSDT']
print(symbols_f)
[১৫৫] এঃ
print(len(symbols_f))
তারপর আমরা গত বছরের জন্য তাদের দৈনিক বন্ধ মূল্য পেতে, কিছু মুদ্রা একটি স্বল্প সময়ের জন্য তাক উপর ছিল যে উল্লেখ, তাই আমরা তথ্য পূরণ করতে হবে। সূচক তথ্য স্বাভাবিককরণ দ্বারা গণনা করা যেতে পারে।
চূড়ান্ত সূচক রিটার্ন প্রায় 12 গুণ, অর্থাৎ, আপনি যদি 2021 সালের 1 জানুয়ারী গড়ে 134 টি মুদ্রা কিনে থাকেন তবে কিছুই না করার চূড়ান্ত রিটার্ন 12 গুণ হবে। এটি অনুমান করা হয় যে 90% এরও বেশি ব্যবসায়ীরা গড় সূচককে ছাড়িয়ে যায় না। তাদের মধ্যে, সর্বাধিক হ্রাস সহ মুদ্রাগুলি হ'লঃ আইসিপি 93%, ডোডো 85% হ্রাস পেয়েছে এবং লিনা 75% হ্রাস পেয়েছে। যখন এসওএল, এফটিএম, লুনা, ম্যাটিক, স্যান্ড এবং এএক্সএস প্রায় 100 গুণ বৃদ্ধি পেয়েছে। তাদের মধ্যে, এএক্সএস 168 গুণ বৃদ্ধি পেয়েছে, এটি বৃহত্তম ডার্ক হর্স হয়ে উঠেছে। মিডিয়ান 3 গুণ বৃদ্ধি পেয়েছে, যা মূলত পাবলিক চেইন এবং গেমস দ্বারা চালিত হয়েছিল। বেঁচে থাকার পক্ষপাত এভিয়েড করার জন্য, আমরা এই সময়ের মধ্যে চিরস্থায়ী নতুন মুদ্রা বাদ দিয়েছি এবং আমরা মুনাফা প্রায় 11 গুণ অর্জন করেছি। এটি বিটিসির 7 গুণ লাভের জন্য।
এটি একটি হতাশার হার। আমি সব ধরণের কৌশল তৈরি করতে কঠোর পরিশ্রম করেছি, তবে এটি এক বছরে কিছুই না করার মুনাফা থেকে অনেক দূরে ছিল। তবে, এটি লক্ষ করা উচিত যে নির্দিষ্ট কিছু বৃদ্ধি খুব বড় এবং এটি সূচক থেকে স্পষ্টতই বিচ্যুত হয়েছিল। যদি এই মুদ্রাগুলি বছরের শুরুতে নির্বাচিত না হয় তবে মুনাফা মধ্যমটির কাছাকাছি হবে, যা অনেক কম লাভজনক।
[১৫৭] এঃ
#Obtain the function of K-line in any period
def GetKlines(symbol='BTCUSDT',start='2020-8-10',end='2021-8-10',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 = int(time.mktime(datetime.strptime(end, "%Y-%m-%d").timetuple()))*1000 + 8*60*60*1000
intervel_map = {'m':60*1000,'h':60*60*1000,'d':24*60*60*1000}
while start_time < end_time:
mid_time = min(start_time+1000*int(period[:-1])*intervel_map[period[-1]],end_time)
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]
Klines += res_list
elif type(res_list) == list:
start_time = start_time+1000*int(period[:-1])*intervel_map[period[-1]]
else:
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_all_s = pd.DataFrame(index=pd.date_range(start='2021-1-1', end='2021-12-28', freq='1d'),columns=symbols_s)
for i in range(len(symbols_f)):
#print(symbols_s[i])
symbol_s = symbols_f[i]
df_s = GetKlines(symbol=symbol_s,start='2021-1-1',end='2021-12-28',period='1d',base='api',v='v3')
df_all_s[symbol_s] = df_s[~df_s.index.duplicated(keep='first')].close
[১৬৫] এঃ
df_all_s.tail() #data structure
আউট[165]:
[১৭৪] এঃ
df_all = df_all_s.fillna(method='bfill')#filled data
df_norm = df_all/df_all.iloc[0] #normalization
df_norm.mean(axis=1).plot(figsize=(12,4),grid=True);
#The final index return chart
আউট[174]:
[১৭৫] এঃ
#The median increase
df_norm.median(axis=1).plot(figsize=(12,4),grid=True);
আউট[175]:
[১৬৮] এঃ
#Ranking for increase/decrease
print(df_norm.iloc[-1].round(2).sort_values().to_dict())
[317] এঃ
#Maximum rollback of current price compared with the highest point in the year
print((1-df_norm.iloc[-1]/df_norm.max()).round(2).sort_values().to_dict())
[১৭৭] এঃ
df_all_f = pd.DataFrame(index=pd.date_range(start='2021-1-1', end='2021-12-28', freq='1d'),columns=symbols_s)
for i in range(len(symbols_f)):
#print(symbols_s[i])
symbol_f = symbols_f[i]
df_f = GetKlines(symbol=symbol_f,start='2021-1-1',end='2021-12-28',period='1d',base='fapi',v='v1')
df_all_f[symbol_f] = df_f[~df_f.index.duplicated(keep='first')].close
[208] এঃ
#Excluding new currency
df = df_all_s[df_all_s.columns[~df_all_f.iloc[0].isnull()]]
df = df.fillna(method='bfill')
df = df/df.iloc[0]
df.mean(axis=1).plot(figsize=(12,4),grid=True);
আউট[208]:
[২১২] এঃ
#Compared with Bitcoin
(df.mean(axis=1)/df.BTCUSDT).plot(figsize=(12,4),grid=True);
আউট[212]:
[২১৩] এঃ
#Use the original backtest engine
class Exchange:
def __init__(self, trade_symbols, fee=0.0004, initial_balance=10000):
self.initial_balance = initial_balance #Initial assets
self.fee = fee
self.trade_symbols = trade_symbols
self.account = {'USDT':{'realised_profit':0, 'unrealised_profit':0, 'total':initial_balance, 'fee':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 #Deduct the handling fee
self.account['USDT']['fee'] += price*amount*self.fee
self.account[symbol]['fee'] += price*amount*self.fee
if cover_amount > 0: #Close the position first
self.account['USDT']['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount #Profits
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): #Update the assets
self.account['USDT']['unrealised_profit'] = 0
for symbol in self.trade_symbols:
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'] = abs(self.account[symbol]['amount'])*close_price[symbol]
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)
[418] এঃ
#The hourly K-line was taken to make the backtest more accurate
df_all_s = pd.DataFrame(index=pd.date_range(start='2021-1-1', end='2021-12-28', freq='1h'),columns=symbols_s)
for i in range(len(symbols_f)):
#print(symbols_s[i])
symbol_s = symbols_f[i]
df_s = GetKlines(symbol=symbol_s,start='2021-1-1',end='2021-12-28',period='1h',base='api',v='v3')
df_all_s[symbol_s] = df_s[~df_s.index.duplicated(keep='first')].close
[419] এঃ
df = df_all_s[df_all_s.columns[~df_all_f.iloc[0].isnull()]]
df = df.fillna(method='bfill')
df = df/df.iloc[0]
df.mean(axis=1).plot(figsize=(12,4),grid=True);
আউট [419]:
ব্যাকটেস্টে, 1 জানুয়ারী, 2021 এ অনলাইন বাইনান্স চিরস্থায়ী চুক্তির সমস্ত মুদ্রা নির্বাচন করা হয়েছিল। কে-লাইন সময়কাল ছিল 1h। প্যারামিটারটি পজিশনে স্কেলিং শুরু করে যখন অবস্থানটি গড়ের চেয়ে 5% কম ছিল, এবং অবস্থানটি 5% এর বেশি হলে সেগুলি বিক্রি করে। যখন ব্যাকটেস্টটি সমস্ত মুদ্রা হয়, চূড়ান্ত কৌশলগত রিটার্ন 7.7 গুণ হয়। এটি স্পষ্টতই 13 গুণের গড় রিটার্নের মতো ভাল নয়। এটিও প্রত্যাশিত। সর্বোপরি, শতগুণ বেড়ে যাওয়া বেশ কয়েকটি মুদ্রা খুব বিশেষ, এবং ভারসাম্য কৌশল তাদের সমস্ত বিক্রি করবে।
যদি সর্বাধিক বৃদ্ধিপ্রাপ্ত ১০টি মুদ্রাকে ব্যাকটেস্ট থেকে বাদ দেওয়া হয়, তাহলে শুধুমাত্র তুলনামূলকভাবে মাঝারি মুদ্রাগুলি বিবেচনা করা হবে এবং চূড়ান্ত আয় হবে ৪.৮ গুণ, যা গড় পারফরম্যান্সের ৩.৪ গুণের তুলনায় অনেক বেশি।
যদি কেবলমাত্র সর্বাধিক বৃদ্ধির সাথে 3 টি মুদ্রা ঘোরানো হয় তবে চূড়ান্ত মুনাফা 373 গুণ হবে, যা 160 গুণের গড় পারফরম্যান্সের তুলনায় অনেক বেশি। এটি দেখায় যে যদি নির্বাচিত ঘোরানো মুদ্রার প্রবণতা এবং বৃদ্ধি ধারাবাহিক হয় তবে ঘোরানো ফলাফলটি কিছুই না করার চেয়ে অনেক ভাল হবে।
[৪৯৪] এঃ
#Full currency backtest
symbols = list(df.iloc[-1].sort_values()[:].index)
e = Exchange(symbols, fee=0.001, initial_balance=10000)
res_list = []
avg_pct = 1/len(symbols)
for row in df[symbols].iterrows():
prices = row[1]
total = e.account['USDT']['total']
e.Update(prices)
for symbol in symbols:
pct = e.account[symbol]['value']/total
if pct < 0.95*avg_pct:
e.Buy(symbol,prices[symbol],(avg_pct-pct)*total/prices[symbol])
if pct > 1.05*avg_pct:
e.Sell(symbol,prices[symbol],(pct-avg_pct)*total/prices[symbol])
res_list.append([e.account[symbol]['value'] for symbol in symbols] + [e.account['USDT']['total']])
res = pd.DataFrame(data=res_list, columns=symbols+['total'],index = df.index)
[৪৯৫] এঃ
e.account['USDT']
আউট[495]:
[৪৯৬] এঃ
# Backtest performance of full currencies
(res.total/10000).plot(figsize=(12,4),grid = True);
df[symbols].mean(axis=1).plot(figsize=(12,4),grid=True);
আউট[496]:
[৪৯৮] এঃ
#Remove currencies with huge growth
symbols = list(df.iloc[-1].sort_values()[:-10].index)
e = Exchange(symbols, fee=0.001, initial_balance=10000)
res_list = []
avg_pct = 1/len(symbols)
for row in df[symbols].iterrows():
prices = row[1]
total = e.account['USDT']['total']
e.Update(prices)
for symbol in symbols:
pct = e.account[symbol]['value']/total
if pct < 0.95*avg_pct:
e.Buy(symbol,prices[symbol],(avg_pct-pct)*total/prices[symbol])
if pct > 1.05*avg_pct:
e.Sell(symbol,prices[symbol],(pct-avg_pct)*total/prices[symbol])
res_list.append([e.account[symbol]['value'] for symbol in symbols] + [e.account['USDT']['total']])
res = pd.DataFrame(data=res_list, columns=symbols+['total'],index = df.index)
[৫০১] এঃ
e.account['USDT']
আউট[501]:
৪৯৯ সালেঃ
(res.total/10000).plot(figsize=(12,4),grid = True);
df[symbols].mean(axis=1).plot(figsize=(12,4),grid=True);
আউট [499]:
[৫০৩] এঃ
#Only the currency with the highest increase is tested
symbols = list(df.iloc[-1].sort_values()[-3:].index)
e = Exchange(symbols, fee=0.001, initial_balance=10000)
res_list = []
avg_pct = 1/len(symbols)
for row in df[symbols].iterrows():
prices = row[1]
total = e.account['USDT']['total']
e.Update(prices)
for symbol in symbols:
pct = e.account[symbol]['value']/total
if pct < 0.95*avg_pct:
e.Buy(symbol,prices[symbol],(avg_pct-pct)*total/prices[symbol])
if pct > 1.05*avg_pct:
e.Sell(symbol,prices[symbol],(pct-avg_pct)*total/prices[symbol])
res_list.append([e.account[symbol]['value'] for symbol in symbols] + [e.account['USDT']['total']])
res = pd.DataFrame(data=res_list, columns=symbols+['total'],index = df.index)
[৫০৪] এঃ
e.account['USDT']
আউট[504]:
[৫০৫] এঃ
(res.total/10000).plot(figsize=(12,4),grid = True);
df[symbols].mean(axis=1).plot(figsize=(12,4),grid=True);
আউট[505]:
সাধারণভাবে, ২০২১ সালটি নকল মুদ্রার জন্য একটি ষাঁড়ের বাজার এবং বিটকয়েনের জন্য একটি হ্রাসের বছর হবে। বিটকয়েনের বাজার মূল্য এখন বছরের শুরুতে ৭০% থেকে এখন ৪০% এ নেমে গেছে, যা ইতিহাসের সর্বনিম্ন স্তর। অতএব, গত বছরে নকল পণ্য কেনা এবং ধরে রাখার গড় মুনাফা বিটকয়েন ধরে রাখার তুলনায় অনেক বেশি। ২০২২ সালের দিকে তাকিয়ে, যদি আপনি মনে করেন যে ভবিষ্যতে বর্তমান বাজারে এখনও কয়েকশ গুণ মুদ্রা থাকবে, আপনি সাহসের সাথে আপনার অবস্থানগুলি বৈচিত্র্যময় করতে পারেন এবং ধৈর্যের সাথে অপেক্ষা করতে পারেন। যদি আপনি কয়েকটি মুদ্রা বা গড় বাজার সম্পর্কে বিশেষভাবে আশাবাদী হন তবে আপনি চিন্তা না করে অতিরিক্ত রিটার্ন অর্জনের জন্য ঘূর্ণিত কৌশলটি ব্যবহার করতে পারেন। যদি আপনি মনে করেন যে জিনিসগুলি চরমের দিকে ফিরে গেলে তারা একে অপরের বিরুদ্ধে পৌঁছে যাবে, আপনি আরও ভাল রিটার্ন এবং সুরক্ষা অর্জনের জন্য বিটকয়েন শিকার করতে পারেন।