• 蒙特卡洛法批量计算期权希腊值


    一般计算期权的希腊值会用中心差分的办法,比如Delta就需要分别计算标的涨跌1%的估值。再加上其他希腊值,我们就需要运行多次蒙特卡洛,时间效率不高。

    由于cuda最多支持3个维度,所以我们可以利用这一特点一次性把这些值都算出来。

    我们可以定义第一个维度是价格路径,第二个维度是估值的类型。以回望期权计算Delta和Gamma为例,核函数可以写成

    1. @cuda.jit()
    2. def KernelLookBackBatch(payoff,zpath,SMat,K,H,T,r,q,sigma,steps,N):
    3. #第一个维度是路径,第二个维度是种类
    4. path_i,kind_i = cuda.grid(2)
    5. if(path_i>=payoff.shape[0] or kind_i>=payoff.shape[1]):
    6. return
    7. maxprice=0
    8. dt = T / steps
    9. S=SMat[kind_i]
    10. for i in range(0,steps):
    11. S=S*math.exp((r - q - 0.5 * sigma**2) * dt + sigma * math.sqrt(dt) * zpath[i,path_i])
    12. #Sdebug[path_i,i,kind_i]=S
    13. if maxprice < S:
    14. maxprice=S
    15. payoff[path_i,kind_i]=max(maxprice-K,0)* math.exp(-r * T)

    调用方式改为

    1. payoffs=np.zeros((QuasiN,3))
    2. threadsperblock = (512,1)
    3. blockspergrid_x = math.ceil(payoffs.shape[0] / threadsperblock[0])
    4. blockspergrid_y = math.ceil(payoffs.shape[1] / threadsperblock[1])
    5. blockspergrid = (blockspergrid_x, blockspergrid_y)
    6. #S扩展为一个向量,分别计算上涨和下跌一个dS(0.01)的价格
    7. SMat=np.asarray([S,S*(1+0.01),S*(1-0.01)])
    8. KernelLookBackBatch[blockspergrid, threadsperblock](payoffs,zpath,SMat,K,H,T,r,q,sigma,steps,QuasiN)
    9. lookback_price = np.mean(payoffs,axis=0)
    10. print("lookback_price",lookback_price[0])
    11. print(f"lookback delta {lookback_price[1]-lookback_price[2]/(S*0.01*2)}")
    12. print(f"lookback gamma {lookback_price[1]+lookback_price[2]-2*lookback_price[0]/(S*0.01)**2}")

    这样就可以一次性把所有希腊值计算出来。

    同样的,这个方法也可以用来计算多个期权的估值。

  • 相关阅读:
    【Layui】表单赋值 / 取值与任意位置按钮提交表单
    Go 存储系列:B+树存储引擎 boltdb
    【无标题】
    基于蝴蝶种类识别
    Qt实现鼠标左键拖动无标题栏窗体右下角改变窗体大小及移动窗体
    git关闭commit时的语法检测husky
    Pull down实验步骤
    Linux系统如何查看服务器带宽及网络使用情况
    2023气传导耳机排行榜,盘点相对比较好用的气传导耳机分享
    ssh实现免密登录服务器
  • 原文地址:https://blog.csdn.net/dxlbuaa/article/details/136182059