这是第一篇文章,我将帮助您获得如何使用这个新的强大工具来解决金融中的半分析问题并取代您的蒙特卡洛方法的直觉。
我们都知道并喜欢蒙特卡洛数字积分方法,但是如果我告诉你你可以用虚数和傅里叶级数来代替蒙特卡洛呢?
主要好处是速度,这在期权定价中非常重要。这非常重要,因为用于定价股票期权的赫斯顿模型需要数字积分,蒙特卡罗大约需要 100 毫秒,傅里叶级数需要几毫秒。
对于任何函数 f 和区间 a,b,我们可以将 f(x) 近似为余弦和正弦的无限和,L = b-a。
def get_fourier_approx(f, x:np.array, a:float, b:float, N:int):
fa = lambda x, n : f(x) * cos((2*pi*n*x)/(b - a))
fb = lambda x, n : f(x) * sin((2*pi*n*x)/(b - a))
A0 = 1/(b - a) * quad(f, a, b, limit=200)[0]
Cosine_Sine_Sum = np.zeros_like(x)
for n in range(1, N+1):
A = 2/(b - a) * quad(fa, a, b, args=(n), limit=200)[0]
B = 2/(b - a) * quad(fb, a, b, args=(n), limit=200)[0]
Cosine_Sine_Sum += A*cos((2*pi*n*x)/(b - a)) + B*sin((2*pi*n*x)/(b - a))
fx = A0 + Cosine_Sine_Sum
return fx
a = -6
b = 6
x = np.linspace(a, b, 1_000)
y = f(x)
fig, (ax1, ax2) = plt.subplots(2, figsize=(20,12))
blue_shades = ['#0000FF', '#3399FF', '#66B2FF', '#99CCFF', '#CCE5FF']
avg_residuals = []
Ns = [8, 16, 32, 64, 128]
for i, N in enumerate(Ns):
fx = get_fourier_approx(f=f, x=x, a=a, b=b, N=N)
ax1.plot(x,fx, blue_shades[i], label=f'N = {N}')
ax2.plot(x,y-fx, blue_shades[i], label=f'N = {N}')
avg_residuals.append(np.abs(y-fx).mean())
ax1.set_title('Fourier Transform of f(x)')
ax1.plot(x,y,'tab:red', linestyle='--')
ax2.set_title('Residuals')
plt.tight_layout() ; ax1.legend();ax2.legend() ; plt.show()
pd.Series(avg_residuals, index=Ns, name='Avg Residual')
来源:笔记本
N Avg. Residual
--------------------
8 1.311711
16 0.784683
32 0.440387
64 0.268449
128 0.154604
来源:笔记本
N Avg. Residual
--------------------
8 0.447389
16 0.264635
32 0.153540
64 0.088745
128 0.052147
来源:笔记本
N Avg. Residual
--------------------
8 1.092374e-01
16 8.326020e-05
32 6.878539e-14
64 5.721031e-14
128 5.170898e-14
S_T遵循 Q 下的简单 GBM,我们可以使用以下等式推导出S_T的概率密度:
现在我们可以使用以下函数在 Python 中定义 f(S_T),并将下限定义为 ( 0, S_0*exp(r*T) + 12 * sigma*sqrt(T)*S_0 )
S0 = 100
r = 0.05
sigma = 0.1
T = 5.0
Z = lambda St : np.where(St > 0, ((log(St/S0) - (r - .5*sigma)*T)/(sqrt(T)*sigma)), -np.inf)
f = lambda x : norm.pdf(Z(x))
a = S0*exp(r*T) - 12 * sigma*sqrt(T)*S0
b = S0*exp(r*T) + 12 * sigma*sqrt(T)*S0
Source: Notebook
N Avg. (scaled) Residual Avg. Residual Execution Time (sec)
----------------------------------------------------------------------------
8 0.176429 5.880975e-03 0.112720
16 0.004235 1.411566e-04 0.246473
32 0.000030 9.855127e-07 0.624209
64 0.000027 8.918504e-07 1.936948
128 0.000026 8.530034e-07 6.741019
a=1e-8 的S_T密度,在残差处表现出不良性质。来源:笔记本
媒介:链接
在下一篇文章中,我们将了解如何将这些知识与特征函数(虚数的使用)结合使用,以使用标准布莱克-斯科尔斯模型计算欧洲看涨期权的值。