최근 보아의 양적 일기에는 부정적 관련 화폐를 활용하여 화폐를 거래할 수 있다고 언급하고 있으며, 가격 격차 돌파에 따라 수익을 올릴 수 있다. 디지털 화폐는 기본적으로 긍정적으로 관련되어 있으며, 부정적 관련은 소수의 화폐이며, 종종 특별한 시장이 있습니다. 예를 들어, 이전 기간 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) # 获取所有的正在交易的交易对
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 사이입니다.
피어슨 관련 계수 는 두 변수의 동변차와 표준차를 계산하여 연관성을 결정한다. 공식은 다음과 같다.
[ \rho_{X,Y} = \frac{\text{cov}(X,Y) }{\sigma_X \sigma_Y}
그 중 하나는:
물론, 어떻게 계산하느냐에 신경쓰지 않고, 파이썬 1줄 코드를 사용하여 모든 동전의 관련성을 계산할 수 있다. 그림은 관련성 열차를 보여줍니다. 빨간색은 긍정적으로 연관되어 있고, 파란색은 부정적으로 연관되어 있으며, 색깔이 깊어질수록 관련성이 강하다. 큰 조각은 모두 심하게 빨간색으로 표시되어 있기 때문에 디지털 화폐의 긍정적 인 관련성이 강하다고 볼 수 있습니다.
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) 의 가격 비율이며, 이 비율의 변화에 따라 거래를 수행하는 것입니다. 구체적인 단계는 다음과 같습니다.
초기화:
e
초기 배당액은 1만 달러이며 거래 수수료는 0.02%입니다.avg
。value = 1000
。반복 처리 가격 데이터:
df_close
。diff
。aim_value
, 0.01의 각 편차에 따라 하나의 값을 거래한다. 그리고 현재 계정 보유 및 가격 상황에 따라 구매 및 판매 처리를 결정한다.pair_a
그리고 구매pair_b
운영합니다.pair_a
그리고 판매pair_b
운영합니다.평균을 조정합니다:
avg
이 사이트는 가장 최근 가격 비율을 반영하기 위해 설치되었습니다.계정 및 기록 업데이트:
res_list
。결과 출력:
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개의 동전 그룹을 재검토하여 비교적 이상적인 결과를 얻었다. 현재 관련성 계산은 미래 데이터를 사용하므로 정확하지 않습니다. 이 문서에서는 데이터를 두 부분으로 나누고, 이전 계산 관련성, 후기 재검토 거래 결과에 따라 두 부분으로 나눈다. 거래 결과는 다소 나빴지만 좋았습니다. 사용자 스스로 연습을 위해 확인하십시오.
쌍무 거래 전략은 이론적으로 수익성이 있지만 실제 운영에서는 약간의 위험이 존재합니다: 통화 간의 상관관계가 시간이 지남에 따라 변화하여 전략의 실패로 이어질 수 있습니다. 극단적인 시장 조건에서 가격 오차가 커질 수 있으며 큰 손실을 초래할 수 있습니다. 특정 통화의 유동성이 낮아서 거래가 수행되기 어렵거나 비용이 증가 할 수 있습니다. 빈번한 거래로 발생하는 절차 수수료는 수익을 침식 할 수 있습니다.
위험을 줄이고 전략의 안정성을 높이기 위해 다음과 같은 개선 방안을 고려할 수 있다: 통화 간 상관관계를 주기적으로 재 계산하여 거래 쌍을 적시에 조정한다; 단편 거래의 최대 손실을 제어하기 위해 스톱 손실 및 스톱 목표점을 설정한다; 동시에 여러 통화 쌍을 거래하여 위험을 분산시킨다.
디지털 화폐 짝짓기 거래 전략은 통화 가격의 상관관계를 활용하여 가격의 오차에 따라 유리한 조작을 통해 수익을 창출합니다. 이 전략은 높은 이론적 타당성을 가지고 있습니다. 이 전략을 기반으로 한 간단한 실제 전략 소스코드가 나중에 출시 될 것입니다. 더 많은 질문이 있거나 추가 논의가 필요한 경우 언제든지 연락하십시오.
77924998이것은 연구할 가치가 있습니다. 코드 소스?
콩 888장 총장은 - 하하하!