Source code for economic_curves.black_scholes.Black_Scholes

import numpy as np
import pandas as pd

[docs]def simulate_Black_Scholes(S0, mu, sigma, T, dt) -> pd.DataFrame: """Calculates a temporal series of stock prices using the Black Scholes log normal model and the generated Brownian motion stock_price_simulation = simulate_Black_Scholes(S0, mu, sigma, T, dt) Arguments: S0: integer, specifying the initial value of the underlying asset mu: float, specifying the drift rate of the underlying asset sigma: float, standard deviation of the underlying asset's return T: integer, specifying the maximum modeling time. ex. if T = 2 then modelling time will run from 0 to 2 dt: float, specifying the length of each subinterval. ex. dt=10, then there will be 10 intervals of length 0.1 between two integers of modeling time Returns: stock_price_simulation = N x 2 pandas DataFrame where index is modeling time and values are a realisation of the uderlying's price Example: Model the price of a stock whitch is worth today 100. The market has a future annualized risk free rate of 5% and an annualized volatility of 30%. The user is interested in a price projection for the next 10 years in increments of 6 months (0.5 years):: >>> simulate_Black_Scholes(100, 0.05, 0.3, 10, 0.5) Time Stock Price 0.0 100.000000 0.5 131.721286 1.0 124.924654 1.5 209.302935 2.0 222.085955 2.5 208.085678 3.0 165.550253 3.5 239.512165 4.0 176.886669 4.5 148.687363 5.0 181.235262 5.5 164.280753 6.0 172.861576 6.5 170.698562 7.0 141.613940 7.5 121.070316 8.0 116.508183 8.5 104.524616 9.0 146.124924 9.5 202.368581 10.0 262.282989 For more information see https://en.wikipedia.org/wiki/Black%E2%80%93Scholes_model""" N = int(T / dt) # number of subintervals of length 1/dt between 0 and max modeling time T time, delta_t = np.linspace(0, T, num = N+1, retstep = True) S = np.exp((mu - sigma ** 2 / 2) * dt + sigma * np.random.normal(0, np.sqrt(dt), size= N)) S = np.hstack([1, S]) S = S0* S.cumprod(axis=0) dict = {'Time' : time, 'Stock Price' : S} stock_price_simulation = pd.DataFrame.from_dict(data = dict) stock_price_simulation.set_index('Time', inplace = True) return stock_price_simulation