Моделирование Монте-Карло для аппроксимации дельты в Matlab - PullRequest
0 голосов
/ 26 декабря 2018

Мне нужно закодировать алгоритм Монте-Карло для приближения дельты к Matlab и вычислить доверительные интервалы: algorithm

, но по какой-то причине мой код не работает, есть идеи, почему?

randn('state', 100)

%Problem and method parameters
S=10; E=9; sigma=0.1; r=0.06; T=1;
Dt=1e-3; N=T/Dt; M=2^17;h=10^(-4);

 delta = zeros(M,1);
  for i = 1:M
  Sfinal = S*exp((r-0.5*sigma^2)*T+sigma*sqrt(T).*randn(M,1));
  S_h = (S+h)*exp((r-0.5*sigma^2)*T+sigma*sqrt(T).*randn(M,1));
  delta(i) = exp(-r*T).*(max(Sfinal-E,0)-max(S_h-E,0))/h;
end
aM=mean(delta); 
bM=std(delta);
conf=[aM-1.96*bM/sqrt(M),aM+1.96*bM/sqrt(M)]

Сообщение об ошибке:

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

Любая помощь приветствуется!

1 Ответ

0 голосов
/ 26 декабря 2018

Вам не нужно явно писать цикл for, так как вы уже векторизовали его.Другими словами, Sfinal и S_h являются векторами длины M, а их i -ые записи соответствуют S_i и S^h_i на изображении.Поскольку правая часть выражения delta соответствует вектору длины M, который содержит все значения дельты, вы должны присвоить этот вектор непосредственно delta, а не delta(i).

Еще одна вещь: псевдокод на изображении, кажется, предполагает, что одно и то же случайное число должно использоваться для вычисления S_i и S^h_i.Это не относится к вашему коду, так как вы вызываете randn отдельно для вычисления Sfinal и S_h.Я думаю, вы должны сгенерировать случайные выборки один раз, сохранить их, а затем использовать их для обоих вычислений.

Вот код:

randn('state', 100)

%Problem and method parameters
S=10; E=9; sigma=0.1; r=0.06; T=1;
Dt=1e-3; N=T/Dt; M=2^17;h=10^(-4);

xi = randn(M,1);
Sfinal = S*exp((r-0.5*sigma^2)*T+sigma*sqrt(T).*xi);
S_h = (S+h)*exp((r-0.5*sigma^2)*T+sigma*sqrt(T).*xi);
delta = exp(-r*T).*(max(Sfinal-E,0)-max(S_h-E,0))/h;

aM=mean(delta); 
bM=std(delta);
conf=[aM-1.96*bM/sqrt(M),aM+1.96*bM/sqrt(M)]
...