Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/16: Рейтинг темы: голосов - 16, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 17.07.2013
Сообщений: 35

Алгоритмы оценки опциона.

05.08.2013, 14:50. Показов 3316. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго всем дня! Возникала следующая ошибка при вводе массива состоящего из более чем двух элементов:

Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function [A,S] = somefunction(n,P,Q)
pelem = length(P);
qelem = length(Q);
if pelem == qelem
    p = 1 - (Q(1)/P(1));
    A = p;
    S = p;
        if qelem >= n || pelem >= n    
            for ii = 2:1:n
                f = 1 - (1 - p(ii-1))^-1*(Q(ii)/P(ii));
                S(ii-1) = f;
                p = p(ii-1)*f;
            end
        else
            disp('Элементы массива P и Q должны быть равны периоду n')
        end
else
    disp('Кол-во элементов массива P и Q должны совпадать!') 
end
Ошибка следующая:
Attempted to access p(2); index out of bounds because numel(p)=1.
Для массива P и Q состоящих из двух элементов все работает.

P.S. можно как то в вышеуказанной функции избавиться от переменной - A и включить первое посчитанное значение в один результативный массив S?

Всем заранее большое спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.08.2013, 14:50
Ответы с готовыми решениями:

Найти стоимость американского опциона
По схеме Крэнка-Николсона. Метод послед-ой сверхрелаксации = SOR. Решаемая задача Имеет вид: A*{U}^{m+1}\geq {b}^{m} В маткаде как...

Определить количество дней, в которых оценки меньше средней оценки по классу
в массиве записаны оценки по информатике 22 учеников класса. Определить количество дней, в которых меньше средней оценки по классу, и...

Имеется массив из N итоговых оценок студента.Если студент является неуспевающим(имеются оценки ниже 4),то замените все его неудовлетворительные оценки
Имеется массив из N итоговых оценок студента.Если студент является неуспевающим(имеются оценки ниже 4),то замените все его...

34
 Аватар для lomt
454 / 280 / 13
Регистрация: 13.11.2012
Сообщений: 588
Записей в блоге: 1
14.08.2013, 13:46
Студворк — интернет-сервис помощи студентам
В 13ой строчке, когда ты задаёшь индекс jj, ты добавляешь к нему a, что формирует строку не целых значений, которые естественно не подходят для индексации массива. Зачем там a?

Добавлено через 2 минуты
Вот так будет с a в значениях jj:
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
clear all
S=160;
X=150;
n=3;
u=1.5;
d=0.5;
r=18.232;
R=exp(r/100);
e = 2.7182818284;
rnum = r/100;
R = e^rnum;
if R < u && R > d && r > 0
    a = log(X/S * d^n)/log(u/d);
    p = (R - d)/(u - d);
    RR = e^(rnum * n);
    b(1) = p^a * (1 - p)^(n - a); %величины b(a; n, p) вычисляются
    D(1) = S * u^a * d^(n - a);
    C(1)= b * (D - X)/RR;
    k=2; %индекс заполнения массива
    for jj = a + 1:1:n
        
        b(k) = b(k-1) * p * (n - jj + 1)/((1 - p) * jj);
        D(k) = D(k-1) * u/d;
        C(k) = C(k-1) + b(k) * (D(k) - X)/R;
    k=k+1; %переход к следующей итерации
    end
else
    disp('ВНИМАНИЕ! Ошибка условия (R = e^r) u > R > d')
end
fprintf('%.10f\n', C)
1
0 / 0 / 0
Регистрация: 17.07.2013
Сообщений: 35
14.08.2013, 14:06  [ТС]
Очередная попытка интерпретации линейного алгоритма представленного на картинке.

Переменная b размещает величины b(j: n, p) для j = a, a+1 .... n, именно в таком порядке, а переменная С производит суммирование величин b(j; n,p) * S(Sud^j*d^n-j - X)/e^(n*r) при j = a, a+1, ..., n

странно что результаты полученные в алгоритме: https://www.cyberforum.ru/matl... -post.html

отличаются от тех, что в указанном алгоритме выше.
Миниатюры
Алгоритмы оценки опциона.  
0
 Аватар для lomt
454 / 280 / 13
Регистрация: 13.11.2012
Сообщений: 588
Записей в блоге: 1
14.08.2013, 14:23
Исходя из формулы из картинки у тебя ошибка в высчитывании a, ты скобки забыл при умножении. Должно быть так:
Matlab M
1
a = log(X/(S * d^n))/log(u/d);
Но при таких расчетах a получается не целым, поэтому для дальнейшего расчёт видимо его надо округлить. Логичным было бы округление в сторону нуля, тогда a=1, всё получается гладко с заполнением массива.
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
clear all
S=160;
X=150;
n=3;
u=1.5;
d=0.5;
r=18.232;
R=exp(r/100);
e = 2.7182818284;
rnum = r/100;
R = e^rnum;
if R < u && R > d && r > 0
    a = log(X/(S * d^n))/log(u/d);
    p = (R - d)/(u - d);
    RR = e^(rnum * n);
    b(1) = p^a * (1 - p)^(n - a); %величины b(a; n, p) вычисляются
    D(1) = S * u^a * d^(n - a);
    C(1)= b * (D - X)/RR;
    for jj = fix(a) + 1:1:n
        
        b(jj) = b(jj-1) * p * (n - jj + 1)/((1 - p) * jj);
        D(jj) = D(jj-1) * u/d;
        C(jj) = C(jj-1) + b(jj) * (D(jj) - X)/R;
    end
else
    disp('ВНИМАНИЕ! Ошибка условия (R = e^r) u > R > d')
end
fprintf('%.10f\n', C)
1
0 / 0 / 0
Регистрация: 17.07.2013
Сообщений: 35
14.08.2013, 14:28  [ТС]
Спасибо большое за подсказки как выходить из таких ситуаций , но вот с результатами буду копать дальше. Пока не понял в чем суть, два метода для определения стоимости опциона при равных параметрах дают различные результаты.
0
0 / 0 / 0
Регистрация: 17.07.2013
Сообщений: 35
21.08.2013, 12:25  [ТС]
Доброго времени суток, у меня очередная проблема с доступом к массиву P, помогите пожалуйста

Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
clear all
S=160;
X=150;
n=3;
u=1.5;
d=0.5;
r=18.232;
function P = binomamericanput(S, u, d, n, r, X)
e = 2.7182818284;
rnum = r/100; %percent to number
R = e^rnum;
    if R < u && R > d && r > 0
        p = (R-d)/(u-d);
            for ii = 1:1:n 
                A = X - S * u^(n-ii)*d^ii;
                P(ii) = max(0, A);
                for jj = n-1:-1:1
                    for ii = 1:1:jj
                        P(ii) = max((p * P(ii) + (1 - p) * P(ii + 1))/ R, X - S * u^(jj - ii)*d^ii);
                    end
                end
            end
    else
        disp('ВНИМАНИЕ! Ошибка условия (R = e^r) u > R > d')
    end
fprintf('%.10f\n', P)
end
Ругается так:

Attempted to access P(0); index must be a positive integer or
logical.

Error in binomamericanput (line 14)
P(ii) = max((p * P(ii - 1) + (1 - p) *
P(ii + 1))/ R, X - S * u^(jj - ii)*d^ii);

Алгоритм из книги:
Миниатюры
Алгоритмы оценки опциона.  
0
 Аватар для lomt
454 / 280 / 13
Регистрация: 13.11.2012
Сообщений: 588
Записей в блоге: 1
21.08.2013, 12:57
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
clear all
S=160;
X=150;
n=3;
u=1.5;
d=0.5;
r=18.232;
 
e = 2.7182818284;
rnum = r/100; %percent to number
R = e^rnum;
if R < u && R > d && r > 0
    p = (R-d)/(u-d);
    for ii = 1:1:n+1
        A = X - S * u^(n+1-ii)*d^ii;
        P(ii) = max(0, A);
    end;
    for jj = n:-1:1
        for ii = 1:1:jj
            P(ii) = max((p * P(ii) + (1 - p) * P(ii + 1))/ R, X - S * u^(jj - ii)*d^ii);
        end
    end
    
else
    disp('ВНИМАНИЕ! Ошибка условия (R = e^r) u > R > d')
end
fprintf('%.10f\n', P)
Судя по описанию алгоритма, сначала надо сформировать P[0...n], а потом проводить операции над ним. А у тебя получилось всё в одном цикле, поэтому и ошибки. И смотри, там массив начинается с нулевого индекса, а Матлаб принимает только положительные индексы массивов, поэтому для расчётов надо брать P[1...n+1].
2
0 / 0 / 0
Регистрация: 17.07.2013
Сообщений: 35
21.08.2013, 13:49  [ТС]

Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function P = binomamericanput(S, u, d, n, r, X)
e = 2.7182818284;
rnum = r/100; %percent to number
R = e^rnum;
P = zeros(1, n+1);
    if R < u && R > d && r > 0
       p = (R-d)/(u-d);
           for ii = 1:1:n 
               A = X - S * u^(n-ii)*d^ii;
               P(ii) = max(0, A);
               for jj = n-1:-1:1
                   for ii = 1:1:jj
                       P(ii) = max((p * P(ii) + (1 - p) * P(ii + 1))/ R, X - S * u^(jj - ii)*d^ii);
                   end
               end
           end
    else
        disp('ВНИМАНИЕ! Ошибка условия (R = e^r) u > R > d')
    end
fprintf('%.10f\n', P)
end
Спасибо тебе!!!!!!
0
0 / 0 / 0
Регистрация: 17.07.2013
Сообщений: 35
22.08.2013, 12:25  [ТС]
Доброго всем времени суток! Доброго времени суток и Вам уважаемый lomt!
Очередной вопрос по реализации следующей функции:
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function C = somefunction( S, u, d, X, n, sigma, m, r)
e = 2.7182818284;
rnum = r/100; %percent to number
R = e^rnum;
C = zeros(1, n + 1);
p = (R-d)/(u-d); 
if sigma > 0 && sigma < 1
for ii = 0:1:n 
    C(ii) = max(0, S * u^(n-ii)*d^ii*(1-sigma)^m - X);
end
    for jj = n - 1:-1:1
        for ii = 1:1:jj
            if all(jj:jj+1) %вот тут не понимание, как правильно сделать?
                m = m - 1;
            end
            C(ii) = max((p * C(ii)+(1 - p) * C(ii + 1))/R, S * u^(jj-ii)*d^ii*(1-sigma)^m - X); 
        end
    end
end
end
Алгоритм это взят из учебника, и представлен ниже.

Как я понял цикл (период) jj, вроде счетчика, каждое прохождение по которому = jj + 1, но почему тогда условие "если" ?

Подскажите пожалуйста, как правильно можно сделать.

Данные для ввода:
Matlab M
1
2
3
4
5
6
7
8
S = 160;
X = 150;
u = 1.5;
d = 0.5;
n = 3;
sigma = S * 0.002;
r = 18.232
m = 2;
Миниатюры
Алгоритмы оценки опциона.  
0
 Аватар для Зосима
5246 / 3574 / 379
Регистрация: 02.04.2012
Сообщений: 6,477
Записей в блоге: 18
22.08.2013, 18:12
Здесь ключевые слова "период" и "момент выплаты" лично мне неясно какой переменной они зашифрованы в формулке
Так, если период обозначить, например, переменной T, а момент выплаты - z, то условие примет вид:
Matlab M
1
2
3
if  (T(jj)<z) & (z<=T(jj+1)) % если момент выплаты оказался внутри текущего периода
  m = m-1;
end
Добавлено через 3 минуты
*и я тебя очень прошу, вместо:
Matlab M
1
2
3
e = 2.7182818284;
rnum = r/100; %percent to number
R = e^rnum;
напиши пожалуйста:
Matlab M
1
R = exp(r/100);
1
 Аватар для lomt
454 / 280 / 13
Регистрация: 13.11.2012
Сообщений: 588
Записей в блоге: 1
22.08.2013, 18:25
Дядя Зосима дело говорит)))) Просто оценка, попадает ли в интервал момент выплат. Расшифруй все переменные в дано, примени вышеуказанный код и будет тебе счастье)

Добавлено через 2 минуты
И, думаю, не стоит создавать много похожих тем, пиши все возникающие вопросы в эту тему, чтобы не засорять форум
0
0 / 0 / 0
Регистрация: 17.07.2013
Сообщений: 35
26.08.2013, 12:16  [ТС]
Спасибо модератору, за то, что привел в порядок мою "больную" тему
Очередной раз взываю о помощи ко всем гуру матлаб, и опять же речь об организации алгоритма представленного ниже.
Проверьте пожалуйста написание сего алгоритма в функции матлаб:
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 function P = diagolametodamericanput(S, u, d, tau, X, n, r, q)
qnum = q/100;
P = zeros(1, n);
e = 2.7182818284;
rnum = r/100; %percent to number
R = e^rnum;
p = (e^((r-qnum)*(tau/n)) - d)/(u/d);
a = log(X/(S * d^n))/log(u/d);
if rnum > qnum || rnum == qnum || qnum > 0
    for ii = 1:1:fix(a) - 1
        P(ii) = -1; %верхняя граница узлов досрочного исполнения
    end
    for jj = n - fix(a):-1:1
        for ii = fix(a) - 1:-1:1
            niz(ii) = P(ii);
            if  niz(ii) < 0
                niz(ii) = X - S * u^ii * d^(jj + 1);
                c(ii) = (p * P(ii + 1) + (1 - p) * niz(ii))/R;
            else
                if c(ii) > (X - S * u^ii * d^jj) && c(ii) == (X - S * u^ii * d^jj) && ii > 0
                   P(ii) = c; %досрочное исполнение отсутствует
                else
                    if c > (X - S * u^ii * d^jj) && c == (X - S * u^ii * d^jj) && ii == 0
                       P(ii) = c;
                    else
                        if jj == 0
                           disp('Вывод P[0]:')
                           fprintf('%.10f\n', P(1))
                        else 
                            for kk = 1:1:fix(a) - 1
                                P(kk) = ((kk + jj - 1)/kk) * p^k * (1 - p)^jj * P(kk)* e^-((kk + jj)* r * (tau/n));
                                disp('Вывод  P(kk) = ((kk + jj - 1)/ii) * p^k * (1 - p)^jj * P(kk)* e^-((kk + jj)* r * (maturity/n):')
                                fprintf('%.10f\n', P(kk))
                            end
                        end
                    end
                end
            end 
        end
    end
else
    disp('Ошибка условия: r >= q >0') 
end
if P(1) < 0
   disp('Вывод P[0]:')
   fprintf('%.10f\n', P(1))
end
Данные для ввода:
Matlab M
1
2
3
4
5
6
7
8
 S = 50;
X = 50;
n = 100;
r = 5;
q = 1;
tau = 1/3;
u = 1.5;
d = 0.5;
Полученные результаты, крайне трудно охарактеризовать как результаты

Еще вопрос касательно представленного алгоритма из книги, а именно строка: P[a] = 0; %Собрать нижнюю границу нулевых узлов в одном месте. Не совсем понял как это можно реализовать.

Всем заранее большое спасибо!!!
Миниатюры
Алгоритмы оценки опциона.  
0
0 / 0 / 0
Регистрация: 17.07.2013
Сообщений: 35
26.08.2013, 14:23  [ТС]
подкорректировал вышеуказанный алгоритм, но результаты все равно оставляют желать лучшего
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
function P = diagolametodamericanput(S, u, d, tau, X, n, r, q)
qnum = q/100;
P = zeros(1, n);
e = 2.7182818284;
rnum = r/100; %percent to number
R = e^rnum;
p = e^((((r-qnum)*(tau/n)) - d)/(u/d)); %для без дивидендной акции
a = log(X/(S * d^n))/log(u/d);
if rnum > qnum || rnum == qnum || qnum > 0
    for ii = 1:1:fix(a) - 1
        P(ii) = -1; %верхняя граница узлов досрочного исполнения
    end
    for jj = n - fix(a):-1:1
        for ii = fix(a) - 1:-1:1
            niz(ii) = P(ii);
            if  niz(ii) < 0
                niz(ii) = X - S * u^ii * d^(jj + 1);
                c(ii) = (p * P(ii + 1) + (1 - p) * niz(ii))/R;
            else
                if c(ii) > (X - S * u^ii * d^jj) && c(ii) == (X - S * u^ii * d^jj) && ii > 0
                   P(ii) = c; %досрочное исполнение отсутствует
                else
                    if c(ii) > (X - S * u^ii * d^jj) && c(ii) == (X - S * u^ii * d^jj) && ii == 0
                       P(ii) = c;
                    else
                        if jj == 0
                           disp('Вывод P[0]:')
                           fprintf('%.10f\n', P(1))
                        else 
                            for kk = 1:1:fix(a) - 1
                                P(kk) = ((kk + jj - 1)/kk) * p^kk * (1 - p)^jj * P(kk)* e^-((kk + jj)* r * (tau/n));
                                disp('Вывод  P(kk) = ((kk + jj - 1)/kk) * p^k * (1 - p)^jj * P(kk)* e^-((kk + jj)* r * (maturity/n):')
                                fprintf('%.10f\n', P(kk))
                            end
                        end
                    end
                end
            end 
        end
        if P(1) < 0
           P(1) = X - S;
           disp('Вывод P[0]:')
           fprintf('%.10f\n', P(1))
        end
    end
else
   disp('Ошибка условия: r >= q >0') 
end
end
0
 Аватар для lomt
454 / 280 / 13
Регистрация: 13.11.2012
Сообщений: 588
Записей в блоге: 1
26.08.2013, 14:36
Я потом посмотрю повнимательней, но как уже тебя просил Зосима, надо писать экспоненту в степени только в таком виде:
Matlab M
1
R = exp(r/100);
1
0 / 0 / 0
Регистрация: 17.07.2013
Сообщений: 35
26.08.2013, 14:39  [ТС]
Ок!, усвоил -запомнил, впредь экспоненту буду писать так в будущем. Спасибо, что отозвались на мою просьбу!
0
0 / 0 / 0
Регистрация: 17.07.2013
Сообщений: 35
27.08.2013, 17:21  [ТС]
Возможно проблема в 31 строке алгоритма см. выше. Не совсем понятно как присвоить значения P(kk) в соответствии с представленным алгоритмом? (см. картинку ниже), а именно как правильно записать выражение, то что указано в скобках.
Миниатюры
Алгоритмы оценки опциона.  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.08.2013, 17:21

Имеется n итоговых оценок студента. Расположите эти оценки в следующем порядке: десятки, восьмерки, шестерки. Остальные оценки в произвольном порядке
Имеется n итоговых оценок студента. Расположите эти оценки в следующем порядке: десятки, восьмерки, шестерки. Остальные оценки в...

Реализовать алгоритмы построения прямой: простой пошаговый алгоритм и алгоритмы Брезенхема
1. Написать на языке PASCAL программу, реализующую алгоритмы построения прямой: простой пошаговый алгоритм и алгоритмы Брезенхема для...

Циклические алгоритмы. Алгоритмы обработки последовательностей чисел
Помогите пожалуйста... Преподаватель говорит что: 1. Программа считает правильно (за исключением того, что по условию диапазон...

Циклические алгоритмы. Алгоритмы обработки последовательностей чисел
Помогите пожалуйста program Lab_3_1; const x1=1; xn=3; dx=0.2; a=3.9; b=2.3; var x,y,z:real; ...

Циклические алгоритмы (Алгоритмы с одним циклом)
Доброго времени суток! Помогите пожалуйста написать программы на циклы в Delphi 7, а то я только с линейными и разветвляющиеся...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru