Understanding European and American Options: A Quantitative Approach

In partnership with

The easiest way to stay business-savvy.

There’s a reason over 4 million professionals start their day with Morning Brew. It’s business news made simple—fast, engaging, and actually enjoyable to read.

From business and tech to finance and global affairs, Morning Brew covers the headlines shaping your work and your world. No jargon. No fluff. Just the need-to-know information, delivered with personality.

It takes less than 5 minutes to read, it’s completely free, and it might just become your favorite part of the morning. Sign up now and see why millions of professionals are hooked.

🚀 Your Investing Journey Just Got Better: Premium Subscriptions Are Here! 🚀

It’s been 4 months since we launched our premium subscription plans at GuruFinance Insights, and the results have been phenomenal! Now, we’re making it even better for you to take your investing game to the next level. Whether you’re just starting out or you’re a seasoned trader, our updated plans are designed to give you the tools, insights, and support you need to succeed.

Here’s what you’ll get as a premium member:

  • Exclusive Trading Strategies: Unlock proven methods to maximize your returns.

  • In-Depth Research Analysis: Stay ahead with insights from the latest market trends.

  • Ad-Free Experience: Focus on what matters most—your investments.

  • Monthly AMA Sessions: Get your questions answered by top industry experts.

  • Coding Tutorials: Learn how to automate your trading strategies like a pro.

  • Masterclasses & One-on-One Consultations: Elevate your skills with personalized guidance.

Our three tailored plans—Starter Investor, Pro Trader, and Elite Investor—are designed to fit your unique needs and goals. Whether you’re looking for foundational tools or advanced strategies, we’ve got you covered.

Don’t wait any longer to transform your investment strategy. The last 4 months have shown just how powerful these tools can be—now it’s your turn to experience the difference.

Having worked as a derivatives quant trader at an algorithmic trading firm and now actively trading derivatives myself, I often get asked about the differences between European and American options, especially when it comes to their pricing models. These distinctions are crucial for anyone dealing with options, so today I’ll break down both pricing models and explain their subtle but impactful differences.

The Core Difference: Early Exercise

  • European Options: Can only be exercised at the expiration date. This restriction simplifies pricing and reduces flexibility.

  • American Options: Can be exercised at any point before or at the expiration date. This added flexibility typically makes them more valuable, as they offer more strategic opportunities.

In this article we’ll compare the pricing of European and American vanilla options using Python’s QuantLib and visualize how their values change with varying stock prices.

Make your marketing less boring

The best marketing ideas come from marketers who live it. That’s what The Marketing Millennials delivers: real insights, fresh takes, and no fluff. Written by Daniel Murray, a marketer who knows what works, this newsletter cuts through the noise so you can stop guessing and start winning. Subscribe and level up your marketing game.

Option Pricing Using QuantLib

We start by pricing European and American vanilla options. Below are two Python functions that price these options using the Black-Scholes model for European options and a binomial tree approach for American options.

Here’s how you can price European options using QuantLib:

import QuantLib as ql

def option_price_european(S0, K, days_to_maturity, r, sigma, call=True, engine="BS", steps=200, paths=10000):
    # Pricing European options with different engines: Black-Scholes (BS), Binomial Tree (BT), and Monte Carlo (MC)
    today = ql.Date().todaysDate()
    maturity = today + days_to_maturity
    option_type = ql.Option.Call if call else ql.Option.Put
    payoff = ql.PlainVanillaPayoff(option_type, K)
    europeanExercise = ql.EuropeanExercise(maturity)
    europeanOption = ql.VanillaOption(payoff, europeanExercise)
    
    # Option parameters
    spot = ql.SimpleQuote(S0)
    riskFreeTS = ql.YieldTermStructureHandle(ql.FlatForward(today, r, ql.Actual365Fixed()))
    volTS = ql.BlackVolTermStructureHandle(ql.BlackConstantVol(today, ql.NullCalendar(), sigma, ql.Actual365Fixed()))
    process = ql.BlackScholesProcess(ql.QuoteHandle(spot), riskFreeTS, volTS)
    
    # Pricing engine selection
    if engine == "BS":
        engine = ql.AnalyticEuropeanEngine(process)
    elif engine == "BT":
        engine = ql.BinomialVanillaEngine(process, "crr", steps)
    elif engine == "MC":
        engine = ql.MCEuropeanEngine(process, "PseudoRandom", timeSteps=steps, requiredSamples=paths)
    
    europeanOption.setPricingEngine(engine)
    return europeanOption.NPV()

def option_price_american(S0, K, days_to_maturity, r, sigma, call=True, steps=300):
    # Pricing American options using a binomial tree method
    today = ql.Date().todaysDate()
    maturity = today + days_to_maturity
    option_type = ql.Option.Call if call else ql.Option.Put
    payoff = ql.PlainVanillaPayoff(option_type, K)
    americanExercise = ql.AmericanExercise(today, maturity)
    americanOption = ql.VanillaOption(payoff, americanExercise)
    
    # Option parameters
    spot = ql.SimpleQuote(S0)
    riskFreeTS = ql.YieldTermStructureHandle(ql.FlatForward(today, r, ql.Actual365Fixed()))
    volTS = ql.BlackVolTermStructureHandle(ql.BlackConstantVol(today, ql.NullCalendar(), sigma, ql.Actual365Fixed()))
    process = ql.BlackScholesProcess(ql.QuoteHandle(spot), riskFreeTS, volTS)
    
    # Pricing with a binomial tree
    engine = ql.BinomialVanillaEngine(process, "crr", steps)
    americanOption.setPricingEngine(engine)
    return americanOption.NPV()

Here, the European options are priced using three methods — Black-Scholes, Binomial Tree, and Monte Carlo — while the American options are priced using a binomial tree, as no closed-form solution exists for American-style options.

Comparing European and American Options

Let’s compare the value of an option as the stock price changes, keeping all other factors constant.

# Graphing the comparison between European and American put options
StockPrices = list(range(80, 120))
OptionPricesEuropeanPut = [option_price_european(S, K=100, days_to_maturity=180, r=0.05, sigma=0.20, call=False) for S in StockPrices]
OptionPricesAmericanPut = [option_price_american(S, K=100, days_to_maturity=180, r=0.05, sigma=0.20, call=False) for S in StockPrices]

plt.plot(StockPrices, OptionPricesEuropeanPut, label="European Put", color="orange")
plt.plot(StockPrices, OptionPricesAmericanPut, label="American Put", color="blue")
plt.xlabel("Stock Price")
plt.ylabel("Put Price")
plt.title("Comparison of European vs American Puts")
plt.legend()
plt.show()

The graph shows how American options consistently have a higher value than European options due to the flexibility of early exercise. This flexibility is particularly valuable when the option is deep in the money, allowing for early exercise to capture intrinsic value.

Time Value and Exercise Style

One of the most crucial concepts when comparing European and American options is the time value. For calls, having more time generally increases the option’s value. However, the situation is different for puts, especially deep in the money.

For European-style puts, the time value can actually hurt the option’s price. When deep in the money, it would be more beneficial to exercise early and invest the proceeds. However, with European options, early exercise is not possible, causing the option price to fall below its intrinsic value.

On the other hand, American puts avoid this problem due to the ability to exercise early.

# Define the payoff function for puts
def getPutPayoff(S, K=100):
    if S < K:
        return K - S
    return 0

def addPutPayoff(K, rng=21):
    stockP = range(K - rng, K + rng)
    optionP = list(map(lambda x: getPutPayoff(x, K), stockP))
    plt.plot(stockP, optionP, linestyle="dotted", color="red")

# Graphing the comparison between European and American put options
StockPrices = list(range(80, 120))
OptionPricesEuropeanPut = [option_price_european(S, K=100, days_to_maturity=180, r=0.05, sigma=0.20, call=False) for S in StockPrices]
OptionPricesAmericanPut = [option_price_american(S, K=100, days_to_maturity=180, r=0.05, sigma=0.20, call=False) for S in StockPrices]

plt.plot(StockPrices, OptionPricesEuropeanPut, label="European Put", color="orange")
plt.plot(StockPrices, OptionPricesAmericanPut, label="American Put", color="blue")
plt.xlabel("Stock Price")
plt.ylabel("Put Price")
plt.title("Comparison of European vs American Puts")
addPutPayoff(100)  # Add the payoff line
plt.legend()
plt.show()

When comparing American and European put options, we can observe a significant difference in their pricing due to the flexibility offered by American options. The American option’s value is consistently higher than its payoff value. This is because the American option allows for early exercise, meaning you can choose to exercise it at any point before expiration. This flexibility ensures that the American option’s price reflects its potential for early exercise, so it never drops below its intrinsic value.

In contrast, a European option, which can only be exercised at expiration, may have a price that is lower than its payoff value, particularly when it is deep in-the-money (ITM). This happens because the European option does not benefit from the possibility of early exercise. When a put option is deeply ITM, the ability to exercise early becomes more valuable, which is why the European option’s price might be less than its payoff value. On the other hand, for options that are close to at-the-money (ATM) or out-of-the-money (OTM), the price difference between the European and American options is relatively small.

This distinction highlights a crucial concept: American options never experience a disadvantage from time value since they can be exercised at any time before expiration. European options, however, can suffer from a time value disadvantage due to their restriction against early exercise. This difference is particularly noticeable with deep ITM options, where the advantage of early exercise is significant.

Mathematically, American options are said to “stochastically dominate” European options. This means that American options are generally at least as valuable as European options and often worth more due to their early exercise feature. In simpler terms, holding an American option is typically more advantageous because it offers greater flexibility and potential value compared to its European counterpart.