Penelitian Platform Lanjutan
FMZ memiliki built-in jupyter notebook untuk membantu pengguna membiasakan diri dengan API platform dan melakukan penelitian strategi, dan mendukung lingkungan pembelajaran Python3 C++11/17 dan Javascript. Notebook+Python adalah alat yang sangat kuat, yang hampir tidak bisa dipungkiri untuk analisis data dan penelitian strategi. Meskipun backtest yang datang dengan platform FMZ sangat berguna, itu tidak cocok untuk strategi dengan volume data yang kompleks dan besar.
Lingkungan penelitian di dalam FMZ dapat digunakan, tetapi jaringan tidak nyaman. Disarankan untuk menginstal pada perangkat Anda sendiri anaconda3, dengan notebook dan perpustakaan terkait yang umum digunakan untuk perhitungan matematika; dapat berbagi lingkungan jaringan lokal, dan memiliki kinerja yang lebih baik.
Ada banyak tutorial online untuk menggunakan keterampilan tertentu dari notebook dan Python. Anda dapat menemukan banyak informasi dengan mencari kata kunci, seperti kuantifikasi Python dan tutorial notebook jupyter. Anda perlu belajar dan menguasai serangkaian dasar seperti crawler, pemrosesan data, backtest, desain strategi, dan plot.
Platform umumnya menyediakan API untuk mendapatkan K-line dengan data sejarah, dan beberapa juga menyediakan data pelaksanaan perdagangan dengan perdagangan.
Selanjutnya, kita akan menunjukkan cara mendapatkan dan menyimpan data K-line dari kontrak abadi di Binance.
Pertama, cari dokumentasi Binance Perpetual Swap:https://binance-docs.github.io/apidocs/futures/cn/#c59e471e81. Anda dapat melihat parameter yang diperlukan dan format data yang dikembalikan. Biasanya, jumlah K-line yang diperoleh oleh API terbatas, dan Binance memiliki maksimum 1000, sehingga perlu diperoleh dengan iterasi loop. Situasi di platform lain mirip dengan Binance. Perhatikan bahwa jaringan perlu terhubung ke jaringan luar negeri (dibandingkan dengan jaringan domestik di Cina) untuk merayapi K-line.
Periode yang didukung Binance:1m, 3m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 12h, 1d, 3d, 1w, 1M.
Dalam [24]:
permintaan impor #permintaan jaringan untuk perpustakaan umum
dari tanggal/waktu tanggal impor,tanggal/waktu
waktu impor
mengimpor panda sebagai pd
Di [160]:
def GetKlines ((simbol=
Penyimpanan dan pembacaan data dapat menggunakan fungsi di dalam perpustakaan panda. Formatnya adalah csv, yang dapat langsung dibuka dengan perangkat lunak excel.
Selain harga tertinggi, harga terendah, harga terbuka, harga penutupan dan volume yang dilaksanakan, data K-line yang dikembalikan oleh Binance juga mencakup jumlah perdagangan total, jumlah pembelian inisiatif, jumlah eksekusi, dll. Ini adalah informasi berharga yang dapat digunakan untuk membangun strategi.
Di [86]:
df.to_csv ((
...
Di [88]:
df.index = pd.to_datetime ((df.time,unit=
Artikel sebelumnya juga memberikan mesin backtest Python, tetapi di sini adalah versi yang dioptimalkan. USDT-margined (atau lain kutipan mata uang-margined) kontrak abadi sangat mirip dengan kontrak spot. Perbedaannya adalah bahwa kontrak abadi dapat dimanfaatkan dan memegang jumlah negatif (setara dengan membuat pendek), dan dapat berbagi mesin backtest. kontrak pengiriman crypto-margined khusus, karena mereka diselesaikan dalam mata uang dan memerlukan backtest khusus.
Di sini diberikan contoh sederhana, yang dapat mengimplementasikan spot multi-simbol atau backtesting perpetual multi-simbol. Banyak detail diabaikan: seperti leverage futures, margin occupation, funding rate, mekanisme likuidasi, market making dan transaksi order taker serta pemeliharaan order, tetapi biasanya tidak mempengaruhi hasil backtest normal. Dan harga dan kuantitas pencocokan, dan pembaruan akun semuanya perlu diimpor dari luar. Pembaca dapat memperbaikinya atas dasar ini.
Pengantar kelas pertukaran:
account:USDT menunjukkan mata uang dasar, yang tidak diperlukan; realised_profit: keuntungan dan kerugian yang telah direalisasikan; unrealised_profit: keuntungan dan kerugian yang belum direalisasikan; total: total ekuitas; biaya: biaya penanganan. Untuk pasangan perdagangan lainnya, jumlah (yang merupakan angka negatif ketika melakukan shorting); hold_price: harga kepemilikan; nilai: nilai kepemilikan; harga: harga saat ini.
trade_symbols: array dari pasangan perdagangan; Anda juga dapat lulus dalam satu pasangan perdagangan; mata uang penawaran default adalah USDT, tetapi Anda juga dapat menggunakan simbol mata uang penawaran lain untuk backtest.
biaya: biaya penyerahan; untuk menjadi sederhana, tidak membedakan pembuat dan penerima.
initial_balance: aset awal; jumlah awal dari pasangan perdagangan default adalah 0.
Fungsi beli: untuk membeli, yang sesuai dengan membuat panjang dan menutup pendek kontrak abadi, tanpa mekanisme pencocokan.
Fungsi jual: untuk menjual.
Fungsi pembaruan: untuk memperbarui informasi akun, yang perlu dilewati dalam kamus harga dari semua pasangan perdagangan. Di [98]: kelas Pertukaran:
def init(self, trade_symbols, fee=0.0004, initial_balance=10000):
self.initial_balance = initial_balance #saldo awal
biaya sendiri = biaya
self.trade_symbols = trade_symbols
sendiri.account = {
def Perdagangan ((sendiri, simbol, arah, harga, jumlah):
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 Beli ((sendiri, simbol, harga, jumlah):self.Trade(simbol, 1, harga, jumlah)
def Jual ((sendiri, simbol, harga, jumlah):self.Trade(simbol, -1, harga, jumlah)
def Update ((self, close_price): #update aset
sendiri.account[
Pertama, mari kita backtest strategi grid abadi klasik. Strategi ini sangat populer di platform kami baru-baru ini. Dibandingkan dengan grid spot, tidak perlu memegang mata uang dan dapat menambahkan leverage, yang jauh lebih nyaman daripada grid spot. Namun, karena tidak dapat langsung backtest, tidak kondusif untuk memilih simbol mata uang. Di sini kita menggunakan mesin backtest sekarang untuk mengujinya.
Di bagian atas
Semakin pendek periode K-line, semakin akurat hasil backtest yang sesuai, dan semakin besar jumlah data yang diperlukan.
Di [241]:
simbol =
e = Exchange (([simbol], biaya=0.0002, initial_balance=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, kolom=[
Jenis strategi ini juga relatif populer, tetapi platform FMZ tidak sangat baik dalam backtesting strategi multi-simbol, cukup gunakan mesin backtest ini untuk mencobanya. Kami memilih empat simbol mata uang utama, BTC, ETH, LTC, dan XRP, dan mengkonfigurasi 25% dari nilai pasar masing-masing, dan menyeimbangkan setiap penyimpangan 1%.
Pertama, dapatkan harga penutupan dari empat simbol dalam setahun terakhir. Hal ini dapat dilihat bahwa ETH memiliki kenaikan terbesar, dan tiga lainnya memiliki kenaikan yang sama. Jika Anda memegang empat simbol ini rata-rata, nilai bersih akhir adalah 4.5. Setelah backtest, strategi keseimbangan memiliki nilai bersih akhir 5.3, yang sedikit ditingkatkan.
Di [290]:
simbol = [
Strategi penyu adalah strategi tren klasik yang mencakup logika stop-loss lengkap untuk menambahkan posisi.https://zhuanlan.zhihu.com/p/27987938Kami akan menerapkan versi sederhana di sini untuk backtest.
Periode strategi penyu memiliki pengaruh besar pada strategi, dan tidak disarankan untuk memilih periode yang terlalu pendek. Di sini, kita memilih 6h. Periode saluran Donchian dipilih sebagai 5, dan rasio posisi dipilih sebagai 0,003 sesuai dengan backtest. Ketika harga menembus upBand saluran untuk membuka 1 unit posisi panjang, dan harga terus naik dengan volatilitas 0,3 setelah membuka posisi, terus tambahkan 1 unit, dan harga turun di bawah 2,5 Volatilitas harga terbuka terbaru untuk menghentikan kerugian. Prinsip pesanan pendek sama. Karena pasar bull besar ETH, strategi penyu telah menangkap tren utama dan akhirnya mencapai 27 kali keuntungan, dengan leverage maksimum 4 kali selama periode tersebut.
Parameter strategi kura-kura terkait erat dengan periode, dan mereka perlu dipilih melalui backtest.
Dari grafik nilai bersih akhir dapat dilihat bahwa strategi penyu adalah strategi jangka panjang, di mana mungkin tidak ada keuntungan selama 3 sampai 4 bulan, dan kehilangan berhenti berulang, tetapi setelah ada penawaran pasar yang besar di satu sisi, strategi penyu dapat memanfaatkan tren untuk mengumpulkan posisi besar, menahannya hingga akhir tren, menghasilkan banyak keuntungan. Pada akhir kenaikan, strategi akan mengumpulkan banyak posisi. Pada saat ini, volatilitas akan relatif besar, dan seringkali keuntungan besar akan ditarik kembali. Menggunakan strategi penyu mengharuskan Anda menerima kekurangannya dan kesabaran Anda.
Di [424]:
simbol =
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, kolom=[
Jika Anda mahir menggunakan platform penelitian notebook jupyter, Anda dapat dengan mudah melakukan operasi, seperti akuisisi data, analisis data, backtest strategi, tampilan grafik, dll, yang merupakan cara yang tak terelakkan untuk perdagangan kuantitatif.
Gunakan Python untuk melakukan analisis data:https://wizardforcel.gitbooks.io/pyda-2e/content/
Tutorial kuantitatif Python:https://wizardforcel.gitbooks.io/python-quant-uqer/content/
Dalam [ ]: