/usr/share/doc/quantlib-python/examples/european-option.py is in quantlib-python 1.2-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 102 103 104 105 106 107 108 109 110 111 112 113 114 | # Copyright (C) 2004, 2005, 2006, 2007 StatPro Italia srl
#
# This file is part of QuantLib, a free-software/open-source library
# for financial quantitative analysts and developers - http://quantlib.org/
#
# QuantLib is free software: you can redistribute it and/or modify it under the
# terms of the QuantLib license. You should have received a copy of the
# license along with this program; if not, please email
# <quantlib-dev@lists.sf.net>. The license is also available online at
# <http://quantlib.org/license.shtml>.
#
# 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 license for more details.
from QuantLib import *
# global data
todaysDate = Date(15,May,1998)
Settings.instance().evaluationDate = todaysDate
settlementDate = Date(17,May,1998)
riskFreeRate = FlatForward(settlementDate, 0.05, Actual365Fixed())
# option parameters
exercise = EuropeanExercise(Date(17,May,1999))
payoff = PlainVanillaPayoff(Option.Call, 8.0)
# market data
underlying = SimpleQuote(7.0)
volatility = BlackConstantVol(todaysDate, TARGET(), 0.10, Actual365Fixed())
dividendYield = FlatForward(settlementDate, 0.05, Actual365Fixed())
# report
header = ' |'.join(['%17s' % tag for tag in ['method','value',
'estimated error',
'actual error' ] ])
print
print header
print '-'*len(header)
refValue = None
def report(method, x, dx = None):
e = '%.4f' % abs(x-refValue)
x = '%.5f' % x
if dx:
dx = '%.4f' % dx
else:
dx = 'n/a'
print ' |'.join(['%17s' % y for y in [method, x, dx, e] ])
# good to go
process = BlackScholesMertonProcess(QuoteHandle(underlying),
YieldTermStructureHandle(dividendYield),
YieldTermStructureHandle(riskFreeRate),
BlackVolTermStructureHandle(volatility))
option = VanillaOption(payoff, exercise)
# method: analytic
option.setPricingEngine(AnalyticEuropeanEngine(process))
value = option.NPV()
refValue = value
report('analytic',value)
# method: integral
option.setPricingEngine(IntegralEngine(process))
report('integral',option.NPV())
# method: finite differences
timeSteps = 801
gridPoints = 800
option.setPricingEngine(FDEuropeanEngine(process,timeSteps,gridPoints))
report('finite diff.',option.NPV())
# method: binomial
timeSteps = 801
option.setPricingEngine(BinomialVanillaEngine(process,'jr',timeSteps))
report('binomial (JR)',option.NPV())
option.setPricingEngine(BinomialVanillaEngine(process,'crr',timeSteps))
report('binomial (CRR)',option.NPV())
option.setPricingEngine(BinomialVanillaEngine(process,'eqp',timeSteps))
report('binomial (EQP)',option.NPV())
option.setPricingEngine(BinomialVanillaEngine(process,'trigeorgis',timeSteps))
report('bin. (Trigeorgis)',option.NPV())
option.setPricingEngine(BinomialVanillaEngine(process,'tian',timeSteps))
report('binomial (Tian)',option.NPV())
option.setPricingEngine(BinomialVanillaEngine(process,'lr',timeSteps))
report('binomial (LR)',option.NPV())
# method: finite differences
# not yet implemented
# method: Monte Carlo
option.setPricingEngine(MCEuropeanEngine(process,
'pseudorandom',
timeSteps = 1,
requiredTolerance = 0.02,
seed = 42))
report('MC (crude)', option.NPV(), option.errorEstimate())
option.setPricingEngine(MCEuropeanEngine(process,
'lowdiscrepancy',
timeSteps = 1,
requiredSamples = 32768))
report('MC (Sobol)', option.NPV())
|