리소스 로딩... 로딩...

바이낸스 선물 다화폐 헤지 전략 연구 1부

저자:선함, 제작: 2020-05-09 11:14:50, 업데이트: 2023-11-04 19:49:01

img

바이낸스 선물 다화폐 헤지 전략 연구 1부

대시보드 페이지의 검색 버튼을 클릭하고, 그 다음 입력하기 위해 화살표를 클릭합니다. 업로드 된.pynb 후승 파일을 열고 Shift + enter를 누르면 행별로 실행됩니다. 검색 환경의 사용자 도움말에 기본 자습서가 있습니다.

img

전략적 이유

바이낸스는 현장에서 많은 알트 코인을 나열했습니다. 단기 변동이 불확실하지만, 장기간 매일 라인을 살펴보면 기본적으로 90% 이상 떨어졌으며 일부는 가장 높은 가격 부분의 일부만 가지고 있음을 알게 될 것입니다. 그러나 현장에 대한 보편적인 단편 판매 방법이 없으며, 알트 코인을 만지지 않는 것을 제외하고는 특별한 권장 사항이 없습니다. 지난 2 개월 동안 바이낸스 미래에셋은 20 개 이상의 영구 계약을 출시했으며, 대부분은 주류 통화이며 일부는 알려지지 않았습니다. 이것은 우리에게 이러한 알트 코인 조합을 단편화하는 방법을 제공합니다. 알트 코인과 BTC 사이의 상관 계수를 사용하여 효과적인 분석 방법이 될 것이며 두 가지 전략을 설계 할 수 있습니다.

전략 원칙

첫 번째 전략: 선택된 골판의 알트 코인을 분산 적량으로 단축 판매하고, 동시에 위험과 변동성을 줄이기 위해 동일한 양의 BTC 지위를 단축 구매합니다. 가격이 변동함에 따라 단축 지점 값을 일정하고 긴 지점과 동일하게 유지하기 위해 지속적으로 지위를 조정합니다. 본질적으로 이는 알트 코인-비트코인 가격 지수를 단축 판매하는 작업입니다.

두 번째 전략: Altcoin-Bitcoin 가격 지수보다 높은 가격을 가진 통화를 단축하고 지수보다 낮은 통화를 갈망합니다. 오차가 커질수록 지위가 커집니다. 동시에 BTC (또는 그렇지 않은) 로 헤지되지 않은 위치를 헤지합니다.

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

필요한 화폐를 스크린

바이낸스 영구계약은 현재 API 인터페이스를 사용하여 얻을 수있는 통산 23 개의 통화 (BTC를 제외) 를 나열하고 있습니다.

#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']

먼저, 지난 1년 동안 비트코인에 대한 알트코인의 가격 움직임을 연구해 보자. 전 데이터를 미리 다운로드하고 포럼에 올렸습니다. 이는 연구 환경에서 직접 인용될 수 있습니다.

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

5줄 × 23개 열

먼저 이 통화들의 가격을 그려 그 추세를 보려면 데이터를 정상화 해야 합니다. 네 개의 통화를 제외하고는 다른 통화들의 가격 추세는 기본적으로 동일하며 하락 추세를 나타냅니다.

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% 감소했으며, 분명히 단축할 여지가 있습니다. Altcoin 가격 지수에 이러한 동전의 추세를 합성하여 기본적으로 모든 길을 떨어졌다는 것을 발견했습니다. 작년 하반기에 더 안정적이었고 올해 모든 길을 떨어지기 시작했습니다. 이 연구는 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

바이낸스 지속가능성 데이터

이와 마찬가지로 바이낸스 지속가능성에 대한 자료도 수집되었습니다. 또한 노트북에 직접 인용할 수 있습니다. 자료는 2020년 1월 28일부터 3월 31일까지 1시간 시장 K 라인입니다.

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

먼저 정상화 된 데이터로 전체 추세를 살펴보십시오. 3 월의 폭락에서 2 월 초 가격에 비해 가격은 일반적으로 낮아졌으며 영구 계약의 위험도 매우 높다는 것을 보여줍니다. 이러한 하락 물결은 또한 전략에 대한 큰 도전 테스트입니다.

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

역시험 엔진

FMZ 로컬 백테스트는 모든 화폐에 대한 데이터를 가지고 있지 않으며 멀티 화폐 백테스트를 지원하지 않기 때문에 백테스트 엔진을 다시 구현해야합니다. 그래서 나는 새로운 백테스트 엔진을 썼습니다. 그것은 비교적 간단하지만 기본적으로 충분합니다. 거래 수수료를 고려하지만 기본적으로 자본 비율을 무시하고 마진 자본을 유지하는 상황을 고려하지 않았습니다. 총 자본, 점유 마진 및 레버리지가 기록되었습니다. 이 전략은 긴 지위가 짧은 지위에 해당한다는 특성을 가지고 있기 때문에 자본 비율의 영향은 중요하지 않습니다.

백테스트는 가격 미끄러짐 상황을 고려하지 않습니다. 거래 수수료 시뮬레이션을 스스로 증가시킬 수 있습니다. 바이낸스 메이커의 낮은 거래 수수료를 고려하여 인기가없는 통화 시장에서의 가격 격차 차이는 매우 작습니다. 주문 할 때 실제 시장에서 빙산 수수료 방법을 사용할 수 있습니다. 그 영향은 중요하지 않아야합니다.

교환 객체를 만들 때 거래해야 할 통화를 지정해야합니다. 구매는 길고 판매는 짧습니다. 영구 계약 제한으로 인해 포지션을 열 때 긴 포지션과 짧은 포지션은 자동으로 함께 닫습니다. 짧은 포지션과 통화 수를 판매 할 때 음수입니다. 매개 변수는 다음과 같습니다.

  • 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보다 적으면 해당 차이는 단위로 판매되며, 더 많으면 해당 금액을 구매하여 포지션을 닫습니다.
  • 모든 알트코인의 짧은 값을 더하고 BTC 지위를 조정하여 이에 대비하십시오.

짧은 무역_값 위치가 위치의 크기를 결정합니다. 설정 로그 = True는 거래 로그를 인쇄합니다

# 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 레버리지가 알트코인 인덱스를 단축시키는 효과입니다. 전략이 기본적으로 예상과 일치하는 인덱스의 변동을 증폭시키는 것을 볼 수 있습니다. 최종 2 개월 수익률은 60%, 최대 리트레이싱은 20%이며 최대 레버리지가 약 8배입니다. 대부분의 경우 6배 미만입니다. 여전히 안전합니다. 가장 중요한 것은 완전한 헤지링으로 전략이 3 월 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

또한 USDT에 대한 altcoin의 가격도 떨어졌기 때문에 극단적인 계획은 헤지되지 않고, 직접 단축 판매하지만 변동은 매우 크고 리트레이싱은 높습니다.

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

두 번째 전략 코드

전략 논리:

  • 가격이 있는지 또는 거래가 있는지 확인하십시오.
  • 지수에서 통화 가격의 오차를 확인
  • 오차 판단에 따라 길고 짧은 이동하고 오차 크기에 따라 위치를 판단
  • BTC로 헤지되지 않은 포지션을 계산하고 헤지

트레이드_밸류 또한 오픈 포지션의 크기를 제어합니다. 당신은 또한 변수 인수를 수정 할 수 있습니다 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 USDT 지점이 열렸습니다.

참고로, 통화가 독립적인 추세를 실행하면, 예를 들어, 지수에 비해 몇 배 증가하면, 통화의 많은 양의 짧은 지위를 축적 할 것이며, 동일한 급격한 하락은 또한 최대 개척 지위를 제한 할 수있는 긴 구매 전략을 만들 것입니다.

(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

만약 USDT 가격 회귀를 언급한다면 그 영향은 훨씬 더 심각할 것입니다.

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

요약 및 위험

첫 번째 전략은 Altcoin의 전체 가치가 Bitcoin만큼 좋지 않다는 사실을 활용합니다. 당신이 긴 Bitcoins를 구입하면 오랫동안이 전략을 고수하기를 원할 수 있습니다. 긴 위치와 짧은 위치의 동등성으로 인해 당신은 기본적으로 8h의 펀딩 비율을 두려워하지 않습니다. 장기적으로는 승률이 상대적으로 높습니다. 그러나 Altcoin이 현재 바닥에 있으며 상승 추세에서 빠져나올 수 있으며이 전략의 손실을 초래할 수 있다고 걱정합니다.

두 번째 전략은 알트 코인의 가격 회귀 특징을 사용하며, 이는 지수보다 더 상승하고 다시 떨어질 확률이 높습니다. 그러나 단일 통화에서 너무 많은 포지션을 축적 할 수 있습니다. 특정 통화가 실제로 다시 떨어지지 않으면 큰 손실이 발생할 수 있습니다.

전략의 시작시간과 특수한 매개 변수들이 다르기 때문에 이 전략을 오랫동안 사용하는 사람들의 영향은 크지 않을 것입니다.

한마디로 완벽한 전략은 없고, 전략에 대한 올바른 태도만 있고, 결국은 위험에 대한 이해와 미래에 대한 판단에 달려 있습니다.


관련

더 많은