Методы оптимизации портфеля бескупонных облигаций
Страница 6
;
yi — эффективная доходность к погашению ГКО i-й серии;
—количество дней до погашения i-го выпуска ГКО;
— средний срок до погашения портфеля всех обращающихся облигаций.
После несложных преобразований формула (2) принимает следующий вид:
, (3)
6. Описание выбранной модели
Индекс расcчитывается путем численного решения уравнения (1) методом хорд. Выбор в пользу численного решения уравнения (1) по сравнению с приближенным аналитическим решением сделан в связи со следующими соображениями. Программные средства позволяют без особых затрат в быстрые сроки рассчитать точное решение уравнения с любой допустимой погрешностью. Следовательно, использовать хотя бы и аналитическое, но приближенное решение вряд ли целесообразно.
7. Учет технических моментов
Необходимости в подобном учете не возникло.
8. Достоинства и недостатки. Рекомендации по использованию
· Гипотеза о том, что все промежуточные выплаты будут реинвестированы под один и тот же процент, пока еще для российского рынка является слишком сильной. Данное допущение уместно для очень стабильной долгосрочной конъюнктуры процентных ставок.
· Метод расчета индекса путем численного решения некоторого уравнения затрудняет его расчет непрограммными средствами (вручную). Скорость расчета индекса становится критической в случае, если расчет необходимо производить очень часто и в очень сжатые сроки. Таким образом, человек, не имеющий возможности пользоваться хотя бы электронными таблицами, самостоятельно рассчитать индекс не сможет.
· Данный индикатор позволяет анализировать степень взаимосвязи рынка ГКО с различными макроэкономическими параметрами, а также влияние смежных сегментов финансовой сферы на конъюнктуру рынка ГКО. С помощью него удобно анализировать соотношения текущего уровня процентных ставок и темпов инфляции. Кроме того, ним удобно проводить корреляционный анализ.
· У точечных показателей доходности по сравнению с кривой распределения процентных ставок есть достоинства — их динамику более удобно изображать графически на плоскости, тогда как для изображения динамики всей кривой доходности нужны уже объемные графики.
· Описанный выше индикатор - инструмент макропрогнозирования в средне- и долгосрочной перспективе.
Приложение 3. Оценка между точным решением и приближенным значением.
#include <iostream.h>
#include <stdio.h>
#include <math.h>
#include <conio.h>
const N=5; // кол-в инстументов
int n; // кол-во бумаг
float Q[N], // объемы бумаг
P[N], // цены приобретения
T[N], // интервал обращения
Ppr; // цена продажи
// метод вычисления доходности портфеля численным методом секущих Ньютона
// усовершенствованный
float method3() {
int i;
float Ik; // Ik - значение %
float F=0,
F0;
for (Ik=-50;Ik<300;Ik+=0.01) {
F0=F;
F=0;
for (i=0;i<N;i++)
F+=Q[i]*P[i]*pow(1+Ik/1200,(float)T[i]/30)-Ppr*Q[i];
if (F0<=0 && F>=0) break;
}
return Ik;
}
// метод вычисления доходности портфеля через взвешивание по времени и объему
float method2() {
int i;
float Ik,S,S1;
float D[N],D1[N];
for (i=0;i<N;i++) {
D[i]=(((float)Ppr-(float)P[i])/(float)P[i]*36500/(float)T[i]);
D1[i]=(pow(1+D[i]*(float)T[i]/36500,30/(float)T[i])-1)*1200;
}
S=0;S1=0;
for (i=0;i<N;i++) {
S+=D1[i]*Q[i]*P[i]*T[i];
S1+=Q[i]*P[i]*T[i];
}
Ik=S/S1;
return Ik;
}
void main(void) {
float I;
clrscr();
Q[0]=223;Q[1]=200;Q[2]=400;Q[3]=500;Q[4]=300;Q[5]=271;Q[6]=32;Q[7]=10;
P[0]=80.16;P[1]=80.53,P[2]=80.37;P[3]=80.21;P[4]=80.05;P[5]=75.00;P[6]=93.22;P[7]=92.5;
T[0]=40;T[1]=40;T[2]=40;T[3]=40;T[4]=40;T[5]=148;T[6]=14;T[7]=11;
Ppr=87.15;
I=method3();
cout<<endl<<"Ставка по численному методу "<<I;
I=method2();
cout<<endl<<"Ставка по методу взвешивания "<<I;
}
Результат:
Ставка по численному методу: 76.555565
Ставка по методу взвешивания: 76.550621
Приложение 4. Проверка метода на случайной выборке.
Программа 1.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
const N=8;
void main(void) {
float Q[N], // кол-во
P[N], // цена
T[N], // дней до погашения
D[N], // дох-ть эффективная
Q1[N], // нач. портфель
P1[N], // нач. цены
Cush,S; // деньги
float S1,S2;
int k,maxk,i;
T[0]=58;
T[1]=37;
T[2]=72;
T[3]=107;
T[4]=135;
T[5]=163;
T[6]=303;
T[7]=359;
randomize();
Cush=200000; // 2 миллиарда
maxk=0;
clrscr();
for (k=0;k<N;k++) {
D[k]=28+float(random(400))/100;
P[k]=100/pow((D[k]/1200+1),T[k]/30);
P1[k]=P[k];
Q[k]=Q1[k]=0;
if (D[maxk]<D[k]) maxk=k;
printf(" %f %f",D[k],P[k]);
}
Q1[maxk]=Q[maxk]=int(Cush/(P[maxk]*1.001));
Cush=Cush-Q[maxk]*P[maxk]*1.001;
printf(" %d %f %f",maxk,Q1[maxk],Cush);
S=0;
for (k=0;k<N;k++) S+=Q[k]*P[k];
for (i=1;i<=21;i++) {
maxk=0;
for (k=0;k<N;k++) {
D[k]=28+float(random(200))/100;
P[k]=100/pow((D[k]/1200+1),(T[k]-i)/30);
if (D[maxk]<D[k]) maxk=k;
}
for (k=0;k<N;k++) {
if (Q[k]>0)
if (D[k]+1<D[maxk]) {
Cush+=P[k]*Q[k]*0.999;
Q[maxk]+=int(Cush/(P[maxk]*1.001));
Cush=Cush-Q[maxk]*P[maxk]*1.001;
Q[k]=0;
}
}
printf(" деньги %f",Cush);
for (k=0;k<N;k++) {
printf(" Q[%d]= %f",k,Q[k]);
}
asm {
mov ax,0
int 16h
}
}
S1=S2=0;
for (k=0;k<N;k++) {
S1+=Q1[k]*P[k];
S2+=Q[k]*P[k];
}
printf(" нач.ст-ть :%fбыло бы :%f есть:%f",S,S1,S2);
}
Программа 2.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
const N=8;
void main(void) {
float Q[N], // кол-во
P[N], // цена
T[N], // дней до погашения
D[N], // дох-ть эффективная
Q1[N], // нач. портфель
P1[N], // нач. цены
Cush,QQ,S; // деньги
float S1,S2;
int k,maxk,i;
T[0]=58;
T[1]=37;
T[2]=72;
T[3]=107;
T[4]=135;
T[5]=163;
T[6]=303;
T[7]=359;
randomize();
Cush=0;
maxk=0;
clrscr();
for (k=0;k<N;k++) {
Q1[k]=Q[k]=100;
D[k]=28+float(random(400))/100;
P[k]=100/pow((D[k]/1200+1),T[k]/30);
}
S=0;
for (k=0;k<N;k++) S+=Q[k]*P[k];
for (i=1;i<=21;i++) {
maxk=0;
for (k=0;k<N;k++) {
D[k]=28+float(random(400))/100;
P[k]=100/pow((D[k]/1200+1),(T[k]-i)/30);
if (D[maxk]<D[k]) maxk=k;
}
for (k=0;k<N;k++) {
if (Q[k]>0)
if (D[k]+1<=D[maxk]) {
Cush+=P[k]*Q[k]*0.999;
QQ=int(Cush/(P[maxk]*1.001));
Q[maxk]+=QQ;
Cush=Cush-QQ*P[maxk]*1.001;
Q[k]=0;
}
}
printf(" деньги %f",Cush);
for (k=0;k<N;k++) {
printf(" Q[%d]= %f",k,Q[k]);
}
asm {
mov ax,0
int 16h
}
}
S1=S2=0;
for (k=0;k<N;k++) {
S1+=Q1[k]*P[k];
S2+=Q[k]*P[k];
}
printf(" нач.ст-ть :%fбыло бы :%f есть:%f",S,S1,S2);
}
Программа 3.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
const N=8;
void main(void) {
float Q[N], // кол-во
P[N], // цена
T[N], // дней до погашения
D[N], // дох-ть эффективная