def test_FinBinomialTree(): stock_price = 50.0 riskFreeRate = 0.06 dividendYield = 0.04 volatility = 0.40 valuation_date = Date(1, 1, 2016) expiry_date = Date(1, 1, 2017) model = FinModelBlackScholes(volatility) discount_curve = DiscountCurveFlat(valuation_date, riskFreeRate) dividendCurve = DiscountCurveFlat(valuation_date, dividendYield) num_stepsList = [100, 500, 1000, 2000, 5000] strikePrice = 50.0 testCases.banner("================== EUROPEAN PUT =======================") putOption = FinEquityVanillaOption(expiry_date, strikePrice, FinOptionTypes.EUROPEAN_PUT) value = putOption.value(valuation_date, stock_price, discount_curve, dividendCurve, model) delta = putOption.delta(valuation_date, stock_price, discount_curve, dividendCurve, model) gamma = putOption.gamma(valuation_date, stock_price, discount_curve, dividendCurve, model) theta = putOption.theta(valuation_date, stock_price, discount_curve, dividendCurve, model) testCases.header("BS Value", "BS Delta", "BS Gamma", "BS Theta") testCases.print(value, delta, gamma, theta) payoff = FinEquityTreePayoffTypes.VANILLA_OPTION exercise = FinEquityTreeExerciseTypes.EUROPEAN params = np.array([-1, strikePrice]) testCases.header("NumSteps", "Results", "TIME") for num_steps in num_stepsList: start = time.time() tree = FinEquityBinomialTree() results = tree.value(stock_price, discount_curve, dividendCurve, volatility, num_steps, valuation_date, payoff, expiry_date, payoff, exercise, params) end = time.time() duration = end - start testCases.print(num_steps, results, duration) testCases.banner("================== AMERICAN PUT =======================") payoff = FinEquityTreePayoffTypes.VANILLA_OPTION exercise = FinEquityTreeExerciseTypes.AMERICAN params = np.array([-1, strikePrice]) testCases.header("NumSteps", "Results", "TIME") for num_steps in num_stepsList: start = time.time() tree = FinEquityBinomialTree() results = tree.value(stock_price, discount_curve, dividendCurve, volatility, num_steps, valuation_date, payoff, expiry_date, payoff, exercise, params) end = time.time() duration = end - start testCases.print(num_steps, results, duration) testCases.banner( "================== EUROPEAN CALL =======================") callOption = FinEquityVanillaOption(expiry_date, strikePrice, FinOptionTypes.EUROPEAN_CALL) value = callOption.value(valuation_date, stock_price, discount_curve, dividendCurve, model) delta = callOption.delta(valuation_date, stock_price, discount_curve, dividendCurve, model) gamma = callOption.gamma(valuation_date, stock_price, discount_curve, dividendCurve, model) theta = callOption.theta(valuation_date, stock_price, discount_curve, dividendCurve, model) testCases.header("BS Value", "BS Delta", "BS Gamma", "BS Theta") testCases.print(value, delta, gamma, theta) payoff = FinEquityTreePayoffTypes.VANILLA_OPTION exercise = FinEquityTreeExerciseTypes.EUROPEAN params = np.array([1.0, strikePrice]) testCases.header("NumSteps", "Results", "TIME") for num_steps in num_stepsList: start = time.time() tree = FinEquityBinomialTree() results = tree.value(stock_price, discount_curve, dividendCurve, volatility, num_steps, valuation_date, payoff, expiry_date, payoff, exercise, params) end = time.time() duration = end - start testCases.print(num_steps, results, duration) testCases.banner( "================== AMERICAN CALL =======================") payoff = FinEquityTreePayoffTypes.VANILLA_OPTION exercise = FinEquityTreeExerciseTypes.AMERICAN params = np.array([1.0, strikePrice]) testCases.header("NumSteps", "Results", "TIME") for num_steps in num_stepsList: start = time.time() tree = FinEquityBinomialTree() results = tree.value(stock_price, discount_curve, dividendCurve, volatility, num_steps, valuation_date, payoff, expiry_date, payoff, exercise, params) end = time.time() duration = end - start testCases.print(num_steps, results, duration)
def testFinEquityAmericanOption(): valueDate = FinDate(2016, 1, 1) expiryDate = FinDate(2017, 1, 1) stockPrice = 50.0 interestRate = 0.06 dividendYield = 0.04 volatility = 0.40 strikePrice = 50.0 model = FinEquityModelBlackScholes(volatility) discountCurve = FinFlatCurve(valueDate, interestRate) numStepsList = [1000, 2000] testCases.banner("================== EUROPEAN PUT =======================") putOption = FinEquityVanillaOption( expiryDate, strikePrice, FinEquityOptionTypes.EUROPEAN_PUT) value = putOption.value( valueDate, stockPrice, discountCurve, dividendYield, model) delta = putOption.delta( valueDate, stockPrice, discountCurve, dividendYield, model) gamma = putOption.gamma( valueDate, stockPrice, discountCurve, dividendYield, model) theta = putOption.theta( valueDate, stockPrice, discountCurve, dividendYield, model) testCases.header("OPTION_TYPE", "VALUE", "DELTA", "GAMMA", "THETA") testCases.print("EUROPEAN_PUT_BS", value, delta, gamma, theta) option = FinEquityAmericanOption( expiryDate, strikePrice, FinEquityOptionTypes.EUROPEAN_PUT) testCases.header( "OPTION_TYPE", "NUMSTEPS", "VALUE DELTA GAMMA THETA", "TIME") for numSteps in numStepsList: start = time.time() results = option.value( valueDate, stockPrice, discountCurve, dividendYield, model, numSteps) end = time.time() duration = end - start testCases.print("EUROPEAN_PUT_TREE", numSteps, results, duration) testCases.banner("================== AMERICAN PUT =======================") option = FinEquityAmericanOption( expiryDate, strikePrice, FinEquityOptionTypes.AMERICAN_PUT) testCases.header( "OPTION_TYPE", "NUMSTEPS", "VALUE DELTA GAMMA THETA", "TIME") for numSteps in numStepsList: start = time.time() results = option.value( valueDate, stockPrice, discountCurve, dividendYield, model, numSteps) end = time.time() duration = end - start testCases.print("AMERICAN_PUT", numSteps, results, duration) testCases.banner( "================== EUROPEAN CALL =======================") callOption = FinEquityVanillaOption( expiryDate, strikePrice, FinEquityOptionTypes.EUROPEAN_CALL) value = callOption.value( valueDate, stockPrice, discountCurve, dividendYield, model) delta = callOption.delta( valueDate, stockPrice, discountCurve, dividendYield, model) gamma = callOption.gamma( valueDate, stockPrice, discountCurve, dividendYield, model) theta = callOption.theta( valueDate, stockPrice, discountCurve, dividendYield, model) testCases.header("OPTION_TYPE", "VALUE", "DELTA", "GAMMA", "THETA") testCases.print("EUROPEAN_CALL_BS", value, delta, gamma, theta) option = FinEquityAmericanOption( expiryDate, strikePrice, FinEquityOptionTypes.EUROPEAN_CALL) testCases.header( "OPTION_TYPE", "NUMSTEPS", "VALUE DELTA GAMMA THETA", "TIME") for numSteps in numStepsList: start = time.time() results = option.value( valueDate, stockPrice, discountCurve, dividendYield, model, numSteps) end = time.time() duration = end - start testCases.print("EUROPEAN_CALL", numSteps, results, duration) testCases.banner( "================== AMERICAN CALL =======================") testCases.header( "OPTION_TYPE", "NUMSTEPS", "VALUE DELTA GAMMA THETA", "TIME") option = FinEquityAmericanOption( expiryDate, strikePrice, FinEquityOptionTypes.AMERICAN_CALL) for numSteps in numStepsList: start = time.time() results = option.value( valueDate, stockPrice, discountCurve, dividendYield, model, numSteps) end = time.time() duration = end - start testCases.print("AMERICAN_CALL", numSteps, results, duration)