Penyelidikan Platform Lanjutan
FMZ mempunyai buku nota jupyter terbina dalam untuk membantu pengguna membiasakan diri dengan API platform dan menjalankan penyelidikan strategi, dan menyokong persekitaran pembelajaran Python3 C ++ 11/17 dan Javascript. Notebook+Python adalah alat yang sangat berkuasa, yang hampir tidak ternilai untuk analisis data dan penyelidikan strategi. Walaupun backtest yang datang dengan platform FMZ sangat berguna, ia tidak sesuai untuk strategi dengan jumlah data yang kompleks dan besar.
Kawasan penyelidikan di dalam FMZ boleh digunakan, tetapi rangkaian tidak selesa. Adalah disyorkan untuk memasang pada peranti anda sendiri anaconda3, dengan buku nota dan perpustakaan berkaitan yang biasa digunakan untuk pengiraan matematik; ia boleh berkongsi persekitaran rangkaian tempatan, dan mempunyai prestasi yang lebih baik.
Terdapat banyak tutorial dalam talian untuk menggunakan kemahiran khusus buku nota dan Python. Anda boleh mencari banyak maklumat dengan mencari kata kunci, seperti kuantifikasi Python dan tutorial buku nota jupyter. Anda perlu mempelajari dan menguasai satu siri asas seperti perayap, pemprosesan data, backtest, reka bentuk strategi, dan plot.
Platform biasanya menyediakan API untuk mendapatkan K-line dengan data sejarah, dan beberapa juga menyediakan data pelaksanaan perdagangan oleh perdagangan. Kita perlu menggunakan perayap untuk mendapatkan dan menyimpan data. Anda juga boleh menerima data yang didorong oleh platform dan membuat penyimpanan pangkalan data tempatan sendiri.
Seterusnya, kita akan menunjukkan cara mendapatkan dan menyimpan data K-line kontrak kekal di Binance.
Pertama, cari dokumentasi Perpetual Swap Binance:https://binance-docs.github.io/apidocs/futures/cn/#c59e471e81. Anda boleh melihat parameter yang diperlukan dan format data yang dikembalikan. Biasanya, bilangan K-line yang diperoleh oleh API adalah terhad, dan Binance mempunyai maksimum 1000, jadi ia perlu diperoleh dengan pengulangan gelung. Keadaan di platform lain serupa dengan Binance. Perhatikan bahawa rangkaian perlu disambungkan ke rangkaian luar negara (berbanding dengan rangkaian domestik di China) untuk merakam K-line.
Tempoh yang disokong Binance:1m, 3m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 12h, 1d, 3d, 1w, 1M.
Dalam [24]:
permintaan import #permintaan rangkaian untuk perpustakaan bersama
dari tarikhwaktu tarikh import,tarikhwaktu
Masa import
import panda sebagai pd
Dalam [160]:
def GetKlines ((symbol=
Penyimpanan dan bacaan data boleh menggunakan fungsi di dalam perpustakaan panda. Formatnya adalah csv, yang boleh dibuka secara langsung dengan perisian excel.
Sebagai tambahan kepada harga tertinggi, harga terendah, harga terbuka, harga penutupan dan jumlah pelaksanaan, data K-line yang dikembalikan oleh Binance juga merangkumi jumlah dagangan keseluruhan, jumlah pembelian inisiatif, jumlah pelaksanaan, dll. Ini adalah maklumat berharga yang boleh digunakan untuk membina strategi.
Di [86]:
df.to_csv ((
...
Dalam [88]:
df.index = pd.to_datetime ((df.time,unit=
Artikel sebelumnya juga memberikan enjin backtest Python, tetapi di sini adalah versi yang dioptimumkan. Kontrak kekal dengan margin USDT (atau mata wang margin lain) sangat serupa dengan kontrak spot. Perbezaannya adalah bahawa kontrak kekal boleh dimanfaatkan dan memegang jumlah negatif (setara dengan membuat pendek), dan boleh berkongsi enjin backtest. kontrak penghantaran margin crypto adalah istimewa, kerana mereka diselesaikan dalam mata wang dan memerlukan backtest khusus.
Di sini diberikan contoh yang mudah, yang boleh melaksanakan spot multi-simbol atau pengujian belakang kekal multi-simbol. Banyak butiran diabaikan: seperti leverage niaga hadapan, pendudukan margin, kadar pembiayaan, mekanisme pembubaran, pembuatan pasaran dan urus niaga pemegang pesanan serta penyelenggaraan pesanan, tetapi biasanya tidak mempengaruhi hasil pengujian belakang biasa. Dan harga dan kuantiti pencocokan, dan kemas kini akaun semuanya perlu diimport dari luar. Pembaca boleh memperbaikinya atas asas ini.
Pengenalan kelas pertukaran:
akaun:USDT menunjukkan mata wang asas, yang tidak diperlukan; realised_profit: keuntungan dan kerugian yang telah diwujudkan; unrealised_profit: keuntungan dan kerugian yang belum diwujudkan; jumlah: jumlah ekuiti; bayaran: bayaran pengendalian. Untuk pasangan dagangan lain, jumlah (yang merupakan nombor negatif apabila membuat pendek); hold_price: harga pegangan; nilai: nilai pegangan; harga: harga semasa.
trade_symbols: pelbagai pasangan dagangan; anda juga boleh lulus dalam satu pasangan dagangan; mata wang kutipan lalai adalah USDT, tetapi anda juga boleh menggunakan simbol mata wang kutipan lain untuk backtest.
yuran: yuran penyerahan; untuk menjadi mudah, tidak membezakan pembuat dan penerima.
initial_balance: aset awal; jumlah awal pasangan dagangan lalai adalah 0.
Fungsi beli: untuk membeli, yang sepadan dengan membuat panjang dan menutup kontrak kekal, tanpa mekanisme pencocokan.
Fungsi menjual: untuk menjual.
Fungsi kemas kini: untuk mengemas kini maklumat akaun, yang perlu lulus dalam kamus harga semua pasangan dagangan. Dalam [98]: kelas Pertukaran:
def mulakan(sendiri, trade_symbols, bayaran=0.0004, asal_saldo=10000):
self.initial_balance = initial_balance #saldo awal
sendiri.bayaran = yuran
self.trade_symbols = trade_symbols
akaun sendiri = {
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
akaun sendiri[
Pertama, mari kita backtest strategi grid kekal klasik. Strategi ini sangat popular di platform kami baru-baru ini. Berbanding dengan grid spot satu, ia tidak perlu memegang mata wang dan boleh menambah leverage, yang jauh lebih mudah daripada grid spot satu. Walau bagaimanapun, kerana ia tidak boleh secara langsung backtested, ia tidak kondusif untuk memilih simbol mata wang. Di sini kita menggunakan enjin backtest sekarang untuk mengujinya.
Di bahagian atas
Semakin pendek tempoh garis K, semakin tepat hasil backtest yang sepadan, dan semakin besar jumlah data yang diperlukan.
Dalam [241]:
simbol =
e = Exchange (([simbol], bayaran=0.0002, asal_saldo=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, lajur=[
Jenis strategi ini juga agak popular, tetapi platform FMZ tidak begitu baik dalam menguji semula strategi pelbagai simbol, hanya gunakan enjin uji balik ini untuk mencuba.
Pertama, dapatkan harga penutupan empat simbol pada tahun lalu. Dapat dilihat bahawa ETH mempunyai peningkatan terbesar, dan tiga yang lain mempunyai peningkatan yang serupa. Jika anda memegang empat simbol ini secara purata, nilai bersih akhir adalah 4.5. Selepas backtest, strategi keseimbangan mempunyai nilai bersih akhir 5.3, yang sedikit ditingkatkan.
Dalam [290]:
simbol = [
Strategi penyu adalah strategi trend klasik yang merangkumi logik stop-loss lengkap untuk menambah kedudukan.https://zhuanlan.zhihu.com/p/27987938Kami akan melaksanakan versi mudah di sini untuk backtest.
Apabila harga memecahkan upBand saluran untuk membuka 1 unit kedudukan panjang, dan harga terus meningkat dengan turun naik 0.3 selepas membuka kedudukan, terus menambah 1 unit, dan harga jatuh di bawah 2.5 turun naik harga terbuka terbaru untuk menghentikan kerugian. Prinsip pesanan pendek adalah sama. Oleh kerana pasaran lembu besar ETH, strategi penyu telah menangkap trend utama dan akhirnya mencapai 27 kali keuntungan, dengan leverage maksimum 4 kali semasa tempoh.
Parameter strategi penyu berkait rapat dengan tempoh, dan mereka perlu dipilih melalui backtest. unit setiap masa posisi terbuka juga harus berhati-hati untuk tidak terlalu besar untuk mengelakkan risiko yang terlalu tinggi.
Ia dapat dilihat dari carta nilai bersih akhir bahawa strategi penyu adalah strategi jangka panjang, di mana mungkin tidak ada keuntungan selama 3 hingga 4 bulan, dan penghentian kerugian berulang, tetapi setelah terdapat sebut harga pasaran yang besar di satu sisi, strategi penyu dapat memanfaatkan trend untuk mengumpulkan kedudukan yang besar, tahan hingga akhir trend, memperoleh banyak keuntungan. Pada akhir kenaikan, strategi akan mengumpulkan banyak kedudukan. Pada masa ini, turun naiknya akan agak besar, dan sering keuntungan yang besar akan ditarik balik. Menggunakan strategi penyu memerlukan anda menerima kekurangan dan kesabaran anda.
Dalam [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, lajur=[
Jika anda mahir menggunakan platform penyelidikan buku nota jupyter, anda boleh dengan mudah melakukan operasi, seperti pengambilalihan data, analisis data, ujian balik strategi, paparan carta, dll, yang merupakan cara yang tidak dapat dielakkan untuk perdagangan kuantitatif.
Gunakan Python untuk menjalankan analisis data:https://wizardforcel.gitbooks.io/pyda-2e/content/
Tutorial kuantitatif Python:https://wizardforcel.gitbooks.io/python-quant-uqer/content/
Dalam [ ]: