Есть ли способ создать столбец на основе доходности акций за определенный пользователем период? - PullRequest
0 голосов
/ 05 ноября 2019

РЕДАКТИРОВАТЬ:

Я попытался внести изменения и выбрал пакет tidyquant, которым поделились в комментариях ниже.

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

Идея этого цикла заключается в том, что он вытягивает скорректированные цены за период, а затем берет первое ипоследняя цена, чтобы рассчитать изменение (или возвращение цены акций)

Я не уверен, но хотелось бы некоторые мысли!

start_date = "2019-05-20"
end_date = "2019-05-30"

Symbol_list <- c("CTVA","IBM", "GOOG", "GE")

range_returns <- for (Symbol in Symbol_List) {
  frame <- tq_get(Symbol, get = "stock.prices", from = start_date, to = end_date, complete_cases = FALSE)[,7]
  (frame[nrow(frame),] - frame[1,]) / frame[1,]
}

Старые вещи


Допустим, у меня есть фрейм данных

symbol <- c("GOOG", "IBM","GE","F","BKR")
name <- c("Google", "IBM","General Electric","Ford","Berkshire Hathaway")

df <- cbind(symbol, name)

И я хочу создать третийстолбец - df $ custom_return, который определяется на основе моего личного периода времени.

Я пытался работать с пакетом quantmod, и у меня возникли некоторые проблемы с его ограничениями.

Где я нахожусьв:

Сначала мне нужно вытащить всю историю цен, которая запрещает возможность создавать новый столбец, например:

start_date <- "2003-01-05"
end_date <- "2019-01-05"

df$defined_period_return <- ROC(getSymbol(df$symbol, src = yahoo, from = start_date, to = end_date, periodicity = "monthly"))

Я знаю, что мне нужно только скорректированное закрытие, которое является 6-мколонка для источника Yahoo. Итак, я мог бы добавить следующее и просто перенести записи в среду.

price_history <- null

for (Symbol in sp_500$Symbol)
        price_history <- cbind(price_history,
                           getSymbols(df$symbol, from = start_date, 
                           to = end_date, periodicity = "daily", 
                           auto.assign=FALSE)[,6])

Хорошо, это кажется выполнимым, но это не совсем гладко, и теперь я сталкиваюсь с проблемой, если один из моих символов (Tickers) выходит за пределы диапазона предоставленных дат. Например, CTVA является одним из них, и он начал торговать только после даты окончания. Весь скребок тут же останавливается. Как мне пропустить эту ошибку?

И, скажем, мы решили "загвоздку" отсутствия соответствующих записей ... как бы вы вычислили доходность для каждого символа за разные сроки? Например, Google не начал торговать до 2004 года. GetSymbol действительно тянет историю цен, как только начинает торговать, но эта временная шкала возврата отличается от GE, у которой были данные в начале моего диапазона.

1 Ответ

1 голос
/ 06 ноября 2019

Нет необходимости в петле for. Вы можете сделать все с Tidyquant и Dplyr. Для первого и последнего наблюдения группы вы можете использовать функции first и last из dplyr. См. Код ниже для рабочего примера.

library(tidyquant)
library(dplyr)

start_date = "2019-05-20"
end_date = "2019-05-30"

Symbol_list <- c("CTVA","IBM", "GOOG", "GE")

stocks <- tq_get(Symbol_list, get = "stock.prices", from = start_date, to = end_date, complete_cases = FALSE)

stocks %>% 
  group_by(symbol) %>% 
  summarise(returns = (last(adjusted) / first(adjusted)) - 1) # calculate returns

# A tibble: 4 x 2
  symbol returns
  <chr>    <dbl>
1 CTVA   -0.0172
2 GE     -0.0516
3 GOOG   -0.0197
4 IBM    -0.0402
...