2021 اختتام کو آرہا ہے ، اور ڈی ای ایف آئی سے گیمفی تک ہاٹ سپاٹ ایک لامتناہی سلسلے میں ابھر رہے ہیں ، اور مجموعی طور پر مارکیٹ اب بھی ایک بیل مارکیٹ ہے۔ اب پیچھے مڑ کر دیکھیں اور خلاصہ کریں ، آپ نے 2021 میں کتنا فائدہ اٹھایا؟ آپ نے کون سے مواقع گنوائے؟ کامیاب سرمایہ کاری کیا تھی؟ حال ہی میں ، میں نے گذشتہ سال کی تاریخی مارکیٹ پر ایک نظر ڈالی اور ایک غیر متوقع طور پر آسان منافع بخش حکمت عملی ملی ، جو ایک کثیر کرنسی انڈیکس ہے۔
تبادلے پر بہت ساری کرنسیاں ہیں ، جن میں سے بہت سی نامعلوم ہونے کا مقدر ہیں اور یہاں تک کہ تجارت سے بھی واپس لے لی جاسکتی ہیں۔ یہاں ہم بائننس کے مستقل معاہدے کی کرنسی کا انتخاب کرتے ہیں جو مارکیٹ میں استعمال ہوئی ہیں۔ وہ عام طور پر جانچ کی جاتی ہیں اور مرکزی دھارے کی کرنسیوں کے طور پر پہچانی جاتی ہیں ، جو نسبتا safe محفوظ ہیں۔ سادہ اسکریننگ کے بعد ، کچھ انڈیکس کرنسیوں کو ہٹا دیا گیا اور 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
[144] میں:
## Current trading pairs
Info = requests.get('https://fapi.binance.com/fapi/v1/exchangeInfo')
symbols = [s['symbol'] for s in Info.json()['symbols']]
[154] میں:
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)
[155] میں:
print(len(symbols_f))
اس کے بعد ہم پچھلے سال کے لئے ان کی روزانہ بندش کی قیمت حاصل کرتے ہیں ، نوٹ کرتے ہوئے کہ کچھ کرنسیاں شیلف پر تھوڑی دیر کے لئے رہ چکی ہیں ، لہذا ہمیں اعداد و شمار کو پُر کرنے کی ضرورت ہے۔ انڈیکس کا حساب اعداد و شمار کو معمول پر لانے سے کیا جاسکتا ہے۔
حتمی انڈیکس کی واپسی تقریبا 12 گنا ہے ، یعنی ، اگر آپ یکم جنوری 2021 کو اوسطا 134 سکے خریدتے ہیں تو ، کچھ نہ کرنے کی حتمی واپسی 12 گنا ہوگی۔ یہ اندازہ لگایا گیا ہے کہ 90 فیصد سے زیادہ تاجر اوسط انڈیکس سے بہتر کارکردگی کا مظاہرہ نہیں کرتے ہیں۔ ان میں ، سب سے زیادہ کمی والی کرنسیاں یہ ہیں: آئی سی پی 93 فیصد گر گئی ، ڈوڈو 85 فیصد گر گیا ، اور لینا 75 فیصد گر گئی۔ جبکہ ایس او ایل ، ایف ٹی ایم ، لونا ، میٹک ، سینڈ اور اے ایکس ایس میں تقریبا 100 گنا اضافہ ہوا ہے۔ ان میں ، اے ایکس ایس 168 گنا بڑھ گیا ، جس سے یہ سب سے بڑا سیاہ گھوڑا بن گیا ہے۔ میڈین 3 گنا بڑھ گیا ، جو بنیادی طور پر عوامی چین اور کھیلوں کی وجہ سے تھا۔ بقا کے تعصب کو دور کرنے کے لئے ، ہم نے اس مدت کے دوران دائمی نئی کرنسی کو خارج کردیا ، اور ہم نے منافع کا تقریبا 11 گنا بھی حاصل کیا۔ یہ بی ٹی سی کے لئے 7 گنا ہے۔
یہ واپسی کی ایک مایوس کن شرح ہے۔ میں نے ہر طرح کی حکمت عملی بنانے کے لئے سخت محنت کی ہے ، لیکن یہ ایک سال میں کچھ نہیں کرنے کے منافع سے دور تھا۔ تاہم ، یہ نوٹ کیا جانا چاہئے کہ کچھ مخصوص اضافے بہت زیادہ ہیں اور ظاہر ہے کہ یہ انڈیکس سے انحراف تھا۔ اگر ان کرنسیوں کو سال کے آغاز میں منتخب نہیں کیا جاتا ہے تو ، منافع میڈین کے قریب ہوگا ، جو کہ کم منافع بخش ہے۔
[157] میں:
#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
[164] میں:
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
[165] میں:
df_all_s.tail() #data structure
باہر[165]:
[174] میں:
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
باہر [1]:
[175] میں:
#The median increase
df_norm.median(axis=1).plot(figsize=(12,4),grid=True);
باہر [1]:
[168] میں:
#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())
[177] میں:
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]:
[212] میں:
#Compared with Bitcoin
(df.mean(axis=1)/df.BTCUSDT).plot(figsize=(12,4),grid=True);
باہر[212]:
[213] میں:
#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]:
بیک ٹیسٹ میں ، یکم جنوری 2021 کو آن لائن بائننس دائمی معاہدے کی تمام کرنسیوں کا انتخاب کیا گیا تھا۔ K لائن کی مدت 1h تھی۔ پیرامیٹر نے پوزیشنوں میں اسکیلنگ شروع کی جب پوزیشن اوسط سے 5٪ کم تھی ، اور جب پوزیشن 5٪ سے زیادہ تھی تو انہیں فروخت کریں۔ جب بیک ٹیسٹ تمام کرنسیوں کا ہوتا ہے تو ، حتمی اسٹریٹجک واپسی 7.7 گنا ہوتی ہے۔ یہ ظاہر ہے کہ 13 گنا کی اوسط واپسی تک اتنا اچھا نہیں ہے۔ یہ بھی متوقع ہے۔ بہر حال ، کئی کرنسیاں جو سو گنا بڑھ گئیں وہ بہت خاص ہیں ، اور توازن کی حکمت عملی ان سب کو فروخت کرے گی۔
اگر سب سے زیادہ اضافے کے ساتھ 10 کرنسیوں کو بیک ٹسٹ سے ہٹا دیا جائے تو ، صرف نسبتا mediocre کرنسیوں پر غور کیا جائے گا ، اور حتمی آمدنی 4.8 گنا ہوگی ، جو اوسط کارکردگی سے 3.4 گنا زیادہ ہوگی۔
اگر صرف 3 کرنسیوں میں سب سے زیادہ اضافہ ہوتا ہے تو ، حتمی منافع 373 گنا ہوگا ، جو اوسط کارکردگی سے 160 گنا زیادہ ہے۔ اس سے پتہ چلتا ہے کہ اگر منتخب کردہ گھومنے والی کرنسی کا رجحان اور اضافہ مستقل ہوتا ہے تو ، گھومنے کا نتیجہ کچھ نہیں کرنے سے کہیں بہتر ہوگا۔
[494] میں:
#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)
[495] میں:
e.account['USDT']
باہر[495]:
[496] میں:
# 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]:
[498] میں:
#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)
[501] میں:
e.account['USDT']
باہر[501]:
میں [499]:
(res.total/10000).plot(figsize=(12,4),grid = True);
df[symbols].mean(axis=1).plot(figsize=(12,4),grid=True);
باہر[499]:
[503] میں:
#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)
[504] میں:
e.account['USDT']
باہر[504]:
[505] میں:
(res.total/10000).plot(figsize=(12,4),grid = True);
df[symbols].mean(axis=1).plot(figsize=(12,4),grid=True);
باہر[505]:
عام طور پر ، 2021 جعلی سککوں کے لئے ایک بیل مارکیٹ اور بٹ کوائن کے لئے ایک گرتا ہوا سال ہوگا۔ بٹ کوائن کی مارکیٹ ویلیو اب سال کے آغاز میں 70 فیصد سے 40 فیصد تک گر گئی ہے ، جو تاریخ کی سب سے کم سطح ہے۔ لہذا ، پچھلے سال میں جعلی سامان خریدنے اور رکھنے سے اوسط منافع بٹ کوائن رکھنے سے کہیں زیادہ ہے۔ 2022 کو آگے دیکھتے ہوئے ، اگر آپ سمجھتے ہیں کہ مستقبل میں موجودہ مارکیٹ میں اب بھی کئی سو گنا کرنسیاں ہوں گی تو ، آپ اپنی پوزیشنوں کو جرات مندانہ طور پر متنوع کرسکتے ہیں اور صبر سے انتظار کرسکتے ہیں۔ اگر آپ کچھ کرنسیوں یا اوسط مارکیٹ کے بارے میں خاص طور پر پرامید ہیں تو ، آپ بغیر سوچے سمجھے زیادہ منافع حاصل کرنے کے لئے گھومنے والی حکمت عملی کا استعمال کرسکتے ہیں۔ اگر آپ کو لگتا ہے کہ جب وہ انتہائی ہوجائیں گے تو چیزیں ایک دوسرے کے خلاف ہوجائیں گی ، تو آپ بہتر منافع اور حفاظت حاصل کرنے کے لئے بٹ کوائن کا سودا کرسکتے ہیں۔