Сохранить результаты цикла в матрице - PullRequest
0 голосов
/ 08 июня 2018

В настоящее время я программирую инструмент Python для выполнения геометрического броуновского движения.Цикл для выполнения движения сделан и работает как задумано.Теперь у меня проблемы с сохранением различных результатов моделирования в большой матрице и их построением.

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

Мой код:

import matplotlib.pyplot as plt
import numpy as np


T = 2
mu = 0.15
sigma = 0.10
S0 = 20
dt = 0.01

N = round(T/dt)                 ### Paths
simu = 20                       ### number of simulations
i = 1                      

## creates an array with values from 0 to T with N elementes (T/dt)
t = np.linspace(0, T, N)

## empty Matrix for the end results
res = []

while i < simu + 1:

    ## random number showing the Wiener process
    W = np.random.standard_normal(size = N) 
    W = np.cumsum(W)*np.sqrt(dt) ### standard brownian motion ###
    X = (mu-0.5*sigma**2)*t + sigma*W 
    S = S0*np.exp(X) ### new Stock prices based on the simulated returns ###

    res.append(S)     #appends the resulting array to the result table

    i += 1

#plotting of the result Matrix
plt.plot(t, res)
plt.show() 

Я был бы очень рад, если бы кто-нибудь смог мне помочь с этой проблемой, поскольку я намереваюсь отобразить время с разными путями (которые хранятся в большой матрице).

Заранее спасибо

Ник

1 Ответ

0 голосов
/ 08 июня 2018

Чтобы полностью избежать цикла и использовать быстрые и чистые пиктонические векторизованные операции, вы можете написать свою операцию следующим образом:

import matplotlib.pyplot as plt
import numpy as np


T = 2
mu = 0.15
sigma = 0.10
S0 = 20
dt = 0.01

N = round(T/dt)                 ### Paths
simu = 20                       ### number of simulations
i = 1                      

## creates an array with values from 0 to T with N elementes (T/dt)
t = np.linspace(0, T, N)

## result matrix creation not needed, thanks to gboffi for the hint :)
## random number showing the Wiener process
W = np.random.standard_normal(size=(simu, N))
W = np.cumsum(W, axis=1)*np.sqrt(dt) ### standard brownian motion ###
X = (mu-0.5*sigma**2)*t + sigma*W
res = S0*np.exp(X) ### new Stock prices based on the simulated returns ###

Теперь ваши результаты сохраняются в матрице real ,или правильно np.ndarray.np.ndarray - это стандартный формат массива numpy и, таким образом, наиболее широко используемый и поддерживаемый формат массива.
Чтобы отобразить его, вам нужно предоставить дополнительную информацию, например: Хотите ли вы построить каждую строку массива результатов??Это будет выглядеть следующим образом:

for i in range(simu):
    plt.plot(t, res[i])
plt.show()

Если вы хотите проверить согласованность формы после расчета, вы можете сделать следующее:

assert res.shape == (simu, N), 'Calculation faulty!'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...