Создание компьютерного приложения для расчета оптимального набора ценных бумаг в портфеле инвестиций
Формирование инвестиционного портфеля и его диверсификация. Расчет показателей оптимального портфеля. Задача выбора портфеля максимальной эффективности из всех портфелей, имеющих риск не более заданного. Работа с файлами. Упрощение работы с программой.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 26.02.2013 |
Размер файла | 435,8 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Введение
Переход экономики РФ к рыночным отношениям привел к развитию рынка ценных бумаг. Как следствие, вырос интерес юридических и физических лиц к вложениям финансовых средств в акции и облигации ведущих российских эмитентов и их производные инструменты.
Рынок ценных бумаг в условиях развивающейся российской экономики характеризуются как высокой доходностью, так и значительными рисками в сравнении с рынками развитых экономик. Одним из основных способов уменьшения риска инвестиций в финансовые инструменты является диверсификация активов, что приводит к формированию портфелей ценных бумаг.
Потенциальному инвестору достаточно трудно составить портфель с приемлемым для него соотношением риск-доходность, поэтому проблема моделирования оптимального портфеля ценных бумаг с учетом ограничений приобретает особую актуальность.
Целью данной курсовой работы является изучение основных аспектов портфельной теории и создание на их основе приложения на ЭВМ для расчёта оптимального набора ценных бумаг в портфеле инвестиций.
Портфельный анализ
Начало портфельного анализа было положено в работах лауреата Нобелевской премии в области экономики, профессора Чикагского университета Г.Марковица в 1952 г. Им впервые была предложена модель формирования оптимального портфеля и были даны методы построения таких портфелей.
Формирование инвестиционного портфеля
Поскольку ценные бумаги различных видов различаются по доходности и степени надёжности, инвесторы вкладывают средства в приобретение ценных бумаг нескольких видов, стремясь достичь наилучшего соотношения «риск-доходность». Принимая решение о приобретении набора ценных бумаг, инвестор должен иметь в виду, что доходность портфеля в предстоящий период владения неизвестна. Однако можно оценить предполагаемую доходность различных ценных бумаг, основываясь на некоторых предположениях. Уровень доходности является случайной величиной, и основными её характеристиками являются ожидаемое, или среднее, значение и стандартное отклонение. Именно последнюю характеристику предлагается использовать как меру риска.
Ожидаемая доходность портфеля из n ценных бумаг равна:
n
rp = ?xi ri , (1)
i=1
где xi - доля начальной стоимости портфеля, инвестированная в i-ый вид ценных бумаг, ri - ожидаемая доходность i-го вида ценных бумаг, n - количество видов ценных бумаг в портфеле.
Стандартное отклонение портфеля у(rp) вычисляется следующим образом. Дисперсия доходности портфеля - это дисперсия суммы случайных величин; как известно из теории математической статистики, она равна ковариации:
n n n n
D(rp) = Cov( ?xi ri , ?xj rj ) = ??xixj Cov(ri ,rj).
i=1 j=1 i=1 j=1
Здесь Cov(ri ,rj) - ковариация ожидаемых доходностей ценных бумаг i и j, вычисляемая по формуле:
Cov(ri ,rj) = µij = µij уi уj , i, j = 1, 2, …, n,
где µij - коэффициент корреляции между доходностями i-й и j-й ценных бумаг, D и у - соответственно, дисперсия и стандартное (среднеквадратическое) отклонение доходностей ценных бумаг. Как известно,
-1 ? µij ? 1.
Формула для стандартного отклонения портфеля имеет вид:
у(rp) = .
Рассмотрим пример.
Пример 1. Найти ожидаемую доходность и стандартное отклонение доходности портфеля, состоящего из 30 % акций компании А и 70 % акций компании В, если их доходности некоррелированы и равны, соответственно, 25 и 10 %, а стандартные отклонения - 10 и 5 %.
Решение. По формуле (1) получаем:
rp = 0,3Ч25 % + 0,7Ч10 % = 14,5 %.
Поскольку доходности бумаг некоррелированы, то µij = 0 при i ? j, и тогда
у(rp) = = 4,6%.
Диверсификация портфеля.
Приведенный пример показывает, что портфель ценных бумаг обладает меньшим риском, чем некоторые отдельные составляющие его бумаги. Это свойство портфеля называется диверсификацией: увеличение количества видов ценных бумаг при одновременном сокращении их долей в общей ожидаемой доходности уменьшает риск портфеля. Проиллюстрируем на примере.
Пример 2. Найти ожидаемую доходность и её стандартное отклонение для портфеля, состоящего из 10 видов ценных бумаг с некоррелированными доходностями. Доли ценных бумаг хi , их доходности ri и стандартные отклонения уi приведены в таблице 1.
Таблица 1
Параметры |
Номера ценных бумаг 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 |
10 |
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).
Приведенный пример показывает, что крупные компании на рынке инвестиций чувствуют себя гораздо более уверенно, нежели их мелкие конкуренты, поскольку крупные инвестиции позволяют приобретать более диверсифицированные портфели и тем самым в значительной мере обезопасить компанию от рыночных рисков.
Формирование оптимального портфеля. Портфель Марковица минимального риска
Существует несколько вариантов задач оптимизации рискового портфеля. Рассмотрим одну из них. Это так называемый «портфель Марковица». Эта задача была сформулирована и решена американским экономистом Г. Марковицем в 1952 году, за что позднее он получил Нобелевскую премию.
Пусть имеются n видов ценных бумаг, из которых инвестор хочет сформировать портфель. Необходимо найти xi, минимизирующие вариацию портфеля:
Vp = xiЧxjЧVij ,
при условии, что обеспечивается заданное значение эффективности портфеля mp, т.е.
xiЧmi = mp.
Поскольку xi - доли, то в сумме они должны составлять единицу:
xi=1.
Оставив за инвестором выбор средней эффективности портфеля и помогая ему минимизировать в этом случае неопределенность, получаем следующую задачу по оптимизации портфеля ценных бумаг:
xiЧxjЧVij (min)
xi = 1
miЧxi = mp
xi?0,…,xn?0
Опустив условия неотрицательности переменных, получаем собственно задачу Марковица.
Решение.
С помощью функции Лагранжа сведем задачу на условный экстремум к задаче на безусловный экстремум:
L(x1, …, xn, , )= VijЧxiЧxj - Ч (mi -1) - Ч(miЧxi - mp),
= 2ЧVisЧxi - - Чms = 0, s = 1, …, n. (2)
Производные по , воспроизводят указанные выше два соотношения, тем самым для (n+2) переменных x1,…,xn, , получаем (n+2) уравнения.
Запишем полученные уравнения в матричной форме, используя следующие обозначения:
, , , X= (x1,…,xn), M= (m1,…,mn).
Штрих применяется для обозначения операции транспонирования матрицы.
B - матрица ковариаций, B-1 - обратная ей матрица. Следовательно, уравнения (1) примут вид:
B Ч X = (/2) Ч E + (/2) Ч M,
EЧ X = 1,
mЧ X = mp.
Основное допущение этой модели состоит в том, что между эффективностями m1,…,mn нет линейной связи, поэтому ковариационная матрица B невырождена (|B| ? 0), следовательно, существует обратная матрица В-1. Используя этот факт, разрешим в матричной форме относительно Х:
Х = (/2)*В-1Ч Е + (/2) Ч В-1Ч М (3)
Подставив это решение в первое и второе условия, получим два уравнения для определения /2 и /2:
(Е Ч В-1 Ч Е) Ч (/2) + (Е Ч В-1 Ч М) Ч (/2) = 1
(М Ч B-1 Ч Е) Ч (/2) + (М Ч В-1 Ч М) Ч (/2) = mp.
Решая два последних уравнения по правилу Крамера, находим:
/2 = ((М Ч В-1 Ч М) - mp Ч (Е Ч В-1 Ч М)) / ((Е Ч В-1 Ч Е) Ч (М Ч В-1 Ч М) - (М Ч B-1 Ч Е)2)
/2 = (mp Ч (Е Ч В-1 Ч Е) - (М Ч B-1 Ч Е)) / ((Е Ч В-1 Ч Е) Ч (М Ч В-1 Ч М) - (М Ч B-1 Ч Е)2)
Подставляя это решение в (3), получаем следующую структуру оптимального портфеля:
[(МЧВ-1ЧМ) - mpЧ(ЕЧВ-1 Ч М)]ЧВ-1ЧЕ + [mp Ч (Е Ч В-1 Ч Е) - (М Ч B-1 Ч Е)] Ч В-1 Ч МХ* = (Е Ч В-1 Ч Е) Ч (М Ч В-1 Ч М) - (М Ч B-1 Ч Е)2
С помощью подстановки можно убедиться, что Е Ч Х* = 1 и М Ч Х* = mp.
Кроме того, находим минимальную дисперсию, соответствующую оптимальной структуре:
Если ?0, то это означает рекомендацию вложить долю наличного капитала в ценные бумаги i-го вида. Если же <0, то содержательно это означает провести операцию «short sale» («короткая продажа»). Инвестор, формирующий портфель, обязуется через какое-то время поставить ценные бумаги i-го вида (вместе с доходом, какой они принесли бы их владельцу за это время). За это сейчас он получает их денежный эквивалент. Эти деньги он присоединяет к своему капиталу и покупает рекомендуемые оптимальным решением ценные бумаги. Так как ценные бумаги других видов (т.е. не i-го вида) более эффективны, то инвестор оказывается в выигрыше. Математически эта операция значит, что нужно исключить этот вид ценных бумаг из рассмотрения и решить задачу заново.
Задача формирования портфеля максимальной эффективности из всех портфелей, имеющих риск не более заданного
Постановку Марковица задачи формирования оптимального портфеля можно словами сформулировать так: сформировать портфель минимального риска из всех портфелей, имеющих эффективность не менее заданной.
Но столь же естественна и задача формирования портфеля максимальной эффективности из всех портфелей, имеющих риск не более заданного:
Найти xi , максимизирующие ожидаемую эффективность портфеля:
при условии, что обеспечивается заданное значение риска портфеля, т.е.
поскольку хi - доли, то в сумме они должны составлять единицу:
Для решения описанных выше задач было разработано приложение для ЭВМ.
Руководство пользователя
Название приложения: OptimalPortfolio.exe.
Дополнительные ресурсы: папка с примерами.
Общий вид программы при запуске
Это форма предназначена для операций расчёта оптимального набора ценных бумаг в портфеле инвестиций.
Для начала работы пользователь должен ввести исходные данные задачи:
· количество ценных бумаг, из которых состоит портфель, в предназначенное для этого поле:
· доходности и стандартные отклонения для каждой бумаги в таблицу:
· коэффициенты корреляции между доходностями ценных бумаг в таблицу:
· выбрать задачу, которую нужно решить, отметив, что будет вводиться: желаемая доходность или допустимый риск:
· ввести значение выбранного параметра в поле:
Убедившись, что все данные введены корректно, нужно нажать кнопку, чтобы программа выполнила необходимые вычисления.
Полученные доли ценных бумаг выводятся в таблицу:
А рассчитанный минимальный риск(максимальная доходность) в поле:
Кроме того, предусмотрена возможность построения графика, называемого «Пуля» Марковица для отображения эффективной границы, которая показывает множество оптимальных портфелей (выделена красным цветом), и достижимого множества, представляющего собой все портфели, которые можно составить из n видов ценных бумаг (область внутри «пули»).
Для построения графика нужно нажать кнопку:
Для того чтобы очистить все исходные данные для решения новой задачи, надо нажать кнопку:
Для перехода к решению задачи определения ожидаемой доходности и стандартного отклонения доходности готового портфеля, необходимо выбрать пункт «Расчёт доходности и риска портфеля» в меню «Операции» или нажать соответствующую кнопку на инструментальной панели.
Откроется форма, предназначенная для решения данной задачи:
Работа с данной формой аналогична работе с первой.
Для обратного перехода нужно выбрать один из пунктов меню «Операции» или нажать на соответствующую кнопку на панели инструментов.
Работа с файлами
В программе предусмотрена возможность сохранения данных задачи в файл и ввод данных из файла. Данные функции осуществляются с помощью пунктов «Открыть» и «Сохранить» меню «Файл» или нажатием на соответствующие кнопки на панели инструментов.
или
По умолчанию папкой с примерами является папка, откуда была запущена программа, но может быть выбрана и другая директория в открывшемся диалоговом окне.
Завершение работы
Для выхода из программы используется пункт «Выход» меню «Файл» или соответствующая кнопка на инструментальной панели.
Функции для упрощения работы пользователя с программой
Предусмотрено наличие всплывающих подсказок при наведении указателя на какой-либо компонент или пункт меню, помогающих пользователю ориентироваться в приложении.
Есть статусная панель, в которой тоже отображаются подсказки пользователю.
На панели инструментов расположены основные кнопки для быстроты доступа к нужным функциям.
Предусмотрена проверка на корректный ввод и отображение сообщений с описанием возникшей ошибки. Например,
Прочитав сообщение, нужно нажать «OK» и исправить указанную ошибку.
Примеры
Для проверки работоспособности программы служат файлы: example1.tpr, example2d.tpr, example10.tpr, example11.tpr.
Также рассмотрен пример портфеля инвестиций из ценных бумаг реальных компаний, основные показатели которых были оценены экспертами. Эти показатели приведены в таблицах 2 и 3.
Заключение
инвестиционный портфель риск программа
В данной курсовой работе были рассмотрены основные вопросы портфельной теории, в частности расчёт доходности и риска портфеля и построение оптимального портфеля ценных бумаг.
Данная тема является актуальной, так как в условиях неопределенности инвестор не может точно рассчитать доходность той или иной ценной бумаги. Кроме того, он всегда подвергается риску потерять свои средства.
Портфельная теория предлагает методы расчёта средней ожидаемой доходности и риска и методы для снижения рисков или увеличения доходности от приобретения ценных бумаг за счёт диверсификации вложений и формирования портфеля инвестиций.
В курсовой работе был рассмотрен вариант построения оптимального портфеля, предложенный Г.Марковицем, на основе которого было создано приложение для расчёта оптимального набора ценных бумаг в портфеле инвестиций.
Созданное приложение позволяет также рассчитать ожидаемую доходность и стандартное отклонение уже созданного портфеля.
Список использованной литературы
1. М.С. Красс, Б.П. Чупрынов. Математика для экономистов. - СПб: «Питер», 2005. - 464 с.
2. Колемаев В.А. Математическая экономика. М.: «Юнити» 1998. - 390 с.
3. http://www.finansmat.ru/
4. http://www.Finam.ru
Приложение
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Menus, TeeProcs, TeEngine, Chart, Spin,
Grids, ComCtrls, ToolWin, Series, Math, ImgList, AppEvnts;
type
TForm_Risk_or_Profit = class(TForm)
ToolBar1: TToolBar;
StatusBar1: TStatusBar;
SG_Input_date: TStringGrid;
SG_Correlation: TStringGrid;
SE_Input_count: TSpinEdit;
Chart1: TChart;
MainMenu1: TMainMenu;
NFile: TMenuItem;
NOpen: TMenuItem;
N4: TMenuItem;
NExit: TMenuItem;
NOperations: TMenuItem;
NReadyPortfolio: TMenuItem;
NHelp: TMenuItem;
NAbout: TMenuItem;
NSave: TMenuItem;
LCount: TLabel;
LTable: TLabel;
LCorrelation: TLabel;
BCalculation: TButton;
RG_Risk_or_Profit: TRadioGroup;
LRG: TLabel;
E_Risk_or_Profit: TEdit;
BClear: TButton;
LResult: TLabel;
SG_Result: TStringGrid;
Series1: TLineSeries;
Series2: TLineSeries;
BDrawGraph: TButton;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
EditResult: TEdit;
LComment: TLabel;
ToolButtonOpen: TToolButton;
ToolButtonSave: TToolButton;
ToolButton3: TToolButton;
ToolButtonReadyPortfolio: TToolButton;
ToolButton5: TToolButton;
ToolButtonAbout: TToolButton;
ToolButton7: TToolButton;
ToolButtonExit: TToolButton;
ApplicationEvents1: TApplicationEvents;
ImageList1: TImageList;
procedure NReadyPortfolioClick(Sender: TObject);
procedure NExitClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure SG_Input_dateKeyPress(Sender: TObject; var Key: Char);
procedure SG_CorrelationKeyPress(Sender: TObject; var Key: Char);
procedure E_Risk_or_ProfitKeyPress(Sender: TObject; var Key: Char);
procedure SE_Input_countChange(Sender: TObject);
procedure BClearClick(Sender: TObject);
procedure BCalculationClick(Sender: TObject);
procedure Graph;
function Get_Date:boolean;
procedure BDrawGraphClick(Sender: TObject);
procedure SG_CorrelationSelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
procedure SG_CorrelationMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure SG_CorrelationExit(Sender: TObject);
procedure NOpenClick(Sender: TObject);
procedure NSaveClick(Sender: TObject);
procedure NAboutClick(Sender: TObject);
procedure ApplicationEvents1Hint(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type myarray=array [1..100] of real;
myarr=array [1..100,1..100] of real;
var
Form_Risk_or_Profit: TForm_Risk_or_Profit;
SEValue:integer;
M,BE,BM,deviation_of_stocks:myarray;
B,E,B1,E1:myarr;
mp,ebe,mbm,ebm,x,mbe:real;
mPr,risk:real;
number_of_stocks,SelectedRow,SelectedCol:integer;
implementation
uses Unit2, UAboutMe;
{$R *.dfm}
procedure TForm_Risk_or_Profit.NReadyPortfolioClick(Sender: TObject);
var i,j:integer;
begin
Form_Risk_or_Profit.Visible:=False;
Form_for_ready_portfolio.SE_Input_count.Value:=SEValue;
Form_for_ready_portfolio.Show;
for i:=1 to SEValue do
begin
Form_for_ready_portfolio.SG_Input_date.Cells[i,2]:=SG_Input_date.Cells[i,1];
Form_for_ready_portfolio.SG_Input_date.Cells[i,3]:=SG_Input_date.Cells[i,2];
for j:=1 to SEValue do
begin
Form_for_ready_portfolio.SG_Correlation.Cells[i,j]:=SG_Correlation.Cells[i,j];
end;
end;
end;
procedure TForm_Risk_or_Profit.NExitClick(Sender: TObject);
begin
Close;
end;
procedure TForm_Risk_or_Profit.FormCreate(Sender: TObject);
begin
SG_Input_date.Cells[0,0]:='Показатель | Номер бумаги';
SG_Input_date.Cells[0,1]:='Доходность';
SG_Input_date.Cells[0,2]:='Риск';
SG_Result.Cells[0,0]:='Номер бумаги';
SG_Result.Cells[0,1]:='Доля';
SelectedRow:=1;
SelectedCol:=1;
end;
procedure TForm_Risk_or_Profit.SG_Input_dateKeyPress(Sender: TObject;
var Key: Char);
begin
case key of
'0'..'9',#8,',':;
else key:=#0;
end;
end;
procedure TForm_Risk_or_Profit.SG_CorrelationKeyPress(Sender: TObject;
var Key: Char);
begin
case key of
'0'..'9',#8,',','-':;
else key:=#0;
end;
end;
procedure TForm_Risk_or_Profit.E_Risk_or_ProfitKeyPress(Sender: TObject;
var Key: Char);
begin
case key of
'0'..'9',#8,',':;
else key:=#0;
end;
end;
procedure TForm_Risk_or_Profit.SE_Input_countChange(Sender: TObject);
var i:integer;
begin
SEValue:=SE_Input_count.Value;
for i:=1 to SEValue do
begin
SG_Input_date.Cells[i,0]:=inttostr(i);
SG_Result.Cells[i,0]:=inttostr(i);
SG_Correlation.Cells[0,i]:=inttostr(i);
SG_Correlation.Cells[i,0]:=inttostr(i);
SG_Correlation.Cells[i,i]:='1';
end;
SG_Input_date.ColCount:=SEValue+1;
SG_Correlation.ColCount:=SEValue+1;
SG_Correlation.RowCount:=SEValue+1;
SG_Result.ColCount:=SEValue+1;
end;
procedure TForm_Risk_or_Profit.BClearClick(Sender: TObject);
var i,j:integer;
begin
for i:=1 to SEValue do
for j:=1 to SEValue do
begin
SG_Input_date.Cells[i,j]:='';
SG_Correlation.Cells[i,j]:='';
SG_Result.Cells[i,j];
end;
Series1.Clear;
E_Risk_or_Profit.Clear; SE_Input_count.Value:=2;
end;
function minRisk(mp:real):real;
begin
minRisk:=sqrt((mp*mp*ebe-2*mp*mbe+mbm)/(ebe*mbm-mbe*mbe));
end;
Function bisection(a,b,risk:real):real;
var y1,y2,c:real;
begin
y1:=MinRisk(a)-risk;
y2:=MinRisk(b)-risk;
while abs(y2)>0.000001 do
begin
c:=(a+b)/2;
y2:=MinRisk(c)-risk;
if y1*y2<0
then b:=c
else begin a:=c; y1:=y2; end;
end;
bisection:=c;
end;
function TForm_Risk_or_Profit.Get_Date:boolean;
var i,j:integer;
begin
result:=True;
number_of_stocks:=SE_Input_count.Value;
for i:=1 to number_of_stocks do
begin
E[i,i]:=1;
try
M[i]:=strtofloat(SG_Input_date.Cells[i,1]);
except
showmessage('Извините, Вы не ввели доходность '+intToStr(i)+'-й бумаги!');
result:=False;
exit;
end;
try
deviation_of_stocks[i]:=strtofloat(SG_Input_date.Cells[i,2]);
except
showmessage('Извините, Вы не ввели риск '+intToStr(i)+'-й бумаги!');
result:=False;
exit;
end;
B[i,i]:=sqr(deviation_of_stocks[i]);
end;
for i:=1 to number_of_stocks do
begin
for j:=i+1 to number_of_stocks do
begin
try B[i,j]:=strtofloat(SG_Correlation.Cells[j,i])*deviation_of_stocks[i]*deviation_of_stocks[j];
except
showmessage('Извините, Вы не ввели корреляцию '+intToStr(i)+'-ой и '+intToStr(j)+'-ой бумаг!');
result:=False;
exit;
end;
B[j,i]:=B[i,j];
E[i,j]:=0;
E[j,i]:=0;
end;
end;
end;
procedure base;
var i,j,k,l,a:integer;
begin
for i:=1 to number_of_stocks do
begin
for j:=1 to number_of_stocks do
begin
for k:=1 to number_of_stocks do
begin
B1[j,k]:=B[j,k];
E1[j,k]:=E[j,k];
end;
end;
for l:=1 to number_of_stocks do
begin
B[i,l]:=B1[i,l]/B1[i,i];
E[i,l]:=E1[i,l]/B1[i,i];
for a:=1 to number_of_stocks do
begin
if a<>i then
begin
B[a,l]:=(B1[a,l]-(B1[a,i]*B1[i,l]/B1[i,i]));
E[a,l]:=(E1[a,l]-(B1[a,i]*E1[i,l]/B1[i,i]));
end;
end;
end;
end;
for i:=1 to number_of_stocks do
begin
BE[i]:=0;
for j:=1 to number_of_stocks do
begin
BE[i]:=BE[i]+E[i,j];
end;
end;
for i:=1 to number_of_stocks do
begin
BM[i]:=0;
for j:=1 to number_of_stocks do
begin
BM[i]:=BM[i]+M[j]*E[i,j];
end;
end;
ebe:=0;
ebm:=0;
mbm:=0;
mbe:=0;
for i:=1 to number_of_stocks do
begin
ebe:=ebe+BE[i];
ebm:=ebm+BM[i];
mbm:=mbm+M[i]*BM[i];
mbe:=mbe+M[i]*BE[i];
end;
end;
procedure TForm_Risk_or_Profit.Graph;
var i:integer;
min,max,profit:real;
begin
max:=m[1];
for i:=2 to number_of_stocks do
begin
if m[i]>max then max:=m[i];
end;
min:=m[1];
for i:=2 to number_of_stocks do
begin
if m[i]<min then min:=m[i];
end;
profit:=mbe/ebe;
repeat
Series1.AddXY(minRisk(profit),profit);
profit:=profit+(max-min)/100;
until profit>=max;
profit:=min;
repeat
Series2.AddXY(minRisk(profit),profit);
profit:=profit+(max-min)/100;
until profit>=mbe/ebe;
end;
function Max_Profit(risk:real):real;
var i:integer;
max:real;
begin
max:=m[1];
for i:=2 to number_of_stocks do
begin
if m[i]>max then
max:=m[i];
end;
mPr:=bisection(mbe/ebe,max,risk);
result:=mPr;
end;
procedure TForm_Risk_or_Profit.BCalculationClick(Sender: TObject);
var i:integer;
max,min:real;
a:boolean;
begin
if Get_Date then
begin
base;
LComment.Caption:='';
case RG_Risk_or_Profit.ItemIndex of
0:begin
try
mp:=strtofloat(E_Risk_or_Profit.Text);
except
Application.MessageBox('Извините, Вы не ввели желаемую доходность!','Ошибка!');
exit;
end;
//проверка, лежит ли введенная доходность между минимальной и максимальной
max:=m[1];
for i:=2 to number_of_stocks do
begin
if m[i]>max then max:=m[i];
end;
min:=m[1];
for i:=2 to number_of_stocks do
begin
if m[i]<min then min:=m[i];
end;
if (mp<min)or(mp>max) then
begin
Application.MessageBox('Извините, желаемая доходность должна быть в пределах эффективностей ценных бумаг!','Ошибка!');
exit;
end;
if 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));
end;
1:begin
try
risk:=strtofloat(E_Risk_or_Profit.Text);
except
Application.MessageBox('Извините, Вы не ввели допустимый уровень риска','Ошибка!');
exit;
end;
mp:=Max_Profit(risk);
EditResult.Text:=' Максимальная доходность портфеля: '+floattostr(roundto(mp,-4));
end;
end;
a:=false;
for i:=1 to number_of_stocks do
begin
x:=((mbm-mp*ebm)*BE[i]+(mp*ebe-mbe)*BM[i])/(ebe*mbm-mbe*mbe);
if x<0 then a:=true;
SG_Result.Cells[i,1]:=floattostr(roundto(x,-4));
end;
if a then
LComment.Caption:=LComment.Caption+' Так как доля бумаг отрицательна, то необходимо провести сделку "short sale",'+#9#13
+' исключить бумаги этого вида из портфеля и решить задачу заново.';
end;
end;
procedure TForm_Risk_or_Profit.BDrawGraphClick(Sender: TObject);
begin
if Get_Date then
begin
Series1.Clear;
Series2.Clear;
base;
graph;
end;
end;
procedure TForm_Risk_or_Profit.SG_CorrelationSelectCell(Sender: TObject;
ACol, ARow: Integer; var CanSelect: Boolean);
begin
if ACol=ARow
then begin CanSelect:=False; exit; end;
SG_CorrelationExit(Sender);
SelectedRow:=ARow;
SelectedCol:=ACol;
end;
procedure TForm_Risk_or_Profit.SG_CorrelationMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
SG_CorrelationExit(Sender);
end;
procedure TForm_Risk_or_Profit.SG_CorrelationExit(Sender: TObject);
begin
try
if abs(StrToFloat(SG_Correlation.Cells[SelectedCol,SelectedRow]))<=1 then SG_Correlation.Cells[SelectedRow,SelectedCol]:=SG_Correlation.Cells[SelectedCol,SelectedRow]
else
begin
ShowMessage('Извините, корреляция не может быть больше 1!');
SG_Correlation.Cells[SelectedCol,SelectedRow]:='0';
SG_Correlation.Cells[SelectedRow,SelectedCol]:='0';
end;
except
SG_Correlation.Cells[SelectedCol,SelectedRow]:='0';
SG_Correlation.Cells[SelectedRow,SelectedCol]:='0';
end;
end;
procedure TForm_Risk_or_Profit.NOpenClick(Sender: TObject);
var f:file of real;
i,j:integer;
a:real;
begin
if OpenDialog1.Execute
then
begin
BClearClick(Sender);
AssignFile(f,OpenDialog1.FileName);
try
reset(f);
except
Application.MessageBox('Извините, невозможно открыть файл!','Ошибка!');
end;
read(f,a);
SEValue:=round(a);
SE_Input_count.Value:=SEValue;
//считываем из файла доходности
for i:=1 to SEValue do
begin
read(f,a);
SG_Input_date.Cells[i,1]:=FloatToStr(a);
end;
//считываем из файла риски
for i:=1 to SEValue do
begin
read(f,a);
SG_Input_date.Cells[i,2]:=FloatToStr(a);
end;
//считываем из файла корреляцию
for i:=1 to SEValue do
for j:=1 to SEValue do
begin
read(f,a);
SG_Correlation.Cells[i,j]:=FloatToStr(a);
end;
closefile(f);
end;
end;
procedure TForm_Risk_or_Profit.NSaveClick(Sender: TObject);
var f:file of real;
i,j:integer;
a:real;
begin
if SaveDialog1.Execute
then
begin
if ExtractFileExt(SaveDialog1.FileName)=''
then SaveDialog1.FileName:=SaveDialog1.FileName+'.tpr';
AssignFile(f,SaveDialog1.FileName);
rewrite(f);
a:=SEValue;
write(f,a);
//записываем в файл доходности
for i:=1 to SEValue do
begin
try
a:=StrToFloat(SG_Input_date.Cells[i,1]);
except
a:=0;
end;
write(f,a);
end;
//записываем в файл риски
for i:=1 to SEValue do
begin
try
a:=StrToFloat(SG_Input_date.Cells[i,2]);
except
a:=0;
end;
write(f,a);
end;
//записываем в файл корреляцию
for i:=1 to SEValue do
for j:=1 to SEValue do
begin
try
a:=StrToFloat(SG_Correlation.Cells[i,j]);
except
a:=0;
end;
write(f,a);
end;
//записываем в файл доли
for i:=1 to SEValue do
begin
a:=0;
write(f,a);
end;
closefile(f);
end;
end;
procedure TForm_Risk_or_Profit.NAboutClick(Sender: TObject);
begin
AboutProgram.ShowModal;
end;
procedure TForm_Risk_or_Profit.ApplicationEvents1Hint(Sender: TObject);
begin
StatusBar1.SimpleText:=Application.Hint;
end;
end.
unit Unit2;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, Menus, ToolWin, Spin, Grids, Math, AppEvnts,
ImgList;
type
TForm_for_ready_portfolio = class(TForm)
ToolBar1: TToolBar;
MainMenu1: TMainMenu;
NFile: TMenuItem;
NOpen: TMenuItem;
NSave: TMenuItem;
N4: TMenuItem;
NExit: TMenuItem;
NOperations: TMenuItem;
NMinRisk: TMenuItem;
NHelp: TMenuItem;
NAbout: TMenuItem;
StatusBar1: TStatusBar;
NMaxProfit: TMenuItem;
LCount: TLabel;
SE_Input_count: TSpinEdit;
BClear: TButton;
LTable: TLabel;
SG_Input_date: TStringGrid;
LCorrelation: TLabel;
SG_Correlation: TStringGrid;
BCalculation: TButton;
Label1: TLabel;
MemoResult: TMemo;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
ToolButtonOpen: TToolButton;
ToolButtonSave: TToolButton;
ToolButton3: TToolButton;
ToolButtonMinRisk: TToolButton;
ToolButtonMaxProfit: TToolButton;
ToolButton6: TToolButton;
ToolButtonAbout: TToolButton;
ToolButton8: TToolButton;
ToolButtonExit: TToolButton;
ImageList1: TImageList;
ApplicationEvents1: TApplicationEvents;
procedure NMinRiskClick(Sender: TObject);
procedure NExitClick(Sender: TObject);
procedure NMaxProfitClick(Sender: TObject);
procedure BCalculationClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure SG_Input_dateKeyPress(Sender: TObject; var Key: Char);
//procedure FormShow(Sender: TObject);
procedure SG_CorrelationKeyPress(Sender: TObject; var Key: Char);
procedure SE_Input_countChange(Sender: TObject);
procedure BClearClick(Sender: TObject);
procedure SG_CorrelationSelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
procedure SG_CorrelationExit(Sender: TObject);
procedure SG_CorrelationMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure NOpenClick(Sender: TObject);
procedure NSaveClick(Sender: TObject);
procedure NAboutClick(Sender: TObject);
procedure ApplicationEvents1Hint(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type myarray=array [1..100] of real;
myarr=array [1..100,1..100] of real;
var Form_for_ready_portfolio: TForm_for_ready_portfolio;
SEValue,SelectedRow,SelectedCol:integer;
implementation
uses Unit1, UAboutMe;
{$R *.dfm}
procedure TForm_for_ready_portfolio.NMinRiskClick(Sender: TObject);
begin
Form_for_ready_portfolio.Visible:=False;
Form_Risk_or_Profit.RG_Risk_or_Profit.ItemIndex:=0;
Form_Risk_or_Profit.Show;
end;
procedure TForm_for_ready_portfolio.NExitClick(Sender: TObject);
begin
Close;
end;
procedure TForm_for_ready_portfolio.NMaxProfitClick(Sender: TObject);
begin
Form_for_ready_portfolio.Visible:=False;
Form_Risk_or_Profit.RG_Risk_or_Profit.ItemIndex:=1;
Form_Risk_or_Profit.Show;
end;
procedure TForm_for_ready_portfolio.BCalculationClick(Sender: TObject);
var profitability_of_portfolio,deviation_of_portfolio:real;
number_of_stocks,i,j:integer;
dispersion,sum:real;
profitabilities_of_stocks,deviation_of_stocks,equity_share:myarray;
begin
number_of_stocks:=SE_Input_count.Value;
sum:=0;
for i:=1 to number_of_stocks do
begin
try
equity_share[i]:=strtofloat(SG_Input_date.Cells[i,1]);
except
showmessage('Извините, Вы не ввели долю '+intToStr(i)+'-ой бумаги!');
exit;
end;
sum:=sum+equity_share[i];
try
profitabilities_of_stocks[i]:=strtofloat(SG_Input_date.Cells[i,2]);
except
showmessage('Извините, Вы не ввели доходность '+intToStr(i)+'-ой бумаги!');
exit;
end;
try
deviation_of_stocks[i]:=strtofloat(SG_Input_date.Cells[i,3]);
except
showmessage('Извините, Вы не ввели риск '+intToStr(i)+'-ой бумаги!');
exit;
end;
end;
if sum<>1 then
begin
Application.MessageBox('Извините, сумма долей бумаг должна быть равна 1','Ошибка!');
exit;
end;
profitability_of_portfolio:=0;
dispersion:=0;
for i:=1 to number_of_stocks do
begin profitability_of_portfolio:=profitability_of_portfolio+equity_share[i]*profitabilities_of_stocks[i];
for j:=1 to number_of_stocks do
try dispersion:=dispersion+equity_share[i]*equity_share[j]*strtofloat(SG_Correlation.Cells[i,j])*deviation_of_stocks[i]*deviation_of_stocks[j];
except
showmessage('Извините, Вы не ввели корреляцию '+intToStr(i)+'-ой и '+intToStr(j)+'-ой бумаг!');
exit;
end;
end;
deviation_of_portfolio:=sqrt(dispersion);
MemoResult.Lines.Add('Ожидаемая доходность портфеля: '+floattostr(roundto(profitability_of_portfolio,-4))+'%');
MemoResult.Lines.Add('Стандартное отклонение доходности: '+floattostr(roundto(deviation_of_portfolio,-4))+'%');
end;
procedure TForm_for_ready_portfolio.FormCreate(Sender: TObject);
begin
SG_Input_date.Cells[0,0]:='Показатель | Номер бумаги';
SG_Input_date.Cells[0,1]:='Доля';
SG_Input_date.Cells[0,2]:='Доходность';
SG_Input_date.Cells[0,3]:='Стандартное отклонение';
SelectedRow:=1;
SelectedCol:=1;
end;
procedure TForm_for_ready_portfolio.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Form_Risk_or_Profit.Close;
end;
procedure TForm_for_ready_portfolio.SG_Input_dateKeyPress(Sender: TObject;
var Key: Char);
begin
case key of
'0'..'9',#8,',':;
else key:=#0;
end;
end;
procedure TForm_for_ready_portfolio.SG_CorrelationKeyPress(Sender: TObject;
var Key: Char);
begin
case key of
'0'..'9',#8,',','-':;
else key:=#0;
end;
end;
procedure TForm_for_ready_portfolio.SE_Input_countChange(Sender: TObject);
var i:integer;
begin
SEValue:=SE_Input_count.Value;
for i:=1 to SEValue do
begin
SG_Input_date.Cells[i,0]:=inttostr(i);
SG_Correlation.Cells[0,i]:=inttostr(i);
SG_Correlation.Cells[i,0]:=inttostr(i);
SG_Correlation.Cells[i,i]:='1';
end;
SG_Input_date.ColCount:=SEValue+1;
SG_Correlation.ColCount:=SEValue+1;
SG_Correlation.RowCount:=SEValue+1;
end;
procedure TForm_for_ready_portfolio.BClearClick(Sender: TObject);
var i,j:integer;
begin
for i:=1 to SEValue do
for j:=1 to SEValue do
begin
SG_Input_date.Cells[i,j]:='';
SG_Correlation.Cells[i,j]:='';
end;
MemoResult.Lines.Clear;
SE_Input_count.Value:=2;
end;
procedure TForm_for_ready_portfolio.SG_CorrelationSelectCell(
Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
begin
if ACol=ARow
then begin CanSelect:=False; exit; end;
SG_CorrelationExit(Sender);
SelectedRow:=ARow;
SelectedCol:=ACol;
end;
procedure TForm_for_ready_portfolio.SG_CorrelationExit(Sender: TObject);
begin
try
if abs(StrToFloat(SG_Correlation.Cells[SelectedCol,SelectedRow]))<=1 then SG_Correlation.Cells[SelectedRow,SelectedCol]:=SG_Correlation.Cells[SelectedCol,SelectedRow]
else
begin
ShowMessage('Извините, корреляция не может быть больше 1!');
SG_Correlation.Cells[SelectedCol,SelectedRow]:='0';
end;
except
SG_Correlation.Cells[SelectedCol,SelectedRow]:='0';
SG_Correlation.Cells[SelectedRow,SelectedCol]:='0';
end;
end;
procedure TForm_for_ready_portfolio.SG_CorrelationMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
SG_CorrelationExit(Sender);
end;
procedure TForm_for_ready_portfolio.NOpenClick(Sender: TObject);
var f:file of real;
i,j:integer;
a:real;
begin
if OpenDialog1.Execute then
begin
BClearClick(Sender);
AssignFile(f,OpenDialog1.FileName);
try
reset(f);
except
Application.MessageBox('Извините, невозможно открыть файл!','Ошибка!');
end;
read(f,a);
SEValue:=round(a);
SE_Input_count.Value:=SEValue;
//считываем из файла доходности
for i:=1 to SEValue do
begin
read(f,a);
SG_Input_date.Cells[i,2]:=FloatToStr(a);
end;
//считываем из файла риски
for i:=1 to SEValue do
begin
read(f,a);
SG_Input_date.Cells[i,3]:=FloatToStr(a);
end;
//считываем из файла корреляцию
for i:=1 to SEValue do
for j:=1 to SEValue do
begin
read(f,a);
SG_Correlation.Cells[i,j]:=FloatToStr(a);
end;
//считываем из файла доли
for i:=1 to SEValue do
begin
read(f,a);
SG_Input_date.Cells[i,1]:=FloatToStr(a);
end;
closefile(f);
end;
end;
procedure TForm_for_ready_portfolio.NSaveClick(Sender: TObject);
var f:file of real;
i,j:integer;
a:real;
begin
if SaveDialog1.Execute then
begin
if ExtractFileExt(SaveDialog1.FileName)=''
then SaveDialog1.FileName:=SaveDialog1.FileName+'.tpr';
AssignFile(f,SaveDialog1.FileName);
rewrite(f);
a:=SEValue;
write(f,a);
//записываем в файл доходности
for i:=1 to SEValue do
begin
try
a:=StrToFloat(SG_Input_date.Cells[i,2]);
except
a:=0;
end;
write(f,a);
end;
//записываем в файл риски
for i:=1 to SEValue do
begin
try
a:=StrToFloat(SG_Input_date.Cells[i,3]);
except
a:=0;
end;
write(f,a);
end;
//записываем в файл корреляцию
for i:=1 to SEValue do
for j:=1 to SEValue do
begin
try
a:=StrToFloat(SG_Correlation.Cells[i,j]);
except
a:=0;
end;
write(f,a);
end;
//записываем в файл доли
for i:=1 to SEValue do
begin
try
a:=StrToFloat(SG_Input_date.Cells[i,1]);
except
a:=0;
end;
write(f,a);
end;
closefile(f);
end;
end;
procedure TForm_for_ready_portfolio.NAboutClick(Sender: TObject);
begin
AboutProgram.ShowModal
end;
procedure TForm_for_ready_portfolio.ApplicationEvents1Hint(
Sender: TObject);
begin
StatusBar1.SimpleText:=Application.Hint;
end;
end.
Размещено на Allbest.ru
Подобные документы
Формирование инвестиционного портфеля. Диверсификация портфеля. Портфель Марковица минимального риска. Задача формирования портфеля максимальной эффективности из всех портфелей, имеющих риск не более заданного. Расчет оптимального набора ценных бумаг.
курсовая работа [574,6 K], добавлен 22.04.2012Изучение надежности вложения средств в мультивалютные вклады в банках РФ. Разработка приложения для оценки эффективности и риска мультивалютного вклада на основе математических методов построения инвестиционного портфеля. Вычисление вектора приоритетов.
дипломная работа [4,9 M], добавлен 18.12.2013Структура программного комплекса. Ввод информации из заданного файла. Создание набора данных. Добавление элементов в конец набора данных. Просмотр всех элементов набора данных. Копирование информации из НД в заданный файл. Сортировка массива по номерам.
курсовая работа [630,5 K], добавлен 01.06.2014Проектирование информационной модели данных, серверной и клиентской частей приложения. Обеспечение коллективного доступа. Составление оптимального набора тестов. Разработка инструкций по сопровождению и эксплуатации клиент–серверного приложения.
дипломная работа [2,7 M], добавлен 07.07.2012Использование программы "Total Commander": пользовательский интерфейс, клавиатурные сочетания, операции с файлами, контекстные меню, внутренний просмотр файлов. Назначение и применение функциональных клавиш. Особенности работы с каталогами и файлами.
презентация [462,3 K], добавлен 25.09.2014Разбиение задачи на несколько более простых подзадач. Вычисление логарифма с использованием ряда Тейлора при небольших значениях. Функция поиска строки с максимальной суммой. Создание дополнительной функции. Процедура печати строки с максимальной суммой.
контрольная работа [171,0 K], добавлен 17.08.2013Создание приложения Windows, позволяющего автоматизировать процесс обработки информации студентов университета. Организация работы с физическими файлами в языках программирования. Изучение средств IDE Delphi для организации работы с текстовыми файлами.
курсовая работа [1,5 M], добавлен 08.11.2011Обследование объекта, обоснование необходимости систем компьютерного тестирования. Анализ существующих разработок и обоснование выбора технологии проектирования. Создание системы компьютерного тестирования на основе случайного выбора в среде Visual Basic.
дипломная работа [2,4 M], добавлен 18.08.2013Разработка программы, относящейся к классу задач маршрутизации и системы принятия решения, предназначенной для выбора оптимального маршрута перемещения в лабиринте из начальной клетки в конечную, с учетом необходимости посещения определенных клеток.
контрольная работа [14,7 K], добавлен 11.11.2010Изучение инструментальной графической среды программирования промышленных контроллеров и языка программирования FBD. Разработка приложения, реализующего вычисление арифметических и логических выражений. Проверка работы приложения программой "Maple".
контрольная работа [2,2 M], добавлен 26.05.2015