2
fokus pada
20
Pengikut

DATADATA mendukung strategi grid (II): hubungan antara jumlah grid dan tingkat pengembalian

Dibuat di: 2025-02-13 16:22:36, diperbarui pada: 2025-02-17 17:38:52
comments   0
hits   356

Dalam artikel sebelumnya, kami melakukan penyaringan awal mata uang pada platform DATADATA berdasarkan amplitudo serta kenaikan dan penurunan. Berikutnya, kita akan membahas faktor kunci dalam perdagangan grid, yaitu pengaturan jumlah grid. Jumlah grid menentukan frekuensi transaksi dan jumlah dana untuk setiap transaksi, yang pada gilirannya memengaruhi total pengembalian dan tingkat risiko perdagangan grid. Oleh karena itu, bagaimana cara mengatur jumlah grid secara wajar untuk mencapai titik keseimbangan terbaik merupakan masalah penting yang perlu dipertimbangkan oleh setiap pedagang grid.

Tantangan dalam pengaturan jumlah grid

  • Terlalu sedikit grid: Jika jumlah kisi ditetapkan terlalu kecil, interval antar kisi akan lebih besar, yang berarti harga perlu lebih berfluktuasi untuk mencapai kisi berikutnya. Meskipun jumlah transaksi setiap grid lebih besar dan dapat menangkap keuntungan fluktuasi yang lebih besar, karena peluang perdagangan yang lebih sedikit, beberapa keuntungan yang diperoleh dari fluktuasi yang lebih kecil mungkin terlewatkan. Oleh karena itu, profitabilitas keseluruhan mungkin lebih rendah dari yang diharapkan.

  • Terlalu banyak grid:Ketika jumlah grid ditetapkan terlalu banyak, kisaran harga setiap grid menjadi lebih kecil, peluang perdagangan meningkat, dan pembelian serta penjualan dapat dilakukan lebih sering. Namun, karena kecilnya modal yang terlibat dalam setiap transaksi, strategi seperti itu sering kali memerlukan perdagangan frekuensi tinggi untuk menghasilkan keuntungan. Hal ini dapat dengan mudah mengakibatkan biaya transaksi yang lebih tinggi, dan perdagangan yang terlalu sering dapat menjadikan fluktuasi pasar kecil sebagai sumber utama keuntungan, dengan batas atas keuntungan yang terbatas.

  • Jumlah grid yang wajarJumlah grid yang tepat perlu memperhitungkan volatilitas pasar, ukuran akun, dan frekuensi perdagangan yang diharapkan. Ketika volatilitas pasar tinggi, menambah jumlah grid secara tepat dapat menangkap fluktuasi dengan lebih baik, sementara ketika dana besar, menetapkan jumlah grid yang lebih sedikit dapat menghasilkan jumlah transaksi tunggal yang lebih tinggi dan mengurangi tekanan biaya transaksi. Dengan menyeimbangkan jarak grid dan biaya perdagangan yang sering, keuntungan strategi dan pengendalian risiko dapat dimaksimalkan.

Jumlah grid diatur berdasarkan

1. Jarak grid dan alokasi dana

Fitur inti perdagangan grid adalah mengalokasikan dana ke setiap interval dengan menetapkan beberapa interval grid. Saat menentukan jumlah kotak, pertama-tama Anda perlu menghitung interval antara setiap kotak dan jumlah dana di setiap kotak. Pengaturan jumlah grid tidak hanya memengaruhi jumlah dana di setiap grid, tetapi juga menentukan kisaran harga beli dan jual setiap grid.

  • Jarak grid: Ketika jaringan terlalu padat, meskipun ada lebih banyak peluang perdagangan, jumlah dana untuk setiap transaksi kecil, yang dapat menyebabkan batas bawah dan atas pengembalian total; sebaliknya, ketika jaringan terlalu jarang, meskipun jumlah dana untuk setiap transaksi besar, karena frekuensi transaksi rendah, peluang keuntungan mungkin terlewatkan.
  • Alokasi Pendanaan:Saat menetapkan jumlah kisi, kita perlu menyeimbangkan alokasi dana untuk menghindari terlalu banyak dana yang tersebar di setiap kisi dan gagal memperoleh laba secara efektif.

2. Dana Akun dan Manajemen Risiko

Dana akun merupakan faktor penting dalam menentukan jumlah grid. Dana akun yang lebih besar memungkinkan lebih banyak jaringan untuk dibentuk, sementara dana akun yang lebih kecil memerlukan batasan pada jumlah jaringan untuk menghindari alokasi dana yang terlalu tersebar, yang mengakibatkan jumlah dana terlalu kecil di setiap jaringan dan ketidakmampuan untuk menghasilkan laba yang efektif.

Selain itu, strategi manajemen risiko perdagangan grid juga perlu mempertimbangkan pengaturan jumlah grid. Terutama ketika pasar berfluktuasi hebat, terlalu banyak jaringan dapat menyebabkan kerugian yang lebih besar, jadi jumlah jaringan harus dikontrol secara wajar untuk menghindari perdagangan yang berlebihan.

Implementasi strategi perdagangan grid

Dalam penerapan strategi perdagangan grid yang sebenarnya, terutama saat mengoptimalkan keseimbangan antara jumlah grid dan tingkat pengembalian, DQL (Datadata Query Language) dari platform Datadata memberikan fleksibilitas yang luar biasa. DQL tidak hanya mendukung kueri, pemrosesan, dan analisis data yang efisien, tetapi juga membantu pedagang melakukan simulasi dan menguji ulang kinerja strategi perdagangan grid untuk menemukan nomor grid dan konfigurasi parameter lainnya yang paling sesuai.

Melalui DQL, kita dapat dengan mudah memperoleh data K-line historis dari berbagai bursa (seperti Binance) dan menyesuaikan strategi perdagangan grid berdasarkan data ini. Dengan cara ini, strategi perdagangan grid yang optimal dapat disaring secara akurat berdasarkan lingkungan pasar yang berbeda dan volatilitas mata uang tertentu.

1. Dapatkan datanya

Sebelum kita mulai menguji ulang strategi perdagangan grid kita, pertama-tama kita perlu memperoleh data pasar untuk mata uang target. Berikut ini adalah kode untuk meminta data K-line mata uang tertentu dari database:

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

Menjelaskan:

  • Dengan melakukan kueri pada basis data, kita dapat memperoleh nilai mata uang tertentu (misalnya:???_usdt) pada platform perdagangan Binance (termasuk waktu, harga pembukaan, harga tertinggi, harga terendah, dan harga penutupan, dll.). Ini menyediakan data dasar untuk pelaksanaan strategi.

2. Fungsi strategi grid

Inti dari strategi perdagangan grid adalah berdagang menggunakan kuantitas dan kisaran harga grid yang telah ditetapkan sebelumnya. Langkah-langkah spesifiknya adalah sebagai berikut:

  1. Hitung interval grid (gap) dan jumlah transaksi per grid (nosional)

    • Jarak grid (gap): Dihitung berdasarkan rasio antara harga tertinggi dan terendah di pasar. Rumusnya adalah sebagai berikut: [ \text{gap} = \frac{\log(\text{max_p} / \text{min_p})}{\text{grid_num}} ] di dalam,max_pUntuk harga tertinggi,min_pUntuk harga terendah,grid_numadalah jumlah grid.

    • Jumlah transaksi per grid (nosional):Jumlah transaksi setiap grid dihitung berdasarkan total dana dan jumlah grid. Rumusnya adalah: [ \text{notional} = \frac{\text{balance}}{\text{grid_num}} ]

  2. Harga awal dan akhir grid

    • Harga awal dan akhir setiap grid dihitung secara dinamis berdasarkan interval grid. Misalnya, harga awal grid pertama adalah harga terendah, dan harga awal grid kedua adalah harga terendah dikalikanexp(gap), dan seterusnya.
  3. Operasi Perdagangan

    • Kondisi pembukaan: Ketika harga turun ke harga awal grid tertentu, operasi beli dieksekusi.
    • Kondisi posisi kosong:Ketika harga naik ke harga akhir grid tertentu, operasi jual dieksekusi.
  4. Biaya Transaksi: Dengan asumsi biaya penanganan untuk setiap transaksi adalah 0,0001, kita perlu menghitung dan mengakumulasikan biaya penanganan untuk setiap transaksi.

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. Jalankan backtest

Untuk mata uang target, kami memilih mata uang ‘oax_usdt’. Setelah memeriksa kode pada artikel sebelumnya, mata uang ini mempertahankan amplitudo tinggi untuk jangka waktu yang lama tanpa menunjukkan tren unilateral yang signifikan. Kami dapat mencoba menggunakan nomor grid yang berbeda (misalnya: 5, 10, 15, dst.) untuk simulasi backtesting guna melihat efek dari nomor grid yang berbeda dan kemudian menemukan nomor grid yang sesuai. Misalnya, dengan menghitung laba bersih (pl-net) untuk setiap nomor grid, kita dapat mengevaluasi nomor grid mana yang dapat memberikan hasil terbaik dalam lingkungan pasar saat ini. Berikut kode untuk menjalankan backtest:

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. Analisis hasil percobaan

Setelah melakukan pengujian ulang dengan konfigurasi nomor grid yang berbeda, kami memperoleh hasil berikut:

Analisis:

  • Saat jumlah jaringan meningkat, manfaat bersih menunjukkan tren peningkatan terlebih dahulu, kemudian penurunan. Bila jumlah kisi 15, laba bersih mencapai nilai maksimum. Karena jumlah jaringan terus meningkat, laba bersih menurun.
  • Fluktuasi pengembalian minimum dan maksimum serupa dengan tren pengembalian bersih, yang menunjukkan bahwa pilihan nomor grid memiliki dampak penting pada pengembalian.

Meringkaskan

Menetapkan jumlah grid yang tepat merupakan tugas penting dalam strategi perdagangan grid. Dengan mengoptimalkan jumlah grid, kinerja laba strategi perdagangan grid dapat ditingkatkan secara efektif dan risiko dapat dikendalikan dengan lebih baik. Artikel ini menganalisis pengaturan nomor grid dan menyediakan metode perhitungan spesifik serta contoh kode, dengan harapan dapat membantu semua orang mengoptimalkan strategi perdagangan grid serta meningkatkan stabilitas dan profitabilitas strategi.

Catatan: Kode pengujian ulang grid dalam artikel ini diadaptasi dari Zhihu Da Shen Halcyon, silakan lihat artikel untuk penjelasan kode sumberCatatan Harian Praktik Trading Algoritmik (XVIII) - Detail dalam Trading Grid: Hubungan antara Jumlah Grid dan Pengembalian Jangka Panjang