Sumber dimuat naik... memuat...

Penyelidikan Platform Lanjutan Analisis Data Python & Ujian Kembali Strategi

Penulis:Ninabadass, Dicipta: 2022-04-13 09:12:47, Dikemas kini: 2022-04-28 11:06:13

Penyelidikan Platform Lanjutan Analisis Data Python & Strategi Backtest.ipynb

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.

Penggunaan Jupyter

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.

Tutorial

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.

Pemerolehan Data

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=BTC,start=2020-8-10,end=2021-8-10,period=1h): Klines = [] start_time = int(time.mktime(datetime.strptime(start, %Y-%m-%d).timetuple))) *1000 end_time = int(time.mktime(datetime.strptime(end, %Y-%m-%d).timetuple))) *1000 sementara start_time < end_time: res = request.get(https://fapi.binance.com/fapi/v1/klines?symbol=%sUSDT&interval=%s&startTime=%s&limit=1000%(symbol,period,start_time)) res_list = res.json() Klines += res_list #print ((datetime.utcfromtimestamp ((start_time/1000).strftime ((%Y-%m-%d %H:%M:%S), len ((res_list)) start_time = res_list[-1][0] return pd.DataFrame ((Klines,columns=[time,open,high,low,close,amount,end_time,volume,count,buy_amount,buy_volume,null]).astype ((float) Dalam [85]: df = GetKlines ((simbol=BTC,start=2021-1-1,end=2021-8-10,period=1h)

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 ((btc_klines.csv) df = pd.read_csv(btc_klines.csv,index_col=0) Dalam [87]: df Keluar[87]: ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, masa buka tinggi rendah jumlah penutupan akhir_waktu jumlah kira beli_jumlah beli_volume sifar 0 1596988800000 11575.08 11642.00 11566.07 11591.37 6541.466 1596992399999 7.592336e+07 25724 3127.898 3.630633e+07 0 1 1596992400000 11591.39 11610.23 11526.90 11534.39 6969.252 1596995999999 8.057780e+07 27403 3390.424 3.920162e+07 0 2 1596996000000 11534.39 11656.69 11527.93 11641.07 6439.365 1596999599999 7.469135e+07 25403 3446.186 3.997906e+07 0 3 1596999600000 11641.06 11665.90 11624.20 11635.30 3911.582 1597003199999 4.555459e+07 17820 1842.413 2.145768e+07 0 4 1597003200000 11635.29 11684.00 11635.29 11673.81 3461.004 1597006799999 4.036804e+07 15513 1660.575 1.936981e+07 0 .................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. 8805 1628658000000 45627.72 45894.53 45540.00 45801.45 10296.202 1628661599999 4.710187e+08 112187 4988.565 2.282399e+08 0 8806 1628661600000 45801.46 46270.00 45800.01 46087.86 26409.962 1628665199999 1.215164e+09 247170 13696.301 6.302708e+08 0 8807 1628665200000 46087.87 46450.00 46087.87 46367.38 23969.309 1628668799999 1.110210e+09 232348 11990.951 5.554267e+08 0 8808 1628668800000 46367.37 46643.13 46002.01 46217.01 23472.769 1628672399999 1.086549e+09 229533 12334.292 5.711837e+08 0 8809 1628672400000 46217.01 46329.69 46046.54 46297.16 6579.477 16286759999 3.039580e+08 78812 3313.055 1.530718e+08 0 ... 8810 baris × 12 lajur

... Dalam [88]: df.index = pd.to_datetime ((df.time,unit=ms) #mengubah indeks menjadi tarikh, yang mudah untuk plot Dalam [89]: df.close.plot ((figsize=(15,6), grid = Benar); # close price Keluar[89]:imgDalam [92]: (df.buy_amount.rolling(150).mean()/df.amount.rolling(150.mean)).plot ((figsize=(15,6),grid = True); # selepas rata, perkadaran inisiatif membeli jumlah # keadaan bahawa bahagian jumlah pembelian inisiatif meningkat selepas mencapai bahagian bawah biasanya bertindak balas kepada keadaan kenaikan harga, tetapi purata jangka panjang bahagian jumlah pembelian inisiatif adalah 49% Keluar[92]:imgDalam [93]: (df[count].rolling(100).mean (()).plot ((figsize=(15,6),grid = True); #jumlah yang dilaksanakan selepas rata,dan sebut harga pasaran mungkin disediakan di lokasi yang rendah Keluar[93]:img

Enjin Ujian Kembali

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 = {USDT:{realised_profit:0, unrealised_profit:0, total:initial_balance, fee:0}} untuk simbol dalam trade_symbols: self.account[symbol] = {jumlah:0, harga tahan:0, nilai:0, harga:0, keuntungan_tercapai:0,keuntungan_tidak tercapai:0,yuran:0}

    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[USDT][unrealised_profit] = 0 untuk simbol dalam self.trade_symbols: self.account[simbol][unrealised_profit] = (close_price[simbol] - self.account[simbol][hold_price]) *self.account[simbol][amount] self.account[simbol][price] = close_price[simbol] self.account[simbol][value] = abs(self.account[simbol][jumlah]) * close_price[simbol] self.account[USDT][unrealised_profit] += self.account[simbol][unrealised_profit] self.account[USDT][total] = bulat(self.account[USDT][realised_profit] + self.initial_balance + self.account[USDT][unrealised_profit],6) Dalam [117]: #Dalam ujian, anda dapat melihat bahawa tidak ada penekanan pada sama ada platform adalah USDT-margin atau spot. e = Exchange([BTC], bayaran=0.0004, initial_balance=10000) #mencipta objek Exchange, dan hanya satu pasangan dagangan BTC e.Beli ((BTC,40000, 0.1) #beli 0.1 BTC pada harga 40,000 e.Menjual(BTC,41000, 0.1)#menjual 0.1 BTC pada harga 41,000 e.Update (({BTC:41000}) #updtae maklumat akaun print ((e.account) #maklumat akaun akhir print (('Keuntungan: ',bulat-bulat ((e. akaun[USDT][total]-e. awal_saldo,2)) Out[117]:{USDT: {realised_profit: 96.76, unrealised_profit: 0.0, total: 10096.76, fee: 3.24}, BTC: {amount: 0.0, hold_price: 0, value: 0.0, price: 000, 41 realised_profit: 100.0, unrealised_profit: 0.0, fee: 3.24}} keuntungan: 96.76

Ujian Backtest Strategi Grid

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 Live, terdapat bot rasmi, bermula dari 4 April 2021; nilai kedudukan adalah 150, jarak grid adalah 0.01, dan keuntungan semasa adalah 3600USDT. Menggunakan parameter yang sama dan 5min K-line untuk backtest, keuntungan adalah 3937USDT. Oleh kerana nilai kedudukan pada permulaan bot adalah kurang dari 150 USDT, hasilnya agak tepat. Jika anda mengubah jarak grid menjadi 0.005, keuntungan akan menjadi 5226U. Jarak grid 0.005 jelas merupakan parameter yang lebih baik daripada 0.01, yang perlu diuji kembali untuk mengetahui.

Semakin pendek tempoh garis K, semakin tepat hasil backtest yang sepadan, dan semakin besar jumlah data yang diperlukan.

Dalam [241]: simbol = TRX df = GetKlines ((symbol=symbol,start=2021-4-4,end=2021-8-11,period=5m) Dalam [286]: nilai = 150 pct = 0.01

e = Exchange (([simbol], bayaran=0.0002, asal_saldo=10000) init_price = df.loc[0,close] res_list = [] # digunakan untuk menyimpan hasil tengah untuk baris dalam df.iterrows(): kline = baris[1] #yang hanya akan menguji satu K-line dan hanya mendapat satu pesanan beli atau satu pesanan jual, yang tidak sangat tepat buy_price = (value / pct - value) / ((value / pct) / init_price + e.account[simbol][amount]) #jual harga pesanan, kerana ia adalah pelaksanaan pembuat, juga harga yang sepadan akhir sell_price = (nilai / pct + nilai) / ((nilai / pct) / init_price + e.account[simbol][jumlah])

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=[time,price,amount,profit]) res.index = pd.to_datetime ((res.time,unit=ms) Dalam [287]: e. akaun Out[287]:{USDT: {realised_profit: 3866.633149565143, keuntungan tidak direalisasikan: 70.54622281993666, total: 13937.179372, biaya: 177.51000000000596}, TRX: {jumlah: 36497.43208747655, hold_price: 0.08203709078461048, nilai: 3064.689372385406, harga: 0.08397, hasil_keuntungan: 4044.143149565462, keuntungan tidak direalisasikan: 70.54622281993666, fe: 177.51000000000596}} Dalam [288]: res.profit.plot ((figsize=(15,6), grid = Benar); Keluar[288]:imgDalam [170]: res.price.plot ((figsize=(15,6), grid = True); # close price Keluar[170]:img

Strategi Keseimbangan Spot Backtest

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 = [BTC,ETH,LTC,XRP] data = {} untuk simbol dalam simbol: df = GetKlines ((symbol=symbol,start=2020-8-11,end=2021-8-11,period=1h) data[simbol] = df.close Dalam [291]: df = pd.DataFrame (([data[simbol].nilai untuk simbol dalam simbol],index=simbol).T Dalam [302]: e = Pertukaran ((simbol, yuran=0.0004, baki_awal=10000) res_list = [] untuk baris dalam df.iterrows(): harga = baris[1] Jumlah = e. akaun[USDT][total] e.Memperbaharui (harga) untuk simbol dalam simbol: pct = e.account[simbol][value]/jumlah jika pct > 0,26: e.Menjual ((simbol,harga[simbol],(tokoh-0.25)*jumlah/harga[simbol]) jika pct < 0,24: e.Beli ((simbol,harga[simbol],(0.25 peratus) *jumlah/harga[simbol]) res_list.append (([e.account[simbol][value] untuk simbol dalam simbol] + [e.account[USDT][total]]) res = pd.DataFrame ((data=res_list, lajur=simbol+[total]) Dalam [303]: (df/df.iloc[0,:]).plot(figsize=(15,6),grid = Benar); #plot trand oleh normalisasi Keluar[303]:imgDalam [304]: (res.total/10000-(df/df.iloc[0,:]).mean(axis=1)).plot(figsize=(15,6),grid = True); #enheance kesan Keluar[304]:img

Strategi Penyu

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 = ETH df = GetKlines ((symbol=symbol,start=2019-8-11,end=2021-8-11,period=6h) Dalam [425]: df.index = pd.to_datetime ((df.time,unit=ms) Dalam [568]: M = 5 # jumlah tempoh saluran Donchian pct = 0.003 #peratusan kedudukan yang ditambah dalam jumlah kedudukan df[up] = df[high].rolling ((M).max().shift(1) #upBand saluran Donchian, digunakan untuk membuat panjang dan menilai untuk menembusi t df[down] = df[low].rolling(M).max().shift(1) df[middle] = (df[up]+df[down])/2 df[true_range] = pd.concat([df[high]-df[low],df[high]-df[close].shift(1),df[close].shift(1)-df[low],eksis=1).max (eksis=1) df[N] = df[true_range].rolling(50).mean() #N sama dengan turun naik baru-baru ini, digunakan untuk menilai untuk membeli dan menghentikan kerugian Di [572]: open_times = 0.3 #penghakiman pembukaan kedudukan stop_times = 2.5 #stop loss e = Exchange([simbol], bayaran=0.0004, initial_balance=10000) #set the taker to 0.0004 res_list = [] last_price = 0 #harga kedudukan terbuka terakhir untuk baris dalam df.iterrows(): kline = barisan[1] jika kline.isnull().sum() > 0: #lipat bahagian tanpa data Lanjutkan unit = e.account[USDT][total]*pct/kline.N #jumlah unit kedudukan terbuka

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=[time,price,value,total]) res.index = pd.to_datetime ((res.time,unit=ms) print( Nilai pasaran akhir:,res[total][-1]) Keluar[572]:Nilai pasaran akhir: 280760.566996 Di [573]: res.total.plot ((figsize=(15,6), grid = Benar); Keluar[573]:imgDalam [571]: (res.value/res.total).plot(figsize=(15,6),grid = Benar); Keluar[571]:img

Kesimpulan

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 [ ]:


Lebih lanjut