Nghiên cứu nền tảng tiên tiến
FMZ có một sổ ghi chép jupyter tích hợp để giúp người dùng làm quen với API nền tảng và tiến hành nghiên cứu chiến lược, và hỗ trợ môi trường học tập của Python3 C++11/17 và Javascript. Notebook+Python là một công cụ rất mạnh mẽ, hầu như không thể thiếu cho phân tích dữ liệu và nghiên cứu chiến lược. Mặc dù backtest đi kèm với nền tảng FMZ rất hữu ích, nhưng nó không phù hợp với các chiến lược có khối lượng dữ liệu phức tạp và lớn. Bài viết này sẽ giới thiệu một số kỹ năng sử dụng nâng cao của sổ ghi chép jupyter, và thực hiện các backtest của các chiến lược giao dịch cặp ngẫu nhiên và nhiều cặp giao dịch.
Môi trường nghiên cứu bên trong FMZ có thể được sử dụng, nhưng kết nối mạng là không thuận tiện. Nó được khuyến cáo để cài đặt trên thiết bị của riêng bạn Anaconda3, với sổ tay và các thư viện liên quan thường được sử dụng để tính toán toán học; nó có thể chia sẻ môi trường mạng cục bộ, và có hiệu suất tốt hơn. Nó cũng được khuyến cáo để sử dụng Google colab. Mặc dù có một số hạn chế lưu trữ, nó là miễn phí và mạnh mẽ, phù hợp với nghiên cứu liên quan đến robot học.
Có rất nhiều hướng dẫn trực tuyến cho các kỹ năng sử dụng cụ thể của sổ ghi chép và Python. Bạn có thể tìm thấy rất nhiều thông tin bằng cách tìm kiếm các từ khóa, chẳng hạn như định lượng Python và hướng dẫn sổ ghi chép jupyter. Bạn cần phải học và làm chủ một loạt các điều cơ bản như trình thu thập dữ liệu, xử lý dữ liệu, kiểm tra lại, thiết kế chiến lược và phác thảo.
Các nền tảng thường cung cấp các API để lấy K-line với dữ liệu lịch sử, và một số cũng cung cấp dữ liệu thực thi thương mại theo thương mại. Chúng ta cần sử dụng trình thu thập dữ liệu để lấy và lưu dữ liệu. Bạn cũng có thể trực tiếp nhận dữ liệu được đẩy bởi nền tảng và tự tạo một bộ lưu trữ cơ sở dữ liệu cục bộ.
Tiếp theo, chúng tôi sẽ chứng minh cách lấy và lưu trữ dữ liệu K-line của các hợp đồng vĩnh viễn trên Binance.
Đầu tiên, tìm tài liệu Binance Perpetual Swap:https://binance-docs.github.io/apidocs/futures/cn/#c59e471e81. Bạn có thể xem các thông số cần thiết và định dạng dữ liệu được trả về. Thông thường, số lượng K-line được API thu thập được là giới hạn, và Binance có tối đa 1000, vì vậy nó cần phải được thu thập bằng lặp lặp vòng lặp. Tình hình trên các nền tảng khác tương tự như Binance. Lưu ý rằng mạng cần được kết nối với mạng ngoài nước (so với mạng nội địa ở Trung Quốc) để thu thập các K-line.
Các khoảng thời gian Binance hỗ trợ:1m, 3m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 12h, 1d, 3d, 1w, 1M.
Trong [24]:
yêu cầu nhập # yêu cầu mạng cho thư viện chung
Từ ngày/thời điểm ngày nhập khẩu,thời điểm nhập khẩu
Thời gian nhập khẩu
nhập panda như pd
Trong [160]:
def GetKlines ((symbol=
Lưu trữ và đọc dữ liệu có thể sử dụng các chức năng bên trong thư viện panda.
Ngoài giá cao nhất, giá thấp nhất, giá mở, giá đóng cửa và khối lượng được thực hiện, dữ liệu đường K được Binance trả về cũng bao gồm tổng số giao dịch, số tiền mua sáng kiến, số tiền thực hiện, v.v. Đây là thông tin có giá trị có thể được sử dụng để xây dựng các chiến lược.
Trong [86]:
df.to_csv ((
Trong [88]:
df.index = pd.to_datetime ((df.time,unit=
Các hợp đồng vĩnh cửu được ký quỹ bằng USDT (hoặc các hợp đồng ký quỹ bằng tiền tệ khác) rất giống với các hợp đồng tại chỗ. Sự khác biệt là các hợp đồng vĩnh cửu có thể được đòn bẩy và giữ số tiền âm (tương đương với việc mua bán ngắn), và có thể chia sẻ một công cụ kiểm tra lại. các hợp đồng giao hàng được ký quỹ bằng tiền điện tử là đặc biệt, vì chúng được giải quyết bằng tiền tệ và yêu cầu kiểm tra lại cụ thể.
Đây là một ví dụ đơn giản, có thể thực hiện thử nghiệm đằng sau nhiều biểu tượng hoặc thử nghiệm đằng sau nhiều biểu tượng. Nhiều chi tiết bị bỏ qua: như đòn bẩy tương lai, chiếm đóng biên, tỷ lệ tài trợ, cơ chế thanh lý, thực hiện thị trường và giao dịch người nhận lệnh cũng như duy trì lệnh, nhưng nó thường không ảnh hưởng đến kết quả kiểm tra đằng sau bình thường. Và giá và số lượng của sự phù hợp và cập nhật tài khoản đều cần phải được nhập bên ngoài. Người đọc có thể cải thiện nó trên cơ sở này.
giới thiệu lớp trao đổi:
tài khoản:USDT chỉ ra đồng tiền cơ sở, không cần thiết; realized_profit: lợi nhuận và lỗ đã được thực hiện; unrealised_profit: lợi nhuận và lỗ chưa được thực hiện; tổng: tổng vốn chủ sở hữu; phí: phí xử lý. Đối với các cặp giao dịch khác, số tiền (đó là số âm khi mua ngắn); hold_price: giá nắm giữ; giá trị: giá trị nắm giữ; giá: giá hiện tại.
trade_symbols: mảng các cặp giao dịch; bạn cũng có thể chuyển trong một cặp giao dịch; đồng tiền báo giá mặc định là USDT, nhưng bạn cũng có thể sử dụng các biểu tượng đồng tiền báo giá khác để backtest.
phí: phí giao hàng; đơn giản hơn, không phân biệt người làm và người nhận.
initial_balance: tài sản ban đầu; số tiền ban đầu của các cặp giao dịch mặc định là 0.
Chức năng mua: mua, tương ứng với việc mua dài và đóng ngắn hợp đồng vĩnh viễn, mà không có cơ chế khớp.
Chức năng bán: bán.
Chức năng cập nhật: để cập nhật thông tin tài khoản, cần phải đi vào từ điển giá của tất cả các cặp giao dịch. Trong [98]: lớp trao đổi:
def init(self, trade_symbols, fee=0.0004, initial_balance=10000):
self.initial_balance = initial_balance #calendary ban đầu
self.fee = phí
self.trade_symbols = trade_symbols
self.account = {
def Thương mại ((bản thân, biểu tượng, hướng, giá, số tiền):
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 #take out the fee
self.account['USDT']['fee'] += price*amount*self.fee
self.account[symbol]['fee'] += price*amount*self.fee
if cover_amount > 0: #close first
self.account['USDT']['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount #profit
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 Mua ((tự, biểu tượng, giá, số tiền):self.Trade(thượng hiệu, 1, giá, số tiền)
def Bán bản thân, biểu tượng, giá, số tiền):self.Trade(biểu tượng -1, giá, số tiền)
def Update ((self, close_price): #update các tài sản
tài khoản riêng[
Đầu tiên, hãy kiểm tra lại một chiến lược lưới vĩnh cửu cổ điển. Chiến lược này rất phổ biến trên nền tảng của chúng tôi gần đây. So với lưới giao ngay, nó không cần phải giữ tiền tệ và có thể thêm đòn bẩy, thuận tiện hơn nhiều so với lưới giao ngay. Tuy nhiên, vì nó không thể được kiểm tra lại trực tiếp, nó không thuận lợi để chọn các biểu tượng tiền tệ. Ở đây chúng tôi sử dụng công cụ kiểm tra lại ngay bây giờ để kiểm tra nó.
Ở trên cùng của
Thời gian đường K càng ngắn, kết quả backtest tương ứng càng chính xác và lượng dữ liệu cần thiết càng lớn.
Trong [241]:
ký hiệu =
e = Giao dịch (([thượng hiệu], phí=0.0002, số dư ban đầu=10000)
init_price = df.loc[0,
if kline.low < buy_price: #the lowest price of K-line is less than the current maker price; the buy order is executed
e.Buy(symbol,buy_price,value/buy_price)
if kline.high > sell_price:
e.Sell(symbol,sell_price,value/sell_price)
e.Update({symbol:kline.close})
res_list.append([kline.time, kline.close, e.account[symbol]['amount'], e.account['USDT']['total']-e.initial_balance])
res = pd.DataFrame ((data=res_list, columns=[
Phương pháp này cũng tương đối phổ biến, nhưng nền tảng FMZ không phải là rất tốt trong việc kiểm tra lại các chiến lược đa biểu tượng, chỉ cần sử dụng công cụ kiểm tra lại này để thử. Chúng tôi chọn bốn biểu tượng tiền tệ chính thống, BTC, ETH, LTC và XRP, và cấu hình 25% giá trị thị trường tương ứng, và cân bằng mỗi lệch 1%
Đầu tiên, lấy giá đóng của bốn biểu tượng trong năm qua. Có thể thấy rằng ETH có sự gia tăng lớn nhất, và ba biểu tượng khác có sự gia tăng tương tự. Nếu bạn giữ bốn biểu tượng này trung bình, giá trị ròng cuối cùng là 4.5. Sau khi kiểm tra lại, chiến lược cân bằng có giá trị ròng cuối cùng là 5.3, được tăng lên một chút.
Trong [290]:
ký hiệu = [
Chiến lược rùa là một chiến lược xu hướng cổ điển, bao gồm logic dừng lỗ hoàn chỉnh để thêm các vị trí.https://zhuanlan.zhihu.com/p/27987938Chúng ta sẽ thực hiện một phiên bản đơn giản ở đây cho backtest.
Thời gian chiến lược rùa có ảnh hưởng lớn đến chiến lược, và không nên chọn một thời gian quá ngắn. Ở đây, chúng tôi chọn 6h. Thời gian kênh Donchian được chọn là 5, và tỷ lệ vị trí được chọn là 0,003 theo backtest. Khi giá vượt qua upBand của kênh để mở 1 đơn vị vị dài, và giá tiếp tục tăng 0,3 biến động sau khi mở các vị trí, tiếp tục thêm 1 đơn vị, và giá giảm xuống dưới 2,5 biến động của giá mở mới nhất để dừng lỗ. Nguyên tắc lệnh ngắn là như nhau. Do thị trường bò lớn của ETH, chiến lược rùa đã nắm bắt xu hướng chính và cuối cùng đạt được lợi nhuận 27 lần, với đòn bẩy tối đa 4 lần trong thời gian.
Các thông số của chiến lược rùa có liên quan chặt chẽ đến thời gian, và chúng cần phải được lựa chọn thông qua backtest.
Có thể thấy từ biểu đồ giá trị ròng cuối cùng rằng chiến lược rùa là một chiến lược dài hạn, trong đó có thể không có lợi nhuận trong 3 đến 4 tháng, và lặp đi lặp lại dừng lỗ, nhưng một khi có một báo giá thị trường lớn ở một bên, chiến lược rùa có thể tận dụng xu hướng để tích lũy một vị trí lớn, giữ nó đến cuối xu hướng, kiếm được nhiều lợi nhuận. Vào cuối sự gia tăng, chiến lược sẽ tích lũy rất nhiều vị trí. Tại thời điểm này, sự biến động sẽ tương đối lớn, và thường lợi nhuận lớn sẽ được rút. Sử dụng chiến lược rùa đòi hỏi bạn phải chấp nhận những thiếu sót của nó và sự kiên nhẫn của bạn.
Trong [424]:
ký hiệu =
if kline.high > kline.up and e.account[symbol]['amount'] == 0: #first time to open long position
e.Buy(symbol,kline.up,unit) #notice the trading price here
last_price = kline.up
if e.account[symbol]['amount'] > 0 and kline.high > last_price + open_times*kline.N: #long position, buy in
e.Buy(symbol,last_price + open_times*kline.N,unit)
last_price = last_price + open_times*kline.N
if e.account[symbol]['amount'] > 0 and kline.low < last_price - stop_times*kline.N: #long position, stop loss
e.Sell(symbol,last_price - stop_times*kline.N,e.account[symbol]['amount'])
if kline.low < kline.down and e.account[symbol]['amount'] == 0: #open short
e.Sell(symbol,kline.down,unit)
last_price = kline.down
if e.account[symbol]['amount'] < 0 and kline.low < last_price - open_times*kline.N: #short position, buy in
e.Sell(symbol,last_price - open_times*kline.N,unit)
last_price = last_price - open_times*kline.N
if e.account[symbol]['amount'] < 0 and kline.high > last_price + stop_times*kline.N: #short position, stop loss
e.Buy(symbol,last_price + stop_times*kline.N,-e.account[symbol]['amount'])
e.Update({symbol:kline.close})
res_list.append([kline.time, kline.close, e.account[symbol]['amount']*kline.close, e.account['USDT']['total']])
res = pd.DataFrame ((data=res_list, columns=[
Nếu bạn thành thạo trong việc sử dụng nền tảng nghiên cứu máy tính xách tay jupyter, bạn có thể dễ dàng thực hiện các hoạt động, như thu thập dữ liệu, phân tích dữ liệu, kiểm tra lại chiến lược, hiển thị biểu đồ, v.v., đây là cách không thể tránh khỏi để giao dịch định lượng. Nếu bạn không có manh mối về viết chiến lược ngay bây giờ, bạn cũng có thể phân tích dữ liệu trước. Đối với người mới bắt đầu, các tài nguyên được khuyến cáo:
Sử dụng Python để phân tích dữ liệu:https://wizardforcel.gitbooks.io/pyda-2e/content/
Bài hướng dẫn định lượng Python:https://wizardforcel.gitbooks.io/python-quant-uqer/content/
Trong [ ]: