我需要一些幫助來矢量化下面的代碼,因爲我相信它會變得更高效。不過,我不知道如何開始...我創建了一個循環,通過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