-
Notifications
You must be signed in to change notification settings - Fork 16
/
blog_european_option.py
101 lines (76 loc) · 2.83 KB
/
blog_european_option.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
'''
QuantLib with python example
Copyright (C) 2014 John Orford
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
'''
from QuantLib import *
###################################################
##1)
##Inputs
###################################################
#dates
valuation_date = Date(13,1,2014)
expiry_date = Date(13,1,2015)
#terms and conditions
strike_price = 123
put_or_call = Option.Call
#market data
interest_rate = 0.01
#see idivs.org for expected dividend yields
dividend_rate = 0.02
volatility_rate = 0.03
underlying_price = SimpleQuote(123)
###################################################
##2)
#Date setup
###################################################
Settings.instance().evaluation_date = valuation_date
#Asumptions
calendar = UnitedStates()
day_counter = ActualActual()
###################################################
##3)
#Curve setup
###################################################
interest_curve = FlatForward(valuation_date, interest_rate, day_counter )
dividend_curve = FlatForward(valuation_date, dividend_rate, day_counter )
volatility_curve = BlackConstantVol(valuation_date, calendar, volatility_rate, day_counter )
###################################################
##4)
#Option setup
###################################################
exercise = EuropeanExercise(expiry_date)
payoff = PlainVanillaPayoff(put_or_call, strike_price)
#Option Setup
option = VanillaOption(payoff, exercise)
#Collate market data together
u = QuoteHandle(underlying_price)
d = YieldTermStructureHandle(dividend_curve)
r = YieldTermStructureHandle(interest_curve)
v = BlackVolTermStructureHandle(volatility_curve)
process = BlackScholesMertonProcess(u, d, r, v)
#Set pricing engine
engine = AnalyticEuropeanEngine(process)
option.setPricingEngine(engine)
###################################################
##5)
##Collate results
###################################################
print "NPV: ", option.NPV()
print "Delta: ", option.delta()
print "Gamma: ", option.gamma()
print "Vega: ", option.vega()
print "Theta: ", option.theta()
print "Rho: ", option.rho()
print "Dividend Rho: ", option.dividendRho()
print "Theta per Day: ", option.thetaPerDay()
print "Strike Sensitivity: ", option.strikeSensitivity()