Numba原子操作和期权蒙特卡洛估值

期权的蒙特卡洛法估值的一般步骤是

1,生成大量标的价格路径,这一步是通用的,对所有的期权都是一样的

2,根据价格路径计算到期日期权的价值,这一步根据期权类型的不同

3,求所有路径下期权价值贴现的期望。这一步也是通用的

numba支持核函数中生成随机数,也支持cuda原子操作,所以在核函数中有可能实现所有步骤,用回望期权测试一下:

import numpy as np
import cupy as cp
from scipy.stats import qmc
from scipy.stats import norm
from numba import cuda
from numba.cuda.random import xoroshiro128p_uniform_float32,create_xoroshiro128p_states
import math

@cuda.jit()
def KernelLookBack(mean,payoff,rng_states,S0,K,T,r,q,sigma,steps,N):
    n = cuda.grid(1)
    if(n>=N):
        return    
    dt = T / steps
    maxprice=0
    S=S0
    for i in range(0,steps):
        z=xoroshiro128p_uniform_float32(rng_states, n)
        S=S*math.exp((r - q - 0.5 * sigma**2) * dt + sigma * math.sqrt(dt) * z)
        if maxprice < S:
            maxprice=S
    payoff[n]=max(maxprice-K,0)* math.exp(-r * T)
    cuda.atomic.add(mean,0,payoff[n]/N)


S = 100 #stock price 
T = 1/2 # time to maturity
r = 0.05 # risk free 
q = 0.02 # dividend rate
sigma = 0.25 # volatility 
steps = 100 # time steps
N = 100*1000#*1000 # number of trials

threadsperblock=512
blockspergrid=math.ceil(N/threadsperblock)
payoffs=cp.zeros(N,dtype=cp.float32)
rng_states = create_xoroshiro128p_states(threadsperblock * blockspergrid, seed=1)
mean=cp.zeros(1,dtype=cp.float32)
KernelLookBack[blockspergrid, threadsperblock](mean,payoffs,rng_states,S,K,T,r,q,sigma,steps,N)
option_price=cp.mean(payoffs)
print("LookBack Option Price",option_price,mean[0])

经测试,随着路径增多,atomic.add加出来的结果和cupy.mean有细微的误差

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嘉诩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值