Параметры
|
Номера ценных
бумаг i
|
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
хi,%
|
10
|
10
|
10
|
10
|
10
|
10
|
20
|
10
|
5
|
5
|
ri,%
|
15
|
15
|
18
|
12
|
25
|
20
|
10
|
28
|
35
|
50
|
σi,%
|
8
|
8
|
10
|
7
|
12
|
5
|
15
|
20
|
25
|
Решение.
rp = 0,1Ч15 + 0,1Ч15 +
0,1Ч18 + 0,1Ч12 + 0,1Ч25 + 0,1Ч20 + 0,1Ч28 + 0,05Ч35 + 0,05Ч50 = 19,55%.
Так как случайные величины доходностей бумаг являются
независимыми, то дисперсия доходности портфеля:
D(rp) = 0,01Ч64 + 0,01Ч64 + 0,01Ч100 + 0,01Ч49
+ 0,01Ч144 + 0,01Ч100 + 0,04Ч25 + 0,01Ч225 + 0,0025Ч400 + 0,0025Ч625 = 11,02.
Тогда σ(rp)
= = 3,32%.
Видим, что стандартное отклонение доходности портфеля оказалось
ниже минимального значения для ценной бумаги с номером 6, а «пиковые» значения
стандартных отклонений ценных бумаг с номерами 9 и 10 «растворились» в общей
величине σ(rp).
Приведенный пример показывает, что крупные компании на рынке
инвестиций чувствуют себя гораздо более уверенно, нежели их мелкие конкуренты,
поскольку крупные инвестиции позволяют приобретать более диверсифицированные
портфели и тем самым в значительной мере обезопасить компанию от рыночных
рисков.
1.3
Формирование оптимального портфеля
Портфель
Марковица минимального риска.
Существует несколько вариантов задач оптимизации рискового
портфеля. Рассмотрим одну из них. Это так называемый «портфель Марковица». Эта
задача была сформулирована и решена американским экономистом Г. Марковицем в
1952 году, за что позднее он получил Нобелевскую премию.
Пусть имеются n видов ценных бумаг, из которых инвестор хочет сформировать
портфель. Необходимо найти xi, минимизирующие вариацию портфеля:
Vp = SS xiЧxjЧVij,
при условии, что обеспечивается заданное значение
эффективности портфеля mp, т.е.
SxiЧmi = mp.
Поскольку xi - доли, то в сумме они должны составлять
единицу: Sxi=1.
Оставив за инвестором выбор средней эффективности портфеля и
помогая ему минимизировать в этом случае неопределенность, получаем следующую
задачу по оптимизации портфеля ценных бумаг:
SS xiЧxjЧVij (min)
Sxi = 1
SmiЧxi = mp
xi≥0,…, xn≥0
Опустив условия неотрицательности переменных, получаем
собственно задачу Марковица.
Решение.
С помощью функции Лагранжа сведем задачу на условный
экстремум к задаче на безусловный экстремум:
L(x1, …, xn, m, l)= SS VijЧxiЧxj - lЧ (Smi -1) - mЧ(SmiЧxi - mp),
= 2ЧSVisЧxi - l - mЧms = 0, s = 1, …,
n. (2)
Производные по l, m воспроизводят указанные
выше два соотношения, тем самым для (n+2) переменных x1,…, xn, l,
m получаем (n+2) уравнения.
Запишем полученные уравнения в матричной форме, используя
следующие обозначения:
, , , X¢= (x1,…, xn), M¢= (m1,…, mn).
Штрих применяется для обозначения операции транспонирования
матрицы.
B - матрица ковариаций, B-1 - обратная ей матрица.
Следовательно, уравнения (1) примут вид:
B Ч X = (l/2) Ч E + (m/2)
Ч M,
E¢Ч X = 1,
m¢Ч X = mp.
Основное допущение этой модели состоит в том, что между
эффективностями m1,…, mn нет линейной связи, поэтому
ковариационная матрица B невырождена (|B| ≠ 0), следовательно, существует обратная матрица В-1.
Используя этот факт, разрешим в матричной форме относительно Х:
Х = (l/2)*В-1Ч Е + (m/2) Ч В-1Ч М
(3)
Подставив это решение в первое и второе условия, получим два
уравнения для определения l/2 и m/2:
(Е¢ Ч В-1 Ч Е) Ч (l/2) + (Е¢ Ч В-1 Ч М) Ч
(m/2)
= 1
(М¢ Ч B-1 Ч Е) Ч (l/2) + (М¢ Ч В-1 Ч М) Ч
(m/2)
= mp.
Решая два последних уравнения по правилу Крамера, находим:
l/2 = ((М¢ Ч В-1 Ч М) - mp Ч (Е¢ Ч В-1 Ч М)) / ((Е¢ Ч В-1 Ч Е) Ч
(М¢ Ч В-1 Ч М) - (М¢ Ч B-1 Ч Е)2)
m/2 = (mp Ч (Е¢ Ч В-1 Ч Е) - (М¢ Ч B-1 Ч Е)) / ((Е¢ Ч В-1 Ч Е) Ч (М¢ Ч В-1 Ч М) -
(М¢ Ч B-1 Ч Е)2)
С помощью подстановки можно убедиться, что Е¢ Ч Х* = 1 и М¢ Ч Х* = mp.
Тогда = , что и является минимальным риском портфеля.
Если ≥0, то это означает рекомендацию вложить долю наличного
капитала в ценные бумаги i-го вида. Если же <0, то содержательно это означает провести операцию «short sale»
(«короткая продажа»). Инвестор, формирующий портфель, обязуется через какое-то
время поставить ценные бумаги i-го вида
(вместе с доходом, какой они принесли бы их владельцу за это время). За это
сейчас он получает их денежный эквивалент. Эти деньги он присоединяет к своему
капиталу и покупает рекомендуемые оптимальным решением ценные бумаги. Так как
ценные бумаги других видов (т.е. не i-го
вида) более эффективны, то инвестор оказывается в выигрыше. Математически эта
операция значит, что нужно исключить этот вид ценных бумаг из рассмотрения и
решить задачу заново.
2.
Задача формирования портфеля максимальной эффективности из всех портфелей,
имеющих риск не более заданного
Постановку Марковица задачи формирования оптимального
портфеля можно словами сформулировать так: сформировать портфель минимального
риска из всех портфелей, имеющих эффективность не менее заданной.
Но столь же естественна и задача формирования портфеля
максимальной эффективности из всех портфелей, имеющих риск не более заданного:
Найти xi, максимизирующие ожидаемую эффективность
портфеля:
при условии, что обеспечивается заданное значение риска
портфеля, т.е.
поскольку хi - доли, то в сумме они должны составлять
единицу:
Для решения описанных выше задач было разработано приложение
для ЭВМ.
2.1 Руководство пользователя
Название приложения: OptimalPortfolio.exe.
Дополнительные ресурсы: папка с примерами.
Общий
вид программы при запуске.
Это форма предназначена для операций расчёта оптимального
набора ценных бумаг в портфеле инвестиций.
Для начала работы пользователь должен ввести исходные данные
задачи:
· количество ценных бумаг,
из которых состоит портфель, в предназначенное для этого поле:
· доходности и стандартные
отклонения для каждой бумаги в таблицу:
· коэффициенты корреляции
между доходностями ценных бумаг в таблицу:
· выбрать задачу, которую
нужно решить, отметив, что будет вводиться: желаемая доходность или допустимый
риск:
Убедившись, что все данные введены корректно, нужно нажать
кнопку
,
чтобы программа выполнила необходимые вычисления.
Полученные доли ценных бумаг выводятся в таблицу:
А рассчитанный минимальный риск (максимальная доходность) в
поле:
Кроме того, предусмотрена возможность построения графика,
называемого «Пуля» Марковица для отображения эффективной границы, которая
показывает множество оптимальных портфелей (выделена красным цветом), и
достижимого множества, представляющего собой все портфели, которые можно
составить из n
видов ценных бумаг (область внутри «пули»).
Для построения графика нужно нажать кнопку:
Для того чтобы очистить все исходные данные для решения новой
задачи, надо нажать кнопку:
Для перехода к решению задачи определения ожидаемой
доходности и стандартного отклонения доходности готового портфеля, необходимо
выбрать пункт «Расчёт доходности и риска портфеля» в меню «Операции» или нажать
соответствующую кнопку на инструментальной панели.
Откроется форма, предназначенная для решения данной задачи:
Работа с данной формой аналогична работе с первой.
Для обратного перехода нужно выбрать один из пунктов меню
«Операции» или нажать на соответствующую кнопку на панели инструментов:
.2
Работа с файлами
В программе предусмотрена возможность сохранения данных
задачи в файл и ввод данных из файла. Данные функции осуществляются с помощью
пунктов «Открыть» и «Сохранить» меню «Файл» или нажатием на соответствующие
кнопки на панели инструментов.
По умолчанию папкой с примерами является папка, откуда была
запущена программа, но может быть выбрана и другая директория в открывшемся
диалоговом окне.
2.3
Завершение работы
Для выхода из программы используется пункт «Выход» меню
«Файл» или соответствующая кнопка на инструментальной панели.
.4
Функции для упрощения работы пользователя с программой
Предусмотрено наличие всплывающих подсказок при наведении
указателя на какой-либо компонент или пункт меню, помогающих пользователю
ориентироваться в приложении.
Есть статусная панель, в которой тоже отображаются подсказки
пользователю.
На панели инструментов расположены основные кнопки для быстроты
доступа к нужным функциям.
Предусмотрена проверка на корректный ввод и отображение
сообщений с описанием возникшей ошибки. Например,
Прочитав сообщение, нужно нажать «OK» и исправить указанную
ошибку.
Для проверки работоспособности программы служат файлы: example1.tpr, example2d.tpr, example10.tpr, example11.tpr.
Также рассмотрен пример портфеля инвестиций из ценных бумаг
реальных компаний, основные показатели которых были оценены экспертами. Эти
показатели приведены в таблицах 2 и 3.
Таблица 2. Доходность и риск
Таблица 3. Матрица коэффициентов корреляции
Данные этого примера сохранены в файле equity.tpr.
Заключение
В данной курсовой работе были рассмотрены основные вопросы
портфельной теории, в частности расчёт доходности и риска портфеля и построение
оптимального портфеля ценных бумаг.
Данная тема является актуальной, так как в условиях неопределенности
инвестор не может точно рассчитать доходность той или иной ценной бумаги. Кроме
того, он всегда подвергается риску потерять свои средства.
Портфельная теория предлагает методы расчёта средней
ожидаемой доходности и риска и методы для снижения рисков или увеличения
доходности от приобретения ценных бумаг за счёт диверсификации вложений и
формирования портфеля инвестиций.
В курсовой работе был рассмотрен вариант построения
оптимального портфеля, предложенный Г. Марковицем, на основе которого было создано
приложение для расчёта оптимального набора ценных бумаг в портфеле инвестиций.
Созданное приложение позволяет также рассчитать ожидаемую
доходность и стандартное отклонение уже созданного портфеля.
инвестиционный портфель программа марковиц
Список литературы
1. М.С.
Красс, Б.П. Чупрынов. Математика для экономистов. - СПб: «Питер», 2005. - 464
с.
. Колемаев
В.А. Математическая экономика. М.: «Юнити» 1998. - 390 с.
. http://www.finansmat.ru/
4. http://www. Finam.ru
Приложение
unit Unit1;, Messages, SysUtils, Variants,
Classes, Graphics, Controls, Forms,, StdCtrls, ExtCtrls, Menus, TeeProcs,
TeEngine, Chart, Spin,, ComCtrls, ToolWin, Series, Math, ImgList,
AppEvnts;_Risk_or_Profit = class(TForm): TToolBar;: TStatusBar;_Input_date:
TStringGrid;_Correlation: TStringGrid;_Input_count: TSpinEdit;: TChart;:
TMainMenu;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;:
TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TLabel;: TLabel;: TLabel;:
TButton;_Risk_or_Profit: TRadioGroup;: TLabel;_Risk_or_Profit: TEdit;:
TButton;: TLabel;_Result: TStringGrid;: TLineSeries;: TLineSeries;: TButton;:
TOpenDialog;: TSaveDialog;: TEdit;: TLabel;: TToolButton;: TToolButton;:
TToolButton;: TToolButton;: TToolButton;: TToolButton;: TToolButton;: TToolButton;:
TApplicationEvents;: TImageList;NReadyPortfolioClick (Sender:
TObject);NExitClick (Sender: TObject);FormCreate (Sender:
TObject);SG_Input_dateKeyPress (Sender: TObject; var Key:
Char);SG_CorrelationKeyPress (Sender: TObject; var Key: Char);E_Risk_or_ProfitKeyPress
(Sender: TObject; var Key: Char);SE_Input_countChange (Sender:
TObject);BClearClick (Sender: TObject);BCalculationClick (Sender:
TObject);Graph;Get_Date:boolean;BDrawGraphClick (Sender:
TObject);SG_CorrelationSelectCell (Sender: TObject; ACol,: Integer; var
CanSelect: Boolean);SG_CorrelationMouseUp (Sender: TObject; Button:
TMouseButton;: TShiftState; X, Y: Integer);SG_CorrelationExit (Sender:
TObject);NOpenClick (Sender: TObject);NSaveClick (Sender: TObject);NAboutClick
(Sender: TObject);ApplicationEvents1Hint (Sender: TObject);
{Private declarations}
{Public declarations};myarray=array [1..100] of
real;=array [1.. 100,1..100] of real;_Risk_or_Profit:
TForm_Risk_or_Profit;:integer;, BE, BM, deviation_of_stocks:myarray;, E, B1,
E1:myarr;, ebe, mbm, ebm, x, mbe:real;, risk:real;_of_stocks, SelectedRow,
SelectedCol:integer;Unit2, UAboutMe;
{$R
*.dfm}TForm_Risk_or_Profit.NReadyPortfolioClick (Sender: TObject);i,
j:integer;_Risk_or_Profit. Visible:=False;_for_ready_portfolio.SE_Input_count.
Value:=SEValue;_for_ready_portfolio. Show;i:=1 to SEValue
do_for_ready_portfolio.SG_Input_date. Cells [i, 2]:=SG_Input_date. Cells [i,
1];_for_ready_portfolio.SG_Input_date. Cells [i, 3]:=SG_Input_date. Cells [i,
2];j:=1 to SEValue do_for_ready_portfolio.SG_Correlation. Cells [i,
j]:=SG_Correlation. Cells [i, j];;;;TForm_Risk_or_Profit.NExitClick (Sender:
TObject);;;TForm_Risk_or_Profit. FormCreate (Sender: TObject);_Input_date.
Cells [0,0]:='Показатель | Номер бумаги';_Input_date.
Cells [0,1]:='Доходность';_Input_date.
Cells [0,2]:='Риск';_Result.
Cells [0,0]:='Номер бумаги';_Result.
Cells [0,1]:='Доля';:=1;:=1;;TForm_Risk_or_Profit.SG_Input_dateKeyPress
(Sender: TObject;Key: Char);key of
'0'..'9',#8,',
':;key:=#0;;;TForm_Risk_or_Profit.SG_CorrelationKeyPress (Sender: TObject;Key:
Char);key of
'0'..'9',#8,',
','-':;key:=#0;;;TForm_Risk_or_Profit.E_Risk_or_ProfitKeyPress (Sender:
TObject;Key: Char);key of
'0'..'9',#8,',
':;key:=#0;;;TForm_Risk_or_Profit.SE_Input_countChange (Sender:
TObject);i:integer;:=SE_Input_count. Value;i:=1 to SEValue do_Input_date. Cells
[i, 0]:=inttostr(i);_Result. Cells [i, 0]:=inttostr(i);_Correlation. Cells [0,
i]:=inttostr(i);_Correlation. Cells [i, 0]:=inttostr(i);_Correlation. Cells [i,
i]:='1';;_Input_date. ColCount:=SEValue+1;_Correlation.
ColCount:=SEValue+1;_Correlation. RowCount:=SEValue+1;_Result.
ColCount:=SEValue+1;;TForm_Risk_or_Profit.BClearClick (Sender: TObject);i,
j:integer;i:=1 to SEValue doj:=1 to SEValue do_Input_date. Cells [i,
j]:='';_Correlation. Cells [i, j]:='';_Result. Cells [i, j];;.
Clear;_Risk_or_Profit. Clear;
SE_Input_count. Value:=2;;minRisk
(mp:real):real;:=sqrt((mp*mp*ebe-2*mp*mbe+mbm)/(ebe*mbm-mbe*mbe));;bisection
(a, b, risk:real):real;y1, y2, c:real;:=MinRisk(a) - risk;:=MinRisk(b) -
risk;abs(y2)>0.000001 do:=(a+b)/2;:=MinRisk(c) - risk;y1*y2<0b:=cbegin
a:=c; y1:=y2; end;;:=c;;TForm_Risk_or_Profit. Get_Date:boolean;i,
j:integer;:=True;_of_stocks:=SE_Input_count. Value;i:=1 to number_of_stocks
do[i, i]:=1;[i]:=strtofloat (SG_Input_date. Cells [i, 1]);('Извините, Вы не ввели доходность
'+intToStr(i)+'-й
бумаги!');:=False;;;_of_stocks[i]:=strtofloat
(SG_Input_date. Cells [i, 2]);('Извините, Вы не ввели риск
'+intToStr(i)+'-й
бумаги!');:=False;;;[i,
i]:=sqr (deviation_of_stocks[i]);;i:=1 to number_of_stocks doj:=i+1 to
number_of_stocks doB [i, j]:=strtofloat (SG_Correlation. Cells [j,
i])*deviation_of_stocks[i]*deviation_of_stocks[j];
except('Извините, Вы не ввели корреляцию '+intToStr(i)+'-ой и
'+intToStr(j)+'-ой бумаг!');
result:=False;;;[j, i]:=B [i, j];[i, j]:=0;[j,
i]:=0;;;;base;i, j, k, l, a:integer;i:=1 to number_of_stocks doj:=1 to
number_of_stocks dok:=1 to number_of_stocks do[j, k]:=B [j, k];[j, k]:=E [j,
k];;;l:=1 to number_of_stocks do[i, l]:=B1 [i, l]/B1 [i, i];[i, l]:=E1 [i,
l]/B1 [i, i];a:=1 to number_of_stocks doa<>i then[a, l]:=(B1 [a, l] - (B1
[a, i]*B1 [i, l]/B1 [i, i]));[a, l]:=(E1 [a, l] - (B1 [a, i]*E1 [i, l]/B1 [i,
i]));;;;;i:=1 to number_of_stocks do[i]:=0;j:=1 to number_of_stocks
do[i]:=BE[i]+E [i, j];;;i:=1 to number_of_stocks do[i]:=0;j:=1 to
number_of_stocks do[i]:=BM[i]+M[j]*E [i, j];;;:=0;:=0;:=0;:=0;i:=1 to
number_of_stocks
do:=ebe+BE[i];:=ebm+BM[i];:=mbm+M[i]*BM[i];:=mbe+M[i]*BE[i];;;TForm_Risk_or_Profit.
Graph;i:integer;, max, profit:real;:=m[1];i:=2 to number_of_stocks dom[i]>max
then max:=m[i];;:=m[1];i:=2 to number_of_stocks dom[i]<min then
min:=m[i];;:=mbe/ebe;. AddXY (minRisk(profit),
profit);:=profit+(max-min)/100;profit>=max;:=min;. AddXY (minRisk(profit),
profit);:=profit+(max-min)/100;profit>=mbe/ebe;;Max_Profit (risk:real):real;i:integer;:real;:=m[1];i:=2
to number_of_stocks dom[i]>max then:=m[i];;:=bisection (mbe/ebe, max,
risk);:=mPr;;TForm_Risk_or_Profit.BCalculationClick (Sender:
TObject);i:integer;, min:real;:boolean;Get_Date then;.
Caption:='';RG_Risk_or_Profit. ItemIndex of
:begin:=strtofloat (E_Risk_or_Profit. Text);. MessageBox
('Извините, Вы не ввели желаемую доходность!', 'Ошибка!');;;
// проверка, лежит ли введенная доходность между минимальной
и максимальной
max:=m[1];i:=2 to number_of_stocks dom[i]>max
then max:=m[i];;:=m[1];i:=2 to number_of_stocks dom[i]<min then
min:=m[i];;(mp<min) or (mp>max) then
begin. MessageBox ('Извините, желаемая доходность должна быть
в пределах эффективностей ценных бумаг!', 'Ошибка!');
exit;;mp<mbe/ebe then
LComment. Caption:='Внимание! Указанная доходность НЕ лежит
на эффективной границе!'+#9#13
+'Полученному уровню риска соответствует бОльшая доходность,
равная '+floattostr (roundto(max_Profit (minrisk(mp)), - 4))+#9#13#9#13;
EditResult. Text:=' Минимальный риск портфеля: '+floattostr
(roundto(minrisk(mp), - 4));;
exit;;:=Max_Profit(risk);. Text:=' Максимальная доходность портфеля: '+floattostr
(roundto(mp, - 4));;;:=false;i:=1 to number_of_stocks
do:=((mbm-mp*ebm)*BE[i]+(mp*ebe-mbe)*BM[i])/(ebe*mbm-mbe*mbe);x<0 then
a:=true;_Result. Cells [i, 1]:=floattostr (roundto(x, - 4));;a then. Caption:=LComment. Caption+' Так как доля бумаг
отрицательна, то необходимо провести сделку «short sale», '+#9#13
+' исключить бумаги этого вида из портфеля и решить задачу
заново.';
end;;TForm_Risk_or_Profit.BDrawGraphClick
(Sender: TObject);Get_Date then. Clear;. Clear;;;;;TForm_Risk_or_Profit.SG_CorrelationSelectCell
(Sender: TObject;, ARow: Integer; var CanSelect: Boolean);ACol=ARowbegin
CanSelect:=False; exit;
end;_CorrelationExit(Sender);:=ARow;:=ACol;;TForm_Risk_or_Profit.SG_CorrelationMouseUp
(Sender: TObject;: TMouseButton; Shift: TShiftState; X, Y:
Integer);_CorrelationExit(Sender);;TForm_Risk_or_Profit.SG_CorrelationExit
(Sender: TObject);abs (StrToFloat(SG_Correlation. Cells [SelectedCol,
SelectedRow]))<=1 then SG_Correlation. Cells [SelectedRow, SelectedCol]:=SG_Correlation.
Cells [SelectedCol, SelectedRow]('Извините, корреляция не может быть больше
1!');_Correlation. Cells [SelectedCol, SelectedRow]:='0';_Correlation. Cells
[SelectedRow, SelectedCol]:='0';;_Correlation. Cells [SelectedCol,
SelectedRow]:='0';_Correlation. Cells [SelectedRow,
SelectedCol]:='0';;;TForm_Risk_or_Profit.NOpenClick (Sender: TObject);f:file of
real;, j:integer;:real;OpenDialog1. Execute(Sender);(f, OpenDialog1.
FileName);(f);. MessageBox ('Извините, невозможно открыть файл!', 'Ошибка!');
end;(f, a);:=round(a);_Input_count.
Value:=SEValue;
// считываем из файла доходности
for i:=1 to SEValue do
begin(f, a);_Input_date. Cells [i,
1]:=FloatToStr(a);;
// считываем из файла рискиi:=1 to
SEValue do(f, a);_Input_date. Cells [i, 2]:=FloatToStr(a);;
// считываем из файла корреляциюi:=1 to
SEValue doj:=1 to SEValue do(f, a);_Correlation. Cells [i,
j]:=FloatToStr(a);;(f);;;TForm_Risk_or_Profit.NSaveClick (Sender:
TObject);f:file of real;, j:integer;:real;SaveDialog1. ExecuteExtractFileExt
(SaveDialog1. FileName)=''SaveDialog1. FileName:=SaveDialog1.
FileName+'.tpr';(f, SaveDialog1. FileName);(f);:=SEValue;(f, a);
// записываем в файл доходности
for i:=1 to SEValue do
begin:=StrToFloat (SG_Input_date. Cells [i,
1]);:=0;; (f, a);
end;
// записываем в файл риски
for i:=1 to SEValue do:=StrToFloat
(SG_Input_date. Cells [i, 2]);:=0;; (f, a);
end;
// записываем в файл корреляцию
for i:=1 to SEValue doj:=1 to SEValue
do:=StrToFloat (SG_Correlation. Cells [i, j]);:=0;;(f, a);;
// записываем в файл долиi:=1 to SEValue
do:=0;(f, a);;(f);;;TForm_Risk_or_Profit.NAboutClick (Sender: TObject);.
ShowModal;;TForm_Risk_or_Profit. ApplicationEvents1Hint (Sender: TObject);.
SimpleText:=Application. Hint;;.
unit Unit2;Windows, Messages, SysUtils, Variants,
Classes, Graphics, Controls, Forms,, ComCtrls, StdCtrls, Menus, ToolWin, Spin,
Grids, Math, AppEvnts,;_for_ready_portfolio = class(TForm): TToolBar;:
TMainMenu;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;:
TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TStatusBar;: TMenuItem;:
TLabel;_Input_count: TSpinEdit;: TButton;: TLabel;_Input_date: TStringGrid;:
TLabel;_Correlation: TStringGrid;: TButton;: TLabel;: TMemo;: TOpenDialog;:
TSaveDialog;: TToolButton;: TToolButton;: TToolButton;: TToolButton;: TToolButton;:
TToolButton;: TToolButton;: TToolButton;: TToolButton;: TImageList;:
TApplicationEvents;NMinRiskClick (Sender: TObject);NExitClick (Sender:
TObject);NMaxProfitClick (Sender: TObject);BCalculationClick (Sender:
TObject);FormCreate (Sender: TObject);FormClose (Sender: TObject; var Action:
TCloseAction);SG_Input_dateKeyPress (Sender: TObject; var Key: Char);
//procedure FormShow (Sender:
TObject);SG_CorrelationKeyPress (Sender: TObject; var Key:
Char);SE_Input_countChange (Sender: TObject);BClearClick (Sender:
TObject);SG_CorrelationSelectCell (Sender: TObject; ACol,: Integer; var
CanSelect: Boolean);SG_CorrelationExit (Sender: TObject);SG_CorrelationMouseUp
(Sender: TObject; Button: TMouseButton;: TShiftState; X, Y: Integer);NOpenClick
(Sender: TObject);NSaveClick (Sender: TObject);NAboutClick (Sender:
TObject);ApplicationEvents1Hint (Sender: TObject);
{Private declarations}
{Public declarations};myarray=array [1..100] of
real;=array [1.. 100,1..100] of real;Form_for_ready_portfolio:
TForm_for_ready_portfolio;, SelectedRow, SelectedCol:integer;Unit1, UAboutMe;
{$R *.dfm}TForm_for_ready_portfolio.NMinRiskClick
(Sender: TObject);_for_ready_portfolio.
Visible:=False;_Risk_or_Profit.RG_Risk_or_Profit. ItemIndex:=0;_Risk_or_Profit.
Show;;TForm_for_ready_portfolio.NExitClick (Sender:
TObject);;;TForm_for_ready_portfolio.NMaxProfitClick (Sender:
TObject);_for_ready_portfolio.
Visible:=False;_Risk_or_Profit.RG_Risk_or_Profit. ItemIndex:=1;_Risk_or_Profit.
Show;;TForm_for_ready_portfolio.BCalculationClick (Sender: TObject);profitability_of_portfolio,
deviation_of_portfolio:real;_of_stocks, i, j:integer;, sum:real;_of_stocks,
deviation_of_stocks, equity_share:myarray;_of_stocks:=SE_Input_count.
Value;:=0;i:=1 to number_of_stocks do_share[i]:=strtofloat (SG_Input_date. Cells [i, 1]);('Извините, Вы не
ввели долю '+intToStr(i)+'-ой бумаги!');;;:=sum+equity_share[i];_of_stocks[i]:=strtofloat
(SG_Input_date. Cells [i, 2]);('Извините, Вы не ввели доходность '+intToStr(i)+'-ой
бумаги!');
exit;;_of_stocks[i]:=strtofloat (SG_Input_date.
Cells [i, 3]);('Извините, Вы не ввели риск
'+intToStr(i)+'-ой бумаги!');;;;sum<>1
then
begin. MessageBox ('Извините, сумма долей бумаг должна быть
равна 1', 'Ошибка!');
exit;;_of_portfolio:=0;:=0;i:=1 to
number_of_stocks doprofitability_of_portfolio:=profitability_of_portfolio+equity_share[i]*profitabilities_of_stocks[i];j:=1
to number_of_stocks
dodispersion:=dispersion+equity_share[i]*equity_share[j]*strtofloat
(SG_Correlation. Cells [i, j])*deviation_of_stocks[i]*deviation_of_stocks[j];
except('Извините, Вы не ввели корреляцию '+intToStr(i)+'-ой и
'+intToStr(j)+'-ой бумаг!');
exit;;;_of_portfolio:=sqrt(dispersion);. Lines.
Add ('Ожидаемая доходность портфеля: '+floattostr
(roundto(profitability_of_portfolio, - 4))+' % ');. Lines. Add ('Стандартное отклонение доходности: '+floattostr
(roundto(deviation_of_portfolio, - 4))+' % ');;TForm_for_ready_portfolio.
FormCreate (Sender: TObject);_Input_date. Cells [0,0]:='Показатель | Номер бумаги';_Input_date.
Cells [0,1]:='Доля';_Input_date.
Cells [0,2]:='Доходность';_Input_date.
Cells [0,3]:='Стандартное отклонение';:=1;:=1;;TForm_for_ready_portfolio.
FormClose (Sender: TObject;Action: TCloseAction);_Risk_or_Profit.
Close;;TForm_for_ready_portfolio.SG_Input_dateKeyPress (Sender: TObject;Key:
Char);key of
'0'..'9',#8,',
':;key:=#0;;;TForm_for_ready_portfolio.SG_CorrelationKeyPress (Sender:
TObject;Key: Char);key of
'0'..'9',#8,',
','-':;key:=#0;;;TForm_for_ready_portfolio.SE_Input_countChange (Sender:
TObject);i:integer;:=SE_Input_count. Value;i:=1 to SEValue do_Input_date. Cells
[i, 0]:=inttostr(i);_Correlation. Cells [0, i]:=inttostr(i);_Correlation. Cells
[i, 0]:=inttostr(i);_Correlation. Cells [i, i]:='1';;_Input_date.
ColCount:=SEValue+1;_Correlation. ColCount:=SEValue+1;_Correlation.
RowCount:=SEValue+1;;TForm_for_ready_portfolio.BClearClick (Sender: TObject);i,
j:integer;i:=1 to SEValue doj:=1 to SEValue do_Input_date. Cells [i,
j]:='';_Correlation. Cells [i, j]:='';;. Lines. Clear;_Input_count.
Value:=2;;TForm_for_ready_portfolio.SG_CorrelationSelectCell (: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);ACol=ARowbegin CanSelect:=False; exit;
end;_CorrelationExit(Sender);:=ARow;:=ACol;;TForm_for_ready_portfolio.SG_CorrelationExit
(Sender: TObject);abs (StrToFloat(SG_Correlation. Cells [SelectedCol,
SelectedRow]))<=1 then SG_Correlation. Cells [SelectedRow,
SelectedCol]:=SG_Correlation. Cells [SelectedCol, SelectedRow]('Извините, корреляция не может быть больше
1!');_Correlation. Cells [SelectedCol, SelectedRow]:='0';;_Correlation. Cells
[SelectedCol, SelectedRow]:='0';_Correlation. Cells [SelectedRow,
SelectedCol]:='0';;;TForm_for_ready_portfolio.SG_CorrelationMouseUp (Sender:
TObject;: TMouseButton; Shift: TShiftState; X, Y:
Integer);_CorrelationExit(Sender);;TForm_for_ready_portfolio.NOpenClick
(Sender: TObject);f:file of real;, j:integer;:real;OpenDialog1. Execute
then(Sender);(f, OpenDialog1. FileName);(f);. MessageBox ('Извините, невозможно
открыть файл!', 'Ошибка!');
end;(f, a);:=round(a);_Input_count.
Value:=SEValue;
// считываем из файла доходностиi:=1 to SEValue do
begin(f, a);_Input_date. Cells [i,
2]:=FloatToStr(a);;
// считываем из файла рискиi:=1 to
SEValue do(f, a);_Input_date. Cells [i, 3]:=FloatToStr(a);;
// считываем из файла корреляциюi:=1 to
SEValue doj:=1 to SEValue do(f, a);_Correlation. Cells [i, j]:=FloatToStr(a);;
// считываем из файла долиi:=1 to
SEValue do(f, a);_Input_date. Cells [i,
1]:=FloatToStr(a);;(f);;;TForm_for_ready_portfolio.NSaveClick (Sender:
TObject);f:file of real;, j:integer;:real;SaveDialog1. Execute
thenExtractFileExt (SaveDialog1. FileName)=''SaveDialog1.
FileName:=SaveDialog1. FileName+'.tpr';(f, SaveDialog1.
FileName);(f);:=SEValue;(f, a);
// записываем в файл доходностиi:=1 to SEValue do
begin:=StrToFloat (SG_Input_date. Cells [i, 2]);:=0;; (f, a);
end;
// записываем в файл риски
for i:=1 to SEValue do:=StrToFloat
(SG_Input_date. Cells [i, 3]);:=0;; (f, a);
end;
// записываем в файл корреляцию
for i:=1 to SEValue doj:=1 to SEValue
do:=StrToFloat (SG_Correlation. Cells [i, j]);:=0;;(f, a);;
// записываем в файл долиi:=1 to
SEValue do:=StrToFloat (SG_Input_date. Cells [i, 1]);:=0;;(f,
a);;(f);;;TForm_for_ready_portfolio.NAboutClick (Sender: TObject);.
ShowModal;TForm_for_ready_portfolio. ApplicationEvents1Hint (: TObject);.
SimpleText:=Application. Hint;;.