mcpricer.py
45 lines
| 1.5 KiB
| text/x-python
|
PythonLexer
MinRK
|
r3621 | |||
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) | ||||