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.
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.
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.
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.
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.
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:
???_usdt
) pada platform perdagangan Binance (termasuk waktu, harga pembukaan, harga tertinggi, harga terendah, dan harga penutupan, dll.). Ini menyediakan data dasar untuk pelaksanaan strategi.Inti dari strategi perdagangan grid adalah berdagang menggunakan kuantitas dan kisaran harga grid yang telah ditetapkan sebelumnya. Langkah-langkah spesifiknya adalah sebagai berikut:
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_p
Untuk harga tertinggi,min_p
Untuk harga terendah,grid_num
adalah 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}} ]
Harga awal dan akhir grid:
exp(gap)
, dan seterusnya.Operasi Perdagangan:
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
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
Setelah melakukan pengujian ulang dengan konfigurasi nomor grid yang berbeda, kami memperoleh hasil berikut:
Analisis:
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。