Python untuk membantu menguji produk struktural

Terinspirasi oleh iklan produk struktural di Habré , mengadaptasi skrip python untuk pengujian independen mereka. Gagasan utamanya adalah bahwa produk-produk ini menawarkan perlindungan modal 100%. Dan mengingat 10 tahun pasar banteng, kinerja historis dari produk-produk seperti itu memukau dengan surga bebas risiko.

Artikel ini akan menarik bagi programmer python pemula yang tertarik untuk mengelola uang mereka. Bagi sebagian orang, alat ini berguna untuk membangun strategi sendiri. Tapi hati-hati, broker menulis bahwa ini bukan untuk semua orang.

Kode diposting di GitHub sebagai notepad Jupyter. Ayo pergi!

Beberapa kata untuk diperkenalkan


Saya akan menguji pada saham Amerika dan hasilnya akan lebih rendah daripada di rubel. Pasar Rusia secara absolut pada grafik lebih menarik, tetapi ada lebih banyak risiko di dalamnya. Esensi dari tes tidak berubah dari ini.

Kami mengambil data dari Alpha Advantages gratis, tempat Anda pertama kali perlu mendapatkan kunci dengan berbagi alamat email. Instruksi singkat dalam buku catatan. Anda dapat mengambil kutipan dari sekuritas Rusia di Finam.

Karisma Produk Struktural


Secara singkat, modal Anda aman, dan hasilnya lebih tinggi dari setoran bank (obligasi pemerintah). Berikut adalah beberapa elemen dari persamaan yang hilang:

  • Selalu ada pendapatan pada setoran bank, tetapi ada risiko bermain nol;
  • Anda akan mendapat untung, tetapi broker mengklaim potongan kue yang signifikan;
  • Ada batasan penggunaan uang yang diinvestasikan;
  • Pialang secara praktis tidak menanggung risiko apa pun, dan hanya berpartisipasi dalam keuntungan.

Strategi


Pertimbangkan strategi paling sederhana:

  • Kami membeli 90% dari obligasi jangka pendek modal;
  • Untuk sisanya, kami membeli aset berisiko tinggi;
  • Kami berhenti di 10% dari harga pada awal periode.

Inti dari strategi: obligasi treasuri memberikan 1-3% per tahun, praktis tidak termasuk penarikan (jika ada hasil). 10% dari penarikan aset yang dibeli dengan modal 10% akan menjadi risiko yang akan ditanggung oleh obligasi. Selama periode pasar bullish, beberapa saham dapat tumbuh beberapa kali, yang akan memberi kita kebahagiaan.

Untuk mengulangi strategi ini secara manual, Anda harus melakukan langkah-langkah berikut:

  • Beli obligasi. Misalnya dalam bentuk ETF.
  • Beli saham.
  • Lakukan stop order.

Cara menguji


Saya akan menjelaskan secara singkat beberapa solusi dengan kutipan kode yang membuat pengujian cukup fleksibel dan nyaman.

Jadwalkan


Anda dapat menyeimbangkan kembali dalam periode berikut: minggu, bulan, tahun. Dan juga pada hari apa pun dalam periode: yang pertama, ke-N, terakhir. Kelas `Schedule ()` bertanggung jawab untuk ini:

#         df = pd.DataFrame([], index=pd.date_range(start, end, freq='B')) # ... #      ,   df = df[df.index.isin(dates)].copy() # ... #    # ... elif freq == 'week': groupby = ['year', 'week'] elif freq == 'month': groupby = ['year', 'month'] elif freq == 'year': groupby = ['year'] #      grouped = df.groupby(groupby) for idx, grp in grouped: if len(grp) >= abs(day): df.loc[grp.iloc[day].name, 'allow'] = True 

Siklus data


 StructuredProductMill().run() 

Seperti yang dijelaskan dalam salah satu artikel , kami hanya dapat mem-bypass tanggal penyeimbangan dalam satu siklus dan melewati semua hari lainnya. Tapi kemudian kita kehilangan statistik perubahan aset dalam periode itu, kita tidak akan melihat profitabilitas dan penarikan untuk setiap hari. Skrip ini, yang merugikan kecepatan, berputar setiap hari, yang memungkinkan Anda untuk melihat nilai pasar dari posisi terbuka dan menerapkan pemeriksaan stop order.

Penyeimbangan ulang


 StructuredProductMill().rebalance() 

Di sini, aset yang dapat dibuka dialokasikan ke modal yang tersedia. Setelah membandingkan perhitungan dengan posisi terbuka, transaksi dilakukan untuk angka yang diperlukan:

 #  :       balance = self._cash + self.position_balance(day) #         df = day.merge(self._positions[['quantity']], how='left', left_index=True, right_index=True) # ... #              day.loc[is_allow, 'size_order'] = day[is_allow]['size'] / day[is_allow]['size'].sum() #        day['position_to'] = (balance * day['size_order']) // day['open'] #     day['order'] = day['position_to'] - day['position'] # ... #   for symbol, row in day[fltr].iterrows(): self.trade(row['dt'], symbol, row.order, row.open, 'O' if row.order > 0 else 'C') 

Penawaran


 StructuredProductMill().trade() 

Dan di sini, untuk kecepatan, Anda dapat mengorbankan detail dan hanya mengontrol perubahan dalam profitabilitas setiap posisi. Tetapi skrip memperhitungkan komisi akun dan nilai aset, dan juga menyimpan riwayat transaksi, yang memungkinkan Anda untuk menghitung transaksi dan menjalankan stop order pada setiap hari pengujian. Metode ini memperbarui posisi dan ukuran cache gratis.

Luncurkan


Untuk menjalankan, Anda harus menentukan satu set aset dengan saham dan parameter pengujian. Kami akan menguji produk struktural untuk tahun kalender:

 #   portfolio = {'MINT': 0.9, 'AAPL': 0.1,} #   SYMBOLS = list(portfolio.keys()) df = prices(SYMBOLS) params = { 'benchmark': 'SPY', #     'balance': 100_000, #   'portfolio': portfolio, 'rebalance_day': -1, #      'freq': 'year', #    'stop_loss': 0.1, # -  10% #          'reset_position_prices': True, 'allow_method': allow_default, 'start': pd.to_datetime('2011-01-01'), #   } #  ,      pm = StructuredProductMill(params, prices=prices(SYMBOLS + [params['benchmark']]), show_progress=True) pm.check_params().prepare() #   pm.run() #   pm.print_results(); #   pm.charts() 

Di bagian bawah notebook ada grafik dengan profitabilitas dan drawdown pada tanggal rebalance (pada akhir tahun), yang menegaskan drawdown modal yang sangat rendah pada saat laporan dan terus meningkatkan profitabilitas. Meskipun profitabilitas ini turun ke indeks luas perusahaan Amerika S&P 500.

Hasil


Tes tersebut melibatkan instrumen Amerika yang diperdagangkan bebas sejak 2011:

  • BIL - ETF untuk obligasi jangka pendek dengan imbal hasil 2% per tahun pada saat penulisan. Ingatlah bahwa pada periode 2009 hingga 2017, harga mendekati nol. Alternatifnya adalah dengan menggunakan MINT (dana untuk instrumen pendapatan tetap jangka pendek).
  • AAPL - Stok Apple.
  • MSFT - Microsoft stock.
  • TSLA - Tesla membagikan.

Aapl


Desain ini menghasilkan pendapatan 8 tahun 24% (rata-rata tahunan 2,6%) dengan drawdown antara -6%. Tetapi pada pergantian tahun, penarikannya adalah sekitar nol. Berhenti tidak tersentuh, pasar dengan 180% dari pendapatan kehilangan pesanan.

Profitabilitas dan drawdown untuk setiap hari

Profitabilitas dan drawdown untuk setiap hari (profitabilitas di sebelah kiri, drawdown di sebelah kanan).

Profitabilitas dan drawdown pada pergantian tahun

Profitabilitas dan drawdown pada persimpangan tahun (profitabilitas di sebelah kiri, drawdown di sebelah kanan).

Msft


Desain ini menghasilkan pendapatan 8 tahun sebesar 26% (rata-rata tahunan 2,75%) dengan drawdown antar -2%. Di persimpangan tahun, tidak ada drawdown.

Profitabilitas dan drawdown untuk setiap hari

Profitabilitas dan drawdown pada pergantian tahun

TSLA


Desain ini menghasilkan pendapatan 8 tahun sebesar 45% (rata-rata tahunan 4,6%) dengan drawdown antara rebalances sebanyak -15%. Namun semua ini pada tahun 2013, ketika Tesla tumbuh hampir 5 kali lipat. Pada pergantian tahun, drawdown -2%. Penumpang paling sibuk, tetapi juga menguntungkan.

Profitabilitas dan drawdown untuk setiap hari

Profitabilitas dan drawdown pada pergantian tahun

Kesimpulan


Notepad memungkinkan Anda menguji komposisi portofolio apa pun. Ini bisa berupa dana yang hina atau beberapa perusahaan. Meski umumnya tanpa aset pelindung.

Repositori GitHub .

Source: https://habr.com/ru/post/id461583/


All Articles