Path: blob/main/examples/apps/django_multi_apps/gbm/pn_model.py
2014 views
import hvplot1import hvplot.pandas2import numpy as np3import pandas as pd4import param56import panel as pn789class GBM(param.Parameterized):10# interface11mean = param.Number(default=5, bounds=(.0, 25.0))12volatility = param.Number(default=5, bounds=(.0, 50.0))13maturity = param.Integer(default=1, bounds=(0, 25))14n_observations = param.Integer(default=10, bounds=(2, 100))15n_simulations = param.Integer(default=20, bounds=(1, 500))16refresh = pn.widgets.Button(name="Refresh", button_type='primary')1718def __init__(self, **params):19super().__init__(**params)2021# update the plot for every changes22# @param.depends('mean', 'volatility', 'maturity', 'n_observations', 'n_simulations', watch=True)23# refresh the plot only on button refresh click24@param.depends('refresh.clicks')25def update_plot(self, **kwargs):26df_s = pd.DataFrame(index=range(0, self.n_observations))2728for s in range(0, self.n_simulations):29name_s = f"stock_{s}"30df_s[name_s] = self.gbm(spot=100,31mean=self.mean/100,32vol=self.volatility/100,33dt=self.maturity / self.n_observations,34n_obs=self.n_observations)3536return df_s.hvplot(grid=True, colormap='Paired', value_label="Level", legend=False)3738@staticmethod39def gbm(spot: float, mean: float, vol: float, dt: float, n_obs: int) -> np.ndarray:40""" Geometric Brownian Motion4142:param spot: spot value43:param mean: mean annualised value44:param vol: volatility annualised value45:param dt: time steps46:param n_obs: number of observation to return47:return: a geometric brownian motion np.array()48"""49# generate normal random50rand = np.random.standard_normal(n_obs)51# initialize the parameters52S = np.zeros_like(rand)53S[0] = spot54# loop to generate the brownian motion55for t in range(1, n_obs):56S[t] = S[t - 1] * np.exp((mean - (vol ** 2) / 2) * dt + vol * rand[t] * np.sqrt(dt))57# return the geometric brownian motion58return S596061