Блог им. egenui

R. Доходности активов по периодам


Продолжаю писать для себя библиотеку на R для количественного анализа рыночных данных, недавно переделал функцию для просмотра средней статистической доходностй активов по периодам час/день/месяц. Некоторые вещи вот по ходу публикую, может кому оно и пригодиться.

Собственно на диаграме  средня доходность по периоду (час/день/месяц) за период с 2010 года по сегодняшний день. Качество изображения плохое, потому что нельзя вставлять картинки высокого разрешения.

R. Доходности активов по периодам

Что эта информация может дать? К примеру в самом тривиальном виде мы видим, что у MICEX хороший час это 18 и хороший день это пятница, сколько бы мы заработали, если бы покупали 18 час пятницы?

R. Доходности активов по периодам

#*****************************************************************
# 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))  
}
★11
14 комментариев
Мне! Мне надо. Очень-очень. Пыталась по книжкам разобраться — туплю. С живым человеком легче. Прогу и среду к ней установила. Больше ничо не умею.  Мне надо понять- как загружать данные и  и как их тестить. Умею тестить в метастоке, надеюсь, это поможет.
avatar
vaksa, изначально все же R не инструмент для тестирования рыночных стратегий, по большому счету, это атомарный инструмент для анализа данных ( DataMining ). Однако рыночные данные под это определение прекрасно подходят. С Метастоком не знаком, не знаю может ли он как-то помочь
avatar
evgen000,  для майнинга всё рано гипотезы нужны. Ну, и в метастоке без того никуда. Хотя там, конечно, есть и готовые алгоритмы, и библиотеки по алгоритмам  в изобилии.
avatar
vaksa, какие данные-рыночные?
если да, то через getSymbols.
А тестить два варианта,
или по своей гипотезе писать самому функции, или же воспользоваться готовыми пакетами упрощающими жизнь с анализом финансовых данных и которые позволяют многие вещи упростить. Но вначале нужна своя гипотеза.
avatar
AlexeyT, данные — конечно, рыночные. гипотезы и свои есть, и чужие  использую. то есть  в идеях дефициту нету.
avatar
vaksa, смотрите в сторону пакетов
quantmod (скачка даннных)
rusquant (скачка рус. данных)
blotter (анализ сделок)
PerformanceAnalytics (анализ гипотез)
FinTS (анализ временных рядов)
по ним много есть информации, примеров,
в том числе пара статей и на русском
avatar
AlexeyT, Спасибо. Захомячила себе. Буду разбираться.
avatar
vaksa, Если что, спрашиваете
avatar
AlexeyT, Вот за это спасибо. Обращусь непременно.
avatar
AlexeyT, Здравствуйте! разрешили обращаться по теме R. Вот обращаюсь:  товарищ прислал   content.screencast.com/users/Spekyl.RU/folders/Snagit/media/8cc9ad97-b407-47a9-9229-3722046ea86a/05.25.2016-12.45.14.png  В картинке разделены лудоманы, бврыги банки и куклы.из картинки видно, что сбер подрос и стал. И только лудики сейчас позу набирают это условные названия. кластеры игроков в зависимости от размера счета красные — те, у кого бид или оффер выставленный в диапазоне 5К-20К акций сбера  по идее, надо много мелких нарезать, с шагом 1000 — и прогнать на причинный тест грейнджера тогда он скажет — за кем следить. изи мани
 руки не доходят найдите падавана — мы его такой работой загрузим. это надо на питоне или R кодить

  Вам такое не интересно?  
avatar
vaksa, Здравствуйте.
Что за товарищ?
Тут не только тестом грейнджера можно делать,
много чего можно взять из маш. обучения.
В целом интересно, могу попробовать.
Пришлите более подробно данные, принципы что надо и т.д.
avatar
AlexeyT, спасибо, что откликнулись. товарищ (Spekyl) тут https://web.telegram.org/#/im?p=@finchat
 а сюда мы редко заглядываем. Вас чатовцы знают, пожалуйста, приходите! https://yadi.sk/i/4LYX65z6s7Bg6
avatar
Без циклов будет намного изящнее. Это же все-таки R, а не С какой-нибудь. 
avatar
Вечер пятницы всегда был хорош для покупок, потому что утро понедельника обычно бычье время. За выхи все устаканивается. Могут еще новостей хороших дать. Из опыта именно так. Ну и график Ваш подтверждает.)
avatar

теги блога evgen000

....все тэги



UPDONW
Новый дизайн