2012-05-05 3 views
1

Я нуждается в некоторых советов относительно небольшой проект я делаю. Моя цель - реализация алгоритма быстрого преобразования Фурье (FFT), который может применяться к ценообразованию опций.Реализация быстрого преобразования Фурье для опционов

Первая забота: какие FFT?

Существует множество различных алгоритмов БПФ, самым известным из которых является Cooley-Tukey. Мои мысли об этом: я предпочитаю самый простой, поскольку это не тезис или большой проект, а всего лишь курс по алгоритмам. Но он должен быть совместим с ценой опциона (в отличие от самой - в нашей общей литературе - ссылки на обработку изображений/звука). Таким образом, это зависит от формы ввода, которая предоставляется (по которой мне нужны советы). Я знаком с несколькими улучшениями, такими как Fractional FFT, смешанный редуктор FFT и т. Д. Но они кажутся довольно сложными и оптимизированными/ориентированными на производительность, что не имеет отношения к моему проекту.

Вторая проблема: какая модель ценообразования?

Я уверен, что Black-Scholes (BS) слишком «плоский», и я знаю несколько моделей, появившихся после BS. Итак, с теми же целями, что и выше, я первоначально предпочел модель Хестона.

Есть много соображений, и правда заключается в том, что я просто не могу видеть лес за деревьями.

Некоторой справочная информация:

Мой фон является B.Sc по математике (теоретической), поэтому у меня есть некоторое понимание преобразований Фурье.

Целью является рабочим реализация БПФ для расчета стоимости опционов. Он не должен быть самым быстрым (без экстремальной оптимизации). Цели пытаются понять выбранный БПФ и иметь реальное рабочее приложение.

Так могли бы вы дать несколько советов о выборе?

Я прочитал много документов о цене FFT + Option, скажем, все приличные хиты на первых нескольких страницах googles. Но эти исследования были написаны с гораздо более высокой причиной.

ответ

2

Я изучаю эту тему - БПФ, применяемые к ценообразованию опционов - в течение нескольких недель. Оказывается, на этом предмете много работы, так что это вряд ли бесполезно, как предполагает Александр.

Наиболее читаемый основной документ, который я нашел, - это Карр и Мадан - www.math.nyu.edu/research/carrp/papers/pdf/jcfpub.pdf - но есть много других на разных уровнях детализации, который Google найдет через поиск опционов «Фурье».

Возможно, я буду кодировать это в R в ближайшем будущем; Я пытаюсь найти достойный источник данных о ценах опционов для тестирования.

0

FFT - это просто оптимизированная реализация DFT. Я предлагаю либо использовать существующую библиотеку FFT, такую ​​как KissFFT, либо если вы действительно хотите реализовать это с нуля, тогда просто реализуйте DFT, а не FFT, поскольку это намного проще, и производительность не должна быть проблемой, если у вас нет высоких скорости передачи данных или большие объемы данных.

3

Если ваша цель - использовать БПФ, то ваши варианты плохие: только аффинные модели дают вам достаточно информации для получения преобразования Фурье плотности пятна. На практике это означает Блэка-Скоулза или Хестона. Возможно, еще несколько, но ни одна из «полезных» моделей.

Модель Хестона имеет свои особенности (относящиеся к ее подразумеваемой динамике vol), что делает ее совершенно бесполезной как стохастическую модель vol. Я полагаю, что это популярно именно из-за того, что вы можете оценить варианты ванили в полузамкнутой форме, через преобразования Фурье. Благодаря современным технологиям это уже не реальный актив.

Если вас интересует цена опциона, я бы поэтому предложил вам не слишком много работать с FFT и перейти к методам PDE или Monte-Carlo: диапазон моделей, с которыми вы можете играть, гораздо интереснее (и гораздо более ценным на рынке труда, если вы заинтересованы).

Для части FFT вашего вопроса, внедрение Cooley-Tukey с нуля не сложно, и вы можете начать там. Конечно, в производственном коде вам лучше использовать консервированный пакет (например, FFTW).

+0

Спасибо вам за ответ. Моя основная цель - реализовать БПФ и найти приложение для этого Алгоритма для его использования. Я знаю, что FFT используется для обработки изображений и звука, поэтому я попытался найти более оригинальное приложение, которое я нашел в настройках опций. Можете ли вы, может быть, подробнее остановиться на недостатках модели Хестона и почему в FPS в ценах опционов написано много документов? Скажем, я работаю ... будет ли это бесполезной информацией, когда реальные данные используются в качестве входных данных? Еще раз спасибо, что нашли время ответить. – Cindy88

+0

@ Cindy88: Для недостатков Хестона см., Например. http://papers.ssrn.com/sol3/papers.cfm?abstract_id=1493294. Кроме того, есть много людей, которые работают над математическим финансированием, которые не имеют понятия о том, что действительно делает или нуждается в финансовой отрасли, поэтому огромное количество бесполезных бумаг (не только о FFT, но и модели перехода, микроструктура рынка и т. Д.). –

0

Я предоставляю ниже реализации radix-2 Decimation In Time Схема Cooley-Tukey в Matlab. Код является итеративной и рассматривает схему на следующем рисунке:

enter image description here

Рекурсивный подход также возможно.

Как вы увидите, реализация вычисляет также количество выполненных умножений и дополнений и сравнивает ее с теоретическими расчетами, указанными в How many FLOPS for FFT?.

Код, очевидно, намного медленнее, чем высоко оптимизированный FFTW, используемый Matlab.

Обратите также внимание на то, что коэффициенты twiddle 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);