Написание условного If-заявления для анализа портфеля - PullRequest
0 голосов
/ 22 апреля 2020

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

                              Company  Year      Score  Date     Return Market Value
                              Company x 2008     26.26 2008-01-01  -0.32       601.26
                              Company x 2008     26.26 2008-02-01  -0.10       410.65
                              Company x 2008     26.26 2008-03-01  -0.06       369.80
                              Company x 2008     26.26 2008-04-01   0.01       348.15
                              Company x 2008     26.26 2008-05-01   0.28       353.10
                              Company x 2008     26.26 2008-06-01  -0.25       452.43
                              Company x 2008     26.26 2008-07-01   0.11       338.91
                              Company x 2008     26.26 2008-08-01   0.15       376.86
                              Company x 2008     26.26 2008-09-01  -0.12       433.62
                              Company x 2008     26.26 2008-10-01  -0.27       383.72
                              Company x 2008     26.26 2008-11-01  -0.25       281.95
                              Company x 2008     26.26 2008-12-01  -0.17       211.20

Моя конечная цель - вычесть низкоэффективный портфель из высокого, чтобы увидеть, дает ли высокий портфель ненормальную доходность. Для этого я хотел бы написать функцию if , которая позволяет мне указать, что если рыночная стоимость> 0 в предыдущем месяце, то я хочу, чтобы мой столбец возврата умножался на соответствующий столбец весов. У меня есть эта проблема, поскольку некоторые из компаний в моем наборе данных исключаются из списка в течение года, и затем необходимо перераспределить весовые коэффициенты между оставшимися компаниями на оставшиеся месяцы года. Различные веб-сайты оказали большую помощь (особенно этот: https://www.codingfinance.com/post/2018-04-05-portfolio-returns/), но я не могу найти решение своей вышеупомянутой проблемы. Спасибо за помощь, и я прошу прощения, если код грязный, спасибо.

  returnhigh <- highport %>%
    group_by(Company) %>%
    # Trying to add the weight constraint 
    if(test$`Market Value` > 0) {
      # This is the part where I struggle to specify the market value of the previous month 
      returnhigh$Weight <- 1/length(highport$Company)
    }

  returnhigh <- returnhigh %>% mutate(wt_return = Weight * Return)
  porthigh <- returnhigh %>% group_by(Date) %>% summarise(port_ret = sum(wt_return))
  returnlow <- lowport %>%
    group_by(Company) %>%
    if(test$`Market Value` > 0) {
      # Same problem as above 
      returnlow$Weight <- 1/length(lowport$Company)
    }
  returnlow <- returnlow %>% mutate(wt_return = Weight * Return)
  portlow <- returnlow %>% group_by(Date) %>% summarise(port_ret = sum(wt_return))
  result <- porthigh - portlow
  return(result)
}


1 Ответ

0 голосов
/ 22 апреля 2020

Трудно разобрать, что именно вы ищете, и у меня нет финансовых знаний, но что-то вроде этого может помочь:

library(dplyr)

# High Returns
returnhigh <- df %>%
  group_by(Company) %>%
  filter(`Market Value` > 0) %>%
  mutate(Weight = 1/length(Company)) %>%
  ungroup() %>%
  mutate(wt_return = Weight * Return)

# Low Returns
returnlow <- df %>%
  group_by(Company) %>%
  filter(`Market Value` < 0) %>%
  mutate(Weight = 1/length(Company)) %>%
  ungroup() %>%
  mutate(wt_return = Weight * Return)

# Port Function to summarise your high and low returns

port_func <- function (x) {
  x <- x %>%
    group_by(Date) %>%
    summarise(port_ret = sum(wt_return))
  }

porthigh <- port_func(returnhigh)
portlow <- port_func(returnlow)

Вывод:

df <- structure(list(Company = c("Company x", "Company x", "Company x", 
"Company x", "Company x", "Company x", "Company x", "Company x", 
"Company x", "Company x", "Company x", "Company x"), Year = c(2008, 
2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008
), Score = c(26.26, 26.26, 26.26, 26.26, 26.26, 26.26, 26.26, 
26.26, 26.26, 26.26, 26.26, 26.26), Date = c("2008-01-01", "2008-02-01", 
"2008-03-01", "2008-04-01", "2008-05-01", "2008-06-01", "2008-07-01", 
"2008-08-01", "2008-09-01", "2008-10-01", "2008-11-01", "2008-12-01"
), Return = c(-0.32, -0.1, -0.06, 0.01, 0.28, -0.25, 0.11, 0.15, 
-0.12, -0.27, -0.25, -0.17), `Market Value` = c(601.26, 410.65, 
369.8, 348.15, 353.1, 452.43, 338.91, 376.86, 433.62, 383.72, 
281.95, 211.2)), row.names = c(NA, -12L), class = c("tbl_df", 
"tbl", "data.frame"))
...