r-使用函数Delt()将股票数据的返回添加到数据帧列表中



我有一个包含股票数据的数据帧列表,并希望在列表中的每个数据帧中添加一个返回股价的新列。数据帧看起来是:

ABB.ST.Open ABB.ST.High ABB.ST.Low ABB.ST.Close ABB.ST.Volume ABB.ST.Adjusted       Date
1         166.4       167.4      165.5        166.0        944525        162.1181 2015-01-02
2         165.6       166.6      164.4        164.4       1013670        160.5555 2015-01-05
3         161.2       161.6      159.1        159.1       2546062        155.3794 2015-01-07
4         160.3       163.3      159.2        163.0       1946157        159.1882 2015-01-08
5         162.8       162.8      160.0        160.6       1885969        156.8444 2015-01-09
6         161.5       162.6      160.6        161.1       1795966        157.3327 2015-01-12
7         159.8       160.6      158.3        160.0       2445040        156.2584 2015-01-13
Delt.1.arithmetic
1                  NA
2       -0.0066959806
3       -0.0127628163
4        0.0168292916
5       -0.0002389207
6        0.0141549696
7       -0.0044953302

这种情况一直持续到今天,即大约1300行。

现在,希望使用包quantmod中的函数Delt添加第一列ABB.ST.Open的返回。

当我将此代码应用于列表之外的数据帧时,它就起作用:

ABB.ST$Return <- Delt(ABB.ST[,1])

但是,如何将此列添加到list中的所有数据帧?

我的列表名称是master_df,我尝试过这个代码,但它不起作用。。。

Return <- function(x){
master_df[[x]]$Return <- Delt(master_df[[x]][,1])
} 
test2 <- lapply(master_df, Return(x))

更新:

我在列表中有data.frame,其中我的列表名称是master_df,这是我从雅虎金融下载数据的代码:

as.matrix(LargeCapOMXS[,7])是我的雅虎符号名称列表

Stocklist <- as.matrix(LargeCapOMXS[,7]) #get names of stocks
master_df <- list() #create list to fill with data
for(i in seq(length(Stocklist))){ #loop to fill list with downloaded stock data, by company
Stockindex = Stocklist[i]
getSymbols(Stockindex, src="yahoo", from="2015-01-01", to="2020-01-01", verbose = TRUE)
master_df[[i]] <- as.data.frame(get(Stockindex))
master_df[[i]]$Date = row.names(master_df[[i]])
row.names( master_df[[i]]) = NULL
}
}

下面是一些代码,用于将数据从yahoo获取到列表中,并将Delt列添加到每个xts对象中。无需创建data.frame。您可以稍后再创建。

library(quantmod)
stock_list <- c("ABB", "ABT")
master_df <- lapply(stock_list, getSymbols, from = "2015-01-01", to = "2020-01-01", auto.assign = FALSE)
names(master_df) <- stock_list
# need to merge the xts with the outcome of Delt as Delt only returns 1 column
# function Op selects the open column.
master_df <- lapply(master_df, function(x) merge(x, Delt(Op(x))))

或者如果你想要一个巨大的数据帧,可以使用tidyquant。

library(tidyquant)
library(dplyr)
master_df_tq <- tq_get(stock_list)
master_df_tq <- master_df_tq %>% 
group_by(symbol) %>%
tq_mutate(select = open,
mutate_fun = Delt)

我设法用以下for循环解决了问题:

for(i in seq(length(master_df))){
master_df[[i]]$Return <- Delt(master_df[[i]][,1])
}

有人有使用应用函数的想法吗?这个for循环相当快,但出于好奇。

最新更新