Смекни!
smekni.com

Методы оптимизации портфеля бескупонных облигаций (стр. 5 из 7)

, (2)

где

— весовой объемный коэффициент каждого выпуска ГКО,

;

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("&bsol;n%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("&bsol;n%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("&bsol;nденьги %f",Cush);

for (k=0;k<N;k++) {

printf("&bsol;n 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("&bsol;nнач.ст-ть :%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("&bsol;nденьги %f",Cush);

for (k=0;k<N;k++) {

printf("&bsol;n 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("&bsol;nнач.ст-ть :%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], // дох-ть эффективная

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("&bsol;n%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("&bsol;n%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-i/10+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("&bsol;nденьги %f",Cush);

for (k=0;k<N;k++) {

printf("&bsol;n 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("&bsol;nнач.ст-ть :%fбыло бы :%f есть:%f",S,S1,S2);

}

Программа 4.

#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-i+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("&bsol;nденьги %f",Cush);

for (k=0;k<N;k++) {

printf("&bsol;n 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("&bsol;nнач.ст-ть :%fбыло бы :%f есть:%f",S,S1,S2);

}

Программа 5.

#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("&bsol;n%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("&bsol;n%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+i+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;

Q[maxk]+=int(Cush/(P[maxk]*1.001));

Cush=Cush-Q[maxk]*P[maxk]*1.001;

Q[k]=0;

}

}

printf("&bsol;nденьги %f",Cush);

for (k=0;k<N;k++) {

printf("&bsol;n Q[%d]= %f",k,Q[k]);

}

asm {

mov ax,0

int 16h

}