evgen000
evgen000 личный блог
10 декабря 2015, 13:14

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))  
}
14 Комментариев
  • vaksa
    10 декабря 2015, 13:36
    Мне! Мне надо. Очень-очень. Пыталась по книжкам разобраться — туплю. С живым человеком легче. Прогу и среду к ней установила. Больше ничо не умею.  Мне надо понять- как загружать данные и  и как их тестить. Умею тестить в метастоке, надеюсь, это поможет.
      • vaksa
        15 декабря 2015, 12:24
        evgen000,  для майнинга всё рано гипотезы нужны. Ну, и в метастоке без того никуда. Хотя там, конечно, есть и готовые алгоритмы, и библиотеки по алгоритмам  в изобилии.
    • AlexeyTikhonov
      10 декабря 2015, 15:22
      vaksa, какие данные-рыночные?
      если да, то через getSymbols.
      А тестить два варианта,
      или по своей гипотезе писать самому функции, или же воспользоваться готовыми пакетами упрощающими жизнь с анализом финансовых данных и которые позволяют многие вещи упростить. Но вначале нужна своя гипотеза.
      • vaksa
        15 декабря 2015, 12:26
        AlexeyT, данные — конечно, рыночные. гипотезы и свои есть, и чужие  использую. то есть  в идеях дефициту нету.
        • AlexeyTikhonov
          15 декабря 2015, 13:37
          vaksa, смотрите в сторону пакетов
          quantmod (скачка даннных)
          rusquant (скачка рус. данных)
          blotter (анализ сделок)
          PerformanceAnalytics (анализ гипотез)
          FinTS (анализ временных рядов)
          по ним много есть информации, примеров,
          в том числе пара статей и на русском
          • vaksa
            17 декабря 2015, 10:17
            AlexeyT, Спасибо. Захомячила себе. Буду разбираться.
            • AlexeyTikhonov
              17 декабря 2015, 10:29
              vaksa, Если что, спрашиваете
              • vaksa
                28 декабря 2015, 19:11
                AlexeyT, Вот за это спасибо. Обращусь непременно.
          • vaksa
            25 мая 2016, 13:41
            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 кодить

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

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн