.Artzner P., Delbaen F., Eber J.-M., Heath D. Definition of Coherent Measures of Risk, Symposium on Risk Management at the European Finance Association 24th Annual Meeting, 1997,Viena, Austria.
. Van der Hoek J. and Sherris M., (2001), A class of non-expected utility risk measures and implications for asset allocation, Insurance: Mathematics and Economics 28, No.1, 69-82.
31.Берзон Н.И. и др. Фондовый рынок. Учебное пособие для высших учебных заведений экономического профиля. - М.: Вита-Пресс, 2008. - 400 с.
.Коттл С., Мюррей Р. Ф., Блок Ф.Е. «Анализ ценных бумаг» Грэма и Додда / Пер. с англ. - М.: ЗАО «Олимп - Бизнес», - 2000. - 704 с.
.Татьянников В. Как ведут себя измерители рисков на российском фондовом рынке // Рынок ценных бумаг, - №21 (204), - 2001, - с.57.
. Инвестиционно-финансовый портфель/ Общ. ред. Н.Я. Петракова, -М.: "Соминтек".2001.
. Аристов Д.В., Гольтяев А.А., Горюхин Б.Н., Смарагдов И.А. Ценные бумаги в сберегательном банке России. Тула: Изд-во "Шар", 2000.
. Фондовый портфель/ Отв. ред. Рубин Ю.Б., Солдаткин В.И.- М.: "Соминтек", 2002.
.
Эрлих А.А. Технический анализ товарных и финансовых рынков. Прикладное
пособие.- М.: ИНФРА-М, 2006.
Приложение А
Листинг программы
unit uMainForm;
interface, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, Menus, Grids, uMyExcel, StdCtrls, ExtCtrls, Math;= class(TForm): TMainMenu;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TStringGrid;: TOpenDialog;: TSaveDialog;: TMenuItem;: TMenuItem;: TPanel;: TPanel;: TListBox;: TMenuItem;: TStringGrid;N2Click(Sender: TObject);N6Click(Sender: TObject);N4Click(Sender: TObject);N7Click(Sender: TObject);
{ Private declarations }
{ Public declarations };: TMainForm;uSettings;
{$R *.dfm}TMainForm.N2Click(Sender: TObject);: OleVariant;: OleVariant; //лист с компаниями: OleVariant; //лист с акциями, iCol: integer; //индексы строки и столбца: integer;not OpenDialog1.Execute then;
//очищаем предыдущие данныеiRow := 0 to sgTable.RowCount-1 doiCol := 0 to sgTable.ColCount-1 do.Cells[iCol, iRow] := '';.RowCount := 2;.Items.Clear;; //запускаем ExcelOpenWorkBook(OpenDialog1.FileName,false) then
//подготавливаем данные:= MyExcel.WorkBooks.Item[1];:= WorkBook.Sheets.Item[1];:= WorkBook.Sheets.Item[2];:= 2;
//считываем в нашу таблицуTrim(WorkSheet.Cells[iRow,1]) <> '' do:= 1;Trim(WorkSheet.Cells[iRow, iCol]) <> '' do.Cells[iCol-1, iRow-2] := WorkSheet.Cells[iRow, iCol];(iCol);;.RowCount := sgTable.RowCount+1;(iRow);;.RowCount := sgTable.RowCount-2;
//считываем тест.выборку:= WorkBook.Sheets.Item[3];
iRow := 2;.RowCount := 2;
//считываем в нашу таблицу
while Trim(WorkSheet.Cells[iRow,1]) <> '' do:= 1;Trim(WorkSheet.Cells[iRow, iCol]) <> '' do.Cells[iCol-1, iRow-2] := WorkSheet.Cells[iRow, iCol];(iCol);;.RowCount := sgTable2.RowCount+1;(iRow);;.RowCount := sgTable2.RowCount-1;
//находим отношение посл.к первомуi := 1 to sgTable2.ColCount-1 do.Cells[i, sgTable2.RowCount-1] := FloatToStr((sgTable2.Cells[i, sgTable2.RowCount-2]) /(sgTable2.Cells[i, 2]));;;; //выходим из Excel;TMainForm.N4Click(Sender: TObject);;;TMainForm.N6Click(Sender: TObject);, j: integer;: array[0..1000, 0..4] of real; //таблица не меняется: array[0..1000, 0..4] of real; //зависит от пакета акций, P : array[0..1000] of real; //массивы X и P: array[0..1000] of real; //X*P*100/492: array[0..1000] of integer; //гистограмма: real; //текущее значение в гистограмме: integer;//текущий индекс в гистограмме: array[0..1000] of real;: real; //min элементы PX (их принимаем за нижнюю грань): integer; //индекс мин. элемента для сортировки, sumPositive: real;//суммы кубов отриц и квадратов - для положительныхaxNumber: real; //максимальный параметр (который ищем)
bestPortfel:array[0..4] of real;: integer; //нулевой индекс: integer;: array[0..4] of real;, nCol: integer;, k2, k3, k4, k5: integer; //пакет(помноженный на 10): integer; //шаг - 10 - точность: real;: integer;, spower: real; //k,s степени, sbestpower: real; //k,s - лучшие степени, spowerCurrent: real;: real;, smaxpower : real;: real;: array[0..4] of real;: array[0..4] of real;:= StrToFloat(SettingsForm.edKpower.Text)+0.1;:= StrToFloat(SettingsForm.edSpower.Text)+0.1;:= sgTable.RowCount-1;:= 5;:= 0.0;
//выполняем первый этапi := 0 to nCol-1 do[0, i] := 1.0;i := 1 to nRow-1 doj := 0 to nCol-1 do[i, j] := StrToFloat(sgTable.Cells[j+1, i+1]) / StrToFloat(sgTable.Cells[j+1, i]);
lbLog.Items.Add('Первый этап пройден. Обработка второго этапа');
:= 10; //шаг = 1/step
kpower := 0.2;i := 0 to 4 do[i] := StrToFloat(sgTable2.Cells[i+1, sgTable2.RowCount-1]);kpower < kmaxpower do:= 0.2;spower < smaxpower do:= 100;
//выполняется второй этапk1 := 0 to step do
for k2 := 0 to step-k1 dok3 := 0 to step-k1-k2 dok4 := 0 to step-k1-k2-k3 do
begin
//сбрасываем значение гистограммы и функции распределения
for i := 0 to nRow-1 do[i] := 0;[i] := 0.0;;:= step-k1-k2-k3-k4;[0] := k1*1.0/step;[1] := k2*1.0/step;[2] := k3*1.0/step;[3] := k4*1.0/step;[4] := k5*1.0/step;
//вычисляем доход:= portfel[0] * lastRowTable2[0] +[1] * lastRowTable2[1] +[2] * lastRowTable2[2] +[3] * lastRowTable2[3] +[4] * lastRowTable2[4];temp > maxDohod then:= temp;
//запоминаем портфельi := 0 to 4 do[i] := portfel[i];;
//вычисляем долю акций в зависимости от пакета
//2
этап
и
вычисление
массива
Pi := 0 to nRow-1 do[i] := 0;j := 0 to nCol-1 do[i,j] := addTable[i,j] *
portfel[j];[i] := P[i] + dinTable[i,j];;;
//вычисление массива Xi := 0 to nRow-2 do[i] := (P[i+1]-P[i]) / (P[i+1]+P[i]);[nRow-1] := -1.0;
//вычисление массива PXi := 0 to nRow-2 do[i] := X[i]*P[i]*1000/nRow;[nRow-1] := X[nRow-1]*P[nRow-1]*10/nRow;
//распределение по гистограмме
//сортировка PX[i]
for i := 0 to nRow-2 do:= i;j := i+1 to nRow-1 doPX[j] < PX[iminPX] then:= j;
//меняем местами:= PX[i];[i] := PX[imaxPX];[imaxPX] := temp;
end;
//нахождение минимума и максимума->верхней и нижней грани
minPX
:= PX[0];:= Round(minPX*step*step);:= (PXlower-1)/step/step;
//построение гистограммы:= minPX + 1.0/step/step;:= 0;:= 0;i := 0 to nRow-1 do
begin
//определяем диапазон куда входит PX[i]
if PX[i] < curGistogramValue then(gistogram[curGistogramIndex])
else
//увеличиваем curGistogramValue до тех пор пока не дойдем до этой точки
while (PX[i] > curGistogramValue) do:= curGistogramValue + 1.0/step/step;(curGistogramIndex);(curGistogramValue < 0.00000000001) and (curGistogramValue > -0.000000000001) then:= curGistogramIndex;;(gistogram[curGistogramIndex]);;
end;
//построение функции распределения[0] := gistogram[0];
for i := 1 to curGistogramIndex do[i] := raspredelenieFunc[i-1] + gistogram[i];i := 0 to curGistogramIndex do[i] := raspredelenieFunc[i] / nRow;:= 0;i := iZero+1 to curGistogramIndex do:= sumPositive + power(1-raspredelenieFunc[i], kpower);:= 0;i := 0 to iZero do:= sumNegative + power(raspredelenieFunc[i], spower);(sumNegative + sumPositive) < lminNumber then:= sumNegative + sumPositive;
//запоминаем портфельi := 0 to 4 do[i] := portfel[i];;;.Items.Add('портфель (' + FloatToStrF(bestportfel[0], ffGeneral, 2,2) + '; ' +(bestportfel[1], ffGeneral, 2,2) + '; ' + FloatToStrF(bestportfel[2], ffGeneral, 2,2) + '; ' +(bestportfel[3], ffGeneral, 2,2) + '; ' + FloatToStrF(bestportfel[4], ffGeneral, 2,2) + ')');.Items.Add('Минимальное значение ' + FloatToStrF(lminNumber, ffGeneral, 4,5));.Items.Add('k=' + FloatToStrF(kpower, ffGeneral, 1,2) + ', s=' + FloatToStrF(spower, ffGeneral, 1, 2));.Items.Add('');:= spower+0.2;
end;:= kpower+0.2;;
{
//выполняется второй этап
for k1 := 0 to step dok2 := 0 to step-k1 dok3 := 0 to step-k1-k2 dok4 := 0 to step-k1-k2-k3 do
begin
//сбрасываем значение гистограммы и функции распределения
for i := 0 to nRow-1 do[i] := 0;[i] := 0.0;;:= step-k1-k2-k3-k4;[0] := k1*1.0/step;[1] := k2*1.0/step;[2] := k3*1.0/step;[3] := k4*1.0/step;[4] := k5*1.0/step;
//portfel[0] := 0.15;
//portfel[1] := 0.2;
//portfel[2] := 0.3;
//portfel[3] := 0.2;
//portfel[4] := 0.15;
//вычисляем долю акций в зависимости от пакета
//2 этап и вычисление массива Pi := 0 to nRow-1 do[i] := 0;j := 0 to nCol-1 do[i,j] := addTable[i,j] * portfel[j];[i] := P[i] + dinTable[i,j];;;
//вычисление массива Xi := 0 to nRow-2 do[i] := (P[i+1]-P[i]) / (P[i+1]+P[i]);[nRow-1] := -1.0;
//вычисление
массива
PXi := 0 to nRow-2 do[i] := X[i]*P[i]*1000/nRow;[nRow-1] :=
X[nRow-1]*P[nRow-1]*10/nRow;
//распределение по гистограмме
//сортировка PX[i]
for i := 0 to nRow-2 do:= i;j := i+1 to nRow-1 doPX[j] < PX[iminPX] then:= j;
//меняем местами:= PX[i];[i] := PX[imaxPX];[imaxPX] := temp;
end;
//нахождение минимума и максимума->верхней и нижней грани
minPX := PX[0];:= Round(minPX*step*step);:= (PXlower-1)/step/step;
//построение гистограммы:= minPX + 1.0/step/step;:= 0;:= 0;
i := 0 to nRow-1 do
begin
//определяем диапазон куда входит PX[i]
if PX[i] < curGistogramValue then(gistogram[curGistogramIndex])
else
//увеличиваем curGistogramValue до тех пор пока не дойдем до этой точки
while (PX[i] > curGistogramValue) do:= curGistogramValue + 1.0/step/step;(curGistogramIndex);(curGistogramValue < 0.00000000001) and (curGistogramValue > -0.000000000001) then:= curGistogramIndex;
;(gistogram[curGistogramIndex]);;
end;
//построение функции распределения
raspredelenieFunc[0] := gistogram[0];
for i := 1 to curGistogramIndex do[i] := raspredelenieFunc[i-1] + gistogram[i];i := 0 to curGistogramIndex do[i] := raspredelenieFunc[i] / nRow;
:= 10;:= 0.2;kpower < kmaxpower do:= 0;i := iZero+1 to curGistogramIndex do:= sumPositive + power(1-raspredelenieFunc[i], kpower);:= 0.2;spower < smaxpower do:= 0;i := 0 to iZero do:= sumNegative + power(raspredelenieFunc[i], spower)(sumNegative + sumPositive) < lNumber then:= kpower;:= spower;:= sumNegative + sumPositive;;:= spower+0.2;;:= kpower+0.2;;lnumber < lminNumber then
//запоминаем портфельi := 0 to 4 do[i] := portfel[i];;.Items.Add('портфель (' + FloatToStrF(portfel[0], ffGeneral, 2,2) + '; ' +(portfel[1], ffGeneral, 2,2) + '; ' +(portfel[2], ffGeneral, 2,2) + '; ' +(portfel[3], ffGeneral, 2,2) + '; ' +(portfel[4], ffGeneral, 2,2) + ')=>' +(lNumber, ffGeneral,4,5) +
' k=' + FloatToStrF(kpowerCurrent, ffGeneral, 1,2) +
'
s=' + FloatToStrF(spowerCurrent, ffGeneral, 1,2));
end;
//вывод результата
lbLog.Items.Add('--------------------------------------------');
lbLog.Items.Add('--------------------------------------------');.Items.Add('портфель (' + FloatToStrF(bestportfel[0], ffGeneral, 2,2) + '; ' +(bestportfel[1], ffGeneral, 2,2) + '; ' + FloatToStrF(bestportfel[2], ffGeneral, 2,2) + '; ' +(bestportfel[3], ffGeneral, 2,2) + '; ' + FloatToStrF(bestportfel[4], ffGeneral, 2,2) + ')');.Items.Add('Минимальное значение ' + FloatToStrF(lminNumber, ffGeneral, 4,5));.Items.Add('k=' + FloatToStrF(kbestpower, ffGeneral, 1,2) + ', s=' + FloatToStrF(sbestpower, ffGeneral, 1, 2));
}.Items.Add('');.Items.Add('Максимальная доходность ' + FloatToStrF(maxDohod, ffGeneral, 4,5));
lbLog.Items.Add('Портфель с максимальной доходностью (' + FloatToStrF(maxDohodPortfel[0], ffGeneral, 2,2) + '; ' +(maxDohodPortfel[1], ffGeneral, 2,2) + '; ' + FloatToStrF(maxDohodPortfel[2], ffGeneral, 2,2) + '; ' +(maxDohodPortfel[3], ffGeneral, 2,2) + '; ' + FloatToStrF(maxDohodPortfel[4], ffGeneral, 2,2) + ')');;TMainForm.N7Click(Sender: TObject);.ShowModal;;.