如何在R中对函数进行矢量化

如何在R中对函数进行矢量化,r,function,vectorization,trading,R,Function,Vectorization,Trading,我需要一些帮助矢量化下面的代码,因为我相信它会变得更有效。然而我不知道如何开始。。。我创建了一个通过z的循环z有3列112847行,这可能是它需要很长时间的原因。这3列包含在MACD()函数中使用的数字 library(quantmod) library(TTR) # get stock data getSymbols('LUNA') #Choose the Adjusted Close of a Symbol stock <- Ad(LUNA) #Create matrix fo

我需要一些帮助矢量化下面的代码,因为我相信它会变得更有效。然而我不知道如何开始。。。我创建了一个通过
z
的循环
z
有3列112847行,这可能是它需要很长时间的原因。这3列包含在
MACD()函数中使用的数字

library(quantmod)
library(TTR)

# get stock data 
getSymbols('LUNA')

#Choose the Adjusted Close of a Symbol
stock <- Ad(LUNA)

#Create matrix for returns only
y <- stock

#Create a "MATRIX" by choosing the Adjusted Close 
Nudata3 <- stock

#Sharpe Ratio Matrix
SR1<- matrix(NA, nrow=1)

# I want to create a table with all possible combinations from the ranges below
i = c(2:50)
k = c(4:50)
j = c(2:50)

# stores possible combinations into z
z <- expand.grid(i,k,j)
colnames(z)<- c("one","two","three")            

n = 1
stretches <- length(z[,1])

while (n < stretches){ 

# I am trying to go through all the values in "z"
Nuw <- MACD((stock), nFast=z[n,1], nSlow=z[n,2], nSig=z[n,3], maType="EMA")

colnames(Nuw) <- c("MACD","Signal")  #change the col names to create signals
x <- na.omit(merge((stock), Nuw))

x$sig <- NA

# Create trading signals                            

sig1 <- Lag(ifelse((x$MACD <= x$Signal),-1, 0)) # short when MACD < SIGNAL 
sig2 <- Lag(ifelse((x$MACD >= x$Signal),1, 0))  # long when MACD > SIGNAL 
x$sig <- sig1 + sig2



#calculate Returns
ret <- na.omit(ROC(Ad(x))*x$sig)
colnames(ret)<- c(paste(z[n,1],z[n,2],z[n,3],sep=","))
x <- merge(ret,x)
y <- merge(y,ret) #This creates a MATRIX with RETURNs ONLY
Nudata3 <- merge(Nudata3, x)

((mean(ret)/sd(ret)) * sqrt(252))  -> ANNUAL # Creates a Ratio
ANNUAL->Shrat                                # stores Ratio into ShRat
SR1 <- cbind(SR1,Shrat)                      # binds all ratios as it loops

n <- (n+1)

}
库(quantmod)
图书馆(TTR)
#获取股票数据
getSymbols('LUNA')
#选择符号的调整关闭

股票首先,也是最重要的-案例特定优化-删除
nFast>nSlow
的案例,因为这在技术上没有意义

第二,你正在创建对象并一次又一次地复制它们。这个很贵

第三,您可以通过在一个循环中创建一个信号矩阵并以矢量化方式执行其余操作来更好地编写代码

我会把你正在做的事情编码成这样

如果您不理解,请阅读
mapply
do.call
merge
sapply
的帮助页面

require(quantmod)
getSymbols("LUNA")

#Choose the Adjusted Close of a Symbol
stock <- Ad(LUNA)

# I want to create a table with all possible combinations from the ranges below
i = c(2:50)
k = c(4:50)
j = c(2:50)

# stores possible combinations into z
z <- expand.grid(i,k,j)
结果如下。哪个列属于
i
j
k
的哪个组合是微不足道的

head(RETURNSLIST[, 1:3])
##            LUNA.Adjusted LUNA.Adjusted.1 LUNA.Adjusted.2
## 2007-01-10   0.012739026    -0.012739026               0
## 2007-01-11  -0.051959739     0.051959739               0
## 2007-01-12  -0.007968170    -0.007968170               0
## 2007-01-16  -0.007905180    -0.007905180               0
## 2007-01-17  -0.005235614    -0.005235614               0
## 2007-01-18   0.028315920    -0.028315920               0

SHARPELIST
##   LUNA.Adjusted LUNA.Adjusted.1 LUNA.Adjusted.2 LUNA.Adjusted.3 LUNA.Adjusted.4 LUNA.Adjusted.5 LUNA.Adjusted.6 
##      0.04939150     -0.07428392             NaN      0.02626382     -0.06789803     -0.22584987     -0.07305477 
## LUNA.Adjusted.7 LUNA.Adjusted.8 LUNA.Adjusted.9 
##     -0.05831643     -0.08864845     -0.08221986 



system.time(
+ RETURNSLIST <- do.call(merge, mapply(FUN = getStratRet, nFast = z[1:100,1], nSlow = z[1:100,2], nSig = z[1:100,3], MoreArgs = list(stock = stock, stockret = stockret), SIMPLIFY = TRUE)),
+ SHARPELIST <- sapply(RETURNSLIST, FUN = getAnnualSharpe)
+ )
   user  system elapsed 
   2.28    0.00    2.29 
head(返回列表[,1:3])
##月亮。调整了月亮。调整了。1月亮。调整了。2
## 2007-01-10   0.012739026    -0.012739026               0
## 2007-01-11  -0.051959739     0.051959739               0
## 2007-01-12  -0.007968170    -0.007968170               0
## 2007-01-16  -0.007905180    -0.007905180               0
## 2007-01-17  -0.005235614    -0.005235614               0
## 2007-01-18   0.028315920    -0.028315920               0
夏普利斯特
##月亮。调整的月亮。调整的。1个月亮。调整的。2个月亮。调整的。3个月亮。调整的。4个月亮。调整的。5个月亮。调整的。6
##0.04939150-0.0742832-0.02626382-0.06789803-0.22584987-0.07305477
##月亮。调整。7月亮。调整。8月亮。调整。9
##     -0.05831643     -0.08864845     -0.08221986 
系统时间(

+returns列表请提供一些。具体来说,因为我不熟悉提取交易数据,所以我不知道什么是
Ad()
,也不知道什么是
LUNA
(你指的是股票符号LUNA吗?)还有,
MACD
应该做什么?有什么证据表明MACD是你的速度问题?你在一个while循环中进行了很多合并。这一定很慢。你最好先问一个关于如何有效地完成你真正想做的事情的问题,然后提供你的代码作为你已经完成的工作的示例已尝试。@r2evans
Ad()
是股票数据的调整收盘价。是的,LUNA是交易符号。我更新了代码以要求使用的软件包。
MACD()
也是“MACD由Gerald Appel开发,可能是最流行的价格振荡器。本页中记录的MACD函数比较了同一系列的快速移动平均值(MA)和慢速移动平均值。它可以用作任何单变量系列的通用振荡器,而不仅仅是价格。"+1因为a现在提供的所有信息。你指的是
x$MACD No-对于MACD指示器
nFast>nSlow
并没有让老师明白你的意思。感谢上面的代码,但我有一个问题。你的计算机运行代码需要多长时间?我现在相信可能是我的计算机速度慢,因为它需要很长时间运行代码的时间到了您无法将速度提高到超过某个点。我在上面的回答中更新了100次迭代的计算时间。大约2.29秒。好的,我的计算机大约需要100次迭代的时间…我很担心,因为整个过程需要很长时间。再次感谢,我非常感谢!
#Calculate only once. No need to calculate this in every iteration.
stockret <- ROC(stock)

getStratRet <- function(nFast, nSlow, nSig, stock, stockret) {
    x  <- MACD((stock), nFast=nFast, nSlow=nSlow, nSig=nSig, maType="EMA")
    x <- na.omit(x)
    sig <- Lag(ifelse((x$macd <= x$signal),-1, 0)) + Lag(ifelse((x$macd >= x$signal),1, 0))
    return(na.omit(stockret * sig))
}

RETURNSLIST <- do.call(merge, mapply(FUN = getStratRet, nFast = z[,1], nSlow = z[,2], nSig = z[,3], MoreArgs = list(stock = stock, stockret = stockret), SIMPLIFY = TRUE))

getAnnualSharpe <- function(ret) {
    ret <- na.omit(ret)
    return ((mean(ret)/sd(ret)) * sqrt(252))
}


SHARPELIST <- sapply(RETURNSLIST, FUN = getAnnualSharpe)
head(RETURNSLIST[, 1:3])
##            LUNA.Adjusted LUNA.Adjusted.1 LUNA.Adjusted.2
## 2007-01-10   0.012739026    -0.012739026               0
## 2007-01-11  -0.051959739     0.051959739               0
## 2007-01-12  -0.007968170    -0.007968170               0
## 2007-01-16  -0.007905180    -0.007905180               0
## 2007-01-17  -0.005235614    -0.005235614               0
## 2007-01-18   0.028315920    -0.028315920               0

SHARPELIST
##   LUNA.Adjusted LUNA.Adjusted.1 LUNA.Adjusted.2 LUNA.Adjusted.3 LUNA.Adjusted.4 LUNA.Adjusted.5 LUNA.Adjusted.6 
##      0.04939150     -0.07428392             NaN      0.02626382     -0.06789803     -0.22584987     -0.07305477 
## LUNA.Adjusted.7 LUNA.Adjusted.8 LUNA.Adjusted.9 
##     -0.05831643     -0.08864845     -0.08221986 



system.time(
+ RETURNSLIST <- do.call(merge, mapply(FUN = getStratRet, nFast = z[1:100,1], nSlow = z[1:100,2], nSig = z[1:100,3], MoreArgs = list(stock = stock, stockret = stockret), SIMPLIFY = TRUE)),
+ SHARPELIST <- sapply(RETURNSLIST, FUN = getAnnualSharpe)
+ )
   user  system elapsed 
   2.28    0.00    2.29