Tài nguyên đang được tải lên... tải...

[Binance Championship] Chiến lược giao dịch giao hàng Binance 3 - Bảo hiểm bướm

Tác giả:FMZ~Lydia, Tạo: 2022-11-11 18:17:46, Cập nhật: 2023-09-14 20:32:10

img

Gần đây, Binance tương lai đã ra mắt Binance Championship thứ hai (địa chỉ:https://www.binancezh.com/cn/futures/activity/anniversary-competition/129-38599440FMZ Quant). Nền tảng chính thức của FMZ Quant cũng đã tổ chức một nhóm, có thể được tìm thấy bằng cách tìm kiếm FMZ Quant trực tiếp. Hiện tại, chỉ có hơn 100 người. Chào mừng bạn tham gia chúng tôi. Sau đó, bạn có thể thêm WeChat của người đứng đầu nhóm: fmz_zhangchao, trả lời Binance, và chúng tôi sẽ mời bạn tham gia nhóm WeChat.

Chiến lược được chuẩn bị cho Giải vô địch Binance là bảo hiểm bướm của hợp đồng giao hàng. Bài viết này là báo cáo nghiên cứu về chiến lược. Chú ý: các chiến lược chỉ dành cho tham khảo. Bạn có thể đưa ra ý tưởng của riêng bạn để tối ưu hóa trên cơ sở này. Bạn cũng được chào đón chia sẻ. Báo cáo có thể được sử dụng trong môi trường nghiên cứu của trang web FMZ trực tiếp (nhấp vào góc trên bên phải để tải xuống và tải lên trong Analyze).

img

1. Lý do chiến lược

Bảo hiểm cần tìm một sự khác biệt giá ổn định. Khi chênh lệch giá quá lớn, đi ngắn có thể giảm chênh lệch giá. Khi chênh lệch giá quá nhỏ, đi dài là chênh lệch giá. Khi chênh lệch giá trở lại để đóng vị trí, bạn sẽ kiếm được chênh lệch giá. Nếu tương lai và điểm được bảo hiểm, khi giá của tương lai chưa giao cao hơn nhiều so với giá giao ngay, bạn có thể giảm giá hợp đồng tương lai và đi dài để giảm chênh lệch giá. Ngoài ra còn có các khoản bảo hiểm giữa thời gian của các hợp đồng với thời gian giao dịch khác nhau, với hợp đồng tương lai và điểm bảo hiểm, họ cũng có thể giảm chênh lệch giá. Hợp đồng tương lai và điểm và tương lai chéo là các chiến lược phổ biến với cạnh tranh khốc liệt. Khi không có thị trường, chênh lệch giá tương đối ổn định. Mặc dù nó có thể là một thị trường dài hạn, có ít cơ hội, và hoạt động thủ công cũng đang tìm kiếm. Vì tất cả chúng đều có chênh lệch giá ổn định, khi so sánh với một hợp đồng giao dịch, điều này

2. Nguyên tắc chiến lược

Các hợp đồng tiêu chuẩn tiền tệ Binance, chẳng hạn như BTC và ETH, có ba hợp đồng cùng một lúc, cụ thể là BTCUSD_ PERP vĩnh cửu, BTCUSD_200925 của quý hiện tại, BTCUSD_ 201225 của quý tới. Hợp đồng vĩnh cửu có thể được sử dụng như điểm. Nói chung, có ba chênh lệch giá để bảo hiểm hai hợp đồng: hợp đồng vĩnh cửu quý hiện tại, hợp đồng vĩnh cửu quý tiếp theo và hợp đồng vĩnh cửu quý tiếp theo. Điều chỉnh bướm đòi hỏi ba hợp đồng. Sự khác biệt là (tháng tiếp theo - quý hiện tại) - (tháng hiện tại - vĩnh cửu), nghĩa là sự khác biệt = quý tiếp theo + vĩnh cửu - 2 * quý hiện tại. Để đi dài sự khác biệt, bạn cần mở một hợp đồng vị trí dài cho hợp đồng quý tiếp theo và hợp đồng vĩnh cửu, và mua ngắn hai hợp đồng cho quý hiện tại.

3. Không gian bảo hiểm

Tôi đã thu thập dữ liệu của 5min K-line của Binance từ ngày 14 tháng 8 đến ngày 14 tháng 9, có thể đọc trực tiếp (do sự khác biệt thời gian, sự khác biệt thời gian được hiển thị là 8h).

Trong [4]:

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

Trong [12]:

#Read the data, you can also upload the data to the FMZ forum, which can be referenced in the "Analyze" directly
df = pd.read_csv('https://www.fmz.com/upload/asset/1420b2081ecd122522d.csv',index_col = 0)
df.index = pd.to_datetime(df.index)
df.tail(3)

Ra khỏi [1]:

img

Trước tiên, hãy xem xét sự khác biệt giá giữa các hợp đồng Bitcoin. Vào ngày 17 tháng 8, giá Bitcoin tăng nhanh chóng khoảng 500u. Nói chung, hợp đồng được giao là ở mức cao hơn so với giá giao ngay, và giá giao ngay đã tăng. Sự kỳ vọng cho tương lai sẽ lạc quan hơn. Sự khác biệt giá giữa hợp đồng chưa giao và vĩnh cửu sẽ trở nên lớn hơn. Ví dụ, sự khác biệt giá giữa quý tiếp theo và vĩnh cửu sẽ là 700u. Với sự sụt giảm giá Bitcoin vào tháng 9, kỳ vọng của mọi người sẽ xấu đi nhanh chóng, sự khác biệt giá giữa quý tiếp theo và vĩnh cửu giảm xuống khoảng 150u, và hầu như không có sự khác biệt giá giữa quý hiện tại và vĩnh cửu. Nếu việc bảo hiểm giữa quý tiếp theo và vĩnh cửu được thực hiện, chỉ có thể thực hiện sự trở lại của giá dài hạn lớn. Nếu sự khác biệt giá giữa 400-600 tháng 8 được quyết định thực hiện, rõ ràng hiện nay nó bị khóa trong một trạng thái.

Trong [18]:

#Perpetual price
df['BTCUSD_PERP'].dropna().plot(figsize=(15,6),grid=True);

Ra khỏi [1]:

img

Trong [15]:

# Price difference of next quarter - perpetual
(df['BTCUSD_201225']-df['BTCUSD_PERP']).dropna().plot(figsize=(15,6),grid=True);

Ra khỏi [1]:

img

Trong [16]:

# Price difference of current quarter - perpetual
(df['BTCUSD_200925']-df['BTCUSD_PERP']).dropna().plot(figsize=(15,6),grid=True);

Ra khỏi [1]:

img

Trong [17]:

# Price difference of next quarter - current quarter
(df['BTCUSD_201225']-df['BTCUSD_200925']).dropna().plot(figsize=(15,6),grid=True);

Ra khỏi [1]:

img

Vì vậy, sự khác biệt giá thay đổi như thế nào vào thời điểm này? Như có thể thấy từ hình dưới đây, sự khác biệt giá gần đây đã ổn định ở mức 100-200u trong một thời gian dài. Ngay cả sự sụt giảm mạnh vào đầu tháng 9 cũng không ảnh hưởng nhiều, cho chúng tôi nhiều không gian cho sự điều chỉnh lặp đi lặp lại.

Khi giá giao ngay dao động, hai hợp đồng chưa hết hạn phản ánh kỳ vọng về tương lai cùng một lúc. Quá trình giảm chênh lệch giá có thể bù đắp sự dao động này ở mức độ lớn, và hiệu suất tương đối ổn định.

Trong [19]:

#(next quarter - current quarter)-(current quarter - perpetual)
(df['BTCUSD_201225']-df['BTCUSD_200925']-(df['BTCUSD_200925']-df['BTCUSD_PERP'])).dropna().plot(figsize=(15,6),grid=True);

Ra khỏi [1]:

img

Trong [22]:

#The price difference of ETH
(df['ETHUSD_201225']+df['ETHUSD_PERP']-2*df['ETHUSD_200925']).dropna().plot(figsize=(15,6),grid=True);

Ra khỏi [1]:

img

4. Kiểm tra lại chiến lược

Để tiết kiệm thời gian (chỉ là lười biếng), backtest vẫn sử dụng công cụ tiêu chuẩn USDT của chiến lược Binance Championship cuối cùng. Mặc dù có thể có một số lỗi, nhưng nó cũng có thể giải thích vấn đề. Công cụ backtesting được đặt ở cuối báo cáo này. Khi chạy mã, bạn nên thấy cuối bài viết. Chiến lược tiêu chuẩn tiền tệ có thể xem xét bảo hiểm nếu bạn muốn kiếm được USDT, và nó không phức tạp.

Đường trung của chênh lệch giá được theo dõi bởi EMA, và vị trí được kiểm soát bởi lưới, nghĩa là mỗi khi chênh lệch được mở (chẳng hạn như 30), đi ngắn N cổ phiếu, và ngược lại. Nếu đường trung của chênh lệch giá là 100u, khi chênh lệch giá là 90, đi ngắn 3 cổ phiếu, và chênh lệch giá trở thành 60, đóng một cổ phiếu. Kích thước của lưới là một tham số quan trọng.

Dưới đây là các mã và kết quả kiểm tra ngược cụ thể của BTC và ETH. Hiệu suất phù hợp với mong đợi. Bởi vì ETH và LINK có biến động cao hơn và chênh lệch giá ổn định hơn, hiệu suất tốt hơn. Lưu ý rằng phí dịch vụ ở đây là 0,02%, và phí dịch vụ người nhận VIP0 mặc định ở Binance là 0,04%. phí dịch vụ rất quan trọng và các chương sau sẽ phân tích nó.

Trong [39]:

trade_symbols = ['BTCUSD_201225', 'BTCUSD_200925', 'BTCUSD_PERP']
account = []
diff = df['BTCUSD_201225']+df['BTCUSD_PERP']-2*df['BTCUSD_200925']
diff_mean = diff.ewm(alpha=0.001).mean()
e = Exchange(trade_symbols,initial_balance=10000,taker_fee=0.0002)
for row in df[trade_symbols].dropna().iterrows():
    date = row[0]
    prices = row[1]
    e.Update(date, trade_symbols, prices)
    account.append([e.account['USDT']['margin'],e.account['USDT']['realised_profit']+e.account['USDT']['unrealised_profit']])
    aim_amount = -round((diff[date] - diff_mean[date])/30,1)
    now_amount = e.account['BTCUSD_PERP']['amount']
    if aim_amount - now_amount < -1:
        trade_amount = now_amount - aim_amount
        e.Buy('BTCUSD_200925',prices['BTCUSD_200925'],2*trade_amount)
        e.Sell('BTCUSD_201225',prices['BTCUSD_201225'],trade_amount)
        e.Sell('BTCUSD_PERP',prices['BTCUSD_PERP'],trade_amount)
    if aim_amount - now_amount > 1:
        trade_amount = aim_amount - now_amount
        e.Sell('BTCUSD_200925',prices['BTCUSD_200925'],2*trade_amount)
        e.Buy('BTCUSD_201225',prices['BTCUSD_201225'],trade_amount)
        e.Buy('BTCUSD_PERP',prices['BTCUSD_PERP'],trade_amount)
    
e.df = pd.DataFrame(index=df[trade_symbols].dropna().index,columns=['margin','profit'],data=account)
e.df['profit'].plot(figsize=(15,6),grid=True);

Ra khỏi [39]:

img

Trong [59]:

symbol = 'ETH'
trade_symbols = [symbol+'USD_201225', symbol+'USD_200925', symbol+'USD_PERP']
fee = 0.0002
account = []
diff = df[trade_symbols[0]]+df[trade_symbols[2]]-2*df[trade_symbols[1]]
diff_mean = diff.ewm(alpha=0.001).mean()
e = Exchange(trade_symbols,initial_balance=10000,taker_fee=fee)
for row in df[trade_symbols].dropna().iloc[30:].iterrows():
    date = row[0]
    prices = row[1]
    e.Update(date, trade_symbols, prices)
    account.append([e.account['USDT']['margin'],e.account['USDT']['realised_profit']+e.account['USDT']['unrealised_profit']])
    aim_amount = -round((diff[date] - diff_mean[date])/(15*prices[trade_symbols[2]]*fee),1)
    now_amount = e.account[trade_symbols[2]]['amount']
    if aim_amount - now_amount < -1:
        trade_amount = 1
        e.Buy(trade_symbols[1],prices[trade_symbols[1]],2*trade_amount)
        e.Sell(trade_symbols[0],prices[trade_symbols[0]],trade_amount)
        e.Sell(trade_symbols[2],prices[trade_symbols[2]],trade_amount)
    if aim_amount - now_amount > 1:
        trade_amount = 1
        e.Sell(trade_symbols[1],prices[trade_symbols[1]],2*trade_amount)
        e.Buy(trade_symbols[0],prices[trade_symbols[0]],trade_amount)
        e.Buy(trade_symbols[2],prices[trade_symbols[2]],trade_amount)
e.df = pd.DataFrame(index=df[trade_symbols].dropna().iloc[30:].index,columns=['margin','profit'],data=account)
e.df['profit'].plot(figsize=(15,6),grid=True);

Ra ngoài[59]:

img

Trong [60]:

symbol = 'LINK'
trade_symbols = [symbol+'USD_201225', symbol+'USD_200925', symbol+'USD_PERP']
fee = 0.0002
account = []
diff = df[trade_symbols[0]]+df[trade_symbols[2]]-2*df[trade_symbols[1]]
diff_mean = diff.ewm(alpha=0.001).mean()
e = Exchange(trade_symbols,initial_balance=10000,taker_fee=fee)
for row in df[trade_symbols].dropna().iloc[30:].iterrows():
    date = row[0]
    prices = row[1]
    e.Update(date, trade_symbols, prices)
    account.append([e.account['USDT']['margin'],e.account['USDT']['realised_profit']+e.account['USDT']['unrealised_profit']])
    aim_amount = -round((diff[date] - diff_mean[date])/(15*prices[trade_symbols[2]]*fee),1)
    now_amount = e.account[trade_symbols[2]]['amount']
    if aim_amount - now_amount < -1:
        trade_amount = 1
        e.Buy(trade_symbols[1],prices[trade_symbols[1]],2*trade_amount)
        e.Sell(trade_symbols[0],prices[trade_symbols[0]],trade_amount)
        e.Sell(trade_symbols[2],prices[trade_symbols[2]],trade_amount)
    if aim_amount - now_amount > 1:
        trade_amount = 1
        e.Sell(trade_symbols[1],prices[trade_symbols[1]],2*trade_amount)
        e.Buy(trade_symbols[0],prices[trade_symbols[0]],trade_amount)
        e.Buy(trade_symbols[2],prices[trade_symbols[2]],trade_amount)
e.df = pd.DataFrame(index=df[trade_symbols].dropna().iloc[30:].index,columns=['margin','profit'],data=account)
e.df['profit'].plot(figsize=(15,6),grid=True);

Ra ngoài[60]:

img

5.Sự nhạy cảm của hoa hồng

Vì 3 hợp đồng cần được vận hành cùng một lúc, 8 phí dịch vụ được yêu cầu để đóng vị trí sau khi mở, vì vậy phí dịch vụ có tác động lớn đến chiến lược. Nếu có phí dịch vụ 0,01%, khoảng cách giữa lưới chênh lệch giá có thể được giảm thêm. Kết quả của BTCs backtesting được hiển thị trong hình sau:

img

Nếu hoa hồng là 0,03%, kết quả backtest BTC là như sau:

img

Kết quả backtest của ETH:

img

Theo đó, phí xử lý cuối cùng là 0,0002268. Ngoài ra, sẽ có phần thưởng trực tiếp cho số tiền giao dịch lớn gần đây của hợp đồng giao hàng Binance. Ngoài ra, một phần hóa đơn có thể được đặt và một phần hóa đơn có thể được lấy, và tỷ lệ toàn diện cuối cùng có thể được giảm xuống còn 0,02%. Ngoài ra, quan chức FMZ cũng đang thảo luận về vấn đề giảm giá phí dịch vụ với Binance. Bạn có thể mong đợi nó.

Tóm lại

Mục đích của việc điều chỉnh giá là để tìm một sự khác biệt giá ổn định. Sự khác biệt giá của sự khác biệt giá là ổn định hơn. Do đó, điều chỉnh bướm ít rủi ro hơn nhiều so với thời gian chéo và tương lai, và nó cũng có thể được vận hành bằng tay. Chiến lược này chỉ phục vụ như một phần giới thiệu. Nhiều vấn đề cần được xem xét khi viết trong bot thực sự. Chào mừng tất cả các bạn để giao tiếp.

Trong [23]:

class Exchange:
    
    def __init__(self, trade_symbols, leverage=20, maker_fee=0.0002,taker_fee=0.0004,log='',initial_balance=10000):
        self.initial_balance = initial_balance #Initial assets
        self.taker_fee = taker_fee
        self.maker_fee = maker_fee
        self.leverage = leverage
        self.trade_symbols = trade_symbols
        self.date = ''
        self.log = log
        self.df = pd.DataFrame()
        self.account = {'USDT':{'realised_profit':0, 'margin':0, 'unrealised_profit':0, 
                                'total':initial_balance, 'leverage':0, 'fee':0,'maker_fee':0,'taker_fee':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,'fee':0}
            
    def Trade(self, symbol, direction, price, amount, msg='', maker=True):
        
        if (self.date and symbol == self.log) or self.log == 'all':
            print('%-26s%-15s%-5s%-10.8s%-8.6s %s'%(str(self.date)[:24], 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
        if maker:
            self.account['USDT']['realised_profit'] -= price*amount*self.maker_fee #Deduct service charge
            self.account['USDT']['maker_fee'] += price*amount*self.maker_fee
            self.account['USDT']['fee'] += price*amount*self.maker_fee
            self.account[symbol]['fee'] += price*amount*self.maker_fee
        else:
            self.account['USDT']['realised_profit'] -= price*amount*self.taker_fee #Deduct service charge
            self.account['USDT']['taker_fee'] += price*amount*self.taker_fee
            self.account['USDT']['fee'] += price*amount*self.taker_fee
            self.account[symbol]['fee'] += price*amount*self.taker_fee

        
        
        if cover_amount > 0: #Close the 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 #Release 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
        
    
    def Buy(self, symbol, price, amount, msg='', maker=False):
        self.Trade(symbol, 1, price, amount, msg, maker)
        
    def Sell(self, symbol, price, amount, msg='', maker=False):
        self.Trade(symbol, -1, price, amount, msg,maker)
        

    def Update(self, date, symbols, close_price): #Update the assets
        self.date = date
        self.close = close_price
        self.account['USDT']['unrealised_profit'] = 0
        for symbol in 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)
        self.account['USDT']['leverage'] = round(self.account['USDT']['margin']*self.leverage/self.account['USDT']['total'],4)

Trong [ ]:


Có liên quan

Thêm nữa