|
|
def price_options(S=100.0, K=100.0, sigma=0.25, r=0.05, days=260, paths=10000):
|
|
|
"""
|
|
|
Price European and Asian options using a Monte Carlo method.
|
|
|
|
|
|
Parameters
|
|
|
----------
|
|
|
S : float
|
|
|
The initial price of the stock.
|
|
|
K : float
|
|
|
The strike price of the option.
|
|
|
sigma : float
|
|
|
The volatility of the stock.
|
|
|
r : float
|
|
|
The risk free interest rate.
|
|
|
days : int
|
|
|
The number of days until the option expires.
|
|
|
paths : int
|
|
|
The number of Monte Carlo paths used to price the option.
|
|
|
|
|
|
Returns
|
|
|
-------
|
|
|
A tuple of (E. call, E. put, A. call, A. put) option prices.
|
|
|
"""
|
|
|
import numpy as np
|
|
|
from math import exp,sqrt
|
|
|
|
|
|
h = 1.0/days
|
|
|
const1 = exp((r-0.5*sigma**2)*h)
|
|
|
const2 = sigma*sqrt(h)
|
|
|
stock_price = S*np.ones(paths, dtype='float64')
|
|
|
stock_price_sum = np.zeros(paths, dtype='float64')
|
|
|
for j in range(days):
|
|
|
growth_factor = const1*np.exp(const2*np.random.standard_normal(paths))
|
|
|
stock_price = stock_price*growth_factor
|
|
|
stock_price_sum = stock_price_sum + stock_price
|
|
|
stock_price_avg = stock_price_sum/days
|
|
|
zeros = np.zeros(paths, dtype='float64')
|
|
|
r_factor = exp(-r*h*days)
|
|
|
euro_put = r_factor*np.mean(np.maximum(zeros, K-stock_price))
|
|
|
asian_put = r_factor*np.mean(np.maximum(zeros, K-stock_price_avg))
|
|
|
euro_call = r_factor*np.mean(np.maximum(zeros, stock_price-K))
|
|
|
asian_call = r_factor*np.mean(np.maximum(zeros, stock_price_avg-K))
|
|
|
return (euro_call, euro_put, asian_call, asian_put)
|
|
|
|
|
|
|