Анализ эффективности вложений денежных средств в РКО
направление поиска"End
End If
On Error GoTo ErrorFuncFind
i = Row
While Not IsEmpty(Sheet.Cells(i; Column))
If IsDate(Text) Then
Compare = CDate(Sheet.Cells(i; Column))
Compare1 = CDate(Text)
Else
If IsNumeric(Text) Then
Compare = CDbl(Sheet.Cells(i; Column))
Compare1 = CDbl(Text)
Else
Compare = CStr(Sheet.Cells(i; Column))
Compare1 = CStr(Text)
End If
End If
If Compare = Compare1 Then
Поиск = i
Exit Function
End If
i = i + Direction
Wend
Поиск = 0
Exit Function
ErrorFuncFind:
MsgBox "Несовпадение типов данных в вызове" + Chr(13) + "функции Поиск и в искомом столбце." _
+ Chr(13) + Chr(13) + "Данные разных типов в столбце базы" + Chr(13)
End
End Function
Option Explicit
Option Base 1
' ---------------------------- Общая часть -------------------------------------
' внешние параметры
' тип данных для записи информации о бумаге
Type BumRecord
Num As Long ' номер бумаги
DateStart As Date ' дата выпуска
DateEnd As Date 'дата погашения
Volume As Long 'объем выпуска
Present As Boolean
End Type
' тип данных для записи информации о структуре портфеля
Type PortfelRecord
Dates() As Date ' дата покупки
Price() As Single ' цена покупки
Volume() As Long ' количество
StartPos() As Integer ' начальный индекс бумаги в массиве бумаг данной серии
EndPos() As Integer ' конечный индекс бумаги в массиве бумаг данной серии
VolumeAll() As Long ' количество бумаг данной серии в портфеле
End Type
' тип данных для записи информации об индксах портфеля и рынка
Type IndexRecord
Dates As Date
Portfel As Single
Birga As Single
End Type
Const MaxBum = 500 ' максимальное количество бумаг в портфеле одной серии
Const DilerConst = 1000900000 ' константа для выборки портфеля дилера
Dim MaxPeriod As Long ' максимальное количество дней для анализа(можно вычислить как последний день анализа-первый день анализа+1)
Dim Portfel As PortfelRecord ' данные о портфеле
Dim BumInfo() As BumRecord ' данные о бумагах
Dim BumNum As Integer ' количество различных серий бумаг
Dim Index() As IndexRecord ' индексы портфеля и рынка
Dim Revenue() As IndexRecord ' доходность к погашению портфеля и рынка
Dim BirgaInfo() As Single ' текущая биржевая информация по каждой серии
Dim CoefIndex As Long ' индекс коэффициента
Dim RevIndex As Long ' индекс доходности
Dim EvalDate As Date ' дата для расчета
Dim StartDate As Date ' начальная дата для постоения индексов
Dim PortfelPricePred; BirgaPricePred As Single
Dim Analize1; Analize2 As Boolean
'------------------------------- Процедура расчета портфеля (главный модуль)-
Sub АнализПортфель()
Dim Sheet As Object
Dim i; Ind As Integer
Dim SumCell As Long
Dim CurDate As Date
Set Sheet = Worksheets("Бумаги")
BumNum = 0
While Sheet.Cells(BumNum + 2; 1) <> Empty
BumNum = BumNum + 1
Wend
With DialogSheets("ДиалогДата")
.EditBoxes(1).Text = "05.02.97"
.EditBoxes(2).Text = "30.05.97"
.EditBoxes(1).InputType = xlDate
.EditBoxes(2).InputType = xlDate
.Show
StartDate = CDate(.EditBoxes(1).Text)
EvalDate = CDate(.EditBoxes(2).Text)
End With
With DialogSheets("ДиалогВыбор")
again:
.Show
Analize1 = False
Analize2 = False
If .CheckBoxes(1).Value = 1 Then Analize1 = True
If .CheckBoxes(2).Value = 1 Then Analize2 = True
If Not Analize1 And Not Analize2 Then
MsgBox "Выберите тип анализа"
GoTo again
End If
End With
MaxPeriod = EvalDate - StartDate + 1
ReDim Index(MaxPeriod)
ReDim Revenue(MaxPeriod)
Index(1).Portfel = 1
Index(1).Birga = 1
Index(1).Dates = StartDate
ReDim BumInfo(BumNum)
ReDim BirgaInfo(BumNum)
For i = 1 To BumNum
With BumInfo(i)
.Num = Sheet.Cells(i + 1; 1)
.DateStart = Sheet.Cells(i + 1; 2)
.DateEnd = Sheet.Cells(i + 1; 3)
.Volume = Sheet.Cells(i + 1; 4)
End With
Next i
ReDim Portfel.Dates(BumNum; MaxBum)
ReDim Portfel.Price(BumNum; MaxBum)
ReDim Portfel.Volume(BumNum; MaxBum)
ReDim Portfel.StartPos(BumNum)
ReDim Portfel.EndPos(BumNum)
ReDim Portfel.VolumeAll(BumNum)
For i = 1 To BumNum
Portfel.StartPos(i) = 1
Portfel.EndPos(i) = 0
Next i
Set Sheet = Worksheets("Сделки")
Call Сортировка(Worksheets("Сделки"); "A2"; "A2"; "B2"; "D2"; _
xlAscending; xlAscending; xlAscending)
i = 2
CoefIndex = 1
RevIndex = 1
CurDate = StartDate
While Sheet.Cells(i; 1) <> Empty And Sheet.Cells(i; 1) <= EvalDate
If Sheet.Cells(i; 2) = DilerConst Then
Ind = ReturnBum(Sheet.Cells(i; 3))
If Not IsEmpty(Sheet.Cells(i; 4)) Then
Portfel.EndPos(Ind) = Portfel.EndPos(Ind) + 1
Portfel.Dates(Ind; Portfel.EndPos(Ind)) = Sheet.Cells(i; 1)
Portfel.Price(Ind; Portfel.EndPos(Ind)) = Sheet.Cells(i; 4)
Portfel.Volume(Ind; Portfel.EndPos(Ind)) = Sheet.Cells(i; 6)
Portfel.VolumeAll(Ind) = Portfel.VolumeAll(Ind) + Sheet.Cells(i; 6)
Else
SumCell = Sheet.Cells(i; 6)
Portfel.VolumeAll(Ind) = Portfel.VolumeAll(Ind) - Sheet.Cells(i; 6)
While SumCell >= Portfel.Volume(Ind; Portfel.StartPos(Ind)) And SumCell > 0
SumCell = SumCell - Portfel.Volume(Ind; Portfel.StartPos(Ind))
Portfel.StartPos(Ind) = Portfel.StartPos(Ind) + 1
Wend
If SumCell < Portfel.Volume(Ind; Portfel.StartPos(Ind)) Then
Portfel.Volume(Ind; Portfel.StartPos(Ind)) = Portfel.Volume(Ind; Portfel.StartPos(Ind)) - SumCell
End If
End If
End If
' в данном месте можео провести анализ на основе данных о портфеле за текущую дату
' дата текущая - это Worksheets("Сделки").cells(i-1;1)
' т.е. анализ за эту текущую дату(доходность к погашению портфеля, индекс,...)
If StartDate <= Sheet.Cells(i; 1) And Sheet.Cells(i; 1) <> CurDate Then
Call Процедура_анализа(Sheet.Cells(i; 1))
CoefIndex = CoefIndex + 1
RevIndex = RevIndex + 1
CurDate = Sheet.Cells(i; 1)
End If
i = i + 1
Wend
If Analize1 Then
Worksheets("РезультатИндекс").Cells(1; 2) = "Портфель"
Worksheets("РезультатИндекс").Cells(1; 3) = "Рынок"
For i = 1 To CoefIndex - 1
Worksheets("РезультатИндекс").Cells(i + 1; 1) = Index(i).Dates
Worksheets("РезультатИндекс").Cells(i + 1; 2) = Index(i).Portfel
Worksheets("РезультатИндекс").Cells(i + 1; 3) = Index(i).Birga
Next i
Charts("ДиаграммаИндекс").ChartWizard Source:=Sheets("РезультатИндекс").Range( _
"A1:C" + CStr(i)); Gallery:=xlLine; Format:=4; PlotBy:=xlColumns; _
CategoryLabels:=1; SeriesLabels:=1; HasLegend:=1; Title:= _
"Сравнение индекса портфеля и рынка"; CategoryTitle:="дата"; ValueTitle:= _
"индекс"; ExtraTitle:=""
Charts("ДиаграммаИндекс").Select
MsgBox "Диаграмма Индекса"
End If
If Analize2 Then
Worksheets("РезультатДоходность").Cells(1; 2) = "Портфель"
Worksheets("РезультатДоходность").Cells(1; 3) = "Рынок"
For i = 1 To RevIndex - 1
Worksheets("РезультатДоходность").Cells(i + 1; 1) = Revenue(i).Dates
Worksheets("РезультатДоходность").Cells(i + 1; 2) = Revenue(i).Portfel
Worksheets("РезультатДоходность").Cells(i + 1; 3) = Revenue(i).Birga
Next i
Charts("ДиаграммаДоходность").ChartWizard Source:=Sheets("РезультатДоходность").Range( _
"A1:C" + CStr(i)); Gallery:=xlLine; Format:=4; PlotBy:=xlColumns; _
CategoryLabels:=1; SeriesLabels:=1; HasLegend:=1; Title:= _
"Сравнение доходности портфеля и рынка"; CategoryTitle:="дата"; ValueTitle:= _
"доходность"; ExtraTitle:=""
Charts("ДиаграммаДоходность").Select
MsgBox "Диаграмма Доходности"
End If
End Sub
'--------------------- функция возвращает индекс бумаги в массиве BumInfo -------------
Function ReturnBum(bum As Long)
Dim i As Integer
For i = 1 To BumNum
If bum = BumInfo(i).Num Then
ReturnBum = i
Exit Function
End If
Next i
MsgBox "Не найдена бумага в списке бумаг. Занести бумагу в лист Бумаги"
End
End Function
'-------------------- Процедура построения индексов портфеля и рынка -----------------
Sub Процедура_анализа(CurDate As Date)
Dim i; k As Long
Dim Sheet As Object
Dim PortfelPrice; BirgaPrice As Single
Dim BirgaCoef; PortfelCoef As Single
Dim Doh; Volume As Single
Dim Flag As Boolean
Set Sheet = Worksheets("Биржа")
' поиск первой строки начала биржевой информации за текущий день
i = Поиск(Worksheets("Биржа"); 1; 2; CurDate; 1)
If i = 0 Then
'MsgBox "Биржевая информация за " + CStr(CDate(CurDate)) + "не найдена"
'End
CoefIndex = CoefIndex - 1
Exit Sub
End If
' занесение биржевой информации за текущий день
If i <> 0 Then
While Sheet.Cells(i; 1) = CurDate
If Sheet.Cells(i; 6) <> Empty Then
BirgaInfo(ReturnBum(Sheet.Cells(i; 2))) = Sheet.Cells(i; 6)
End If
i = i + 1
Wend
End If
' определение по каждой бумаге обращения на бирже
For i = 1 To BumNum
If BumInfo(i).DateStart <= CurDate And CurDate <= BumInfo(i).DateEnd Then
BumInfo(i).Present = True
Else
BumInfo(i).Present = False
End If
Next i
' если выбран анализ эффективной доходности портфеля и рынка
If Analize2 Then
Doh = 0
Volume = 0
Flag = True
For k = 1 To BumNum
If BumInfo(k).Present Then
For i = Portfel.StartPos(k) To Portfel.EndPos(k)
Flag = False
Doh = Doh + (100 / Portfel.Price(k; i) - 1) * 36500 * Portfel.Volume(k; i)
Volume = Volume + Portfel.Volume(k; i) * (BumInfo(k).DateEnd - Portfel.Dates(k; i))
Next i
End If
Next k
If Flag Then
RevIndex = RevIndex - 1
GoTo Anal1
End If
Revenue(RevIndex).Portfel = Doh / Volume
Revenue(RevIndex).Dates = CurDate
Flag = True
Doh = 0
Volume = 0
For k = 1 To BumNum
If BumInfo(k).Present Then
Flag = False
Doh = Doh + (100 / BirgaInfo(k) - 1) * 36500 * BumInfo(k).Volume
Volume = Volume + BumInfo(k).Volume * (BumInfo(k).DateEnd - CurDate)
End If
Next k
If Flag Then
RevIndex = RevIndex - 1
GoTo Anal1
End If
Revenue(RevIndex).Birga = Doh / Volume
End If
Anal1:
' если выбран анализ индекса портфеля и рынка
If Analize1 Then
' определение стоимости портфеля и биржи по средневзвешенным ценам
PortfelPrice = 0
BirgaPrice = 0
For i = 1 To BumNum
PortfelPrice = PortfelPrice + Portfel.VolumeAll(i) * BirgaInfo(i) * 10000
BirgaPrice = BirgaPrice + BumInfo(i).Volume * BirgaInfo(i) * 10000
Next i
' расчет индексов
If CoefIndex <> 1 Then
' поиск остатков за текущий день
k = Поиск(Worksheets("Остаток"); 1; 2; CurDate; 1)
If k <> 0 Then
PortfelPrice = PortfelPrice + Worksheets("Остаток").Cells(k; 2)
End If
' вычисление коэффициента портфеля
If k <> 0 Then
PortfelCoef = (PortfelPrice - Worksheets("Остаток").Cells(k; 3) _
+ Worksheets("Остаток").Cells(k; 4)) / PortfelPricePred
Else
PortfelCoef = PortfelPrice / PortfelPricePred
End If
PortfelPricePred = PortfelPrice
' определение индекса портфеля за текущий день
Index(CoefIndex).Portfel = Index(CoefIndex - 1).Portfel * PortfelCoef
Index(CoefIndex).Dates = CurDate
BirgaCoef = BirgaPrice
k = Поиск(Worksheets("Бумаги"); 2; 2; CurDate; 1)
If k <> 0 Then
BirgaCoef = BirgaCoef - Worksheets("Бумаги").Cells(k; 4)
End If
k = Поиск(Worksheets("Бумаги"); 3; 2; CurDate; 1)
If k <> 0 Then
BirgaCoef = BirgaCoef + Worksheets("Бумаги").Cells(k; 4)
End If
BirgaCoef = BirgaCoef / BirgaPricePred
BirgaPricePred = BirgaPrice
' определение индекса биржи за текущий день
Index(CoefIndex).Birga = Index(CoefIndex - 1).Birga * BirgaCoef
Else
k = Поиск(Worksheets("Остаток"); 1; 2; CurDate; 1)
If k <> 0 Then
PortfelPrice = PortfelPrice + Worksheets("Остаток").Cells(k; 2)
End If
PortfelPricePred = PortfelPrice
BirgaPricePred = BirgaPrice
End If
End If
End Sub
Sub Cancel()
End
End Sub
Приложение № 2.2. Диаграмма сравнения доходности портфеля и рынка.
Приложение № 2.3. Диаграмма сравнения индекса портфеля и рынка.
Приложение № 3. Входные статистические данные.
Приложение 3.1. Информация о бумагах.
№ |
Дата выпуска |
Дата погашения |
Объем выпуска |
21019 |
14.11.96 |
13.02.97 |
60 000 000 |
21020 |
09.01.97 |
10.04.97 |
65 000 000 |
21021 |
13.02.97 |
15.05.97 |
55 000 000 |
21022 |
10.04.97 |
10.07.97 |
55 000 000 |
21023 |
10.07.97 |
09.10.97 |
40 000 000 |
21024 |
18.12.97 |
09.04.98 |
45 000 000 |
22002 |
29.08.96 |
27.02.97 |
25 000 000 |
22003 |
26.09.96 |
27.03.97 |
30 000 000 |
22004 |
24.10.96 |
24.04.97 |
40 000 000 |
22005 |
28.11.96 |
29.05.97 |
45 000 000 |
22006 |
19.12.96 |
19.06.97 |
90 000 000 |
22007 |
30.01.97 |
24.07.97 |
30 000 000 |
22008 |
27.02.97 |
28.08.97 |
55 000 000 |
22009 |
27.03.97 |
25.09.97 |
55 000 000 |
22010 |
24.04.97 |
23.10.97 |
60 000 000 |
22011 |
15.05.97 |
13.11.97 |
60 000 000 |
22012 |
29.05.97 |
27.11.97 |
60 000 000 |
24001 |
20.03.97 |
12.03.98 |
30 000 000 |
24002 |
08.05.97 |
07.05.98 |
25 000 000 |
Приложение 3.2. Информация о сделках.
Дата |
№ бумаги |
Цена приобр |
Цена продажи |
Кол-во |
02.12.96 |
22004 |
92,99 |
62 |
|
02.12.96 |
22004 |
93,00 |
340 |
|
04.12.96 |
22005 |
77,50 |
6 |
|
05.12.96 |
22003 |
85,14 |
5 |
|
19.12.96 |
22006 |
80,05 |
300 |
|
19.12.96 |
22006 |
80,21 |
500 |
|
19.12.96 |
22006 |
80,37 |
259 |
|
01.01.97 |
22005 |
92,06 |
7 |
|
01.01.97 |
21021 |
0,00 |
1126 |
|
01.01.97 |
22005 |
0,00 |
95 |
|
01.01.97 |
22008 |
0,00 |
75 |
|
01.01.97 |
22009 |
0,00 |
457 |
|
01.01.97 |
22008 |
0,00 |
29 |
|
01.01.97 |
21020 |
0,00 |
642 |
|
01.01.97 |
22004 |
0,00 |
12 |
|
01.01.97 |
22006 |
0,00 |
20 |
|
01.01.97 |
22009 |
0,00 |
16 |
|
01.01.97 |
21020 |
0,00 |
90 |
|
01.01.97 |
22006 |
0,00 |
26 |
|
01.01.97 |
21020 |
0,00 |
20 |
|
01.01.97 |
22004 |
0,00 |
15 |
|
01.01.97 |
22006 |
0,00 |
5 |
|
01.01.97 |
21021 |
0,00 |
12 |
|
01.01.97 |
22006 |
0,00 |
27 |
|
01.01.97 |
21020 |
0,00 |
0 |
|
01.01.97 |
21021 |
0,00 |
63 |
|
01.01.97 |
22004 |
0,00 |
159 |
|
01.01.97 |
22005 |
0,00 |
146 |
|
01.01.97 |
22009 |
0,00 |
46 |
|
01.01.97 |
22007 |
0,00 |
32 |
|
01.01.97 |
22008 |
0,00 |
13 |
|
01.01.97 |
22006 |
0,00 |
73 |
|
01.01.97 |
22006 |
0,00 |
59 |
|
01.01.97 |
22006 |
0,00 |
56 |
|
01.01.97 |
21020 |
0,00 |
29 |
|
01.01.97 |
21021 |
0,00 |
8 |
|
01.01.97 |
22005 |
0,00 |
12 |
|
01.01.97 |
22006 |
0,00 |
27 |
|
01.01.97 |
21021 |
0,00 |
10 |
|
01.01.97 |
22008 |
0,00 |
28 |
|
01.01.97 |
22008 |
0,00 |
57 |
|
01.01.97 |
21021 |
0,00 |
42 |
|
01.01.97 |
24001 |
0,00 |
34 |
|
01.01.97 |
24001 |
0,00 |
69 |
|
01.01.97 |
21021 |
0,00 |
104 |
|
09.01.97 |
21020 |
90,93 |
300 |
|
09.01.97 |
21020 |
91,03 |
600 |
|
09.01.97 |
21020 |
91,24 |
900 |
|
09.01.97 |
21020 |
91,35 |
600 |
|
09.01.97 |
21020 |
91,50 |
500 |
|
10.01.97 |
22004 |
91,54 |
24 |
|
13.01.97 |
21020 |
93,65 |
50 |
|
14.01.97 |
21020 |
93,22 |
32 |
|
15.01.97 |
22005 |
88,51 |
10 |
|
17.01.97 |
21020 |
92,50 |
10 |
|
28.01.97 |
21020 |
93,40 |
7 |
|
31.01.97 |
22007 |
84,19 |
16 |
|
31.01.97 |
22007 |
84,20 |
184 |
|
06.02.97 |
22004 |
92,80 |
60 |
|
10.02.97 |
22006 |
89,00 |
500 |
|
13.02.97 |
21021 |
91,20 |
430 |
|
13.02.97 |
21021 |
91,30 |
430 |
|
13.02.97 |
21021 |
91,33 |
320 |
|
17.02.97 |
22005 |
92,25 |
78 |
|
17.02.97 |
22007 |
88,42 |
78 |
|
19.02.97 |
22005 |
93,00 |
122 |
|
19.02.97 |
22003 |
97,55 |
41 |
|
19.02.97 |
22007 |
89,39 |
122 |
|
20.02.97 |
22005 |
92,60 |
28 |
|
25.02.97 |
22005 |
92,01 |
100 |
|
25.02.97 |
22005 |
92,03 |
60 |
|
25.02.97 |
21020 |
96,00 |
101 |
|
26.02.97 |
22004 |
95,10 |
12 |
|
26.02.97 |
21021 |
92,50 |
12 |
|
27.02.97 |
22008 |
84,04 |
300 |
|
27.02.97 |
22008 |
84,10 |
432 |
|
27.02.97 |
22008 |
84,22 |
318 |
|
27.02.97 |
22008 |
84,09 |
311 |
|
27.02.97 |
22008 |
84,22 |
182 |
|
27.02.97 |
22008 |
84,42 |
100 |
|
28.02.97 |
21021 |
93,23 |
80 |
|
03.03.97 |
21020 |
97,30 |
200 |
|
03.03.97 |
21021 |
94,00 |
154 |
|
03.03.97 |
22006 |
92,50 |
200 |
|
04.03.97 |
22006 |
92,40 |
24 |
|
04.03.97 |
22006 |
92,52 |
200 |
|
04.03.97 |
22006 |
92,53 |
200 |
|
06.03.97 |
22006 |
92,63 |
25 |
|
06.03.97 |
22004 |
96,45 |
4 |
|
06.03.97 |
21020 |
97,53 |
108 |
|
12.03.97 |
21020 |
97,70 |
489 |
|
13.03.97 |
21020 |
97,50 |
822 |
|
13.03.97 |
21021 |
94,00 |
399 |
|
17.03.97 |
21021 |
93,67 |
100 |
|
19.03.97 |
22003 |
99,19 |
128 |
|
19.03.97 |
22003 |
99,20 |
229 |
|
20.03.97 |
24001 |
72,00 |
50 |
|
20.03.97 |
24001 |
72,15 |
290 |
|
21.03.97 |
22005 |
94,20 |
2 |
|
21.03.97 |
22005 |
94,25 |
100 |
|
24.03.97 |
22005 |
94,25 |
108 |
|
24.03.97 |
22005 |
94,39 |
27 |
|
24.03.97 |
22005 |
94,40 |
598 |
|
24.03.97 |
21020 |
98,40 |
200 |
|
25.03.97 |
22006 |
92,10 |
70 |
|
25.03.97 |
22005 |
94,05 |
320 |
|
25.03.97 |
22003 |
99,78 |
403 |
|
26.03.97 |
22006 |
92,00 |
314 |
|
26.03.97 |
21021 |
94,45 |
80 |
|
26.03.97 |
21020 |
98,10 |
50 |
|
28.03.97 |
22005 |
94,15 |
7 |
|
28.03.97 |
21021 |
95,10 |
135 |
|
28.03.97 |
21021 |
95,19 |
378 |
|
28.03.97 |
21021 |
95,20 |
90 |
|
28.03.97 |
21020 |
99,07 |
288 |
|
28.03.97 |
21020 |
99,01 |
300 |
|
31.03.97 |
22006 |
92,92 |
200 |
|
31.03.97 |
22006 |
92,93 |
400 |
|
31.03.97 |
22006 |
92,94 |
100 |
|
31.03.97 |
22005 |
94,50 |
10 |
|
31.03.97 |
21020 |
99,10 |
88 |
|
31.03.97 |
21020 |
99,11 |
12 |
|