Структура Матлаб кода

Рейтинг: 0Ответов: 1Опубликовано: 25.04.2015

Я не так давно начал работать в Matlab, так что есть вопросы. Посмотрите на код, пожалуйста. Если amountOfOptions = 2, я должен получить OptionPrice = [X X]. То есть размерность (1x2). Кажется, он получает, но он на выход дает последний результат присваивания OptionPrice.

Помогите разобраться, как надо переписать.

function [startStockPrice, strike, barrier, riskFreeRate, timeToExpiry, volatility, CallOrPut, UpOrDown, OptionPrice, time] = OutBarrierOption(amountOfOptions)
%%%%%%%%%% Option parameters %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
startStockPrice   = 70 + 40 * rand(1,amountOfOptions);      % Stock price starts at $100.
strike = 120 + 30 * rand(1,amountOfOptions);                % Strike price for the option ($).
barrier = 300 + 300 * rand(1,amountOfOptions);              % Barrier price for the option ($).
riskFreeRate = 0.05 + 0.1 * rand(1,amountOfOptions);        % 0.5 annual percent. 
timeToExpiry = fix(1 + 3 * rand(1, amountOfOptions));       % Lifetime of the option in years. (Time to maturity)
volatility   = 0.35 + 0.3 * rand(1,amountOfOptions);        % 20% annual volatility.
CallOrPut = round(rand(1, amountOfOptions));                % 0 for Call, 1 for Put                                         
UpOrDown = 'U';                                             % UpOrDown - 'U' or 'D'
M = 1e4; % Number of Monte-Carlo trials
N = 100; % Number of observations
OptionPrice = 0;
tic;
for k = 1:amountOfOptions
    dt(k)=timeToExpiry(k)/N;
for i=1:M
        S(1) = startStockPrice(k)*exp((riskFreeRate(k)-(volatility(k)*volatility(k)/2)*dt(k)) + volatility(k)*sqrt(dt(k))*randn);
        final_vals=[S(1)];
        for j=1:N-1;
            S(j + 1) = S(j)* exp((riskFreeRate(k) - 0.5* volatility(k)*volatility(k))*dt(k) + volatility(k)* sqrt(dt(k))* randn);
            final_vals=S(1:j+1);
        end
end
if CallOrPut == 0
    if UpOrDown == 'U'
        if max(final_vals) <= barrier(k)
            option_values=max(final_vals - strike(k),0); % Evaluate the Call option options
            present_vals = exp(-riskFreeRate(k)*timeToExpiry(k))*option_values; % Discount under r-n assumption
            OptionPrice = mean(present_vals); % Take the average
        else
            % Hit the barrier, so the option is withdrawn.
            present_vals = 0;
            OptionPrice = mean(present_vals);
        end
    elseif UpOrDown == 'D'
        if max(final_vals) >= barrier(k)
            option_values=min(final_vals - strike(k),0); % Evaluate the Call option options
            present_vals = exp(-riskFreeRate(k)*timeToExpiry(k))*option_values; % Discount under r-n assumption
            OptionPrice = mean(present_vals); % Take the average
        else
            % Hit the barrier, so the option is withdrawn.
            present_vals = 0;
            OptionPrice = mean(present_vals);
        end
    end
elseif CallOrPut == 1
    if UpOrDown == 'U'
        if max(final_vals) <= barrier(k)
            option_values=max(strike(k) - final_vals,0); % Evaluate the Put option options
            present_vals = exp(-riskFreeRate(k)*timeToExpiry(k))*option_values; % Discount under r-n assumption
            OptionPrice = mean(present_vals); % Take the average
        else
            % Hit the barrier, so the option is withdrawn.
            present_vals = 0;
            OptionPrice = mean(present_vals);
        end
    elseif UpOrDown == 'D'
        if max(final_vals) >= barrier(k)
            option_values = min(strike(k) - final_vals,0); % Evaluate the Put option options
            present_vals = exp(-riskFreeRate(k)*timeToExpiry(k))*option_values; % Discount under r-n assumption
            OptionPrice = mean(present_vals); % Take the average
        else
            % Hit the barrier, so the option is withdrawn.
            present_vals = 0;
            OptionPrice = mean(present_vals);
        end
    end
end
end
time = toc; 
end

Ответы

▲ 1

Разобрался. Нужно поменять:

  • OptionPrice на OptionPrice(k),
  • OptionPrice = 0 на OptionPrice = [].