Как более эффективно вычислить столбец y + 1 на основе значения в предыдущем столбце y (симуляция Монте-Карло) - PullRequest
0 голосов
/ 11 октября 2019

мой текущий код выглядит следующим образом:

stock_values = np.zeros([path, steps+1])
stock_values[:, 0] = s
for y in range(0, steps):
    stock_values[:, y+1] = stock_values[:, y] * (
        np.exp(change[:,y]))

с:

change = (r_d - 0.5*(sigma_d ** 2)) * deltat + sigma_d * np.sqrt(deltat) * np.random.normal(0, 1, size=(path, steps)) + np.random.poisson(lambda_j*deltat,size=(path, steps))* np.random.normal(r_j,sigma_j, size=(path, steps))

Stock_values ​​и изменения являются массивом с 1 000 000 x 1015 элементов Итак, я запускаю Монте-КарлоМоделирование с GBM и Jump Diffusion, 1 000 000 путей и 1045 шагов. Таким образом, вычислительное время довольно медленное, особеннотак как я бы предпочел использовать для этого 100 000 000 путей. К сожалению, Python использует только одно ядро ​​для цикла, а остальные 7 не используют. Для матрицы "Изменить" она может использовать все ядра ... (Извините, у меня нет хороших технических / аппаратных навыков и знаний ...)

Я ищу функцию для обмена "цикл for, который вычисляет столбец y + 1 на основе значения в столбце y, y + 2 на основе значения y + 1 и т. д. до y + 1044.

Есть идеи? Большое спасибо!

1 Ответ

0 голосов
/ 11 октября 2019

Первое простое улучшение, если у вас достаточно памяти, это вывести np.exp из цикла:

stock_values = np.zeros([path, steps+1])
stock_values[:, 0] = s
e = np.exp(changes)
for y in range(0, steps):
    stock_values[:, y+1] = stock_values[:, y] * e[:,y]
...