বাইনারেন্স ফিউচার মাল্টি-ভারেন্সি হেজিং স্ট্র্যাটেজি পার্ট 1 এর উপর গবেষণা

লেখক:ভাল, তৈরিঃ 2020-05-09 11:14:50, আপডেটঃ 2023-11-04 19:49:01

img

বাইনারেন্স ফিউচার মাল্টি-ভারেন্সি হেজিং স্ট্র্যাটেজি পার্ট 1 এর উপর গবেষণা

ড্যাশবোর্ড পৃষ্ঠায় অনুসন্ধান বোতামটি ক্লিক করুন, এবং তারপর প্রবেশ করতে তীরটি ক্লিক করুন। আপলোড করা.pynb উপসর্গ ফাইলটি খুলুন এবং লাইন দ্বারা চালানোর জন্য শিফ্ট + এন্টার টিপুন। অনুসন্ধান পরিবেশের ব্যবহারের সহায়তায় মৌলিক টিউটোরিয়াল রয়েছে।

img

কৌশলগত কারণ

বিন্যান্স স্পটে অনেকগুলি অল্টকয়েন তালিকাভুক্ত করেছে। যদিও স্বল্পমেয়াদী ওঠানামা অনিশ্চিত, আপনি যদি দীর্ঘ সময়ের জন্য দৈনিক লাইনে তাকান তবে আপনি দেখতে পাবেন যে তারা মূলত 90% এরও বেশি হ্রাস পেয়েছে এবং কিছু এমনকি সর্বোচ্চ দামের ভগ্নাংশের মাত্র ভগ্নাংশ রয়েছে। তবে স্পটের জন্য কোনও সর্বজনীন শর্ট বিক্রয় পদ্ধতি নেই এবং অল্টকয়েন স্পর্শ না করা ব্যতীত কোনও বিশেষ প্রস্তাবনা নেই। গত দুই মাসে, বিন্যান্স ফিউচারস ২০ টিরও বেশি চিরস্থায়ী চুক্তি চালু করেছে, যার বেশিরভাগই মূলধার মুদ্রা এবং কিছু অজানা। এটি আমাদের এই অল্টকয়েন সংমিশ্রণগুলি শর্ট করার উপায় দেয়। অল্টকয়েন এবং বিটিসির মধ্যে সম্পর্ক সহগের ব্যবহার একটি কার্যকর বিশ্লেষণ পদ্ধতি হবে, দুটি কৌশল ডিজাইন করা যেতে পারে।

কৌশলগত নীতি

প্রথম কৌশলঃ বিকেন্দ্রীভূত সমতুল্য একটি নির্বাচিত altcoins এর ঝুড়ি শর্ট বিক্রি, এবং একই সময়ে ঝুঁকি এবং অস্থিরতা কমাতে, অবস্থান BTC একই পরিমাণ দীর্ঘ কিনতে। যেমন দামের কম্পন, ক্রমাগত শর্ট অবস্থান মান ধ্রুবক এবং দীর্ঘ অবস্থানের সমান রাখতে অবস্থানের সামঞ্জস্য। মূলত এটি একটি অপারেশন যে altcoin-বিটকয়েন মূল্য সূচক শর্ট বিক্রি।

দ্বিতীয় কৌশলঃ অল্টকয়েন-বিটকয়েন মূল্য সূচকের চেয়ে বেশি দামের মুদ্রাগুলি শর্ট করা এবং সূচকের চেয়ে কম মুদ্রার সাথে দীর্ঘস্থায়ী, বিচ্যুতি যত বেশি হবে, অবস্থান তত বেশি হবে। একই সাথে বিটিসি (বা না) দিয়ে অনিরাপদ অবস্থানগুলি হেজিং করা।

# Libraries to import
import pandas as pd
import requests
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
%matplotlib inline

প্রয়োজনীয় মুদ্রা প্রদর্শন করুন

বাইনারেন্স চিরস্থায়ী চুক্তিতে বর্তমানে তালিকাভুক্ত মুদ্রাগুলি, যা এর এপিআই ইন্টারফেস ব্যবহার করে প্রাপ্ত করা যেতে পারে, মোট 23 টি (বিটিসি ব্যতীত) ।

#Info = requests.get('https://fapi.binance.com/fapi/v1/exchangeInfo')
#symbols = [symbol_info['baseAsset'] for symbol_info in Info.json()['symbols']]
symbols = ['ETH', 'BCH', 'XRP', 'EOS', 'LTC', 'TRX', 'ETC', 'LINK', 'XLM', 'ADA', 'XMR', 'DASH', 'ZEC', 'XTZ', 'BNB', 'ATOM', 'ONT', 'IOTA', 'BAT', 'VET', 'NEO', 'QTUM', 'IOST']

প্রথমত, চলুন s গত এক বছরে বিটকয়েনের তুলনায় আল্টকয়েনের দামের গতিবিধি অধ্যয়ন করি। আমি ডেটা আগে থেকে ডাউনলোড করেছি এবং এটি ফোরামে পোস্ট করেছি, যা সরাসরি গবেষণা পরিবেশে উদ্ধৃত করা যেতে পারে।

price_btc = pd.read_csv('https://www.fmz.com/upload/asset/1ef1af8ec28a75a2dcb.csv', index_col = 0)
price_btc.index = pd.to_datetime(price_btc.index,unit='ms') #Index date
price_btc.tail()

ফলাফল:

img img

৫টি সারি × ২৩টি কলাম

প্রথমে এই মুদ্রাগুলির দাম আঁকুন প্রবণতা দেখতে, তথ্যগুলি স্বাভাবিক করা উচিত। দেখা যায় যে চারটি মুদ্রা ব্যতীত, অন্যান্য মুদ্রার দামের প্রবণতা মূলত একই, নেমে যাওয়ার প্রবণতা দেখায়।

price_btc_norm = price_btc/price_btc.fillna(method='bfill').iloc[0,]
price_btc_norm.plot(figsize=(16,6),grid = True,legend=False);

img

সর্বশেষ মূল্য পরিবর্তনগুলি সাজিয়ে, আপনি বেশ কয়েকটি মুদ্রা খুঁজে পেতে পারেন যা স্পষ্টতই আলাদা, যথা LINK, XTZ, BCH, ETH। ব্যাখ্যা করুন যে তারা প্রায়শই তাদের নিজস্ব প্রবণতা চালাতে পারে এবং তাদের শর্ট করার ঝুঁকি বেশি এবং কৌশল থেকে বাদ দেওয়া দরকার।

বাকি মুদ্রাগুলির ক্রিয়াশীলতার একটি তাপ মানচিত্র আঁকুন এবং দেখুন যে ETC এবং ATOM এর প্রবণতাও তুলনামূলকভাবে বিশেষ এবং এটি বাদ দেওয়া যেতে পারে।

price_btc_norm.iloc[-1,].sort_values()[-5:]

ফলাফল:

ETH     0.600417
ETC     0.661616
BCH     1.141961
XTZ     2.512195
LINK    2.764495
Name: 2020-03-25 00:00:00, dtype: float64
trade_symbols = list(set(symbols)-set(['LINK','XTZ','BCH', 'ETH'])) # Remaining currencies
plt.subplots(figsize=(12, 12)) # Set the screen size
sns.heatmap(price_btc[trade_symbols].corr(), annot=True, vmax=1, square=True, cmap="Blues");

img

সর্বশেষ অবশিষ্ট মুদ্রাটি বছরে গড়ে 66% হ্রাস পেয়েছে, স্পষ্টতই শর্ট করার জন্য প্রচুর জায়গা রয়েছে। এই মুদ্রাগুলির প্রবণতাকে আল্টকয়েন মূল্য সূচকে সংমিশ্রণ করে দেখা গেছে যে এটি মূলত পুরো পথ পড়েছিল, এটি গত বছরের দ্বিতীয়ার্ধে আরও স্থিতিশীল ছিল এবং এই বছর পুরো পথ পড়েছিল। এই গবেষণাটি LINK, XTZ, BCH, ETH, ETC, ATOM, BNB, EOS, LTC প্রথম কৌশলটির শর্ট অংশগ্রহণ করেনি, নির্দিষ্ট বিবরণগুলি নিজেরাই ব্যাকটেস্ট করতে পারে।

এটা লক্ষ করা উচিত যে বর্তমান আল্টকয়েন সূচক গত বছরের সর্বনিম্ন পয়েন্টে রয়েছে। সম্ভবত এটি একটি স্বল্প সুযোগ নয়, বরং একটি দীর্ঘ কেনার সুযোগ। আপনাকে এটি নিজের দ্বারা সিদ্ধান্ত নিতে হবে।

trade_symbols = list(set(symbols)-set(['LINK','XTZ','BCH', 'ETH', 'ETC','ATOM','BNB','EOS','LTC'])) # You can set the remaining currencies, which you want to subtract.
1-price_btc_norm[trade_symbols].iloc[-1,].mean()

ফলাফল:

0.6714306758250285
price_btc_norm[trade_symbols].mean(axis=1).plot(figsize=(16,6),grid = True,legend=False);

img

বিন্যান্স টেকসইতা ডেটা

একইভাবে, বাইনারেন্স টেকসইতার তথ্য সংগ্রহ করা হয়েছে, আপনি সরাসরি এটি আপনার নোটবুকটিতে উদ্ধৃত করতে পারেন, তথ্যটি ২৮ শে জানুয়ারী থেকে ৩১ শে মার্চ, ২০২০ এর মধ্যে ১ ঘন্টা মার্কেট কে লাইন, কারণ বেশিরভাগ বাইনারেন্স চিরস্থায়ী চুক্তি মাত্র দুই মাস ধরে মধ্যাহ্নভোজ হয়েছে, তাই তথ্য ব্যাকটেস্টের জন্য যথেষ্ট।

price_usdt = pd.read_csv('https://www.fmz.com/upload/asset/20227de6c1d10cb9dd1.csv ', index_col = 0)
price_usdt.index = pd.to_datetime(price_usdt.index)
price_usdt.tail()

ফলাফল:

img img

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

price_usdt_norm = price_usdt/price_usdt.fillna(method='bfill').iloc[0,]
price_usdt_norm.plot(figsize=(16,6),grid = True,legend=False);

img

আমরা যে মুদ্রাকে বিটকয়েনের বিরুদ্ধে বিক্রি করতে চাই তার সূচক মূল্য আঁকুন, কৌশলগত নীতি হল এই বক্ররেখাটি শর্ট করা, এবং রিটার্ন মূলত এই বক্ররেখার বিপরীত।

price_usdt_btc = price_usdt.divide(price_usdt['BTC'],axis=0)
price_usdt_btc_norm = price_usdt_btc/price_usdt_btc.fillna(method='bfill').iloc[0,]
price_usdt_btc_norm[trade_symbols].mean(axis=1).plot(figsize=(16,6),grid = True);
#price_usdt_btc_norm.mean(axis=1).plot(figsize=(16,6),grid = True,legend=False);

img

ব্যাকটেস্ট ইঞ্জিন

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

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

এক্সচেঞ্জ অবজেক্ট তৈরি করার সময়, আপনাকে ট্রেড করার জন্য মুদ্রা নির্দিষ্ট করতে হবে। কিনুন দীর্ঘ এবং বিক্রয় সংক্ষিপ্ত। চিরস্থায়ী চুক্তি সীমাবদ্ধতার কারণে, যখন পজিশন খোলা হয়, তখন দীর্ঘ এবং সংক্ষিপ্ত অবস্থানগুলি স্বয়ংক্রিয়ভাবে একসাথে বন্ধ হয়। যখন সংক্ষিপ্ত অবস্থান বিক্রি হয় এবং মুদ্রার সংখ্যা নেতিবাচক হয়। পরামিতিগুলি নিম্নরূপঃ

  • trade_symbols: ট্রেড করা মুদ্রার তালিকা
  • লিভারেজঃ লিভারেজ, প্রভাব মার্জিন,
  • কমিশনঃ লেনদেনের ফি, ডিফল্ট 0.00005
  • initial_balance: প্রাথমিক সম্পদ, USDT মূল্যায়ন
  • লগঃ লেনদেনের রেকর্ড মুদ্রণ করা হবে কি না
class Exchange:
    
    def __init__(self, trade_symbols, leverage=20, commission=0.00005,  initial_balance=10000, log=False):
        self.initial_balance = initial_balance # Initial asset
        self.commission = commission
        self.leverage = leverage
        self.trade_symbols = trade_symbols
        self.date = ''
        self.log = log
        self.df = pd.DataFrame(columns=['margin','total','leverage','realised_profit','unrealised_profit'])
        self.account = {'USDT':{'realised_profit':0, 'margin':0, 'unrealised_profit':0, 'total':initial_balance, 'leverage':0}}
        for symbol in trade_symbols:
            self.account[symbol] = {'amount':0, 'hold_price':0, 'value':0, 'price':0, 'realised_profit':0, 'margin':0, 'unrealised_profit':0}
            
    def Trade(self, symbol, direction, price, amount, msg=''):
        if self.date and self.log:
            print('%-20s%-5s%-5s%-10.8s%-8.6s %s'%(str(self.date), symbol, 'buy' if direction == 1 else 'sell', price, amount, msg))
            
        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.commission # Minus transaction fee
        
        if cover_amount > 0: # close position first
            self.account['USDT']['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount  # profit
            self.account['USDT']['margin'] -= cover_amount*self.account[symbol]['hold_price']/self.leverage # Free the margin
            
            self.account[symbol]['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount
            self.account[symbol]['amount'] -= -direction*cover_amount
            self.account[symbol]['margin'] -=  cover_amount*self.account[symbol]['hold_price']/self.leverage
            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['USDT']['margin'] +=  open_amount*price/self.leverage            
            self.account[symbol]['hold_price'] = total_cost/total_amount
            self.account[symbol]['amount'] += direction*open_amount
            self.account[symbol]['margin'] +=  open_amount*price/self.leverage
            
        self.account[symbol]['unrealised_profit'] = (price - self.account[symbol]['hold_price'])*self.account[symbol]['amount']
        self.account[symbol]['price'] = price
        self.account[symbol]['value'] = abs(self.account[symbol]['amount'])*price
        
        return True
    
    def Buy(self, symbol, price, amount, msg=''):
        self.Trade(symbol, 1, price, amount, msg)
        
    def Sell(self, symbol, price, amount, msg=''):
        self.Trade(symbol, -1, price, amount, msg)
        
    def Update(self, date, close_price): # Update assets
        self.date = date
        self.close = close_price
        self.account['USDT']['unrealised_profit'] = 0
        for symbol in self.trade_symbols:
            if np.isnan(close_price[symbol]):
                continue
            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']
            if self.date.hour in [0,8,16]:
                pass
                self.account['USDT']['realised_profit'] += -self.account[symbol]['amount']*close_price[symbol]*0.01/100
        
        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']['margin']/self.account['USDT']['total'],4)*self.leverage
        self.df.loc[self.date] = [self.account['USDT']['margin'],self.account['USDT']['total'],self.account['USDT']['leverage'],self.account['USDT']['realised_profit'],self.account['USDT']['unrealised_profit']]
# First test the backtest engine
e = Exchange(['BTC','XRP'],initial_balance=10000,commission=0,log=True)

e.Buy('BTC',100, 5)
e.Sell('XRP',10, 50)

e.Sell('BTC',105,e.account['BTC']['amount'])
e.Buy('XRP',9,-e.account['XRP']['amount'])

round(e.account['USDT']['realised_profit'],4)
75.0

প্রথম কৌশল কোড

কৌশলগত যুক্তি:

  • মুদ্রা মূল্য চেক করুন, যদি না nan, আপনি ট্রেড করতে পারেন
  • আল্টকয়েন চুক্তির মান পরীক্ষা করুন। যদি এটি লক্ষ্য মান trade_value এর চেয়ে কম হয়, তাহলে সংশ্লিষ্ট পার্থক্যটি শর্ট বিক্রি করা হবে, এবং যদি এটি বেশি হয়, তাহলে সংশ্লিষ্ট পরিমাণটি অবস্থান বন্ধ করার জন্য কেনা হবে।
  • সমস্ত আল্টকয়েনের শর্ট ভ্যালু যোগ করুন এবং এর বিরুদ্ধে হেজিং করার জন্য বিটিসি অবস্থান সামঞ্জস্য করুন।

শর্ট ট্রেড_ভ্যালু পজিশন পজিশনের আকার নির্ধারণ করে। সেটিং লগ = সত্য লেনদেন লগ মুদ্রণ করবে

# Need to hedge with BTC
trade_symbols = list(set(symbols)-set(['LINK','XTZ','BCH', 'ETH', 'ETC','ATOM','BNB','EOS','LTC'])) # Remaining currencies
e = Exchange(trade_symbols+['BTC'],initial_balance=10000,commission=0.0005,log=False)
trade_value = 2000
for row in price_usdt.iloc[:].iterrows():
    e.Update(row[0], row[1])
    empty_value = 0
    for symbol in trade_symbols:
        price = row[1][symbol]
        if np.isnan(price):
            continue
        if e.account[symbol]['value'] - trade_value  < -20 :
            e.Sell(symbol, price, round((trade_value-e.account[symbol]['value'])/price, 6),round(e.account[symbol]['realised_profit']+e.account[symbol]['unrealised_profit'],2))
        if e.account[symbol]['value'] - trade_value > 20 :
            e.Buy(symbol, price, round((e.account[symbol]['value']-trade_value)/price, 6),round(e.account[symbol]['realised_profit']+e.account[symbol]['unrealised_profit'],2))
        empty_value += e.account[symbol]['value']
    price = row[1]['BTC']
    if e.account['BTC']['value'] - empty_value < -20:
        e.Buy('BTC', price, round((empty_value-e.account['BTC']['value'])/price,6),round(e.account['BTC']['realised_profit']+e.account['BTC']['unrealised_profit'],2))
    if e.account['BTC']['value'] - empty_value > 20:
        e.Sell('BTC', price, round((e.account['BTC']['value']-empty_value)/price,6),round(e.account['BTC']['realised_profit']+e.account['BTC']['unrealised_profit'],2))
stragey_1 = e

প্রতিটি মুদ্রার চূড়ান্ত মুনাফা নিম্নরূপঃ

pd.DataFrame(stragey_1.account).T.apply(lambda x:round(x,3))

img

নীচের দুটি গ্রাফ হল নেট সম্পদ কার্ভ এবং ব্যবহৃত লিভারেজ।

নেট মূল্য বক্ররেখায় হলুদ হল 1x লিভারেজের প্রভাব যা অল্টকয়েন সূচককে শর্ট করে। দেখা যায় যে কৌশলটি মূলত সূচকের ওঠানামা বাড়িয়ে তোলে, যা প্রত্যাশার সাথে সামঞ্জস্যপূর্ণ। চূড়ান্ত দুই মাসের রিটার্ন 60%, সর্বাধিক পুনরুদ্ধার 20% এবং সর্বাধিক লিভারেজ প্রায় 8 গুণ। বেশিরভাগ সময়, এটি 6 গুণেরও কম। এটি এখনও নিরাপদ। সবচেয়ে গুরুত্বপূর্ণ, সম্পূর্ণ হেজিং কৌশলটি 12 মার্চ ডুবে যাওয়ার সময় সামান্য হারাতে করেছে।

যখন শর্ট-সেলিং মুদ্রার মূল্য বৃদ্ধি পায় এবং চুক্তির মূল্য বৃদ্ধি পায়, তখন অবস্থান হ্রাস পায়, অন্যদিকে, মুনাফা অর্জন করার সময় অবস্থান বৃদ্ধি পায়। এটি চুক্তির মোট মূল্যকে ধ্রুবক রাখে, এমনকি যদি আকাশচুম্বী পতন সীমিত ক্ষতির সাথে থাকে।

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

(stragey_1.df['total']/stragey_1.initial_balance).plot(figsize=(18,6),grid = True); # Net worth curve
#(2-price_usdt_btc_norm[trade_symbols].mean(axis=1)).plot(figsize=(18,6),grid = True);

img

# Strategy leverage
stragey_1.df['leverage'].plot(figsize=(18,6),grid = True);

img

উপরন্তু, ইউএসডিটি-র তুলনায় আল্টকয়েনের দামও হ্রাস পেয়েছে, তাই চরম পরিকল্পনাটি হিজড নয়, সরাসরি শর্ট বিক্রি করে, তবে ওঠানামা খুব বড় এবং পুনরুদ্ধার উচ্চ

trade_symbols = list(set(symbols)-set(['LINK','XTZ','BCH', 'ETH', 'ETC','ATOM','BNB','EOS','LTC'])) # Remaining currencies
e = Exchange(trade_symbols+['BTC'],initial_balance=10000,commission=0.0005,log=False)
trade_value = 2000
for row in price_usdt.iloc[:].iterrows():
    e.Update(row[0], row[1])
    empty_value = 0
    for symbol in trade_symbols:
        price = row[1][symbol]
        if np.isnan(price):
            continue
        if e.account[symbol]['value'] - trade_value  < -20 :
            e.Sell(symbol, price, round((trade_value-e.account[symbol]['value'])/price, 6),round(e.account[symbol]['realised_profit']+e.account[symbol]['unrealised_profit'],2))
        if e.account[symbol]['value'] - trade_value > 20 :
            pass
            #e.Buy(symbol, price, round((e.account[symbol]['value']-trade_value)/price, 6),round(e.account[symbol]['realised_profit']+e.account[symbol]['unrealised_profit'],2))
        empty_value += e.account[symbol]['value']
stragey_1b = e
(stragey_1b.df['total']/stragey_1.initial_balance).plot(figsize=(18,6),grid = True); # Net worth curve
(2-price_usdt_btc_norm[trade_symbols].mean(axis=1)).plot(figsize=(18,6),grid = True);

img

দ্বিতীয় কৌশল কোড

কৌশলগত যুক্তি:

  • একটি মূল্য আছে কিনা তা পরীক্ষা করুন অথবা ট্রেড করার জন্য একটি মূল্য আছে কিনা
  • সূচক থেকে মুদ্রা মূল্যের বিচ্যুতি পরীক্ষা করুন
  • বিচ্যুতি রায় উপর ভিত্তি করে দীর্ঘ এবং সংক্ষিপ্ত যান, এবং বিচ্যুতি আকার অনুযায়ী অবস্থান বিচার
  • বিটিসির মাধ্যমে হিজিং করা পজিশনের হিসাব

Trade_value এছাড়াও খোলা অবস্থানের আকার নিয়ন্ত্রণ করে. আপনি diff/0.001 এর রূপান্তর ফ্যাক্টর পরিবর্তন করতে পারেন

trade_symbols = list(set(symbols)-set(['LINK','XTZ','BCH', 'ETH'])) # Remaining currencies
price_usdt_btc_norm_mean = price_usdt_btc_norm[trade_symbols].mean(axis=1)
e = Exchange(trade_symbols+['BTC'],initial_balance=10000,commission=0.0005,log=False)
trade_value = 300
for row in price_usdt.iloc[:].iterrows():
    e.Update(row[0], row[1])
    empty_value = 0
    for symbol in trade_symbols:
        price = row[1][symbol]
        if np.isnan(price):
            continue
        diff = price_usdt_btc_norm.loc[row[0],symbol] - price_usdt_btc_norm_mean[row[0]]
        aim_value = -trade_value*round(diff/0.01,0)
        now_value = e.account[symbol]['value']*np.sign(e.account[symbol]['amount'])
        empty_value += now_value
        if aim_value - now_value > 50:
            e.Buy(symbol, price, round((aim_value - now_value)/price, 6),round(e.account[symbol]['realised_profit']+e.account[symbol]['unrealised_profit'],2))
        if aim_value - now_value < -50:
            e.Sell(symbol, price, -round((aim_value - now_value)/price, 6),round(e.account[symbol]['realised_profit']+e.account[symbol]['unrealised_profit'],2))
    price = row[1]['BTC']
    aim_value = -empty_value
    now_value = e.account['BTC']['value']*np.sign(e.account['BTC']['amount'])
    if aim_value - now_value > 50:
        e.Buy('BTC', price, round((aim_value - now_value)/price, 6),round(e.account['BTC']['realised_profit']+e.account['BTC']['unrealised_profit'],2))
    if aim_value - now_value < -50:
        e.Sell('BTC', price, -round((aim_value - now_value)/price, 6),round(e.account['BTC']['realised_profit']+e.account['BTC']['unrealised_profit'],2))
stragey_2 = e

দ্বিতীয় কৌশলটির রিটার্ন প্রথম কৌশলটির তুলনায় অনেক ভাল। গত দুই মাসে, এর 100% রিটার্ন রয়েছে, তবে এখনও 20% রিট্র্যাকশন রয়েছে। গত সপ্তাহে, বাজারের ছোটখাট ওঠানামাগুলির কারণে রিটার্নটি সুস্পষ্ট নয়। সামগ্রিক লিভারেজটি খুব বেশি নয়। এই কৌশলটি চেষ্টা করার মতো। বিচ্যুতির মাত্রার উপর নির্ভর করে সর্বাধিক 7800 ইউএসডিটি অবস্থান খোলা হয়েছিল।

মনে রাখবেন যে যদি কোনও মুদ্রা একটি স্বতন্ত্র প্রবণতা চালায়, উদাহরণস্বরূপ, এটি সূচকের তুলনায় বেশ কয়েকবার বৃদ্ধি পেয়েছে, এটি মুদ্রায় প্রচুর সংখ্যক শর্ট পজিশন জমে উঠবে এবং একই তীব্র হ্রাসও দীর্ঘ ক্রয়ের কৌশল তৈরি করবে, যা সর্বাধিক খোলার অবস্থানকে সীমাবদ্ধ করতে পারে।

(stragey_2.df['total']/stragey_2.initial_balance).plot(figsize=(18,6),grid = True);

img

# Summary results by currency
pd.DataFrame(e.account).T.apply(lambda x:round(x,3))

img

e.df['leverage'].plot(figsize=(18,6),grid = True);

img

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

trade_symbols = list(set(symbols)-set(['LINK','XTZ','BCH', 'ETH'])) # Remaining currencies
price_usdt_btc_norm_mean = price_usdt_btc_norm[trade_symbols].mean(axis=1)
e = Exchange(trade_symbols,initial_balance=10000,commission=0.0005,log=False)
trade_value = 300
for row in price_usdt.iloc[:].iterrows():
    e.Update(row[0], row[1])
    empty_value = 0
    for symbol in trade_symbols:
        price = row[1][symbol]
        if np.isnan(price):
            continue
        diff = price_usdt_btc_norm.loc[row[0],symbol] - price_usdt_btc_norm_mean[row[0]]
        aim_value = -trade_value*round(diff/0.01,1)
        now_value = e.account[symbol]['value']*np.sign(e.account[symbol]['amount'])
        empty_value += now_value
        if aim_value - now_value > 20:
            e.Buy(symbol, price, round((aim_value - now_value)/price, 6),round(e.account[symbol]['realised_profit']+e.account[symbol]['unrealised_profit'],2))
        if aim_value - now_value < -20:
            e.Sell(symbol, price, -round((aim_value - now_value)/price, 6),round(e.account[symbol]['realised_profit']+e.account[symbol]['unrealised_profit'],2))
stragey_2b = e
(stragey_2b.df['total']/stragey_2.initial_balance).plot(figsize=(18,6),grid = True);
#(stragey_2.df['total']/stragey_2.initial_balance).plot(figsize=(18,6),grid = True); # Can be stacked together

img

আপনি যদি ইউএসডিটি দামের পুনর্বিবেচনার কথা বলেন, তাহলে এর প্রভাব অনেক খারাপ হবে।

trade_symbols = list(set(symbols)-set(['LINK','XTZ','BCH', 'ETH']))+['BTC'] #Remaining currencies
price_usdt_norm_mean = price_usdt_norm[trade_symbols].mean(axis=1)
e = Exchange(trade_symbols,initial_balance=10000,commission=0.0005,log=False)
trade_value = 300
for row in price_usdt.iloc[:].iterrows():
    e.Update(row[0], row[1])
    empty_value = 0
    for symbol in trade_symbols+['BTC']:
        price = row[1][symbol]
        if np.isnan(price):
            continue
        diff = price_usdt_norm.loc[row[0],symbol] - price_usdt_norm_mean[row[0]]
        aim_value = -trade_value*round(diff/0.01,1)
        now_value = e.account[symbol]['value']*np.sign(e.account[symbol]['amount'])
        empty_value += now_value
        if aim_value - now_value > 20:
            e.Buy(symbol, price, round((aim_value - now_value)/price, 6),round(e.account[symbol]['realised_profit']+e.account[symbol]['unrealised_profit'],2))
        if aim_value - now_value < -20:
            e.Sell(symbol, price, -round((aim_value - now_value)/price, 6),round(e.account[symbol]['realised_profit']+e.account[symbol]['unrealised_profit'],2))
stragey_2c = e
(stragey_2c.df['total']/stragey_2.initial_balance).plot(figsize=(18,6),grid = True);
(stragey_2b.df['total']/stragey_2.initial_balance).plot(figsize=(18,6),grid = True);

img

যদি আপনি সর্বোচ্চ অবস্থান মান সীমাবদ্ধ, কর্মক্ষমতা খারাপ হবে

trade_symbols = list(set(symbols)-set(['LINK','XTZ','BCH', 'ETH'])) #Remaining currencies
price_usdt_btc_norm_mean = price_usdt_btc_norm[trade_symbols].mean(axis=1)
e = Exchange(trade_symbols+['BTC'],initial_balance=10000,commission=0.0005,log=False)
trade_value = 300
for row in price_usdt.iloc[:].iterrows():
    e.Update(row[0], row[1])
    empty_value = 0
    for symbol in trade_symbols:
        price = row[1][symbol]
        if np.isnan(price):
            continue
        diff = price_usdt_btc_norm.loc[row[0],symbol] - price_usdt_btc_norm_mean[row[0]]
        aim_value = -trade_value*round(diff/0.01,1)
        now_value = e.account[symbol]['value']*np.sign(e.account[symbol]['amount'])
        empty_value += now_value
        if aim_value - now_value > 20 and abs(aim_value)<3000:
            e.Buy(symbol, price, round((aim_value - now_value)/price, 6),round(e.account[symbol]['realised_profit']+e.account[symbol]['unrealised_profit'],2))
        if aim_value - now_value < -20 and abs(aim_value)<3000:
            e.Sell(symbol, price, -round((aim_value - now_value)/price, 6),round(e.account[symbol]['realised_profit']+e.account[symbol]['unrealised_profit'],2))
    price = row[1]['BTC']
    aim_value = -empty_value
    now_value = e.account['BTC']['value']*np.sign(e.account['BTC']['amount'])
    if aim_value - now_value > 20:
        e.Buy('BTC', price, round((aim_value - now_value)/price, 6),round(e.account['BTC']['realised_profit']+e.account['BTC']['unrealised_profit'],2))
    if aim_value - now_value < -20:
        e.Sell('BTC', price, -round((aim_value - now_value)/price, 6),round(e.account['BTC']['realised_profit']+e.account['BTC']['unrealised_profit'],2))
stragey_2d = e
(stragey_2d.df['total']/stragey_2.initial_balance).plot(figsize=(17,6),grid = True);

img

সংক্ষিপ্ত বিবরণ এবং ঝুঁকি

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

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

কৌশলটি শুরু করার বিভিন্ন সময় এবং নির্দিষ্ট পরামিতিগুলির কারণে, দীর্ঘ সময় ধরে এই কৌশলটি ব্যবহার করে এমন ব্যক্তিদের প্রভাব খুব বেশি হওয়া উচিত নয়।

সংক্ষেপে, কোন নিখুঁত কৌশল নেই, শুধুমাত্র কৌশলটির প্রতি সঠিক মনোভাব, এটি শেষ পর্যন্ত ব্যবহারকারীর ঝুঁকি বোঝার এবং ভবিষ্যতের বিচার করার উপর নির্ভর করে।


সম্পর্কিত

আরো