2017-02-07 33 views
1

Hy社區,這是我的代碼。它運行時沒有錯誤或警告。 順便說一句,如果你看看x.df(最終數據庫)有什麼毛病SMA & Bollinger樂隊列。 他們都是「不適用」填充。然後,BBands在合併後丟棄一些列。 有什麼問題?Loop function&quantmod

library(quantmod) 
stockData <- new.env() #Make a new environment for quantmod to store data in 
tickers <- c("AAPL","GOOG","YHOO","FB") # choose Symbols 
start_date <- as.Date("2014-01-01") #Set start date 
getSymbols(tickers, src="yahoo", env=stockData, from=start_date) # get data 
x <- list() 

# loop on tickers 
for (i in 1:length(tickers)) { 
x[[i]] <- get(tickers[i], pos=stockData) # get data from stockData environment 
colnames(x[[i]]) <- c("Open", "High", "Low", "Close","Volume", "Adjusted") # rename Header for all tables in list 
x[[i]]$gl <-((Cl(x[[i]])-Op(x[[i]]))/Op(x[[i]]))*100 # Daily gain loss percentage 
SMA.n10 <- SMA(x[[i]][,4],n = 10) # Calculate moving averages (MA) on "Close Price" <-column(4) 
BBands<- BBands(x[[i]][,2:4]) 
x[[i]]$Symbol<- 0 # create "0" vector for Symbol name 
x[[i]]$Symbol<- tickers[[i]] # add Symbol name 
x[[i]]<-data.frame(x[[i]],SMA.n10[[i]],BBands[[i]]) # merge data 
} 
x.df<- do.call(rbind, x) # call rbind to merge all xts objs in a single dataframe 

感謝

編輯: 我的目標是獲得一個單一的數據框(x.df)與下列:

「打開」, 「高」, 「低」,」 Close「,」Volume「,」Adjusted「,符號,」SMA10「,」dn「,」mavg「,」up「,」pctB「。

但是,如果您運行代碼,您可以在SMA列上看到NA值。 Thent沒有關於「dn」,「mavg」,「up」,「pctB」(布林帶值)的蹤跡。

+0

描述更多... –

回答

1

這糾正你的代碼的一些錯誤:

x <- list() 

# loop on tickers 
for (i in 1:length(tickers)) { 
    x[[i]] <- get(tickers[i], pos=stockData) # get data from stockData environment 
    colnames(x[[i]]) <- c("Open", "High", "Low", "Close","Volume", "Adjusted") # rename Header for all tables in list 
    x[[i]]$gl <-((Cl(x[[i]])-Op(x[[i]]))/Op(x[[i]]))*100 # Daily gain loss percentage 
    SMA.n10 <- SMA(x[[i]][,4],n = 10) # Calculate moving averages (MA) on "Close Price" <-column(4) 
    BBands<- BBands(x[[i]][,2:4]) 
    x[[i]]$Symbol<- 0 # create "0" vector for Symbol name 
    x[[i]]$Symbol<- tickers[i] # add Symbol name 
    x[[i]]<-data.frame(x[[i]], coredata(SMA.n10), coredata(BBands)) # merge data 
} 
x.df<- do.call(rbind, x) # call rbind to merge all xts objs in a single dataframe 

你應該瞭解與[][[]]子集向量,列表,dataframes之間的差異。我建議這個資源學習更多:http://adv-r.had.co.nz/Subsetting.html

coredata(SMA.n10)返回值的基本矩陣,按預期工作提供NROW(SMA.n10) == NROW(x[[i]])SMA.n10[[i]]回報NA,並與R中回收的規則將在data.frame(.....)創建NA值的列,而不是什麼你的期望。

如果您想在x.df中包含正確的「時間/日期」列(使用行的名稱x.df來保存時間,就像您在代碼中一樣,給出了這樣的一種排列數據的更好方法)當您跨越符號綁定數據時,無意義的值):

x <- list() 

# loop on tickers 
for (i in 1:length(tickers)) { 
    tmp <- get(tickers[i], pos=stockData) # get data from stockData environment 
    colnames(tmp) <- c("Open", "High", "Low", "Close","Volume", "Adjusted") # rename Header for all tables in list 
    tmp$gl <-((Cl(tmp)-Op(tmp))/Op(tmp))*100 # Daily gain loss percentage 
    SMA.n10 <- SMA(tmp[,4],n = 10) # Calculate moving averages (MA) on "Close Price" <-column(4) 
    BBands<- BBands(tmp[,2:4]) 
    tmp <- merge(tmp, SMA.n10, BBands) 

    x[[i]]<-data.frame("time" = index(tmp), coredata(tmp), "Symbol" = tickers[i]) # merge data 

} 
x.df<- do.call(rbind, x) # call rbind to merge all xts objs in a single dataframe 
+0

感謝FXQuantTrader分享知識。我從你的鏈接中學到了很多東西。你的文章使事情更清楚。 – Mark