gpt4 book ai didi

python - 递归乘法的有效方法

转载 作者:太空宇宙 更新时间:2023-11-04 10:12:37 26 4
gpt4 key购买 nike

我正在创建模拟股票价格 SN_MC 路径,每条路径中有 n 个点,不包括初始点。对于给定的路径,这样做的算法是对股票价格的先前值进行递归。这是我现在拥有的:

import numpy as np
import time

N_MC = 1000
n = 10000

S = np.zeros((N_MC, n+1))
S0 = 1.0
S[:, 0] = S0

start_time_normals = time.clock()
Z = np.exp(np.random.normal(size=(N_MC, n)))
print "generate normals time = ", time.clock() - start_time_normals

start_time_prices = time.clock()
for i in xrange(N_MC):
for j in xrange(1, n+1):
S[i, j] = S[i, j-1]*Z[i, j-1]

print "pices time = ", time.clock() - start_time_prices

时间是:

generate normals time =  1.07
pices time = 9.98

是否有更有效的方法来生成数组 S,或许使用 Numpy 的例程?如果正常的随机变量 Z 也能更快地生成,那就太好了,但我并不抱太大希望。

最佳答案

没有必要遍历“路径”,因为它们彼此独立。因此,您可以删除外部循环 for i in xrange(N_MC) 并只对 SZ 的整个列进行操作。

为了加速递归计算,我们只考虑一个“路径”。假设 z 是包含每个时间步长的随机值的向量(所有这些都是提前已知的)。 s 是一个向量,应该包含每个时间步的输出。 s0 是零时的初始输出。 j 是时间。

您的代码以递归方式定义输出:

s[j] = s[j-1]*z[j-1]

让我们扩展一下:

s[1] = s[0]*z[0]

s[2] = s[1]*z[1]
= s[0]*z[0]*z[1]

s[3] = s[2]*z[2]
= s[0]*z[0]*z[1]*z[2]

s[4] = s[3]*z[3]
= s[0]*z[0]*z[1]*z[2]*z[3]

每个输出 s[j]s[0] 乘以从 0 到 j-1 的随机值的乘积.您可以使用 numpy.cumprod() 像这样计算累积乘积,这应该比循环更有效:

s = np.concatenate(([s0], s0 * np.cumprod(z[0:-1])))

您可以使用 axis 参数沿矩阵的一维进行操作(例如,跨“路径”并行执行此操作)。

关于python - 递归乘法的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37426270/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com