【发布时间】:2021-06-01 08:01:41
【问题描述】:
我在top500Stocks 中有大约 977 个 obs,其中包含 977 只股票的名称。
head(top500Stocks,10)
ï..Symbol
1 RELIANCE
2 TCS
3 HDFCBANK
4 INFY
5 HINDUNILVR
6 HDFC
7 ICICIBANK
8 KOTAKBANK
9 SBIN
10 BAJFINANCE
并且我有 stockRetData 中 top500Stocks 中每只股票的 Date、OHLC 和 Adj.Close、Vol 和 Ret
head(stocksRetData[[1]],3)
Date Open High Low Close Adj.Close Volume Ret
1 20000103 28.18423 29.86935 28.18423 38.94457 29.86935 28802010 0.000
2 20000104 30.66445 32.26056 29.82188 42.06230 32.26056 61320457 0.080
3 20000105 30.45677 34.16522 30.45677 43.71014 33.52440 173426953 0.039
现在,对于给定的 lookbackPeriod 和 holdPeriod,我正在尝试运行以下函数,但这大约需要 1 分钟。我怎样才能让它更快?因为我必须运行多个lookbackPeriod 和holdPeriod,所以需要很长时间才能完成。
CalC.MOD_MScore.Ret.High <- function(lookbackPeriod, holdPeriod, fnoStocks,
stocksRetData, totalTestPeriod) {
#We go through each stock and calculate Modified mscores where we give more importance to recent data
WeeklyData <- list()
wmean <- function(x, k) mean(seq(k)/k * x)
for (i in 1:nrow(fnoStocks)){
out <- stocksRetData[[i]]
out <- tail(out,totalTestPeriod)
if (nrow(out)==totalTestPeriod){
tempDF <- transform(out, wtMean = rollapply(Ret, lookbackPeriod, wmean,
k = lookbackPeriod, align = "right",
fill = NA))
tempDF <- transform(tempDF, ExitVal = rollapply(lead(High, holdPeriod),
holdPeriod, max,
align = "right",
fill = NA))
tempDF$NWeekRet <- (tempDF$ExitVal - tempDF$Adj.Close ) / tempDF$Adj.Close
tempDF <- tempDF[!is.na(tempDF$wtMean),]
tempDF <- tempDF[!is.na(tempDF$ExitVal),]
tempDF$StockName = fnoStocks[i,1]
tempDF$WeekNum = c((lookbackPeriod):(nrow(tempDF)+lookbackPeriod-1))
WeeklyData[[i]] <- data.frame(
StockName = tempDF$StockName,
WeekNum = tempDF$WeekNum,
M_Score = tempDF$wtMean,
NWeekRet = tempDF$NWeekRet,
stringsAsFactors = FALSE
)
}
}# i ends here
return(bind_rows(WeeklyData))
}
这需要一分钟以上才能完成。
a <- CalC.MOD_MScore.Ret.High(4,14,fnoStocks = top500Stocks, stocksRetData = stocksRetData, 2000)
【问题讨论】:
-
您可能需要使用
datatable并避免 for 循环。您可以考虑使用 RCPP 请注意,没有人会为您转换代码。 -
@Onyambu 当然,你有什么可以参考的例子吗?
-
不太在意。也许你应该解决你的问题。可能有更好的方法来完成相同的任务。不显示代码,而是显示预期输出并解释如何达到预期输出
-
我投票结束这个问题,因为重复:codereview.stackexchange.com/questions/261477/…
标签: r performance optimization