2
tập trung vào
20
Người theo dõi

DATADATA hỗ trợ chiến lược lưới (II): mối quan hệ giữa số lượng lưới và tỷ lệ lợi nhuận

Được tạo ra trong: 2025-02-13 16:22:36, cập nhật trên: 2025-02-17 17:38:52
comments   0
hits   356

Trong bài viết trước, chúng tôi đã tiến hành sàng lọc sơ bộ các loại tiền tệ trên nền tảng DATADATA dựa trên biên độ và mức tăng giảm. Tiếp theo, chúng ta sẽ khám phá một yếu tố quan trọng trong giao dịch lưới - thiết lập số lượng lưới. Số lượng lưới quyết định tần suất giao dịch và số tiền cho mỗi giao dịch, từ đó ảnh hưởng đến tổng lợi nhuận và mức độ rủi ro của giao dịch lưới. Do đó, làm sao để thiết lập số lượng lưới hợp lý để đạt được điểm cân bằng tốt nhất là vấn đề quan trọng mà mọi nhà giao dịch lưới cần cân nhắc.

Thách thức trong việc thiết lập số lượng lưới

  • Quá ít lưới:Nếu số lượng lưới được thiết lập quá nhỏ, khoảng cách giữa các lưới sẽ lớn hơn, điều đó có nghĩa là giá cần phải dao động nhiều hơn để đạt đến lưới tiếp theo. Mặc dù số tiền giao dịch của mỗi lưới lớn hơn và có thể thu được lợi nhuận biến động lớn hơn, nhưng do ít cơ hội giao dịch hơn nên một số lợi nhuận mang lại từ những biến động nhỏ hơn có thể bị bỏ lỡ. Do đó, lợi nhuận chung có thể thấp hơn dự kiến.

  • Quá nhiều lưới:Khi số lượng lưới được thiết lập quá nhiều, phạm vi giá của mỗi lưới sẽ nhỏ hơn, cơ hội giao dịch tăng lên và việc mua bán có thể được thực hiện thường xuyên hơn. Tuy nhiên, do số vốn tham gia vào mỗi giao dịch nhỏ nên các chiến lược như vậy thường đòi hỏi giao dịch tần suất cao để tạo ra lợi nhuận. Điều này dễ dẫn đến phí giao dịch cao hơn và giao dịch quá thường xuyên có thể khiến những biến động nhỏ của thị trường trở thành nguồn lợi nhuận chính, với giới hạn lợi nhuận trên bị hạn chế.

  • Số lượng lưới hợp lý:Số lượng lưới phù hợp cần phải tính đến sự biến động của thị trường, quy mô tài khoản và tần suất giao dịch dự kiến. Khi thị trường biến động mạnh, việc tăng số lượng lưới một cách hợp lý có thể nắm bắt tốt hơn những biến động, trong khi khi nguồn vốn lớn, việc thiết lập số lượng lưới nhỏ hơn có thể dẫn đến số tiền giao dịch đơn lẻ cao hơn và giảm áp lực về phí giao dịch. Bằng cách cân bằng khoảng cách lưới và chi phí giao dịch thường xuyên, lợi nhuận và khả năng kiểm soát rủi ro của chiến lược có thể được tối đa hóa.

Số lượng lưới được thiết lập dựa trên

1. Khoảng cách lưới và phân bổ quỹ

Một tính năng cốt lõi của giao dịch lưới là phân bổ tiền cho từng khoảng thời gian bằng cách thiết lập nhiều khoảng thời gian lưới. Khi xác định số lượng lưới, trước tiên bạn cần tính toán khoảng cách giữa mỗi lưới và số tiền trong mỗi lưới. Việc thiết lập số lượng lưới không chỉ ảnh hưởng đến số tiền trong mỗi lưới mà còn quyết định phạm vi giá mua và bán của mỗi lưới.

  • Khoảng cách lưới:Khi lưới quá dày đặc, mặc dù có nhiều cơ hội giao dịch hơn, nhưng số tiền cho mỗi giao dịch lại nhỏ, điều này có thể dẫn đến giới hạn trên của tổng lợi nhuận thấp hơn; ngược lại, khi lưới quá thưa, mặc dù số tiền cho mỗi giao dịch lớn, nhưng do tần suất giao dịch thấp nên có thể bỏ lỡ cơ hội lợi nhuận.
  • Phân bổ tài trợ:Khi thiết lập số lượng lưới, chúng ta cần cân đối việc phân bổ vốn để tránh tình trạng phân tán quá nhiều vốn vào mỗi lưới và không thu được lợi nhuận hiệu quả.

2. Quỹ tài khoản và quản lý rủi ro

Số tiền trong tài khoản là yếu tố quan trọng để xác định số lượng lưới. Quỹ tài khoản lớn hơn cho phép thiết lập nhiều lưới hơn, trong khi quỹ tài khoản nhỏ hơn yêu cầu giới hạn số lượng lưới để tránh phân bổ quỹ quá phân tán, dẫn đến số tiền trong mỗi lưới quá nhỏ và không có khả năng tạo ra lợi nhuận hiệu quả.

Ngoài ra, chiến lược quản lý rủi ro của giao dịch lưới cũng cần phải tính đến việc thiết lập số lượng lưới. Đặc biệt khi thị trường biến động mạnh, quá nhiều lưới có thể dẫn đến thua lỗ lớn hơn, do đó số lượng lưới nên được kiểm soát hợp lý để tránh giao dịch quá mức.

Triển khai chiến lược giao dịch lưới

Trong ứng dụng thực tế của các chiến lược giao dịch lưới, đặc biệt là khi tối ưu hóa sự cân bằng giữa số lượng lưới và tỷ lệ lợi nhuận, DQL (Ngôn ngữ truy vấn Datadata) của nền tảng Datadata mang lại tính linh hoạt cao. DQL không chỉ hỗ trợ truy vấn, xử lý và phân tích dữ liệu hiệu quả mà còn giúp các nhà giao dịch mô phỏng và kiểm tra ngược hiệu suất của các chiến lược giao dịch lưới để tìm ra số lưới và các cấu hình tham số khác phù hợp nhất.

Thông qua DQL, chúng ta có thể dễ dàng thu thập dữ liệu K-line lịch sử từ nhiều sàn giao dịch (như Binance) và điều chỉnh các chiến lược giao dịch lưới dựa trên dữ liệu này. Theo cách này, chiến lược giao dịch lưới tối ưu có thể được sàng lọc chính xác theo các môi trường thị trường khác nhau và mức độ biến động của các loại tiền tệ cụ thể.

1. Lấy dữ liệu

Trước khi bắt đầu kiểm tra lại chiến lược giao dịch lưới của mình, trước tiên chúng ta cần thu thập dữ liệu thị trường cho loại tiền tệ mục tiêu. Sau đây là mã để truy vấn dữ liệu dòng K của một loại tiền tệ được chỉ định từ cơ sở dữ liệu:

# 获取目标币种的K线数据
data = query("select * from klines.spot_1d where Exchange = 'Binance' and Symbol = '???_usdt' order by Time")

Giải thích:

  • Bằng cách truy vấn cơ sở dữ liệu, chúng ta có thể thu được giá trị của một loại tiền tệ cụ thể (ví dụ:???_usdt) trên nền tảng giao dịch Binance (bao gồm thời gian, giá mở cửa, giá cao nhất, giá thấp nhất và giá đóng cửa, v.v.). Điều này cung cấp dữ liệu cơ bản để thực hiện chiến lược.

2. Chức năng chiến lược lưới

Cốt lõi của chiến lược giao dịch lưới là giao dịch bằng cách sử dụng số lượng lưới và phạm vi giá được thiết lập sẵn. Các bước cụ thể như sau:

  1. Tính toán khoảng cách lưới (khoảng cách) và số tiền giao dịch trên mỗi lưới (danh nghĩa)

    • Khoảng cách lưới (gap): Tính toán dựa trên tỷ lệ giữa giá cao nhất và giá thấp nhất trên thị trường. Công thức như sau: [ \text{gap} = \frac{\log(\text{max_p} / \text{min_p})}{\text{grid_num}} ] TRONG,max_pVới mức giá cao nhất,min_pVới mức giá thấp nhất,grid_numlà số lưới.

    • Số tiền giao dịch trên mỗi lưới (danh nghĩa):Số tiền giao dịch của mỗi lưới được tính bằng tổng số tiền và số lượng lưới. Công thức là: [ \text{notional} = \frac{\text{balance}}{\text{grid_num}} ]

  2. Giá bắt đầu và kết thúc của lưới

    • Giá bắt đầu và kết thúc của mỗi lưới được tính toán động dựa trên khoảng cách lưới. Ví dụ, giá khởi điểm của lưới đầu tiên là giá thấp nhất và giá khởi điểm của lưới thứ hai là giá thấp nhất nhân vớiexp(gap)và vân vân.
  3. Hoạt động giao dịch

    • Điều kiện mở cửa:Khi giá giảm xuống mức giá khởi điểm của một lưới nhất định, hoạt động mua sẽ được thực hiện.
    • Điều kiện thế chấp:Khi giá tăng đến mức giá cuối cùng của một lưới nhất định, hoạt động bán sẽ được thực hiện.
  4. Phí giao dịch:Giả sử phí xử lý cho mỗi giao dịch là 0,0001, chúng ta cần tính toán và tích lũy phí xử lý cho mỗi giao dịch.

def grid_trading_strategy(
    raw,
    grid_num,              # 网格数量
    min_p,                # 最低价格
    max_p,                # 最高价格
):
    """
    执行网格交易策略的函数
    """
    # 初始化变量
    balance = 1000                # 初始资金
    raw = raw[['Time', 'Open', 'High', 'Low', 'Close']]  # 只选择相关列

    # 网格交易策略的设置
    gap = math.log(max_p / min_p) / grid_num   # 计算网格间隔
    notional = balance / grid_num            # 每个网格的交易额

    # 初始化网格
    net = []
    for i in range(grid_num):
        net.append({
            'start_p': min_p * math.exp(i * gap),   # 每个网格的起始价格
            'end_p': min_p * math.exp((i + 1) * gap),  # 每个网格的结束价格
            'amt': notional / (min_p * math.exp(i * gap)),  # 每个网格的购买量
            'status': 'idle'                     # 初始状态为闲置
        })

    # 记录状态
    state = {
        'stock': 0,           # 当前持仓
        'fee': 0,             # 交易费用
        'longTradeVol': 0,    # 长期交易量
        'shortTradeVol': 0,   # 短期交易量
        'profitTbl': [],      # 存储每个时刻的利润
        'feeTbl': [],         # 存储每个时刻的费用
        'netCnt': 0,          # 记录净交易次数
        'idx': 0              # 当前数据的索引
    }

    # 检查开盘交易
    def check_open_orders(state, net):
        for i in range(len(net)):
            if net[i]['status'] == 'idle' and raw['Low'][state['idx']] <= net[i]['start_p'] and raw['Open'][state['idx']] > net[i]['start_p']:
                net[i]['status'] = 'taken'  # 网格被占用
                tradeVol = net[i]['amt'] * net[i]['start_p']
                state['stock'] += net[i]['amt']
                state['longTradeVol'] += tradeVol
                state['fee'] += tradeVol * 0.0001  # 假设手续费为0.0001

    # 检查平仓交易
    def check_close_orders(state, net):
        for i in range(len(net)):
            if net[i]['status'] == 'taken' and raw['High'][state['idx']] >= net[i]['end_p'] and raw['Open'][state['idx']] < net[i]['end_p']:
                net[i]['status'] = 'idle'  # 网格状态恢复为空闲
                tradeVol = net[i]['amt'] * net[i]['end_p']
                state['stock'] -= net[i]['amt']
                state['shortTradeVol'] += tradeVol
                state['fee'] += tradeVol * 0.0001  # 假设手续费为0.0001
                state['netCnt'] += 1

    # 日志记录利润和费用
    def log(state):
        addVol = state['stock'] * raw['Close'][state['idx']]  # 当前仓位的总价值
        pl = state['shortTradeVol'] - state['longTradeVol'] + addVol  # 计算利润
        state['profitTbl'].append(pl)
        state['feeTbl'].append(state['fee'])

    # 主交易循环
    for i in range(len(raw)):
        state['idx'] = i
        if raw['Close'][state['idx']] >= raw['Open'][state['idx']]:
            check_open_orders(state, net)
            check_close_orders(state, net)
        else:
            check_close_orders(state, net)
            check_open_orders(state, net)
        log(state)

    # 将利润和费用数据整理为DataFrame
    pl = DataFrame({'pl' : state['profitTbl'],  'fee' : state['feeTbl']})
    pl['time'] = raw['Time']
    pl['pl-net'] = pl['pl'] - pl['fee']
    
    return pl

3. Chạy thử nghiệm ngược

Đối với loại tiền tệ mục tiêu, chúng tôi chọn loại tiền tệ ‘oax_usdt’. Sau khi kiểm tra mã trong bài viết trước, loại tiền tệ này duy trì biên độ cao trong một thời gian dài mà không cho thấy xu hướng đơn phương đáng kể. Chúng ta có thể thử sử dụng các số lưới khác nhau (ví dụ: 5, 10, 15, v.v.) để kiểm tra ngược mô phỏng để xem tác động của các số lưới khác nhau và sau đó tìm một số lưới phù hợp. Ví dụ, bằng cách tính toán lợi nhuận ròng (pl-net) cho mỗi số lưới, chúng ta có thể đánh giá số lưới nào có thể mang lại lợi nhuận tốt nhất trong môi trường thị trường hiện tại. Sau đây là mã để chạy thử nghiệm ngược:

grid_nums = [5*i+5 for i in range(5)]
out = []
for g in grid_nums:
    pl = grid_trading_strategy(
        data,
        grid_num=g,
        min_p=min(data['Close']),
        max_p=max(data['Close'])
    )
    out.append({
        'num': g,
        'pl-net': pl['pl-net'][-1],
        'min_pl': min(pl['pl-net']),
        'max_pl': max(pl['pl-net'])
    })

return out

4. Phân tích kết quả thực nghiệm

Sau khi kiểm tra ngược với các cấu hình số lưới khác nhau, chúng tôi thu được kết quả sau:

Phân tích:

  • Khi số lượng lưới tăng lên, lợi ích ròng có xu hướng tăng dần rồi giảm dần. Khi số lượng ô lưới là 15 thì lợi nhuận ròng đạt giá trị tối đa. Khi số lượng lưới tiếp tục tăng, lợi nhuận ròng lại giảm.
  • Biến động của lợi nhuận tối thiểu và tối đa tương tự như xu hướng lợi nhuận ròng, cho thấy việc lựa chọn số lưới có tác động quan trọng đến lợi nhuận.

Tóm tắt

Việc thiết lập số lượng lưới hợp lý là một nhiệm vụ quan trọng trong chiến lược giao dịch lưới. Bằng cách tối ưu hóa số lượng lưới, hiệu suất lợi nhuận của các chiến lược giao dịch lưới có thể được cải thiện hiệu quả và rủi ro có thể được kiểm soát tốt hơn. Bài viết này phân tích các thiết lập số lưới và cung cấp các phương pháp tính toán cụ thể cùng các mã mẫu, hy vọng có thể giúp mọi người tối ưu hóa các chiến lược giao dịch lưới và cải thiện tính ổn định cũng như lợi nhuận của các chiến lược.

Ghi chú: Mã kiểm tra lưới trong bài viết này được chuyển thể từ Zhihu Da Shen Halcyon, vui lòng tham khảo bài viết để biết giải thích về mã nguồnNhật ký thực hành giao dịch thuật toán (XVIII) - Chi tiết về giao dịch lưới: Mối quan hệ giữa số lưới và lợi nhuận dài hạn