Оценка опционов с использованием симуляции Монте-Карло + Броуновский мост - PullRequest
0 голосов
/ 12 января 2020

Я пытаюсь приблизить цену европейского опциона в Matlab. Точное значение, рассчитанное с помощью Блэка-Шоулза , составит 6,89. Я использую симуляцию Монте-Карло с броуновским мостом для более быстрой конвергенции. К сожалению, цена, приближенная к моему коду, слишком высока (всегда около 120), и я не вижу проблемы с моим кодом. Пожалуйста, найдите код ниже. Если бы кто-нибудь мог помочь мне с моей проблемой, я был бы очень благодарен!

Лучший Яннис

PS: Входной параметр "Pfade" относится к числу смоделированных путей Броуновского моста. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать, я довольно новичок в M C -Simulation и Matlab!

function P=eurocallprice_QMC_BBD(S0,K,r,T,sigma,n,Pfade)
dt=T/n;
timestep=[0:dt:T]';
Wt=zeros(n+1,Pfade);
%Simulate the Brownian motion at T:
eY = randn(1,Pfade);
Wt(n+1,:)= sqrt(T).*eY;
%Simulate the Brownian motion W(t):
for j=2:n
  deltat1=(n+1-j)/(n+1-j+1);
  eYt = randn(1,Pfade);
  Wt(j,:)=deltat1*Wt(j-1,:)+(1-deltat1)*Wt(n+1,:)+sqrt(deltat1*dt)*eYt;
end
BB=Wt;
plot(BB)
SPaths = zeros(n+1, Pfade);
SPaths(1, :) = S0;
for i = 1:n+1
  SPaths(i + 1, :) = SPaths(i,:) .* (1 + r * dt + sigma * BB(i,:));
end
Payoff = zeros(Pfade,1);
Payoff = max(0, SPaths(n+1,:) - K);
P = exp(-r*T) * mean(Payoff);
end

1 Ответ

1 голос
/ 13 января 2020

Точное решение:

Используя формулу на связанной странице википедии:

% Dummy parameter
S0    = 100  % Stock  price 
K     = 100  % Strike price
sigma = 0.2  % Volatility
T     = 0.5  % Maturity
r     = 0.05 % risk free rate

% Application of the formula
N  = @(x) 0.5*(erf(x/sqrt(2))+1)                        %The normal cumulative distribution (with a mean = 0)
d1 = (1/(sigma*T^0.5))*(log(S0/K)+(r+(sigma^2/2))*T)   
d2 = d1-sigma*T^0.5
PV = K*exp(-r*T)
C  = N(d1)*S0 - N(d2)*PV                                %Call price
P  = PV*(1-N(d2))-S0*(1-N(d1))                          %Put  price

И мы получили

C = 6.89

Ваш Броуновский путь может быть заменен нормальным кумулятивным распределением (которое должно давать тот же результат, когда число броуновских путей имеет тенденцию быть бесконечным)

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

enter image description here

Симуляция Монте-Карло:

Я не понимаю, что вы пытаетесь сделать так как в вашем коде почти нет комментариев. Но если вам нужна только смоделированная версия кода выше, вы можете использовать:

% Dummy parameter
S0    = 100  % Stock  price 
K     = 100  % Strike price
sigma = 0.2  % Volatility
T     = 0.5  % Maturity
r     = 0.05 % risk free rate
n     = 100000 % simulation length

rsim    = normrnd(0,1,1,n); %random normal number (mu = 1, sigma = 0).
var     = S0*exp(T*(r-0.5*sigma^2)+sigma*T^0.5*rsim)-K; % variation to price reference (as far as I understand the wikipedia article)
average = sum(max(var,0))/n; %average including the brownian bridge stuff where var<0 = 0
P       = exp(-r*T)*average %Put price
C       = %I let you find how to get the call price ;)
...