Количественный анализ деятельности российских паевых инвестиционных фондов
Особенность построения бенчмарка на основе индексных фондов. Проведение исследования инвестиционного портфеля на основе фьючерса на Индекс МосБиржи. Инвестиционная стратегия с использованием бутстрап подхода. Вычисление активов для покупки и продажи.
Рубрика | Финансы, деньги и налоги |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 02.09.2018 |
Размер файла | 4,4 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
# выделение данных за период в переменную
dta.m=pif.return[i:(i+(period-1)),]
# массив с весами оценок фондов
diff.best=c()
for(j in 1:ncol(dta.m)){
# данные по каждому фонду записаны в столбец
pif=dta.m[,j]
diff.best[j]=NA
# проверка на то, что количество данных по фонду
# соответсвует длине периода
if(length(na.trim(pif))==period){
# вычисление пересечения дат с Индексом МосБиржи
time=intersect(index(pif),index(moex))
# вычисление разности между фондом и индексом
diff.index=abs(Return.excess(pif,moex[as.Date(time)]))
# вычисление показателя для сравнения с другими фондами
diff.best[j]=mean(diff.index)*sd(diff.index)
}
}
# проверка, если все данные пустые
if(length(diff.best[is.na(diff.best)])==length(diff.best)) next
# заполнение названия фондов к их оценке
names(diff.best)=colnames(dta.m)
# остаются только те фонды, по которым сформирована оценка
diff.best=diff.best[!is.na(diff.best)]
#pif.best.name=names(diff.best)[which(diff.best==min(diff.best,na.rm = TRUE))]
#pif.act[tail(index(pif),n=1),pif.best.name]=TRUE
# запись в общую таблицу оценок фондов
pif.act[tail(index(pif),n=1),names(sort(diff.best))]=c(1:length(diff.best))
}
# создание копии таблицы
pif.act.copy=pif.act
# период для инвестиций
period=12
# стирание данных
pif.act[]=NA
# индикатор для начала
# вычисления фонда в который
# нужно инвестировать
j=11
for(i in 1:(nrow(pif.act.copy)-(period-1))){
# выделение данных за период в переменную
dta.m=pif.act.copy[i:(i+(period-1)),]
# проверка, достаточно ли данных в периоде
if(sum(dta.m[1,],na.rm = TRUE)>0){
# увеличение периода на 1 месяц
j=j+1
# если количество месяцев кратно периоду
# то нужно вычислять новый фонд для инвестиций
# на следующий период
if(j%%period==0){
# вычисляется сумма по каждому фонду
# затем данные записываются в массив
best=names(sort(colSums(dta.m)))[1]
# вычисление месяца начала инвестиций
k=i+period
# вычисление конечного месяца инвестиции
k1=ifelse((k+(period-1))>nrow(pif.act.copy),nrow(pif.act.copy),(k+(period-1)))
# запись в таблицу информации о том,
# в какой фонд будут сделаны инвестции
pif.act[index(pif.act.copy[k:k1,]),best[1]]=1
}
}
}
portfel.equity=function(prices, action, bank, fee, log = ""){
# индикатор, нухно ли вести логи
diag = FALSE
if(log!="") diag=TRUE
# значение комиссии на покупку
fee.buy=fee[1]
# значение комиссии на продажу
fee.sell=fee[2]
# запись текущей даты в логи
if(diag) write(as.character(Sys.time()),log,,FALSE)
# портфель, как массив активов
portfel=c()
# история изменения стоимости портфеля
portfel.history=action[,1]
portfel.history[]=NA
for(i in 1:nrow(action)){
# запись даты
if(diag) write(paste0("------------------------------",index(action)[i],"------------------------------"),log,,TRUE)
# если был сплит активов
n.act=action[i,names(portfel)]
if(length(n.act)>0) n.act=n.act[1,!is.na(n.act)]
if(length(n.act)>0) n.act=n.act[1,n.act>1]
if(length(n.act)>0) portfel[colnames(n.act)]=portfel[colnames(n.act)]*n.act
# если нет цен по всем активам в портфеле
pr=prices[i,names(portfel)]
if(length(pr)>0) pr=pr[1,!is.na(pr)]
if(length(pr)!=length(portfel)){
portfel.history[i]=equity
if(diag) write(paste0("По данным активам торги остановлены: ",paste(setdiff(names(portfel),colnames(pr)),collapse = " ")),log,,TRUE)
next
}
# стоимость портфеля
equity=sum(as.numeric(prices[i,names(portfel)]*portfel))+bank
# запись диагностической информации
if(diag) write(paste("Стоимость портфеля:",equity),log,,TRUE)
if(diag) write(paste("Банк:",bank),log,,TRUE)
if(diag) write(paste("Портфель:",paste(paste0(names(portfel),":"),portfel,collapse=", ")),log,,TRUE)
if(diag) write(paste("Количество:",length(portfel)),log,,TRUE)
# новый список активов для портфеля
buy=colnames(action)[which(!is.na(action[i,]))]
# запись стоиости портфеля в историю изменений
portfel.history[i]=equity
# если активы в портфеле такие же, в которые нужно инвестировать
if(length(setdiff(buy,names(portfel)))==0) next
if(diag) write(paste("Новый портфель:",paste(buy,collapse = " ")),log,,TRUE)
if(diag) write(paste("Количество:",length(buy)),log,,TRUE)
# если портфель пустой и покупать ничего не надо
if(length(portfel)==0 & length(buy)==0) next
# вес одной части в портфеле
part=0
# если покупать ничего не надо
if(length(buy)==0){
# будет ребалансировка
if (length(portfel)!=0) part=1/length(portfel)
} else {
# часть каждого актива (равновзвешенный)
part=1/length(buy)
}
# стоимость одной части портфеля
part.money=equity*part
if(diag) write(paste("Вес 1 части:",part),log,,TRUE)
# новые активы, которые нужно купить в портфель: разница между новым списком активов для портфеля и текущим портфелем
buy.new=setdiff(buy,names(portfel))
# акивы из портфеля, которые нужно продать: не входят в новой список активов для портфеля
sell.new=setdiff(names(portfel), buy)
#### сначала продаём активы из портфеля, чтобы пополнить количество денежных средств ####
if(length(sell.new)>0) {
if(diag) write(paste("##### Продажа ",paste(sell.new,collapse = " ")),log,,TRUE)
for(p in sell.new){
# текущая цены пифа
price=as.numeric(prices[i,p])
# если нет цены - переход к следующему активу
if(is.na(price)) next
# вычисление комиссии
fee=price * fee.sell
# количество данного актива в портфеле
n=as.numeric(portfel[p])
if(diag) write(paste("ПИФ:",p,"Цена:",price,"Кол-во:",n,"Итого:",n*price,"Комиссия:",n*fee),log,,TRUE)
# изменение цены с учётом комиссии
price=price - fee
# продажа и пополнение количества денежных средств
bank=bank + n*price
}
# исключение проданных пифов из портфеля
portfel=portfel[! names(portfel) %in% sell.new]
}
# созранение информации о стоимости портфеля
portfel.history[i]==sum(as.numeric(prices[i,names(portfel)]*portfel))+bank
# портфель стал пустым и покупать ничего не нужно
if(length(portfel)==0 & length(buy.new)==0) next
#### далее ребалансировка оставшихся пифов в портфеле (не покупка новых) ####
# цикл по оставшимся пифам в портфеле
#### ребалансировка на продажу ####
if(diag) write("##### Допродажа #####",log,,TRUE)
for(p in names(portfel)){
# текущая цены актива
price=as.numeric(prices[i,p])
# если нет цены - переход к следующему активу
if(is.na(price)) next
# количество пифа в портфеле
n=as.numeric(portfel[p])
# стоимость доли данного пифа
part.price=price*n
# величина части в портфеле
part.p=part.price/equity
# если стоимости доли актива больше новой стоимости одной части, то продажа избытка
if(part.p > part){
# разница для продажи
diff.m=part.price - part.money
# количество, которое будет продано (округление вверх)
n.new= ceiling(diff.m / price)
# если ничего не нужно продавать, то выход
if(n.new==0) next
# вычисление комиссии
fee=price*fee.sell
if(diag) write(paste("ПИФ:",p,"Цена:",price,"Кол-во:",n.new,"Итого:",n.new*price,"Комиссия",n.new*fee),log,,TRUE)
# изменение цены с учётом комиссии
price=price-fee
# вычитание проданного количества пифов
portfel[p]=portfel[p] - n.new
# увеличение банка
bank=bank + n.new*price
# если был продан весь актив
portfel=portfel[! portfel == 0]
}
}
#### ребалансировка на покупку ####
if(diag) write("##### Допокупка #####",log,,TRUE)
for(p in names(portfel)){
# текущая цены актива
price=as.numeric(prices[i,p])
# если нет цены - переход к следующему активу
if(is.na(price)) next
# количество актива в портфеле
n=as.numeric(portfel[p])
# стоимость актива в портфеле
part.price=price*n
# величина части в портфеле
part.p=part.price/equity
# если часть меньше, то нужно докупать
if(part.p < part){
# разница для покупки
diff.m=part.money - part.price
# вычисление комиссии
fee=price*fee.buy
# цена без комиссии
price.old=price
# цена с комиссией
price=price + fee
# количество, которое можно докупить
n.new=floor(diff.m / price)
# если ничего не надо докупать - переход к следующему активу
if(n.new==0) next
if(diag) write(paste("ПИФ:",p,"Цена:",price.old,"Кол-во:",n.new,"Итого:",n.new*price.old,"Комиссия:",n.new*fee),log,,TRUE)
# добавление купленного количества актива в портфель
portfel[p]=portfel[p] + n.new
# уменьшение свебодных денежных средств
bank=bank-n.new*price
}
}
#### покупка новых пифов ####
if(length(buy.new)>0) {
if(diag) write(paste("##### Покупка ",paste(buy.new,collapse = " ")),log,,TRUE)
# если портфель - это оди актив, то стоимость одной части
# это все доступные денежные средства
if(part==1) part.money=bank
for(p in buy.new){
# текущая цены актива
price=as.numeric(prices[i,p])
# если нет цены - переход к следующему активу
if(is.na(price)) next
# вычисление комиссии
fee=price*fee.buy
# цена без комиссии
price.old=price
# цена с комиссией
price=price+fee
# количество актива, которое можно купить
n=floor(part.money / price)
if(diag) write(paste("Бюджет:",part.money,"ПИФ:",p,"Цена:",price.old,"Кол-во:",n,"Итого:",n*price.old,"Комиссия:",n*fee),log,,TRUE)
# если ничего не купить, то выход
if(n==0) next
# добавление актива в портфель
portfel=append(portfel,n)
# уменьшение свободных денежных средств
bank=bank - n*price
# добавление названия актива в портфель
names(portfel)[length(portfel)]=p
}
}
#####
if(diag) write("##########",log,,TRUE)
# вычисление стоимости портфеля
equity=sum(as.numeric(prices[i,names(portfel)]*portfel))+bank
if(diag) write(paste("Стоимость портфеля:",equity),log,,TRUE)
if(diag) write(paste("Банк:",bank),log,,TRUE)
if(diag) write(paste("Портфель:",paste(paste0(names(portfel),":"),portfel,collapse=", ")),log,,TRUE)
if(diag) write(paste("Количество:",length(portfel)),log,,TRUE)
# сохранение информации о стоимости портфеля
portfel.history[i]=equity
}
# в качестве результата возвращается
# таблица данных о временной стоимости портфеля
return(portfel.history)
}
require(PerformanceAnalytics)
Sys.setlocale("LC_TIME", "English")
moex10=read.csv("~/MOEX10.csv",stringsAsFactors = FALSE)
moex10=xts(as.numeric(gsub(",", "", moex10[,2])),order.by = as.Date(moex10[,1], format = "%b %d, %Y"))
moex10=monthlyReturn(to.monthly(moex10, indexAt = 'lastof'))
boot.all = function(return, bench, rf, boot.n = 10, period = 24, l1 = 0.99, l2 = 0.5){
# библиотека для перемешивания значений массива
require(tseries)
# основная таблица t-статистик
boot=matrix(NA,nrow = ncol(return),ncol = (boot.n + 1))
# название строк соответствует названия фондов
row.names(boot)=colnames(return)
# цикл по каждому фонду
for(j in 1:ncol(return)){
# данные по одному фонду
pif=return[,j]
# удаление пустых значений
pif=pif[!is.na(pif)]
# если достаточное количество данных
if(length(na.trim(pif))>period){
# пересечение данных по фонду, бенчмарку и безрисковой ставке по времени
time=intersect(intersect(index(pif),index(rf)),index(bench))
# если достаточно общего количества данных
if(length(time)>period){
# избыточная доходность фонда
Er=Return.excess(pif[as.Date(time)],rf[as.Date(time)])
# избыточная доходность бенчмарка
Eb=Return.excess(bench[as.Date(time)],rf[as.Date(time)])
# если количество данных совпадает
if(length(Er)==length(Eb)){
# регрессия на реальных данных
capm=summary(lm(Er ~ Eb))
# альфа коэффициент
capm.alfa=capm$coefficients[1,1]
# t-статистика альфа коэффициента
capm.t=capm$coefficients[1,3]
# бета коэффициент
capm.beta=capm$coefficients[2,1]
# остатки, ошибки регрессии
capm.res=capm$residuals
# сохранение реального значения t-статистики
boot[j,1]=capm.t
# восстановление избыточной доходности
const = capm.beta * Eb
# бутстрап
# цикл регрессий по восстановленным данным
for(k in 1:boot.n){
# перемешивание остатков
res=xts(tsbootstrap(ts(capm.res)), order.by = index(capm.res))
# добавление остатков к восстановленным данных
Er.b = const + res
# регрессия на восстановленных данных
capm.b = summary(lm(Er.b ~ const))
# сохранение симулированной t-статистики
boot[j,(1+k)]=capm.b$coefficients[1,3]
}
}
}
}
}
# массив лучших симулированных коэффициентов
t.best={}
# цикл по столбцам бутстрапа
for (l in 2:boot.n){
# отбор и добавление лучших коэффициентов из столбца
t.best=c(t.best,boot[which(boot[,l]>=quantile(na.omit(boot[,l]),c(l1)) & boot[,l]>0),l])
}
# массив лучших фондов
pif.best={}
# цикл по первому столбцу таблицы
# с коэффициентами на реальных данных
for(l in 1:nrow(boot)){
# если есть значение коэффициента у фонда
if(!is.na(boot[l,1])){
# если значение коэффицента выше уровня квантили массива лучших коэффициентов
if(boot[l,1]>quantile(t.best,c(l2))){
# добавление значения коэффициента фонда в массив
pif.best=c(pif.best,boot[l,1])
# добавления названия фонда к коэффциенту
names(pif.best)[length(pif.best)]=row.names(boot)[l]
}
}
}
# сортировка массива лучших фондов
# по убыванию значений коэффициентов
pif.best=sort(pif.best, decreasing = TRUE)
# возврат в качестве результата
# массив лучших фондов
return(pif.best)
}
# бенчмарк портфель из индексных паевых фондов
benchmark.pif=portfel.equity(pif.price, pif.act, 10000, c(0.005, 0.015))
# доходность бенчмарка
benchmark.pif.return=pif.graph(benchmark.pif, moex)
# функция вычисления лучших фондов
best.pif=boot.all(return = pif.return, bench = benchmark.pif.return, rf = ru.1y, boot.n = 100, period = 24, l1 = 0.99, l2 = 0.5)
# результат
cat(paste(all[all[,3] %in% names(best.pif),1],round(best.pif,2)),sep = "\n")
# вызов функции с параметрами
benchmark.stock=portfel.equity(data.10, data.act, 10000, c(0.0001, 0.0001))
# месячная доходность бенчмарка
benchmark.stock.return=monthlyReturn(Cl(to.monthly(benchmark.stock, indexAt = 'lastof')))
# функция вычисления лучших фондов
best.stock=boot.all(return = pif.return, bench = benchmark.stock.return, rf = ru.1y, boot.n = 100, period = 24, l1 = 0.99, l2 = 0.5)
# результат
cat(paste(all[all[,3] %in% names(best.stock),1],round(best.stock,2)),sep = "\n")
# вызов функции
benchmark.future=future.benchmark()
# месячная доходность бенчмарка
benchmark.future.return=monthlyReturn(Cl(to.monthly(benchmark.future, indexAt = 'lastof')))
# функция вычисления лучших фондов
best.future=boot.all(return = pif.return, bench = benchmark.future.return, rf = ru.1y, boot.n = 100, period = 24, l1 = 0.99, l2 = 0.5)
# результат
cat(paste(all[all[,3] %in% names(best.future),1],round(best.future,2)),sep = "\n")
boot.history = function(return, bench, rf, boot.n = 10, period = 24, l1 = 0.99, l2 = 0.5){
# библиотека для перемешивания значений массива
require(tseries)
# основная таблица с результатами бутстрапа
# структура копируется с таблицы доходностей активов
boot.res=return
# очистка данных
boot.res[]=NA
# цикл с движущимся окном
for(i in 1:(nrow(return)-(period-1))){
# данные по доходности активов за период
dta.m=return[i:(i+(period-1)),]
# таблица t-статистик
boot=matrix(NA,nrow = ncol(dta.m),ncol = (boot.n + 1))
# название строк соответствует названию активов
row.names(boot)=colnames(dta.m)
# цикл по каждому активу
for(j in 1:ncol(dta.m)){
# данные по активу за период
pif=dta.m[,j]
# если достаточное кодичество данных
if(length(na.trim(pif))==period){
# пересечение данных по фонду, бенчмарку и безрисковой ставке по времени time=intersect(intersect(index(pif),index(rf)),index(bench))
# если достаточно общего количества данных
if(length(time)==period){
# избыточная доходность фонда
Er=Return.excess(pif[as.Date(time)],rf[as.Date(time)])
# избыточная доходность бенчмарка
Eb=Return.excess(bench[as.Date(time)],rf[as.Date(time)])
# если количество данных совпадает
if(length(Er)==length(Eb)){
# регрессия на реальных данных
capm=summary(lm(Er ~ Eb))
# альфа коэффициент
capm.alfa=capm$coefficients[1,1]
# t-статистика альфа коэффициента
capm.t=capm$coefficients[1,3]
# бета коэффициент
capm.beta=capm$coefficients[2,1]
# остатки, ошибки регрессии
capm.res=capm$residuals
# сохранение реального значения t-статистики
boot[j,1]=capm.t
# восстановление избыточной доходности
const = capm.beta * Eb
# бутстрап
# цикл регрессий по восстановленным данным
for(k in 1:boot.n){
# перемешивание остатков
res=xts(tsbootstrap(ts(capm.res)), order.by = index(capm.res))
# добавление остатков к восстановленным данных
Er.b = const + res
# регрессия на восстановленных данных
capm.b = summary(lm(Er.b ~ const))
# сохранение симулированной t-статистики
boot[j,(1+k)]=capm.b$coefficients[1,3]
}
}
}
}
}
# массив лучших симулированных коэффициентов
t.best={}
# цикл по столбцам бутстрапа
for (l in 2:boot.n){
# отбор и добавление лучших коэффициентов из столбца
t.best=c(t.best,boot[which(boot[,l]>=quantile(na.omit(boot[,l]),c(l1)) & boot[,l]>0),l])
}
# массив лучших фондов
pif.best={}
# цикл по первому столбцу таблицы
# с коэффициентами на реальных данных
for(l in 1:nrow(boot)){
# если есть значение коэффициента у фонда
if(!is.na(boot[l,1])){
# если значение коэффицента выше уровня квантили массива лучших коэффициентов
if(boot[l,1]>quantile(t.best,c(l2))){
# добавление значения коэффициента фонда в массив
pif.best=c(pif.best,boot[l,1])
# добавления названия фонда к коэффциенту
names(pif.best)[length(pif.best)]=row.names(boot)[l]
}
}
}
# сортировка массива лучших фондов
# по убыванию значений коэффициентов
pif.best=sort(pif.best, decreasing = TRUE)
# лучшие активы за данный период отмечаются в общей таблице
boot.res[tail(index(dta.m),n=1),names(pif.best)]=c(1:length(pif.best))
}
# массив сумм по стоблцам
sums=colSums(boot.res,na.rm = TRUE)
# удаляюся те фонды
# которые ни разу не были отмечены
sums=sums[sums>0]
# удаление данных фондов из таблицы
boot.res=boot.res[,names(sums)]
# возвращение таблицы в качестве результата функции
return(boot.res)
}
boot.act=function(boot.res, period = 4){
# создание копии таблицы
copy=boot.res
# стирание данных
copy[]=NA
# индикатор для начала
# вычисления фонда в который
# нужно инвестировать
j=period - 1
for(i in 1:(nrow(boot.res)-(period-1))){
# выделение данных за период в переменную
dta.m=boot.res[i:(i+(period-1)),]
# проверка, достаточно ли данных в периоде
if(length(sort(colSums(dta.m)))>0){
# увеличение периода на 1 месяц
j=j+1
# если количество месяцев кратно периоду
# то нужно вычислять новый фонд для инвестиций
# на следующий период
if(j%%period==0){
# вычисляется сумма по каждому фонду
# затем данные записываются в массив
best=names(sort(colSums(dta.m)))
n=as.numeric(floor(quantile(c(0:length(best)),.25)))
# вычисление месяца начала инвестиций
#k=i+period
k=ifelse((i+period)>=nrow(copy),nrow(copy),(i+period))
# вычисление конечного месяца инвестиции
k1=ifelse((k+(period-1))>=nrow(copy),nrow(copy),(k+(period-1)))
# запись в таблицу информации о том,
# в какой фонд будут сделаны инвестции
copy[index(copy[k:k1,]),best[1]]=1
}
}
}
# массив сумм по стоблцам
sums=colSums(copy,na.rm = TRUE)
# удаляюся те фонды
# которые ни разу не были отмечены
sums=sums[sums>0]
# удаление данных фондов из таблицы
copy=copy[,names(sums)]
# возвращение таблицы в качестве результата функции
return(copy)
}
for(i in 1:nrow(copy)){
if(sum(copy[i,],na.rm = TRUE)>0){
break
}
}
# функция вычисления лучших фондов по периодам
best.pif.boot=boot.history(return = pif.return, bench = benchmark.pif.return, rf = ru.1y, boot.n = 10, period = 24, l1 = 0.99, l2 = 0.5)
# функция для установки индикаторов
best.pif.act=boot.act(best.pif.boot,4)
# построение портфеля
portfel=portfel.equity(pif.price, best.pif.act, 10000000, c(0.005, 0.015))
# доходность портфеля
portfel.return=pif.graph(portfel,moex)
pif.graph = function(portfel, bench, file=""){
i=index(portfel)[which(as.numeric(portfel)!=as.numeric(portfel[1]))[1]]
# пересечение дат с индексом
dt=intersect(index(portfel),index(bench))
i=which(as.Date(dt)==i)
dt=dt[i:length(dt)]
test=cbind(bench[as.Date(dt)],Return.calculate(portfel[as.Date(dt)]))
# наименование столбцов
colnames(test)=c("MOEX","Portfel")
# построение графика
if(file!=""){
png(file,width = 1000,height = 1155, units = "px", pointsize = 20)
charts.PerformanceSummary(test)
dev.off()
} else {
charts.PerformanceSummary(test)
}
# регрессия
print(summary(lm(test[,2]~test[,1])))
portfel.return=Return.calculate(portfel[as.Date(dt)])
portfel.return[1]=0
return(portfel.return)
}
future.benchmark = function(){
# чтение данных из файла
future=read.csv("F:/vkr/MX.csv", stringsAsFactors = F)
# наименование фьючерсов
future.name=unique(future[,2])
# таблица со значениями ГО по фьючерсам
future.data=as.data.frame(matrix(NA,nrow = nrow(future), ncol = length(future.name)))
# название строк
row.names(future.data)=future[,1]
# название столбцов
colnames(future.data)=future.name
# преобразование во временной формат данных
future.data=as.xts(future.data, order.by = as.Date(row.names(future.data), "%d.%m.%Y"))
# создание новых таблиц копированием
future.price=future.price.estim=future.action=future.data
# заполнение данных по каждому фьючерсу
for(name in future.name){
# временная переменная
x=future[future[,2]==name,]
# преобразование формата даты
date=as.Date(x[,1], "%d.%m.%Y")
# заполнение значений ГО
future.data[date,name]=x[,16]
# заполнение актуальности фьючерса
future.action[date,name]=1
# заполнение значений средней взвешенной цены
future.price[date,name]=x[,3]
# заполнение значений цены расчета
future.price.estim[date,name]=x[,4]
# удаление временных переменных
rm(x,date)
}
# величина свободных денежных средств
portfel.bank=1000000
# наименование текущего фьючерса в портфеле
portfel.name=""
# история изменения стоимости портфеля
portfel.history=future.data[,1]
# стирание данных
portfel.history[]=NA
for(i in 1:nrow(future.data)){
# фьючерс в который нужно инвестировать на данной итерации
buy=colnames(future.action)[which(!is.na(future.action[i,]))]
# если фьючерс отличается от фьючерса в портфеле
# и портфель не пустой то происходит освобождение ГО
if(buy!=portfel.name & portfel.name!=""){
# ГО возвращается в свободные сердства
portfel.bank=portfel.bank + portfel.warranty
# удаление переменных
rm(portfel.warranty,portfel.count,portfel.price)
}
# если новый фьючерс и фьючерс в портфеле не совпадают
# то нужно инвестировать в данный фьючерс
# ГО было освобождено на предыдущем шаге
if(buy!=portfel.name){
# текущая стоимость фьючерса - это ГО
price=as.numeric(future.data[i,buy])
# инвестиции без "плеча"
# цена количества фьючерсов покрывает весь банк
n=ceiling(portfel.bank / as.numeric(future.price[i,buy]))
# свободные денежные средства
# уменьшаются только на величину ГО
portfel.bank=portfel.bank - n * price
# сохранение количества
portfel.count=n
# сохранение наименования фьючерса
portfel.name=buy
# цена фьючерса для вычисления маржинального требования
portfel.price=as.numeric(future.price[i,buy])
# общий размер ГО
portfel.warranty=n * price
# удаление переменных
rm(price,cash,n)
}
# если в портфеле есть фьючерс
if(portfel.count > 0){
# актуальное значение ГО
warranty.price = as.numeric(future.data[i,portfel.name])
if(!is.na(warranty.price)){
# вычисление актульного ГО покрывающее портфель
warranty=warranty.price * portfel.count
# разница между зарезервированным и актуальным ГО
diff.warranty = portfel.warranty - warranty
# изменение величины свободных средств
portfel.bank = portfel.bank + diff.warranty
# зарезервированное ГО становится актуальным
portfel.warranty = warranty
}
# вычисление маржинального требования
if(portfel.price==as.numeric(future.price[i,portfel.name])){
# инвесировани было в данный день
margin=(as.numeric(future.price.estim[i,portfel.name]) - portfel.price) * portfel.count
} else {
# между двумя датами как ращница расчётных цен
margin=(as.numeric(future.price.estim[i,portfel.name]) - as.numeric(future.price.estim[(i-1),portfel.name])) * portfel.count
}
# если свободных средств и ГО не хватает
# для покрытия маржинального требования
if((portfel.bank + portfel.warranty) < margin){
# происходит margin call
print("Банк опустел")
break
}
# в конце каждого торгового дня свободные средства
# изменяются на величину маржинального требования
portfel.bank = portfel.bank + margin
# удаление переменных
rm(warranty,margin,diff.warranty,warranty.price)
}
portfel.history[i]=portfel.bank + portfel.warranty
}
return(portfel.history)
}
# получение наименования файлов
files=list.files("~/dat",full.names=TRUE)
# общая таблица с данными
data.equity=data.frame()
for(file in files){
# чтение одного файла
eq=read.csv(file,stringsAsFactors=FALSE)
# добавление данных в одну таблицу
data.equity=rbind(data.equity,eq)
}
tickers<-unique(data.equity[,1])
setwd("F:/vkr")
dir=getwd()
# информация о базе расчета Индекс ММВБ 10
mic.10<-read.csv(paste0(dir,"/10micexdata.csv"),header = FALSE,stringsAsFactors = FALSE)
# изменения наименования сокращенных названий акций
mic.10.replace=read.csv(paste0(dir,"/10micex.csv"),header = FALSE,stringsAsFactors = FALSE)
# замена наименования сокращенных названий акций в базе расчета
for(i in 1:nrow(mic.10.replace)){
mic.10[mic.10==mic.10.replace[i,1]]=mic.10.replace[i,2]
}
mic.ticker=c()
mic.ticker=unique(unlist(sapply(c(18:nrow(mic.10)),function(i){mic.ticker=append(mic.ticker,mic.10[i,3:12])})))
mic.ticker=mic.ticker[mic.ticker!=""]
date.all=c() # массив со всеми датами
for(i in 18:nrow(mic.10)){
# база расчета Индекса ММВБ 10 за определенный период
tickers=unlist(mic.10[i,3:length(mic.10[i,])])
# массив календарных дат для базы расчета
dates=seq.Date(as.Date(mic.10[i,1],"%d.%m.%Y"), as.Date(mic.10[i,2],"%d.%m.%Y"), by = "day")
date.t=c() # массив дат для текущей базы расчета
for(t in tickers){
# данные по одной акции из базы расчёта
y=data.equity[which(data.equity[,1]==t),]
# пересечение календарнх дат и торговых дней
date.inter=intersect(dates,as.Date(y[,2]))
# добавление пересечения дат в массив
date.t=append(date.t,date.inter)
}
# добавление уникальных дат в общий массив
date.all=append(date.all,unique(date.t))
}
# структурированная таблица с данными
data.10=xts(matrix(NA, nrow = length(date.all), ncol = length(mic.ticker),dimnames = list(date.all,mic.ticker)),order.by = as.Date(date.all))
for(t in colnames(data.10)){
# данные по одной акции из базы расчёта
y=data.equity[which(data.equity[,1]==t),]
# цены закрытия по данной акции
y=xts(Cl(y),order.by=as.Date(y[,2]))
# заполнение данных в таблице
data.10[index(y),t]=y[index(data.10)]
}
for(i in 18:nrow(mic.10)){
# база расчета Индекса ММВБ 10 за определенный период
tickers=unlist(mic.10[i,3:length(mic.10[i,])])
for(t in tickers){
if(t=="") next
# данные по одной акции из базы расчёта
y=data.equity[which(data.equity[,1]==t),]
# цены закрытия по данной акции
y=xts(Cl(y),order.by=as.Date(y[,2]))
# пересечение дат в таблице и торговых дат для акции
#date.inter=intersect(index(data.10),index(y))
# заполнение данных в таблице
data.10[index(y),t]=y
}
}
for(t in colnames(data.10)){
y=data.equity[which(data.equity[,1]==t),]
# цены закрытия по данной акции
y=xts(Cl(y),order.by=as.Date(y[,2]))
# заполнение данных в таблице
data.10[index(y),t]=y[index(data.10)]
}
for(i in 1:nrow(data.10)){
r=data.10[i,]
if(length(r[,!is.na(r)])<10) print(index(r))
}
# структурированная таблица с данными
data.act=xts(matrix(NA, nrow = length(date.all), ncol = length(mic.ticker),dimnames = list(date.all,mic.ticker)),order.by = as.Date(date.all))
for(i in 18:nrow(mic.10)){
# база расчёта индекса
tickers=unlist(mic.10[i,3:length(mic.10[i,])])
# удаление пустых значений
tickers=tickers[tickers!=""]
# период действия базы расчёта
dates=seq.Date(as.Date(mic.10[i,1],"%d.%m.%Y"), as.Date(mic.10[i,2],"%d.%m.%Y"), by = "day")
# заполнение индикаторов, о вхождении акций в портфель
data.act[dates,tickers]=TRUE
}
# сплит акций
data.act["2007-07-18","SBER"]=1000
data.act["2007-07-18","SBERP"]=20
# заполнение индикаторов
# чтобы акции не были исклчены из портфеля
data.act[c("2007-07-19","2007-07-20"),c("SBER","SBERP")]=TRUE
Размещено на Allbest.ru
...Подобные документы
Понятие, сущность, классификация и организационная структура паевых инвестиционных фондов. Акционерные общества и инвестиционные фонды контрактного типа. Анализ показателей деятельности паевых инвестиционных фондов. Использование инвестиционных фондов.
курсовая работа [420,7 K], добавлен 01.12.2014Виды инвестиционных фондов. Понятие и основные виды паевых инвестиционных фондов (ПИФ). Преимущества и недостатки инвестирования в ПИФы. Рэнкинг паевых инвестиционных фондов по стоимости чистых активов. Диверсификация и профессиональное управление.
презентация [666,0 K], добавлен 27.03.2016Формирование инвестиционного портфеля с участием коротких продаж на основе алгоритма EGP. Сравнение доходностей индексных фондов и рыночных индексов. Формирование оптимального инвестиционного портфеля, определение его состава и структуры, доходности.
дипломная работа [467,8 K], добавлен 11.02.2017Сущность и классификация паевых инвестиционных фондов (ПИФ) и акционерных инвестиционных фондов (АИФ). Особенности правового регулирования АИФ и ПИФ. Применение правил управлением активами ПИФов в уставном капитале. Инвестирование в ценные бумаги.
курсовая работа [1,2 M], добавлен 09.10.2011Теоретические аспекты АИФ и ПИФ. Сущность и классификация паевых инвестиционных фондов и акционерных инвестиционных фондов. Особенности правового регулирования АИФ и ПИФ. Применение правил управлением активами ПИФов в УК. Новые ПИФы объектов искусства.
курсовая работа [915,6 K], добавлен 21.10.2011Сущность и виды паевых инвестиционных фондов, их становление и современное состояние в России, механизм функционирования. Анализ финансово-хозяйственной деятельности предприятия и характеристика перспективы развития рынка коллективных инвестиций.
курсовая работа [370,9 K], добавлен 21.02.2014Понятие, виды, правовое регулирование, отличительные особенности и классификация паевых инвестиционных фондов. История развития паевых инвестиционных фондов в России и за рубежом. Анализ деятельности VIP на российском рынке коллективных инвестиций.
дипломная работа [1,2 M], добавлен 21.10.2010Понятие паевых инвестиционных фондов. Виды фондов. Инвестиционный пай. Технология паевых инвестиционных фондов. Механизм работы паевого фонда. Контроль за деятельностью управляющей компании. Расходы и налоги пайщика. Преимущества ПИФов.
курсовая работа [567,4 K], добавлен 17.05.2006Появление паевых инвестиционных фондов и регулирование взаимных фондов. Основные принципы организации ПИФов, их виды, субъекты, участвующие в работе. Анализ источников и факторов развития инвестиционной деятельности в России на современном этапе.
дипломная работа [1,8 M], добавлен 21.12.2011Сохранение и приумножение заработанных и накопленных средств. Создание цены пая, её типы, риски, налоги, формирование. Взаимодействие участников работы и рекомендации потенциальному инвестору ПИФа. Преимущества и недостатки паевых инвестиционных фондов.
курсовая работа [237,6 K], добавлен 13.12.2010История паевых инвестиционных фондов в мире и России. Открытые и интервальные паевые фонды. Особенности закрытых паевых инвестиционных фондов. Инвестиционный пай как ценная бумага. Определение стоимости пая. Характеристика основных расходов пайщика.
курсовая работа [32,7 K], добавлен 20.03.2011Анализ деятельности инвестиционных управляющих Уоррена Баффетта и компании Berkhire Hathaway. Факторный анализ доходности Баффетта на основе моделей ценообразования капитальных активов. Моделирование наличности в составе портфеля в качестве колл-опциона.
дипломная работа [1,9 M], добавлен 26.10.2016История развития паевых инвестиционных фондов, их преимущества и недостатки. Краткая характеристика банка ОАО "УралСиб", анализ его деятельность в сфере паевых инвестиционных фондов. Приобретение, погашение и обмен паев на первичном и вторичном рынке.
курсовая работа [527,0 K], добавлен 12.01.2015Понятие и виды инвестиционных фондов. Мировая история их возникновения и развития. Зарубежный опыт деятельности фондов на примере США. Современное состояние рынка инвестиционных фондов в ЕС. Анализ деятельности инвестиционных компаний Казахстана.
курсовая работа [764,7 K], добавлен 01.12.2011Особенности инвестиционной деятельности ПИФов, методика расчёта их рейтинга. Паевой инвестиционный фонд как средство коллективного инвестирования. Контроль деятельности паевых фондов. Права владельца пая. Оценка инвестиционных качеств ценных бумаг.
контрольная работа [29,3 K], добавлен 22.06.2013Характеристики риска при анализе инвестиционных проектов. Оценка единичного и рыночного рисков. Статистические критерии риска. Сущность теории портфеля Г. Марковица и модель оценки доходов финансовых активов. Метод оптимизации инвестиционного портфеля.
курсовая работа [608,2 K], добавлен 21.11.2011Определение выгодности инвестиционных вложений, экономическое обоснование проектов. Принципы расчета инвестиционных показателей и определение на их основе наиболее привлекательных проектов. Расчет ставки дисконтирования, анализ инвестиционного портфеля.
курсовая работа [52,9 K], добавлен 05.11.2010Главные задачи реформирования пенсионной системы. Теоретические основы функционирования паевых и пенсионных фондов в Российской Федерации, их роль в развитии пенсионной реформы. Негосударственные и паевые инвестиционные фонды, тенденции их развития.
курсовая работа [741,3 K], добавлен 27.07.2010Особенности развития российского фондового рынка, его конъюнктура, текущее состояние и наметившиеся тенденции. Принципы пассивного управления портфелем. Построение ковариационной матрицы для финансовых активов. Оценка эффективности портфеля инвестиций.
курсовая работа [355,8 K], добавлен 02.06.2016Понятие и классификация коллективных инвестиций. Механизм работы паевого фонда. Основные формы коллективного инвестирования. Понятие и сущность ПИФа и виды фондов. Развитие паевых инвестиционных Фондов в России. Негосударственные пенсионные фонды.
курсовая работа [623,4 K], добавлен 18.02.2010