Nano Hash - криптовалюты, майнинг, программирование

как разделить кадр данных по временному интервалу

У меня есть два кадра данных, первый - это ежедневный доход от 3 ценных бумаг, второй - вес ценных бумаг, как показано ниже:

    daily.return <- data.frame(date = seq.Date(from = as.Date("2015-01-01"),
                                           by = "days",
                                           length.out = 100),
                              a = runif(100,-0.1,0.1),
                              b = runif(100,-0.1,0.1),
                              c = runif(100,-0.1,0.1))
     weights <- data.frame(startDate = c(as.Date("2015-01-01"),
                                         as.Date("2015-02-10"),
                                         as.Date("2015-03-15")),
                             endDate = c(as.Date("2015-02-09"),
                                         as.Date("2015-03-14"),
                                         as.Date("2015-04-10")),
                                   a = c(0.3,0.5,0.2),
                                   b = c(0.4,0.2,0.1), 
                                   c = c(0.3,0.3,0.7)         
                             )

Я знаю, как разделить известность данных по неделям и т. д., если мы преобразуем фрейм данных в xts, но как разделить этот daily.return в соответствии с startDate и endDate в весах? Предположим, у фонда есть эти три ценные бумаги, как рассчитать навигацию фонда и ежедневную доходность?

06.09.2016

Ответы:


1

Это должно сделать работу.

daily.return <- data.frame(date = seq.Date(from = as.Date("2015-01-01"),
                                           by = "days",
                                           length.out = 100),
                           a = runif(100,-0.1,0.1),
                           b = runif(100,-0.1,0.1),
                           c = runif(100,-0.1,0.1))
weights <- data.frame(startDate = c(as.Date("2015-01-01"),
                                    as.Date("2015-02-10"),
                                    as.Date("2015-03-15")),
                      endDate = c(as.Date("2015-02-09"),
                                  as.Date("2015-03-14"),
                                  as.Date("2015-04-10")),
                      a = c(0.3,0.5,0.2),
                      b = c(0.4,0.2,0.1), 
                      c = c(0.3,0.3,0.7)         
)

library(quantmod)

daily.xts <- as.xts(daily.return[,-1],daily.return[,1])

# Assuming that the total period is the same in both the data frames
weights.xts <- xts(matrix(NA,nrow(daily.xts),3),order.by=index(daily.xts))
names(weights.xts) <- c("a","b","c")

for (i in 1:nrow(weights)){

  temp.inputs <- weights[i,]
  temp.period <- paste(temp.inputs[,1],temp.inputs[,2],sep="/")
  len <- nrow(weights.xts[temp.period])
  weights.xts[temp.period,1:3] <- matrix(rep(as.numeric(temp.inputs[,3:5]),len),len,byrow=T)

}

weighted.returns <- daily.xts * weights.xts
weighted.returns <- as.xts(rowSums(weighted.returns),index(weighted.returns))
names(weighted.returns) <- "Weighted Returns"
weighted.returns$Cumulative <- cumsum(weighted.returns)

plot(weighted.returns$Cumulative)

введите здесь описание изображения

06.09.2016

2

Вы можете разделить daily.return в соответствии с датой начала и окончания в весах, используя apply, выполняя построчную операцию

apply(weights, 1, function(x) daily.return[daily.return$date >= x[1]
                                                  & daily.return$date <= x[2], ])

Это даст список из 3 кадров данных, разделенных в соответствии с диапазоном в weights.

ИЗМЕНИТЬ

Если я правильно понял, вы хотите, чтобы каждое значение в столбцах a, b, c из daily.return умножалось на соответствующие столбцы в weights.

apply(weights, 1, function(x) { 
      A <- daily.return[daily.return$date >= x[1] & daily.return$date <= x[2], ]
      t(t(A[, 2:4]) * as.numeric(x[3:5]))
     }
 )  
06.09.2016
  • Большое спасибо. Я пытался использовать «применить», но не смог, этот код короче и полезен. Но как умножить (%*%) каждый элемент списка daily.return на соответствующую строку весов data.frame? Я пытался сделать это, но тоже потерпел неудачу, как показано ниже: (х) х)[-1,][-1,][,i])}) 07.09.2016
  • @ghoost2010 ghoost2010 Я обновил ответ. Проверьте, хотите ли вы этого. 07.09.2016
  • БОЛЬШОЕ СПАСИБО! Прежде чем вы обновили свой ответ, я написал цикл for, чтобы решить проблему. Я не знаком с семейной функцией применения, ваш ответ действительно открывает мне глаза, я думаю, что постараюсь использовать применение чаще. И мне жаль, что я просто можете отметить один ответ как самый полезный. 07.09.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..