数理ファイナンス用の Python ライブラリ。
https://pypi.org/project/QFin/
pip install qfin
QFin は、オブジェクト指向プログラミングの原理をさらに活用するために再構築されています。 このバージョンのいくつかのモジュールは、PDE/SDE のソリューションとともに廃止されます (主にオプション モジュール)。
QFin には現在、モデルの調整とオプションの価格設定を主に担う「stochastics」と呼ばれるモジュールが含まれています。 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# abm.path_characteristics[0] のパスのペイオフを識別するためのターミナル パス値の繰り返し: # CALL ペイオフの追加 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 - Interesteuro_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('コールデルタ: ', euro_call.delta)print('プットデルタ: ', 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('Call vega: ', euro_call.vega)print('Put vega: ', euro_put.vega)
Call vega: 39.447933090788894 Put vega: 39.447933090788894
満期までの時間に関する一次偏導関数。
print('シータを呼び出す: ', euro_call.theta)print('シータを置く: ', 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)
print(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 - 原資産ドリフト (μ)# .01 - リスクフリー利率# .05 - 継続配当# 2 - 分散が暗黙の長期に戻る率分散# .25 - 時間が無限大になる傾向にある暗黙の長期分散# -.7 - 生成された動きの相関# .3 -分散のボラティリティ# 1/52 - タイムステップ (dt)# 1 - 満期までの時間 (年数)svm = StochasticVarianceModel(100, 0, .01, .05, 2, .25, -.7, .3, .09, 1/52、1)
print(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 - 原資産ドリフト (μ)# .3 - 原資産のボラティリティ# 1/52 - タイムステップ (dt)# 1 - 満期までの時間(annum)call_option = MonteCarloCall(100, 1000, .01, 100, 0, .3, 1/52, 1)# これらの追加パラメーターは、確率的ボラティリティ プロセスに基づいてモンテカルロ価格を生成します# 2 - 分散のレート暗黙の長期分散# .25 - 時間が無限大になる傾向にある暗黙の長期分散#に戻ります。 -.5 - 生成された動きの相関# .02 - 連続配当# .3 - 分散の volatilityput_option = MonteCarloPut(100, 1000, .01, 100, 0, .3, 1/52, 1, 2, .25, -. 5、.02、.3)
print(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 - 原資産資産ドリフト (μ)# .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)
print(binary_call.price)print(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 - バリアはインまたはアウトbarrier_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、up=False、out=False)
print(binary_call.price)print(binary_put.price)
4.895841997908933 5.565856754630819
from qfin.simulations import MonteCarloAsianCallfrom qfin.simulations import MonteCarloAsianPut# 100 - 権利行使価格# 1000 - シミュレートされた価格パス数# .01 - リスクフリー金利# 100 - 原資産の初期価格# 0 - 原資産ドリフト (μ)# .3 - 原資産のボラティリティ# 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 )
print(asian_call.price)print(asian_put.price)
6.688201154529573 7.123274528125894
from qfin.simulations import MonteCarloExtendibleCallfrom qfin.simulations import MontecarloExtendiblePut# 100 - 行使価格# 1000 - シミュレートされた価格パスの数# .01 - リスクフリー金利# 100 - 原資産の初期価格# 0 - 原資産ドリフト (μ)# .3 - 原資産のボラティリティ# 1/52 - 時間ステップ (dt)# 1 - までの時間maturity (annum)# .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)
print(extendible_call.price)print(extendible_put.price)
13.60274931789973 13.20330578685724