我想通过应用快速傅立叶变换(FFT)来计算跟随和。我想用FFT计算以下黎曼和近似:
这是我使用的Psy功能:
Psyfun<-function(u,T,r,q,sigma,lmbda,meanV,v0,rho){
j <- as.complex(1i)
a <- lmbda*meanV
b <- lmbda
d <- sqrt((j*rho*sigma*u-b)**2+(u**2+j*u)*sigma**2)
g <- (b-j*rho*sigma*u-d)/(b-j*rho*sigma*u+d)
ret <- exp(j*u*(r-q)*T)
ret <- ret*exp((a/sigma**2)*((b - rho*j*sigma*u - d)*T - 2.0*log((1-g*exp(-d*T))/(1-g))))
return (ret*exp((v0/sigma**2)*(b - rho*j*sigma*u - d)*(1-exp(-d*T))/(1-g*exp(-d*T))))
}
以下是示例参数:
r = 0.025 ,q= 0.01, sigma = 0.2, lmbda = 0.5, meanV = 0.5, v0 = 0.5 , rho = 0.3
我想计算K和T的值等于:
K1 = 172.77且T1 = 0.197,K2 = 75.63且T2 = 0.563,K3 = 269.54且T3 = 0.2648
我实现了以下代码:
N=2^10 # Number of subdivision in [0,a]
alpha=2 # alpha
delta= 0.25 # delta= a/N where a is the up value of w (w in [0,a])
lambda=(2*pi)/(N*delta)
j=seq(1,N,1)
k=seq(1,N,1)
b=(lambda*N)/2
strike= -b+(k-1)*lambda
strike= exp(strike)
res=c()
for (i in 1:N){
w=delta*(i-1) # w= j*delta but from 1 to N so w=(i-1)*delta
w_FC=w-(alpha+1)*1i
phi= Psyfun(w_FC,T,r,q,sigma,lmbda,meanV,v0,rho)
phi=phi*exp(-r1*(T))
phi=phi/(alpha^2+alpha-w^2+1i*(2*alpha+1)*w)
phi=phi*delta*exp(1i*w*b)
res=rbind(res,phi)
}
Result=Re(fft(res))*exp(-alpha*(-b+(k-1)*lambda))/pi
我获得了k个值,所以如何获得对应于K1,K2,K3的值。 任何人都可以推荐一个程序来实现计算吗?感谢
我之前没有快速傅里叶变换(FFT)处理的经验,所以除了有关如何以编程方式更好地处理此方法的建议之外,我还要感谢与数学/方法/代码相关的任何提示和指示。