一般计算期权的希腊值会用中心差分的办法,比如Delta就需要分别计算标的涨跌1%的估值。再加上其他希腊值,我们就需要运行多次蒙特卡洛,时间效率不高。
由于cuda最多支持3个维度,所以我们可以利用这一特点一次性把这些值都算出来。
我们可以定义第一个维度是价格路径,第二个维度是估值的类型。以回望期权计算Delta和Gamma为例,核函数可以写成
@cuda.jit()
def KernelLookBackBatch(payoff,zpath,SMat,K,H,T,r,q,sigma,steps,N):
#第一个维度是路径,第二个维度是种类
path_i,kind_i = cuda.grid(2)
if(path_i>=payoff.shape[0] or kind_i>=payoff.shape[1]):
return
maxprice=0
dt = T / steps
S=SMat[kind_i]
for i in range(0,steps):
S=S*math.exp((r - q - 0.5 * sigma**2) * dt + sigma * math.sqrt(dt) * zpath[i,path_i])
#Sdebug[path_i,i,kind_i]=S
if maxprice < S:
maxprice=S
payoff[path_i,kind_i]=max(maxprice-K,0)* math.exp(-r * T)
调用方式改为
payoffs=np.zeros((QuasiN,3))
threadsperblock = (512,1)
blockspergrid_x =