用於數學金融的 Python 函式庫。
https://pypi.org/project/QFin/
pip install qfin
QFin 正在重建,以利用更多物件導向程式設計的原理。 此版本中的幾個模組與 PDE/SDE 的解決方案一起被棄用(主要在選項模組中)。
QFin 現在包含一個名為「隨機」的模組,該模組主要負責模型校準和選擇權定價。 與 QFin 等效的 Cython/C++ 也正在建構中,敬請期待!
模擬基礎資產動態的隨機微分方程擴展了「StochasticModel」類,並擁有一系列模型參數和函數,用於定價普通、校準隱含波動率表面和蒙特卡羅模擬(在校準路徑相關選擇權的定價後特別有用)。
以下是使用 ArithmeticBrownianMotion 的簡單範例 - 首先匯入 StochasticModel...
從 qfin.stochastics 匯入 ArithmeticBrownianMotion
接下來透過參數化模型來初步化類別物件......
# 由 Bachelier 參數化的 abm vol = .3abm = ArithmeticBrownianMotion([.3])
abm 現在可用於在給定參數集下對普通看漲/看跌期權進行定價(價格預設為“CALL”)...
# F0 = 101# X = 100# T = 1abm.vanilla_pricing(101, 100, 1, "CALL")# 贖回價:1.0000336233656906
使用買權平價也可以獲得賣權價格...
# F0 = 99# X = 100# T = 1abm.vanilla_pricing(99, 100, 1, "PUT")# 看跌價格:1.0000336233656952
還可以對過程進行校準和後續模擬 - 請注意,某些過程具有靜態波動性,無法校準到 ivol 表面。
算術布朗運動可以模擬如下...
# F0 = 100# n(步數)= 10000# dt = 1/252# T = 1abm.simulate(100, 10000, 1/252, 1)
模擬結果以及模擬特性儲存在元組「path_characteristics」下:(paths, n, dt, T)。
使用儲存的路徑特徵,我們可以像以前一樣透過零利率對每個折扣路徑收益(假設股票過程)進行平均來找到呼叫的價格,我們可以如下避免折扣並找到選擇權價值,如下所示...
# 路徑清單 payoffspayoffs = []# 選擇權執行價格X = 99# 透過終端路徑值迭代來辨識收益 for abm.path_characteristics[0]: # 附加 CALL payoff payoffs.append(max((path[-1] - X ) , 0))# 今日選擇權價值np.average(payoffs)# 買權價格: 1.0008974837343871
我們可以在這裡看到模擬價格正在收斂於封閉形式的價格。
非股息支付股票的理論選擇權定價可透過 BlackScholesCall 和 BlackScholesPut 類別獲得。
from qfin.options import BlackScholesCallfrom qfin.options import BlackScholesPut# 100 - 初始基礎資產價格# .3 - 資產基礎波動率# 100 - 選擇權執行價格# 1 - 到期時間(年)# .01 - 無風險利率euro_call = BlackScholesCall(100, .3, 100, 1, .01)euro_put = BlackScholesPut(100, .3, 100, 1, .01)
print('買權價格: ', euro_call.price)print('賣權價格: ', euro_put.price)
Call price: 12.361726191532611 Put price: 11.366709566449416
Black-Scholes 定價模型的一階和一些二階偏導數可用。
關於標的資產價格的一階偏導數。
print('買權 delta: ', euro_call.delta)print('看跌期權 delta: ', euro_put.delta)
Call delta: 0.5596176923702425 Put delta: -0.4403823076297575
關於標的資產價格的二階偏導數。
print('呼叫伽瑪:', euro_call.gamma)print('放置伽瑪:', euro_put.gamma)
Call gamma: 0.018653923079008084 Put gamma: 0.018653923079008084
關於標的資產波動性的一階偏導數。
print('呼叫 vega: ', euro_call.vega)print('放置 vega: ', euro_put.vega)
Call vega: 39.447933090788894 Put vega: 39.447933090788894
關於到期時間的一階偏導數。
print('呼叫 theta: ', euro_call.theta)print('放置 theta: ', euro_put.theta)
Call theta: -6.35319039407325 Put theta: -5.363140560324083
可以使用常見的隨機流程來模擬資產路徑。
用於實現幾何布朗運動的標準模型。
from qfin.simulations import GeometricBrownianMotion# 100 - 初始標的資產價格# 0 - 標的資產漂移(mu)# .3 - 標的資產波動性# 1/52 - 時間步長(dt)# 1 - 到期時間(年) gbm =幾何布朗運動(100, 0, .3, 1/52, 1)
列印(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]
基於 Heston 論文 (1993) 的隨機波動率模型。
from qfin.simulations import StochasticVarianceModel# 100 - 初始標的資產價格# 0 - 標的資產漂移 (mu)# .01 - 無風險利率# .05 - 連續股息# 2 - 方差恢復到隱含長期的比率方差# .25 - 隨著時間趨於無窮大而隱含的長期變異數# -.7 - 產生的運動相關性# .3 - 變異數的波動性# 1/52 - 時間步長(dt)# 1 - 到期時間(年)svm =隨機變異數模型(100, 0, .01, .05, 2, .25, -.7, .3, .09, 1/52, 1)
列印(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]
奇異期權的模擬定價可以在與各自隨機過程相關的假設下進行。 幾何布朗運動是每個蒙特卡羅模擬中使用的隨機過程的基礎。 但是,如果提供其他參數,則將使用適當的隨機過程來產生每個樣本路徑。
from qfin.simulations import MonteCarloCallfrom qfin.simulations import MonteCarloPut# 100 - 執行價格# 1000 - 模擬價格路徑數量# .01 - 無風險利率# 100 - 初始標的資產價格# 0 - 標的資產漂移 (mumu)# .3 -基礎資產波動性# 1/52 - 時間步長(dt)# 1 - 到期時間(年)call_option = MonteCarloCall(100, 1000, .01, 100, 0, .3, 1/52, 1)#這些附加參數將根據隨機波動過程產生蒙特卡羅價格#2 - 方差恢復到隱含長期方差的比率# .25 - 隨著時間趨於無窮大的隱含長期方差# -.5 - 運動相關性generated# . 02 - 連續股息# .3 - 變異數的波動率put_option = MonteCarloPut(100, 1000, .01, 100, 0, .3, 1/52, 1, 2, .25, -.5, .02, .3 )
列印(call_option.price)print(put_option.price)
12.73812121792851 23.195814963576286
from qfin.simulations import MonteCarloBinaryCallfrom qfin.simulations import MonteCarloBinaryPut# 100 - 執行價格# 50 - 二元期權支付# 1000 - 模擬價格路徑數量# .01 - 無風險利率# 100 - 初始標的資產價格# 0 - 初始標的資產價格(mu)# .3 - 基礎資產波動性# 1/52 - 時間步長(dt)# 1 - 到期時間(年)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)
列印(binary_call.price)列印(binary_put.price)
22.42462873441866 27.869902820039087
from qfin.simulations import MonteCarloBarrierCallfrom qfin.simulations import MonteCarloBarrierPut# 100 - 執行價格# 50 - 二元期權支付# 1000 - 模擬價格路徑數量# .01 - 無風險利率# 100 - 初始標的資產價格# 0 - 初始標的資產價格(mu)# .3 - 標的資產波動性# 1/52 - 時間步長(dt)# 1 - 到期時間(年)# True/False - 障礙向上或向下# True/False - 障礙處於或Outbarrier_call = MonteCarloBarrierCall(100, 1000, 150, .01, 100, 0, .3, 1/52, 1, up=True, out=True)barrier_put = MonteCarloBarrierCall(100, 1000, 95, .01, 100, 0 , .3, 1/52, 1, 上=假, 出=假)
列印(binary_call.price)列印(binary_put.price)
4.895841997908933 5.565856754630819
from qfin.simulations import MonteCarloAsianCallfrom qfin.simulations import MonteCarloAsianPut# 100 - 執行價格# 1000 - 模擬價格路徑數# .01 - 無風險利率# 100 - 初始標的資產價格# 0 - 標的資產漂移 - .標的資產波動性# 1/52 - 時間步長(dt)# 1 - 到期時間(年)asian_call = MonteCarloAsianCall(100, 1000, .01, 100, 0, .3, 1/52, 1)asian_put = MonteCarloAsianPut(100, 1000, .01, 100, 0, .3, 1/52, 1)
列印(asian_call.price)列印(asian_put.price)
6.688201154529573 7.123274528125894
from qfin.simulations import MonteCarloExtendibleCallfrom qfin.simulations import MontecarloExtendiblePut# 100 - 執行價格# 1000 - 模擬價格路徑數量# .01 - 無風險利率# 100 - 初始標的資產價格# 0 -mu# 的漂移 - (mu)標的資產波動性# 1/52 - 時間步長(dt)# 1 - 到期時間(年)# .5 - 若到期時處於資金狀態,則延期extendible_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)
列印(extendible_call.price)列印(extendible_put.price)
13.60274931789973 13.20330578685724