Продолжаю писать для себя библиотеку на R для количественного анализа рыночных данных, недавно переделал функцию для просмотра средней статистической доходностй активов по периодам час/день/месяц. Некоторые вещи вот по ходу публикую, может кому оно и пригодиться.
Собственно на диаграме средня доходность по периоду (час/день/месяц) за период с 2010 года по сегодняшний день. Качество изображения плохое, потому что нельзя вставлять картинки высокого разрешения.
Что эта информация может дать? К примеру в самом тривиальном виде мы видим, что у MICEX хороший час это 18 и хороший день это пятница, сколько бы мы заработали, если бы покупали 18 час пятницы?
#*****************************************************************
# Needed libraries
#*****************************************************************
library(rusquant)
library(ggplot2)
library(plyr)
library(reshape2)
library(grid)
#*****************************************************************
# Symbols
#*****************************************************************
assetsTicker = c('SBER','LKOH', 'SNGSP','ROSN','VTBR','GAZP','SNGS','MAGN','MGNT','GMKN','MICEX')
#*****************************************************************
# Start / End dates
#*****************************************************************
dateFrom = '2010-01-01'
dateTo = Sys.Date()
#*****************************************************************
# Period vectors
#*****************************************************************
periodsHours <- c(10,11,12,13,14,15,16,17,18)
periodsDays <- c("понедельник",'вторник','среда',"четверг",'пятница')
periodsMonths <- c("Январь",'Февраль','Март',"Апрель",'Май','Июнь','Июль','Август','Сентябрь', 'Октябрь','Ноябрь','Декабрь')
#*****************************************************************
# Load historical data
#*****************************************************************
getSymbols(assetsTicker, from=dateFrom, to=dateTo, src='Finam', period='hour', auto.assign = T)
#*****************************************************************
# Hours return
#*****************************************************************
periodReturns <- list()
for (i in 1:length(assetsTicker))
{
periodReturns[[i]] <- cbind(OpCl(get(assetsTicker[i])),allReturns(get(assetsTicker[i])))
names(periodReturns[[i]])[1] <-'hourly'
}
names(periodReturns) <- assetsTicker
#*****************************************************************
# List by period vectors
#*****************************************************************
periodsList <- list(periodsHours, periodsDays, periodsMonths )
names(periodsList) <- c('hourly','daily', 'monthly')
#*****************************************************************
# Mean returns by period
#*****************************************************************
getMeanReturn <- function(xtsAsset, period, assetaName)
{
if (period %in% periodsHours)
{
return (mean(na.omit(xtsAsset[.indexhour(xtsAsset) %in% period, "hourly"])))
}
else if (period %in% periodsDays)
{
return (mean(na.omit(xtsAsset[weekdays(index(xtsAsset)) %in% period, "daily"])))
}
else if (period %in% periodsMonths)
{
return (mean(na.omit(xtsAsset[months(index(xtsAsset)) %in% period, "monthly"])))
}
}
#*****************************************************************
# Create list of matrix returns ordered by period vector
#*****************************************************************
ReturnMatrixList <- list()
for (k in 1:length(periodsList))
{
#Матрица доходностей
ReturnMatrixList[[k]] <- matrix(nrow = length(assetsTicker), ncol = length(periodsList[[k]]))
names(ReturnMatrixList)[k] <- names(periodsList)[k]
colnames(ReturnMatrixList[[k]]) <- periodsList[[k]]
rownames(ReturnMatrixList[[k]]) <- assetsTicker
for (i in 1:length(assetsTicker))
{
for (p in 1:length(periodsList[[k]]))
{
x <- periodReturns[attributes(periodReturns)$names %in% assetsTicker[i]][[1]]
ReturnMatrixList[[k]][assetsTicker[i], as.character(periodsList[[k]][p]) ] <- getMeanReturn(x, periodsList[[k]][p],assetsTicker[i])
}
}
}
#*****************************************************************
# Plot list of matrix returns ordered by period vector
#*****************************************************************
pushViewport(viewport(layout = grid.layout(length(ReturnMatrixList), 1)))
for (i in 1:length(ReturnMatrixList))
{
tmp <- melt(ReturnMatrixList[[i]])
names(tmp) <- c('Asset','Period', 'Return')
p <- ggplot(tmp, aes(x=Period, y=Return, fill=factor(Asset))) +
geom_bar(stat="identity", position="dodge", colour="black") +
scale_fill_brewer(type="qual", palette='RdBu' ) + ggtitle(paste("Assets Return from =", dateFrom, cep=''))
print(p, vp = viewport(layout.pos.row = i, layout.pos.col = 1))
}