Расчёт в программе оптимального набора ценных бумаг в портфеле инвестиций

Формирование инвестиционного портфеля. Диверсификация портфеля. Портфель Марковица минимального риска. Задача формирования портфеля максимальной эффективности из всех портфелей, имеющих риск не более заданного. Расчет оптимального набора ценных бумаг.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 22.04.2012
Размер файла 574,6 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Введение

Переход экономики РФ к рыночным отношениям привел к развитию рынка ценных бумаг. Как следствие, вырос интерес юридических и физических лиц к вложениям финансовых средств в акции и облигации ведущих российских эмитентов и их производные инструменты.

Рынок ценных бумаг в условиях развивающейся российской экономики характеризуются как высокой доходностью, так и значительными рисками в сравнении с рынками развитых экономик. Одним из основных способов уменьшения риска инвестиций в финансовые инструменты является диверсификация активов, что приводит к формированию портфелей ценных бумаг.

Потенциальному инвестору достаточно трудно составить портфель с приемлемым для него соотношением риск-доходность, поэтому проблема моделирования оптимального портфеля ценных бумаг с учетом ограничений приобретает особую актуальность.

Целью данной курсовой работы является изучение основных аспектов портфельной теории и создание на их основе приложения на ЭВМ для расчёта оптимального набора ценных бумаг в портфеле инвестиций.

1. Портфельный анализ

Начало портфельного анализа было положено в работах лауреата Нобелевской премии в области экономики, профессора Чикагского университета Г. Марковица в 1952 г. Им впервые была предложена модель формирования оптимального портфеля и были даны методы построения таких портфелей.

1.1 Формирование инвестиционного портфеля

Поскольку ценные бумаги различных видов различаются по доходности и степени надёжности, инвесторы вкладывают средства в приобретение ценных бумаг нескольких видов, стремясь достичь наилучшего соотношения «риск-доходность». Принимая решение о приобретении набора ценных бумаг, инвестор должен иметь в виду, что доходность портфеля в предстоящий период владения неизвестна. Однако можно оценить предполагаемую доходность различных ценных бумаг, основываясь на некоторых предположениях. Уровень доходности является случайной величиной, и основными её характеристиками являются ожидаемое, или среднее, значение и стандартное отклонение. Именно последнюю характеристику предлагается использовать как меру риска.

Ожидаемая доходность портфеля из 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%.

1.2 Диверсификация портфеля

Приведенный пример показывает, что портфель ценных бумаг обладает меньшим риском, чем некоторые отдельные составляющие его бумаги. Это свойство портфеля называется диверсификацией: увеличение количества видов ценных бумаг при одновременном сокращении их долей в общей ожидаемой доходности уменьшает риск портфеля. Проиллюстрируем на примере.

Пример 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).

Приведенный пример показывает, что крупные компании на рынке инвестиций чувствуют себя гораздо более уверенно, нежели их мелкие конкуренты, поскольку крупные инвестиции позволяют приобретать более диверсифицированные портфели и тем самым в значительной мере обезопасить компанию от рыночных рисков.

1.3 Формирование оптимального портфеля

Портфель Марковица минимального риска.

Существует несколько вариантов задач оптимизации рискового портфеля. Рассмотрим одну из них. Это так называемый «портфель Марковица». Эта задача была сформулирована и решена американским экономистом Г. Марковицем в 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)

С помощью подстановки можно убедиться, что Е Ч Х* = 1 и М Ч Х* = mp.

Тогда = , что и является минимальным риском портфеля.

Если ?0, то это означает рекомендацию вложить долю наличного капитала в ценные бумаги i-го вида. Если же <0, то содержательно это означает провести операцию «short sale» («короткая продажа»). Инвестор, формирующий портфель, обязуется через какое-то время поставить ценные бумаги i-го вида (вместе с доходом, какой они принесли бы их владельцу за это время). За это сейчас он получает их денежный эквивалент. Эти деньги он присоединяет к своему капиталу и покупает рекомендуемые оптимальным решением ценные бумаги. Так как ценные бумаги других видов (т.е. не i-го вида) более эффективны, то инвестор оказывается в выигрыше. Математически эта операция значит, что нужно исключить этот вид ценных бумаг из рассмотрения и решить задачу заново.

2. Задача формирования портфеля максимальной эффективности из всех портфелей, имеющих риск не более заданного

Постановку Марковица задачи формирования оптимального портфеля можно словами сформулировать так: сформировать портфель минимального риска из всех портфелей, имеющих эффективность не менее заданной.

Но столь же естественна и задача формирования портфеля максимальной эффективности из всех портфелей, имеющих риск не более заданного:

Найти xi, максимизирующие ожидаемую эффективность портфеля:

при условии, что обеспечивается заданное значение риска портфеля, т.е.

поскольку хi - доли, то в сумме они должны составлять единицу:

Для решения описанных выше задач было разработано приложение для ЭВМ.

2.1 Руководство пользователя

Название приложения: OptimalPortfolio.exe.

Дополнительные ресурсы: папка с примерами.

Общий вид программы при запуске.

Это форма предназначена для операций расчёта оптимального набора ценных бумаг в портфеле инвестиций.

Для начала работы пользователь должен ввести исходные данные задачи:

· количество ценных бумаг, из которых состоит портфель, в предназначенное для этого поле:

· доходности и стандартные отклонения для каждой бумаги в таблицу:

· коэффициенты корреляции между доходностями ценных бумаг в таблицу:

· выбрать задачу, которую нужно решить, отметив, что будет вводиться: желаемая доходность или допустимый риск:

· ввести значение выбранного параметра в поле:

Убедившись, что все данные введены корректно, нужно нажать кнопку

,

чтобы программа выполнила необходимые вычисления.

Полученные доли ценных бумаг выводятся в таблицу:

А рассчитанный минимальный риск (максимальная доходность) в поле:

Кроме того, предусмотрена возможность построения графика, называемого «Пуля» Марковица для отображения эффективной границы, которая показывает множество оптимальных портфелей (выделена красным цветом), и достижимого множества, представляющего собой все портфели, которые можно составить из n видов ценных бумаг (область внутри «пули»).

Для построения графика нужно нажать кнопку:

Для того чтобы очистить все исходные данные для решения новой задачи, надо нажать кнопку:

Для перехода к решению задачи определения ожидаемой доходности и стандартного отклонения доходности готового портфеля, необходимо выбрать пункт «Расчёт доходности и риска портфеля» в меню «Операции» или нажать соответствующую кнопку на инструментальной панели.

Откроется форма, предназначенная для решения данной задачи:

Работа с данной формой аналогична работе с первой.

Для обратного перехода нужно выбрать один из пунктов меню «Операции» или нажать на соответствующую кнопку на панели инструментов:

2.2 Работа с файлами

В программе предусмотрена возможность сохранения данных задачи в файл и ввод данных из файла. Данные функции осуществляются с помощью пунктов «Открыть» и «Сохранить» меню «Файл» или нажатием на соответствующие кнопки на панели инструментов.

По умолчанию папкой с примерами является папка, откуда была запущена программа, но может быть выбрана и другая директория в открывшемся диалоговом окне.

2.3 Завершение работы

Для выхода из программы используется пункт «Выход» меню «Файл» или соответствующая кнопка на инструментальной панели.

2.4 Функции для упрощения работы пользователя с программой

Предусмотрено наличие всплывающих подсказок при наведении указателя на какой-либо компонент или пункт меню, помогающих пользователю ориентироваться в приложении.

Есть статусная панель, в которой тоже отображаются подсказки пользователю.

На панели инструментов расположены основные кнопки для быстроты доступа к нужным функциям.

Предусмотрена проверка на корректный ввод и отображение сообщений с описанием возникшей ошибки. Например,

Прочитав сообщение, нужно нажать «OK» и исправить указанную ошибку.

Для проверки работоспособности программы служат файлы: example1.tpr, example2d.tpr, example10.tpr, example11.tpr.

Также рассмотрен пример портфеля инвестиций из ценных бумаг реальных компаний, основные показатели которых были оценены экспертами. Эти показатели приведены в таблицах 2 и 3.

Таблица 2. Доходность и риск

Таблица 3. Матрица коэффициентов корреляции

Данные этого примера сохранены в файле equity.tpr.

Заключение

В данной курсовой работе были рассмотрены основные вопросы портфельной теории, в частности расчёт доходности и риска портфеля и построение оптимального портфеля ценных бумаг.

Данная тема является актуальной, так как в условиях неопределенности инвестор не может точно рассчитать доходность той или иной ценной бумаги. Кроме того, он всегда подвергается риску потерять свои средства.

Портфельная теория предлагает методы расчёта средней ожидаемой доходности и риска и методы для снижения рисков или увеличения доходности от приобретения ценных бумаг за счёт диверсификации вложений и формирования портфеля инвестиций.

В курсовой работе был рассмотрен вариант построения оптимального портфеля, предложенный Г. Марковицем, на основе которого было создано приложение для расчёта оптимального набора ценных бумаг в портфеле инвестиций.

Созданное приложение позволяет также рассчитать ожидаемую доходность и стандартное отклонение уже созданного портфеля.

инвестиционный портфель программа марковиц

Список литературы

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


Подобные документы

  • Формирование инвестиционного портфеля и его диверсификация. Расчет показателей оптимального портфеля. Задача выбора портфеля максимальной эффективности из всех портфелей, имеющих риск не более заданного. Работа с файлами. Упрощение работы с программой.

    курсовая работа [435,8 K], добавлен 26.02.2013

  • Биржевые и внебиржевые операции по покупке/продаже ценных бумаг через брокерскую компанию. Принципы создания информационной модели. Проектирование интерфейса пользователя. Реализация программного кода. Формирование выбранного отчета и вывод их в Excel.

    презентация [140,5 K], добавлен 19.08.2013

  • Структура программного комплекса. Ввод информации из заданного файла. Создание набора данных. Добавление элементов в конец набора данных. Просмотр всех элементов набора данных. Копирование информации из НД в заданный файл. Сортировка массива по номерам.

    курсовая работа [630,5 K], добавлен 01.06.2014

  • Изучение надежности вложения средств в мультивалютные вклады в банках РФ. Разработка приложения для оценки эффективности и риска мультивалютного вклада на основе математических методов построения инвестиционного портфеля. Вычисление вектора приоритетов.

    дипломная работа [4,9 M], добавлен 18.12.2013

  • Определение с помощью метода Баранкина и Дорфмана оптимального набора цен, по которым следует реализовывать все виды продукции при условии получения наибольшей стоимости реализованной продукции. Программная реализация решения задачи в пакете GINO.

    курсовая работа [126,7 K], добавлен 02.02.2014

  • Описание программного комплекса, его структура и общая характеристика составных модулей. Механизм создания набора данных, поиск элементов по номеру. Методика просмотра элементов и вычисление среднего, минимума и максимума из заданного диапазона.

    курсовая работа [239,6 K], добавлен 12.12.2013

  • Структура программного комплекса. Создание набора данных. Описание модуля funkcii.tpu. Копирование информации из НД в заданный файл. Сортировка массива по номерам. Просмотр элементов и вычисление среднего, минимума и максимума из заданного диапазона.

    курсовая работа [626,6 K], добавлен 18.06.2014

  • Проектирование информационной модели данных, серверной и клиентской частей приложения. Обеспечение коллективного доступа. Составление оптимального набора тестов. Разработка инструкций по сопровождению и эксплуатации клиент–серверного приложения.

    дипломная работа [2,7 M], добавлен 07.07.2012

  • Проектирование устройства, выполняющего функцию определения минимального давления на основе информации о показаниях полученных от 7 датчиков. Разработка набора команд управления микроконтроллером в среде программного обеспечения Code Vision AVR.

    курсовая работа [24,5 K], добавлен 28.06.2011

  • Условие задачи: составление программы на языке Pascal для определения оптимального маршрута с ближайшим временем отправления, меньшим пребыванием в пути. Решение методом последовательного испытания. Формы представления данных, набора тестов. Результаты.

    курсовая работа [22,0 K], добавлен 07.11.2009

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.