수학 금융을 위한 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# payoff를 식별하기 위해 터미널 경로 값을 반복합니다. for path in 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 = 블랙숄즈콜(100, .3, 100, 1, .01)euro_put = 블랙숄즈풋(100, .3, 100, 1, .01)
print('콜 가격: ', euro_call.price)print('풋 가격: ', euro_put.price)
Call price: 12.361726191532611 Put price: 11.366709566449416
Black-Scholes 가격 모델의 1차 및 일부 2차 부분 파생 상품을 사용할 수 있습니다.
기초자산 가격에 대한 1차 편미분입니다.
print('델타 호출: ', euro_call.delta)print('델타 입력: ', euro_put.delta)
Call delta: 0.5596176923702425 Put delta: -0.4403823076297575
기초 자산 가격에 대한 2차 편미분입니다.
print('콜 감마: ', euro_call.gamma)print('풋 감마: ', euro_put.gamma)
Call gamma: 0.018653923079008084 Put gamma: 0.018653923079008084
기초 자산 변동성에 관한 1차 편도함수입니다.
print('베가 호출: ', euro_call.vega)print('베가 입력: ', euro_put.vega)
Call vega: 39.447933090788894 Put vega: 39.447933090788894
만기 시점에 따른 1차 편미분입니다.
print('세타 호출: ', euro_call.theta)print('세타 입력: ', euro_put.theta)
Call theta: -6.35319039407325 Put theta: -5.363140560324083
일반적인 확률론적 프로세스를 사용하여 자산 경로 시뮬레이션이 가능합니다.
기하학적 브라운 운동을 구현하기 위한 표준 모델입니다.
qfin.simulations import 기하학BrownianMotion# 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 = StochasticVarianceModel(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 - 기초 자산 드리프트(mu)# .3 - 기초 자산 변동성# 1/52 - 시간 단계(dt)# 1 - 만기까지의 시간 (연)call_option = MonteCarloCall(100, 1000, .01, 100, 0, .3, 1/52, 1)# 이러한 추가 매개변수는 확률론적 변동성 프로세스# 2 - 변동률을 기반으로 몬테카를로 가격을 생성합니다. 내재된 장기 분산# .25로 되돌아갑니다 - 시간이 무한대로 변하는 경향에 따른 내재된 장기 분산# -.5 - 생성된 모션의 상관관계# .02 - 연속 배당# .3 - 분산의 변동성put_option = MonteCarloPut(100, 1000, .01, 100, 0, .3, 1/52, 1, 2, .25, -. 5, .02, .3)
인쇄(call_option.price)인쇄(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 - 장벽이 In 또는 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, up=False, out=False)
인쇄(binary_call.price)인쇄(binary_put.price)
4.895841997908933 5.565856754630819
from qfin.simulations import MonteCarloAsianCallfrom qfin.simulations import MonteCarloAsianPut# 100 - 행사가# 1000 - 시뮬레이션 가격 경로 수# .01 - 무위험 이자율# 100 - 초기 기초 자산 가격# 0 - 기초 자산 변동(mu)# .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 )
인쇄(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)# .3 - 기초 자산 변동성# 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