Ниже приведен код, который вернет то, что вам нужно. Я использую Quantmod, Purrr и DPlyr в качестве пакетов. Обратите внимание на использование pmap
с getSymbols
для получения данных. При использовании getSymbols для каждого тикера вы получите одинаковое количество строк. Для большинства запросов это излишне, поскольку период ожидания в большинстве случаев меньше. Теперь каждый тикер будет получать данные только между датой покупки и продажей.
Я создал вспомогательную функцию для получения максимумов и минимумов даты покупки и даты продажи. Здесь предполагается, что последняя доступная запись действительно является датой продажи. Отрегулируйте эту часть, если это не так. Я удалил открытые, высокие, низкие и закрытые столбцы из hilo, поскольку они не нужны для этого примера.
Я оставляю проверку, если цена покупки / продажи находится между вами и максимумом.
library(quantmod)
library(purrr)
library(dplyr)
# use pmap so 3 columns can correctly be passed to getSymbols
stocklist <- pmap(list(hilo$Symbol, hilo$Date_of_Purchase, hilo$Date_of_Sale), function(x, y, z) getSymbols(Symbols = x, src = "yahoo", from = y, to = z + 1, auto.assign = FALSE))
names(stocklist) <- hilo$Symbol
# function described below
stock_hilo <- map_dfr(stocklist, hi_lo, hilo = hilo, .id = "Symbol")
hilo %>%
left_join(stock_hilo)
Joining, by = "Symbol"
Symbol Date_of_Purchase Date_of_Sale Purchase_price Sale_Price pu_hi pu_lo sa_hi sa_lo
1 PCH 2018-10-02 2018-10-03 40.2 38.4 40.39 39.330 40.39 39.33
2 NBHC 2018-10-03 2018-10-11 37.8 36.2 37.83 36.540 37.78 37.07
3 STWD 2018-10-08 2018-10-10 21.3 21.0 21.30 21.000 21.42 21.19
4 RWT 2018-10-08 2018-10-11 16.1 16.0 16.16 16.020 16.39 16.16
5 NVEE 2018-10-08 2018-10-10 84.3 83.0 84.34 82.399 85.50 84.15
6 PRIM 2018-10-08 2018-10-10 23.5 23.1 23.61 23.050 23.65 23.38
функция, используемая в коде
hi_lo <- function(stock_data, hilo){
stock_symbol <- stringi::stri_extract(names(stocklist$PCH)[1], regex = "^[A-Z]+")
output <- data.frame(matrix(nrow = 1, ncol = 4))
output <- setNames(output, c("pu_hi", "pu_lo", "sa_hi", "sa_lo"))
# purchase date is the first record of the timeseries
pu_data <- xts::first(stock_data)
output$pu_hi <- as.numeric(quantmod::Hi(pu_data))
output$pu_lo <- as.numeric(quantmod::Lo(pu_data))
# assuming sales date is the last record of the timeseries
sa_data <- xts::last(stock_data)
output$sa_hi <- as.numeric(quantmod::Hi(sa_data))
output$sa_lo <- as.numeric(quantmod::Lo(sa_data))
return(output)
}