def main(): # global data todays_date = Date(15, May, 1998) Settings.instance().evaluation_date = todays_date settlement_date = Date(17, May, 1998) risk_free_rate = FlatForward( reference_date=settlement_date, forward=0.06, daycounter=Actual365Fixed() ) # option parameters exercise = AmericanExercise( earliest_exercise_date = settlement_date, latest_exercise_date = Date(17, May, 1999) ) payoff = PlainVanillaPayoff(Put, 40.0) # market data underlying = SimpleQuote(36.0) volatility = BlackConstantVol(todays_date, TARGET(), 0.20, Actual365Fixed()) dividend_yield = FlatForward( reference_date = settlement_date, forward = 0.00, daycounter = Actual365Fixed() ) # report header = '%19s' % 'method' + ' |' + \ ' |'.join(['%17s' % tag for tag in ['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('%19s' % method + ' |' + \ ' |'.join(['%17s' % y for y in [x, dx, e] ])) # good to go process = BlackScholesMertonProcess( underlying, dividend_yield, risk_free_rate, volatility ) option = VanillaOption(payoff, exercise) refValue = 4.48667344 report('reference value', refValue) # method: analytic option.set_pricing_engine(BaroneAdesiWhaleyApproximationEngine(process)) report('Barone-Adesi-Whaley', option.net_present_value) # method: finite differences time_steps = 801 grid_points = 800 option.set_pricing_engine(FDAmericanEngine('CrankNicolson', process, time_steps, grid_points)) report('finite differences', option.net_present_value) print('This is work in progress.') print('Some pricing engines are not yet interfaced.') return option.set_pricing_engine(BjerksundStenslandEngine(process)) report('Bjerksund-Stensland',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())
# bootstrap the yield/dividend/vol curves flat_term_structure = FlatForward(reference_date=settlement_date, forward=risk_free_rate, daycounter=daycounter) flat_dividend_ts = FlatForward(reference_date=settlement_date, forward=dividend_yield, daycounter=daycounter) flat_vol_ts = BlackConstantVol(settlement_date, calendar, volatility, daycounter) black_scholes_merton_process = BlackScholesMertonProcess( underlyingH, flat_dividend_ts, flat_term_structure, flat_vol_ts) payoff = PlainVanillaPayoff(option_type, strike) european_exercise = EuropeanExercise(maturity) european_option = VanillaOption(payoff, european_exercise) method = 'Black-Scholes' analytic_european_engine = AnalyticEuropeanEngine(black_scholes_merton_process) european_option.set_pricing_engine(analytic_european_engine) print('today: %s settlement: %s maturity: %s' % (todays_date, settlement_date, maturity)) print('NPV: %f\n' % european_option.net_present_value) ### EOF #######################################################################
def main(): # global data todays_date = Date(15, May, 1998) Settings.instance().evaluation_date = todays_date settlement_date = Date(17, May, 1998) risk_free_rate = FlatForward(reference_date=settlement_date, forward=0.06, daycounter=Actual365Fixed()) # option parameters exercise = AmericanExercise(earliest_exercise_date=settlement_date, latest_exercise_date=Date(17, May, 1999)) payoff = PlainVanillaPayoff(Put, 40.0) # market data underlying = SimpleQuote(36.0) volatility = BlackConstantVol(todays_date, TARGET(), 0.20, Actual365Fixed()) dividend_yield = FlatForward(reference_date=settlement_date, forward=0.00, daycounter=Actual365Fixed()) # report header = '%19s' % 'method' + ' |' + \ ' |'.join(['%17s' % tag for tag in ['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('%19s' % method + ' |' + ' |'.join(['%17s' % y for y in [x, dx, e]])) # good to go process = BlackScholesMertonProcess(underlying, dividend_yield, risk_free_rate, volatility) option = VanillaOption(payoff, exercise) refValue = 4.48667344 report('reference value', refValue) # method: analytic option.set_pricing_engine(BaroneAdesiWhaleyApproximationEngine(process)) report('Barone-Adesi-Whaley', option.net_present_value) # method: finite differences time_steps = 801 grid_points = 800 option.set_pricing_engine( FDAmericanEngine('CrankNicolson', process, time_steps, grid_points)) report('finite differences', option.net_present_value) print('This is work in progress.') print('Some pricing engines are not yet interfaced.') return option.set_pricing_engine(BjerksundStenslandEngine(process)) report('Bjerksund-Stensland', 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())
daycounter=daycounter ) flat_vol_ts = BlackConstantVol( settlement_date, calendar, volatility, daycounter ) black_scholes_merton_process = BlackScholesMertonProcess( underlyingH, flat_dividend_ts, flat_term_structure, flat_vol_ts ) payoff = PlainVanillaPayoff(option_type, strike) european_exercise = EuropeanExercise(maturity) european_option = VanillaOption(payoff, european_exercise) method = 'Black-Scholes' analytic_european_engine = AnalyticEuropeanEngine(black_scholes_merton_process) european_option.set_pricing_engine(analytic_european_engine) print( 'today: %s settlement: %s maturity: %s' % ( todays_date, settlement_date, maturity ) ) print('NPV: %f\n' % european_option.net_present_value)