【发布时间】:2021-08-01 10:38:56
【问题描述】:
我正在尝试在调用中执行蒙特卡罗模拟,然后在 Python 中计算其与基础资产相关的一阶导数,但它仍然不起作用
from jax import random
from jax import jit, grad, vmap
import jax.numpy as jnp
xi = jnp.linspace(1,1.2,5)
def Simulation(xi):
K,T,number_sim,sigma,r,q = 1.,1.,100,0.4,0,0
S = jnp.broadcast_to(xi,(number_sim,len(xi))).T
mean = -.5 * sigma * sigma * T
volatility = sigma*jnp.sqrt(T)
r_numb = random.PRNGKey(10)
BM = mean + volatility * random.normal(r_numb, shape=(number_sim,))
product = S*jnp.exp(BM)
payoff = jnp.maximum(product-K,0)
result = jnp.average(payoff, axis=1)*jnp.exp(-q*T)
return result
first_derivative = vmap(grad(Simulation))(xi)
我不知道实现该算法的方式是否是使用“AD 方法”计算导数的最佳方式;这个算法是这样工作的:
-
S = 模拟一个包含所有底层证券的矩阵;对于每一行,我使用“xi = jnp.linspace”生成每个底层,并且在矩阵的每一行内,我有相同的值,次数等于“number_sim”
-
product = 生成 BM(包含正常数的向量)后,我需要将 BM 的每个元素(带 exp)与 S
所以这是对算法的简短解释,我非常感谢任何形式的建议或技巧来管理这个问题,并用 AD 方法计算导数! 提前致谢
【问题讨论】:
-
您能否编辑您的问题以提供有关您的预期输出的更多详细信息?梯度是相对于标量计算的,并且您似乎想要相对于向量的梯度。你真的对雅可比或逐元素标量梯度感兴趣吗?
-
嗨@jakevdp,感谢您的回答。我需要关于一组标的资产“xi”的看涨期权的一阶导数,所以我的输出应该是一个包含所有导数的向量。也许是的,我在标量方面错误地开发了代码。 .如果您需要更多信息,请告诉我! :)
-
我编辑了标题和标签以再次提及 JAX。问一个特定于 JAX 的问题,得到一个特定于 JAX 的答案,然后才删除对 JAX 的提及,这似乎很奇怪。
标签: python numpy montecarlo jax