1

我需要一些关于我正在做的小项目的提示。我的目标是实现快速傅里叶变换算法 (FFT),该算法可应用于期权定价。

第一个问题:哪个 FFT?

有很多不同的 FFT 算法,最著名的一种是 Cooley-Tukey。我对此的想法:我更喜欢最简单的,因为这不是论文或大项目,只是一门算法课程。但它必须与期权定价兼容(与我们一般文献中最常见的图像/声音处理应用程序相比)。所以这取决于所提供的输入形式(我需要一些建议)。我熟悉几个改进,如分数 FFT、混合基数 FFT 等。但这些似乎非常复杂且由优化/性能驱动,这与我的项目无关。

第二个关注点:哪种定价模式?

我猜布莱克-斯科尔斯 (BS) 有点太“扁平化”了,我知道在 BS 之后出现的几种模型。因此,出于与上述相同的目标,我最初更喜欢 Heston 模型。

有很多考虑,而事实是,我就是只见树木不见森林。

一些背景资料

我的背景是数学(理论)学士学位,所以我对傅里叶变换有一些了解。

目标是计算期权定价的有效 FFT 实现。它不必是最快的(没有极端优化)。目标是试图了解所选的 FFT 并拥有一个真实的工作应用程序。

那么你能就选择提供一些建议吗?

我已经阅读了很多关于 FFT + 期权定价的论文,比如说谷歌前几页上的所有不错的点击。但这些研究是出于“更高”的原因而编写的。

4

4 回答 4

4

如果您的目标是使用 FFT,那么您的选择很糟糕:只有仿射模型才能为您提供足够的信息来获得点密度的傅里叶变换。在实践中,这意味着布莱克-斯科尔斯或赫斯顿。也许还有更多,但没有一个“有用”的模型。

Heston 的模型具有特殊的特征(与其隐含的 vol 动力学有关),这使得它作为随机 vol 模型毫无用处。我想它之所以受欢迎,正是因为您可以通过傅里叶变换以半封闭形式为普通期权定价。有了现代技术,这不再是真正的资产。

如果您对期权定价感兴趣,因此我建议您不要太努力地使用 FFT,而转向 PDE 或 Monte-Carlo 方法:您可以使用的模型范围更有趣(也更有价值)在就业市场上,如果你有兴趣)。

对于您问题的 FFT 部分,从头开始实施 Cooley-Tukey 并不难,您可以从那里开始。当然,在生产代码中,您最好使用罐装包(如 FFTW)。

于 2012-05-05T21:26:21.270 回答
3

几周以来,我一直在研究这个主题——FFT 应用于期权定价。事实证明,在这个主题上有大量的工作,所以正如亚历山大所暗示的那样,这几乎不是徒劳的。

我发现的最易读的基础论文来自 Carr 和 Madan - www.math.nyu.edu/research/carrp/papers/pdf/jcfpub.pdf - 但还有许多其他详细程度不同的论文,谷歌会找到通过“期权定价傅里叶”搜索。

在不久的将来,我可能会在 R 中对此进行编码;我正在尝试找到一个不错的期权价格数据来源进行测试。

于 2012-08-24T09:20:02.127 回答
0

FFT只是DFT的优化实现。我建议要么使用现有的 FFT 库,例如KissFFT,或者如果你真的想从头开始实现它,那么只需实现 DFT 而不是 FFT,因为它更简单,除非你有很高的性能,否则性能应该不是问题数据速率或大量数据。

于 2012-05-05T21:01:42.043 回答
0

我在下面提供了Matlab 中radix-2 Decimation In Time Cooley-Tukey 方案的实现。代码是迭代的,考虑下图中的方案:

在此处输入图像描述

递归方法也是可能的。

正如您将看到的,该实现还计算了执行的乘法和加法的数量,并将其与FFT 的多少 FLOPS 中报告的理论计算进行比较?.

该代码显然比 Matlab 使用的高度优化的 FFTW 慢得多。

另请注意,旋转因子omegaa^(interButterflyIndex * 2^(numStages - p))可以离线计算,然后从查找表中恢复,但在下面的代码中跳过了这一点。

% --- Radix-2 Decimation In Time - Iterative approach

clear all
close all
clc

N = 32;

x = randn(1, N);
xoriginal = x;
x = bitrevorder(x);
xhat = zeros(1, N);

numStages = log2(N);

omegaa = exp(-1i * 2 * pi / N);

mulCount = 0;
sumCount = 0;
tic
for p = 1 : numStages
    alpha = 2^(p - 1);
    butterflyStart = 1;
    while (butterflyStart <= (N - alpha))
        for interButterflyIndex = 0 : alpha - 1
            xhat(butterflyStart)          = x(butterflyStart) + x(butterflyStart + alpha) * omegaa^(interButterflyIndex * 2^(numStages - p)); 
            xhat(butterflyStart + alpha)  = x(butterflyStart) - x(butterflyStart + alpha) * omegaa^(interButterflyIndex * 2^(numStages - p));
            mulCount = mulCount + 4;
            sumCount = sumCount + 6;
            butterflyStart = butterflyStart + 1;
            if (interButterflyIndex == (alpha - 1))
                butterflyStart=butterflyStart + alpha;
            end;
        end;
    end;
    x = xhat;
end;
timeCooleyTukey = toc;

tic
xhatcheck = fft(xoriginal, N);
timeFFTW = toc;

rms = 100 * sqrt(sum(sum(abs(xhat - xhatcheck).^2)) / sum(sum(abs(xhat).^2)));

fprintf('Time Cooley-Tukey = %f; \t Time FFTW = %f\n\n', timeCooleyTukey, timeFFTW);
fprintf('Theoretical multiplications count \t = %i; \t Actual multiplications count \t = %i\n', ...
         2 * N * log2(N), mulCount);
fprintf('Theoretical additions count \t\t = %i; \t Actual additions count \t\t = %i\n\n', ...
         3 * N * log2(N), sumCount);
fprintf('Root mean square with FFTW implementation = %.10e\n', rms);
于 2017-02-17T08:03:18.863 回答