我需要一些帮助来矢量化下面的代码,因为我相信它会变得更高效。不过,我不知道如何开始...我创建了一个循环,通过z
。 z
有3列和112847行,这可能是需要很长时间的原因。 3列包含了在该MACD()
功能使用的号码......如何在R中矢量化函数
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)
}
我想知道如何向量化的MACD()
功能,以加快这一进程以来的stretches
长度约。 112847.我的电脑需要一段时间才能通过循环。
请提供一些[再现的代码](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)。具体来说,因为我不熟悉拉交易数据,我不知道'Ad()'是什么,也不知道'LUNA'是什么(你指的是股票代号LUNA?)。此外,“MACD”应该做什么? – r2evans
什么证据表明你有这个MACD是你的速度问题?你在while循环中做了很多合并。这一定很慢。你最好提出一个关于如何完成你真正想要做的事情的问题,然后提供你的代码作为你所尝试的例子。 – John
@ r2evans'Ad()'是股票数据调整后的收盘价。是LUNA是交易标志。我更新了代码以要求使用的软件包。 “MACD()”是“MACD是由Gerald Appel开发的,可能是最受欢迎的价格振荡器。本页中记录的MACD函数比较了一系列的快速移动平均线(MA)和相同的慢速MA系列,它可以用作任何单变量系列的通用振荡器,而不仅仅是价格。“ – Jason