# Ceteris Lab downloadable Python script
# Course: Fundamentals of Python for Financial Econometrics

import numpy as np

rng = np.random.default_rng(24)
S0, mu, sigma, T, steps = 100, 0.06, 0.20, 1, 252
dt = T / steps
z = rng.normal(size=steps)
log_path = np.log(S0) + np.cumsum((mu - 0.5 * sigma**2) * dt + sigma * np.sqrt(dt) * z)
print(round(float(np.exp(log_path[-1])), 2))

from math import erf, exp, log, sqrt

def normal_cdf(value):
    return 0.5 * (1 + erf(value / sqrt(2)))

def black_scholes_call(S, K, T, r, sigma):
    d1 = (log(S / K) + (r + 0.5 * sigma**2) * T) / (sigma * sqrt(T))
    d2 = d1 - sigma * sqrt(T)
    return S * normal_cdf(d1) - K * exp(-r * T) * normal_cdf(d2)

price = black_scholes_call(S=100, K=100, T=1, r=0.03, sigma=0.20)
print(round(price, 4))
