Perpustakaan Python untuk keuangan matematika.
https://pypi.org/project/QFin/
pip install qfin
QFin sedang direkonstruksi untuk memanfaatkan lebih banyak prinsip pemrograman berorientasi objek. Beberapa modul dalam versi ini tidak digunakan lagi bersama dengan solusi untuk PDE/SDE (terutama di modul opsi).
QFin sekarang berisi modul yang disebut 'stochastics' yang sebagian besar akan bertanggung jawab untuk kalibrasi model dan penetapan harga opsi. Cython/C++ yang setara dengan QFin juga sedang dibuat, jadi pantau terus!
Persamaan diferensial stokastik yang memodelkan dinamika aset dasar memperluas kelas 'StochasticModel' dan memiliki daftar parameter model dan fungsi untuk menentukan harga vanilla, mengkalibrasi permukaan volatilitas tersirat, dan simulasi Monte Carlo (sangat berguna setelah kalibrasi untuk opsi yang bergantung pada jalur harga).
Di bawah ini adalah contoh sepele menggunakan ArithmeticBrownianMotion - pertama impor StochasticModel...
dari qfin.stochastics impor ArithmeticBrownianMotion
Selanjutnya inisialisasi objek kelas dengan membuat parameter model...
# abm diparameterisasi oleh Bachelier vol = .3abm = ArithmeticBrownianMotion([.3])
Abm sekarang dapat digunakan untuk menentukan harga opsi call/put vanilla (harga default adalah "CALL") di bawah set parameter yang diberikan...
# F0 = 101# X = 100# T = 1abm.vanilla_pricing(101, 100, 1, "CALL")# Harga Call : 1.0000336233656906
Dengan menggunakan harga call-put parity put juga dapat diperoleh...
# F0 = 99# X = 100# T = 1abm.vanilla_pricing(99, 100, 1, "PUT")# Harga Put: 1.0000336233656952
Kalibrasi dan simulasi proses selanjutnya juga tersedia - perhatikan bahwa beberapa proses memiliki volatilitas statis dan tidak dapat dikalibrasi ke permukaan ivol.
Gerak Brown aritmatika dapat disimulasikan sebagai berikut...
# F0 = 100# n (langkah) = 10000# dt = 1/252# T = 1abm.simulate(100, 10000, 1/252, 1)
Hasil simulasi beserta karakteristik simulasi disimpan di bawah tuple 'path_characteristics' : (paths, n, dt, T).
Dengan menggunakan karakteristik jalur tersimpan, kita dapat menemukan harga panggilan sama seperti sebelumnya dengan merata-ratakan setiap pembayaran jalur yang didiskon (dengan asumsi proses stok) dengan tarif nol, kita dapat menghindari diskon sebagai berikut dan mencari nilai opsi sebagai berikut...
# daftar jalur payoffspayoffs = []# opsi strike priceX = 99# iterasi melalui nilai jalur terminal untuk mengidentifikasi jalur pembayaran di abm.path_characteristics[0]: # appending CALL payoff payoffs.append(max((path[-1] - X ), 0))# nilai opsi hari ininp.rata-rata(bayaran)# Harga Panggilan: 1.0008974837343871
Kita dapat melihat di sini bahwa harga yang disimulasikan menyatu dengan harga dalam bentuk close-form.
Penetapan harga opsi teoretis untuk saham yang tidak membayar dividen tersedia melalui kelas BlackScholesCall dan BlackScholesPut.
dari qfin.options import BlackScholesCallfrom qfin.options import BlackScholesPut# 100 - harga aset dasar awal# .3 - volatilitas dasar aset# 100 - harga kesepakatan opsi# 1 - waktu jatuh tempo (tahunan)# .01 - tingkat bunga bebas risikoeuro_call = BlackScholesCall(100, .3, 100, 1, .01)euro_put = BlackScholesPut(100, .3, 100, 1, .01)
print('Harga panggilan: ', euro_call.price)print('Harga masukan: ', euro_put.price)
Call price: 12.361726191532611 Put price: 11.366709566449416
Tersedia turunan parsial orde pertama dan beberapa orde kedua dari model penetapan harga Black-Scholes.
Derivatif parsial orde pertama sehubungan dengan harga aset yang mendasarinya.
print('Panggil delta: ', euro_call.delta)print('Masukkan delta: ', euro_put.delta)
Call delta: 0.5596176923702425 Put delta: -0.4403823076297575
Derivatif parsial orde kedua sehubungan dengan harga aset yang mendasarinya.
print('Panggil gamma: ', euro_call.gamma)print('Masukkan gamma: ', euro_put.gamma)
Call gamma: 0.018653923079008084 Put gamma: 0.018653923079008084
Derivatif parsial orde pertama sehubungan dengan volatilitas aset yang mendasarinya.
print('Panggil vega: ', euro_call.vega)print('Masukkan vega: ', euro_put.vega)
Call vega: 39.447933090788894 Put vega: 39.447933090788894
Derivatif parsial orde pertama sehubungan dengan waktu jatuh tempo.
print('Panggil theta: ', euro_call.theta)print('Masukkan theta: ', euro_put.theta)
Call theta: -6.35319039407325 Put theta: -5.363140560324083
Simulasi jalur aset tersedia menggunakan proses stokastik umum.
Model standar untuk menerapkan gerak Brown geometris.
dari qfin.simulations import GeometricBrownianMotion# 100 - harga aset dasar awal# 0 - penyimpangan aset dasar (mu)# .3 - volatilitas aset dasar# 1/52 - langkah waktu (dt)# 1 - waktu hingga jatuh tempo (tahunan)gbm = GeometrisBrownianMotion(100, 0, .3, 1/52, 1)
cetak(gbm.simulated_path)
[107.0025048205179, 104.82320056538235, 102.53591127422398, 100.20213816642244, 102.04283245358256, 97.75115579923988, 95.19613943526382, 96.9876745495834, 97.46055174410736, 103.93032659279226, 107.36331603194304, 108.95104494118915, 112.42823319947456, 109.06981862825943, 109.10124426285238, 114.71465058375804, 120.00234814086286, 116.91730159923688, 118.67452601825876, 117.89233466917202, 118.93541257993591, 124.36106523035058, 121.26088015675688, 120.53641952983601, 113.73881043255554, 114.91724168548876, 112.94192281337791, 113.55773877160591, 107.49491796151044, 108.0715118831013, 113.01893111071472, 110.39204535739405, 108.63917240906524, 105.8520395233433, 116.2907247951675, 114.07340779267213, 111.06821275009212, 109.65530380775077, 105.78971667172465, 97.75385009989282, 97.84501925249452, 101.90695475825825, 106.0493833583297, 105.48266575656817, 106.62375752876223, 112.39829297429974, 111.22855058562658, 109.89796974828265, 112.78068777325248, 117.80550869036715, 118.4680557054793, 114.33258212280838]
Model volatilitas stokastik berdasarkan makalah Heston (1993).
dari qfin.simulations import StochasticVarianceModel# 100 - harga aset dasar awal# 0 - penyimpangan aset dasar (mu)# .01 - tingkat bunga bebas risiko# .05 - dividen berkelanjutan# 2 - tingkat di mana varians kembali ke jangka panjang yang tersirat varians# .25 - varians jangka panjang yang tersirat karena waktu cenderung tak terhingga# -.7 - korelasi gerakan yang dihasilkan# .3 - Volatilitas varians# 1/52 - langkah waktu (dt)# 1 - waktu hingga jatuh tempo (tahunan)svm = StochasticVarianceModel(100, 0, .01, .05, 2, .25, -.7, .3, .09, 1/52, 1)
cetak(svm.simulated_path)
[98.21311553503577, 100.4491317019877, 89.78475515902066, 89.0169762497475, 90.70468848525869, 86.00821802256675, 80.74984494892573, 89.05033807013137, 88.51410029337134, 78.69736798230346, 81.90948751054125, 83.02502248913251, 83.46375102829755, 85.39018282900138, 78.97401642238059, 78.93505221741903, 81.33268688455111, 85.12156706038515, 79.6351983987908, 84.2375291273571, 82.80206517176038, 89.63659376223292, 89.22438477640516, 89.13899271995662, 94.60123239511816, 91.200165507022, 96.0578905115345, 87.45399399599378, 97.908745925816, 97.93068975065052, 103.32091104292813, 110.58066464778392, 105.21520242908348, 99.4655106985056, 106.74882010453683, 112.0058519886151, 110.20930861932342, 105.11835510815085, 113.59852610881678, 107.13315204738092, 108.36549026977205, 113.49809943785571, 122.67910031073885, 137.70966794451425, 146.13877267735612, 132.9973784430374, 129.75750117504984, 128.7467891695649, 127.13115959080305, 130.47967713110302, 129.84273088908265, 129.6411527208744]
Penetapan harga simulasi untuk opsi eksotik tersedia berdasarkan asumsi yang terkait dengan proses stokastik masing-masing. Gerak Brown Geometris merupakan dasar yang mendasari proses stokastik yang digunakan dalam setiap simulasi Monte Carlo. Namun, jika parameter tambahan disediakan, proses stokastik yang sesuai akan digunakan untuk menghasilkan setiap jalur sampel.
dari qfin.simulations import MonteCarloCallfrom qfin.simulations import MonteCarloPut# 100 - harga kesepakatan# 1000 - jumlah jalur harga yang disimulasikan# .01 - suku bunga bebas risiko# 100 - harga aset dasar awal# 0 - penyimpangan aset dasar (mu)# .3 - volatilitas aset dasar# 1/52 - langkah waktu (dt)# 1 - waktu hingga jatuh tempo (tahunan)call_option = MonteCarloCall(100, 1000, .01, 100, 0, .3, 1/52, 1)# Parameter tambahan ini akan menghasilkan harga Monte Carlo berdasarkan proses volatilitas stokastik# 2 - tingkat di mana varians kembali ke nilai panjang yang tersirat varians lari# .25 - varians jangka panjang yang tersirat karena waktu cenderung tak terhingga# -.5 - korelasi gerak yang dihasilkan# .02 - dividen berkelanjutan# .3 - Volatilitasput_option varians = MonteCarloPut(100, 1000, .01, 100, 0, .3, 1/52, 1, 2, .25, -.5, .02, .3)
cetak(pilihan_panggilan.harga)cetak(pilihan_pilihan.harga)
12.73812121792851 23.195814963576286
dari qfin.simulations import MonteCarloBinaryCallfrom qfin.simulations import MonteCarloBinaryPut# 100 - harga kesepakatan# 50 - pembayaran opsi biner# 1000 - jumlah jalur harga simulasi# .01 - suku bunga bebas risiko# 100 - harga aset dasar awal# 0 - dasar penyimpangan aset (mu)# .3 - volatilitas aset dasar # 1/52 - langkah waktu (dt) # 1 - waktu jatuh tempo (tahunan)binary_call = MonteCarloBinaryCall(100, 50, 1000, .01, 100, 0, .3, 1/52, 1)binary_put = MonteCarloBinaryPut(100, 50, 1000, .01, 100, 0, .3, 1/52, 1)
cetak(panggilan_biner.harga)cetak(put_biner.harga)
22.42462873441866 27.869902820039087
dari qfin.simulations import MonteCarloBarrierCallfrom qfin.simulations import MonteCarloBarrierPut# 100 - harga kesepakatan# 50 - pembayaran opsi biner# 1000 - jumlah jalur harga simulasi# .01 - tingkat bunga bebas risiko# 100 - harga aset dasar awal# 0 - mendasari penyimpangan aset (mu)# .3 - volatilitas aset dasar# 1/52 - langkah waktu (dt)# 1 - waktu hingga jatuh tempo (tahunan)# Benar/Salah - Penghalang Naik atau Turun# Benar/Salah - Penghalang Masuk atau Keluarbarrier_call = MonteCarloBarrierCall(100, 1000, 150, .01, 100, 0, .3, 1/52, 1, up=Benar, keluar=Benar)barrier_put = MonteCarloBarrierCall(100, 1000, 95, .01, 100, 0, .3, 1/52, 1, atas=Salah, keluar=Salah)
cetak(panggilan_biner.harga)cetak(put_biner.harga)
4.895841997908933 5.565856754630819
dari qfin.simulations import MonteCarloAsianCallfrom qfin.simulations import MonteCarloAsianPut# 100 - harga kesepakatan# 1000 - jumlah jalur harga yang disimulasikan# .01 - suku bunga bebas risiko# 100 - harga aset dasar awal# 0 - penyimpangan aset dasar (mu)# .3 - volatilitas aset dasar# 1/52 - langkah waktu (dt)# 1 - waktu hingga jatuh tempo (tahunan)asian_call = MonteCarloAsianCall(100, 1000, .01, 100, 0, .3, 1/52, 1)asian_put = MonteCarloAsianPut(100, 1000, .01, 100, 0, .3, 1/52, 1 )
print(asian_call.harga)print(asian_put.harga)
6.688201154529573 7.123274528125894
dari qfin.simulations import MonteCarloExtendibleCallfrom qfin.simulations import MontecarloExtendiblePut# 100 - harga kesepakatan# 1000 - jumlah jalur harga yang disimulasikan# .01 - suku bunga bebas risiko# 100 - harga aset dasar awal# 0 - penyimpangan aset dasar (mu)# .3 - volatilitas aset dasar# 1/52 - langkah waktu (dt)# 1 - waktu hingga jatuh tempo (tahunan)# .5 - perpanjangan jika uang habis pada expiredextendible_call = MonteCarloExtendibleCall(100, 1000, .01, 100, 0, .3, 1/52, 1, .5)extendible_put = MonteCarloExtendiblePut(100, 1000, . 01, 100, 0, .3, 1/52, 1, .5)
cetak(panggilan_diperpanjang.harga)cetak(diperpanjang_put.harga)
13.60274931789973 13.20330578685724