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

디지털 화폐 짝짓기 거래 전략에 대한 자세한 설명

저자:초목, 제작: 2024-07-05 16:23:42, 업데이트: 2024-11-05 17:42:06

img

디지털 화폐 짝짓기 거래 전략에 대한 자세한 설명

문장

최근 보아의 양적 일기에는 부정적 관련 화폐를 활용하여 화폐를 거래할 수 있다고 언급하고 있으며, 가격 격차 돌파에 따라 수익을 올릴 수 있다. 디지털 화폐는 기본적으로 긍정적으로 관련되어 있으며, 부정적 관련은 소수의 화폐이며, 종종 특별한 시장이 있습니다. 예를 들어, 이전 기간 MEME 화폐의 독립적인 시장은 큰 디스크의 흐름을 전혀 따라가지 않고, 이러한 화폐를 필터링하여 돌파한 후에 더 많이합니다. 이러한 방법은 특정 상황에서 수익을 올릴 수 있습니다. 그러나 양적 거래 분야에서 가장 일반적인 관련 활용은 양성 거래로 거래하는 것입니다. 이 기획은 간단히 소개됩니다.

암호화폐 쌍용 거래는 통계적 수익을 기반으로 한 거래 전략으로, 두 가지 관련성이 강한 디지털 통화 상속 계약을 동시에 사고 판매하여 가격 오차로 인한 수익을 얻는다. 이 문서에서는 전략의 원리, 수익 메커니즘, 통화 종을 필터링하는 방법, 잠재적인 위험 및 개선 방법을 상세히 설명하고 몇 가지 실용적인 파이썬 코드 예제를 제공합니다.

전략적 원칙

짝짓기 거래 전략은 두 종류의 디지털 화폐의 가격 사이의 역사적 연관성에 의존한다. 두 종류의 화폐의 가격이 강한 연관성을 나타내면, 그들의 가격 운동은 거의 동기화된다. 만약 어느 순간 두 가지의 가격 비율이 크게 변하면, 이것은 일시적인 이상으로 간주될 수 있으며, 가격은 정상 수준으로 돌아가는 경향이 있다. 디지털 화폐 시장은 높은 연동성을 가지고 있으며, 주요 디지털 화폐 (비트코인 등) 중 하나가 큰 변동이 발생했을 때, 다른 디지털 화폐의 연동 반응이 종종 발생한다. 어떤 종류의 화폐는 동일한 투자 기관, 같은 거래자, 같은 경주로 인해 매우 명백한 직관성을 가질 수 있으며 지속될 수 있다. 어떤 종류의 화폐는 부정적 연동이 있지만, 부정적인 연동은 거의 없으며, 모두 큰 거래의 영향을 받기 때문에 종종 상황의 움직임이 발생한다.

동전 A와 동전 B가 높은 가격 관련성을 가지고 있다고 가정한다. 어떤 시점에서 A/B 가격 비율의 평균값은 1이다. 어떤 시점에서 A/B 가격 비율이 0.001 이상, 즉 1.001 이상 상승하면 다음과 같은 방식으로 거래할 수 있다.

이윤의 핵심은 가격의 오차가 정상으로 돌아온다면 유차 수익이다. 가격의 오차가 일반적으로 단기적이기 때문에, 거래자는 가격이 평균으로 돌아온다면 평형화하여 수익을 창출하고 유차 수익을 얻을 수 있다.

데이터 준비

해당 라이브러리를 소개합니다.

이 코드는 직접 사용할 수 있으며, Anancoda를 다운로드하여 Jupyer notebook에서 디뷰하는 것이 좋습니다.

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) # 获取所有的正在交易的交易对

K줄을 다운로드하는 함수

GetKlines 함수의 주요 기능은 비트코인 거래소에서 지정된 거래에 대한 상속 계약에 대한 역사 K 라인 데이터를 획득하고 이를 판다스 데이터프레임에 저장하는 것입니다. K 라인 데이터는 오픈 가격, 최고 가격, 최저 가격, 폐쇄 가격, 거래량 등을 포함합니다. 이번에는 주로 종료 가격 데이터를 사용합니다.

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

데이터 다운로드

데이터의 양은 상당히 크며, 빠른 다운로드를 위해 최근 3개월 동안의 시간적 K 라인 데이터만 얻었다.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')

재검토 엔진

다음 재검토를 위해 Exchange 객체를 정의합니다.

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 사이입니다.

  • 1완전히 긍정적으로 연관되어 있고 두 변수가 항상 동시적으로 변화한다는 것을 나타냅니다. 하나의 변수가 증가할 때 다른 변수도 비례적으로 증가합니다. 1에 가까워질수록 연관성이 강합니다.
  • -1완전히 부정적 상관관계를 나타냅니다. 두 변수는 항상 역으로 변화합니다. -1에 가까워질수록 부정적 상관관계가 강합니다.
  • 0무선 관련을 나타냅니다. 두 변수 사이에 직선 관계가 없습니다.

피어슨 관련 계수 는 두 변수의 동변차와 표준차를 계산하여 연관성을 결정한다. 공식은 다음과 같다.

[ \rho_{X,Y} = \frac{\text{cov}(X,Y) }{\sigma_X \sigma_Y}

그 중 하나는:

  • ( \rho_{X,Y}) 는 변수 (X) 와 (Y) 의 피어슨 관련 계수이다.
  • ( \text{cov}(X,Y) 는 X와 Y의 합변차이다.
  • (\sigma_X) 와 (\sigma_Y) 는 각각 X와 Y의 표준차별이다.

물론, 어떻게 계산하느냐에 신경쓰지 않고, 파이썬 1줄 코드를 사용하여 모든 동전의 관련성을 계산할 수 있다. 그림은 관련성 열차를 보여줍니다. 빨간색은 긍정적으로 연관되어 있고, 파란색은 부정적으로 연관되어 있으며, 색깔이 깊어질수록 관련성이 강하다. 큰 조각은 모두 심하게 빨간색으로 표시되어 있기 때문에 디지털 화폐의 긍정적 인 관련성이 강하다고 볼 수 있습니다.

img

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) 의 가격 비율이며, 이 비율의 변화에 따라 거래를 수행하는 것입니다. 구체적인 단계는 다음과 같습니다.

  1. 초기화

    • 정의 거래 쌍 (pair_a = IOTA, pair_b = ZIL)
    • 거래소 객체를 생성합니다.e초기 배당액은 1만 달러이며 거래 수수료는 0.02%입니다.
    • 초기 평균 가격 비율을 계산avg
    • 초기 거래 값을 설정합니다.value = 1000
  2. 반복 처리 가격 데이터

    • 모든 시간대에 걸쳐서 가격 데이터df_close
    • 현재 가격 비율의 평균에 대한 오차를 계산합니다.diff
    • 오버레이션 기준으로 거래 가치를 계산합니다.aim_value, 0.01의 각 편차에 따라 하나의 값을 거래한다. 그리고 현재 계정 보유 및 가격 상황에 따라 구매 및 판매 처리를 결정한다.
    • 만약 오차가 너무 크다면, 판매를 실행하십시오.pair_a그리고 구매pair_b운영합니다.
    • 만약 오차가 너무 작다면 구매를 실행하세요.pair_a그리고 판매pair_b운영합니다.
  3. 평균을 조정합니다

    • 평균 가격 비율 업데이트avg이 사이트는 가장 최근 가격 비율을 반영하기 위해 설치되었습니다.
  4. 계정 및 기록 업데이트

    • 거래소 계좌의 보유 및 잔액 정보를 업데이트합니다.
    • 각 단계 (총자산, 보유자산, 거래 수수료, 다중자본 및 빈자본) 의 회계 상태를 기록합니다.res_list
  5. 결과 출력

    • 그리고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개의 동전 그룹을 재검토하여 비교적 이상적인 결과를 얻었다. 현재 관련성 계산은 미래 데이터를 사용하므로 정확하지 않습니다. 이 문서에서는 데이터를 두 부분으로 나누고, 이전 계산 관련성, 후기 재검토 거래 결과에 따라 두 부분으로 나눈다. 거래 결과는 다소 나빴지만 좋았습니다. 사용자 스스로 연습을 위해 확인하십시오.

img

잠재적인 위험과 개선 방법

쌍무 거래 전략은 이론적으로 수익성이 있지만 실제 운영에서는 약간의 위험이 존재합니다: 통화 간의 상관관계가 시간이 지남에 따라 변화하여 전략의 실패로 이어질 수 있습니다. 극단적인 시장 조건에서 가격 오차가 커질 수 있으며 큰 손실을 초래할 수 있습니다. 특정 통화의 유동성이 낮아서 거래가 수행되기 어렵거나 비용이 증가 할 수 있습니다. 빈번한 거래로 발생하는 절차 수수료는 수익을 침식 할 수 있습니다.

위험을 줄이고 전략의 안정성을 높이기 위해 다음과 같은 개선 방안을 고려할 수 있다: 통화 간 상관관계를 주기적으로 재 계산하여 거래 쌍을 적시에 조정한다; 단편 거래의 최대 손실을 제어하기 위해 스톱 손실 및 스톱 목표점을 설정한다; 동시에 여러 통화 쌍을 거래하여 위험을 분산시킨다.

결론

디지털 화폐 짝짓기 거래 전략은 통화 가격의 상관관계를 활용하여 가격의 오차에 따라 유리한 조작을 통해 수익을 창출합니다. 이 전략은 높은 이론적 타당성을 가지고 있습니다. 이 전략을 기반으로 한 간단한 실제 전략 소스코드가 나중에 출시 될 것입니다. 더 많은 질문이 있거나 추가 논의가 필요한 경우 언제든지 연락하십시오.


더 많은

77924998이것은 연구할 가치가 있습니다. 코드 소스?

콩 888장 총장은 - 하하하!