Построение средней длины реализации броуновского движения - PullRequest
1 голос
/ 01 апреля 2020

У меня есть функция для броуновского движения:

mu , sig = 0 , 1 # normal dist 
mu_s = 0 # mu in SDE
sig_s = 1 #sig in SDE
S0 = 10 # starting price of stock
n , m = 1000, 20 # paths = n = how many simulations, m  for discritization
T = 1 # year
dt = 1 # each dt is one day


def ABM(n,m,S0,mu,sigma,dt):
    np.random.seed(999) 
    mu_s = mu # mu in SDE
    sig_s = sigma #sig in SDE
    S0 = S0 # starting price of stock
    n , m = n, m # paths = n = how many simulations, m  for discritization


    sig_db = sig_s*np.sqrt(dt)*np.random.normal(mu, sigma, (n,m+1))
    mu_dt = mu_s*dt*np.ones([n,m+1])

    sig_db[:,0] = 0 # set first column to zero
    mu_dt[:,0] = 0

    dS = mu_dt + sig_db
    S = S0 + np.cumsum(dS,axis=1)


    return n,m,S   
n,m,S = ABM(1000,20,10,0,1,1)

, которая отлично работает для построения отдельных реализаций на одном графике:

index  = np.arange(0,m+1)*np.ones([n,m+1]) # create indices as S_0, S_1, S_2
plt.plot(index.T,S.T)

, но теперь я хотел бы построить средняя длина пути этих реализаций для каждого временного шага, и я не уверен, как go об этом. Ожидание арифметического c броуновского движения равно E (S) = S_0 + \ mu * t, что заставляет меня думать, что я должен каким-то образом использовать np.mean(), но я не могу его получить.

TIA

1 Ответ

1 голос
/ 06 апреля 2020

Матрица S состоит из n реализаций, вы получаете E (S (t)) путем усреднения по реализациям, т.е.

EE = np.mean(S, axis = 0)

Аналогично, вы можете получить дисперсию, также функцию времени через

np.mean((S - EE)**2, axis = 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...