2015-10-15 27 views
1

我已經使用getsymbols函數加載並保存了300多個股票的歷史數據。現在我試圖用新的日常數據更新我的歷史數據集,但它不起作用。我嘗試使用merge()rbind(),但它似乎不適用於環境。感謝您對此問題的幫助!如何使用每日庫存數據更新我的xts環境?

這裏是我的代碼:

load.packages('quantmod')   
tickers = spl('A,AA,AAL,AAP,AAPL,ABT,ACN,ADBE,ADI,ADM,ADP,ADS,AEE,AEP') 
getSymbols(tickers, src = 'yahoo', from = '2010-01-01' , env = data, auto.assign = TRUE) 
save(data, file="myTickersData.rda") 

現在,我想今天的數據附加它,而無需重新運行這一切再次從2010,因爲它會佔用大量的時間。

data.today = new.env() 
getSymbols(tickers, src = 'yahoo', from = '2015-10-14' , env = data.today, auto.assign = T) 
updated.data = merge(data,data.today) 

我收到此錯誤:

Error in as.data.frame.default(x) :
cannot coerce class ""environment"" to a data.frame

+0

哪裏了'load.packages'和'spl'功能從何而來? –

+0

對不起約書亞我忘了提及!這些函數來自SIT(系統投資工具箱) con = gzcon(url('http://www.systematicportfolio.com/sit.gz','rb')) 來源(con) 關閉(con) load.packages('quantmod') #tickers = dow.jones.components() tickers = spl('SPY,SHY,AAPL,ADBE,AMZN,DHI,DIS') –

+0

追加數據是一個非常糟糕的主意!歷史股票數據在每次分紅,拆分或現金分配後都在變化。因此,在將數據附加數月之後,這實際上是無用的。你真的應該每天下載它,或者如果你有這方面的知識,並且你準備投入時間和精力,你可以用原始數據維護一個數據庫,並且自己完成所有必要的工作。 (保留公司行爲調整因素,現金股利調整因素,變更符號的映射,例如合併,分拆等) – hvollmeier

回答

0

這裏是一個應該做你最需要什麼樣的功能。一些重要的東西它不這樣做:

  1. 它不檢查,以確保你不rbind重複日期 歷史數據。
  2. 如果在更新之間存在拆分,分紅等,則不會反向調整所有歷史數據。

要解決第二個問題,您需要重新提取給定符號的所有數據。

updateData <- function(oldData, newData) { 
    # ensure both arguments are environments 
    stopifnot(is.environment(oldData) || is.environment(newData)) 
    # track symbols that aren't in the new environment 
    unmatchedSym <- NULL 
    # loop over all symbols in the historical data environment 
    for (sym in ls(oldData)) { 
    # get a copy of the symbol data 
    oldSym <- get(sym, oldData) 
    # try to get the new data 
    newSym <- try(get(sym, newData)) 
    if (inherits(newSym, "try-error")) { 
     unmatchedSym <- c(unmatchedSym, sym) 
     next 
    } else { 
     # rbind old/new data 
     # might want to check to ensure you're not adding a dupicate row 
     combined <- rbind(oldSym, newSym) 
     # update historical data environment 
     assign(sym, combined, oldData) 
    } 
    } 
    # return unmatched symbols (invisibly) 
    invisible(unmatchedSym) 
} 

下面是一個使用示例:

library(quantmod) 
oldData <- new.env() 
getSymbols("A;AA;AAL", env=oldData, to="2015-09-30") 

newData <- new.env() 
getSymbols("A;AA;AAL", env=newData, from="2015-10-01") 

updateData(oldData, newData) 
eapply(oldData, tail) 
# $AA 
#   AA.Open AA.High AA.Low AA.Close AA.Volume AA.Adjusted 
# 2015-10-08 10.85 11.11 10.63 11.01 34172000  11.01 
# 2015-10-09 10.67 10.92 10.25 10.26 78627900  10.26 
# 2015-10-12 10.28 10.29 9.97 10.08 31371900  10.08 
# 2015-10-13 9.96 10.22 9.86 10.03 36220300  10.03 
# 2015-10-14 10.09 10.11 9.91  9.95 42245400  9.95 
# 2015-10-15 9.93 10.00 9.63  9.70 49779200  9.70 
# 
# $A 
#   A.Open A.High A.Low A.Close A.Volume A.Adjusted 
# 2015-10-08 35.39 36.07 35.34 36.01 2597900  36.01 
# 2015-10-09 35.94 36.34 35.88 36.23 3230000  36.23 
# 2015-10-12 36.08 36.18 35.86 35.99 1258300  35.99 
# 2015-10-13 35.76 36.24 35.53 35.63 2379300  35.63 
# 2015-10-14 35.64 35.77 34.97 35.05 1644300  35.05 
# 2015-10-15 35.12 35.68 34.79 35.58 1427300  35.58 
# 
# $AAL 
#   AAL.Open AAL.High AAL.Low AAL.Close AAL.Volume AAL.Adjusted 
# 2015-10-08 39.21 40.03 38.70  39.74 8303200  39.74 
# 2015-10-09 40.27 42.49 40.25  42.42 16797000  42.42 
# 2015-10-12 42.59 43.88 42.55  43.84 11437200  43.84 
# 2015-10-13 42.70 43.97 42.52  43.41 13212600  43.41 
# 2015-10-14 44.00 44.50 43.23  43.80 11121500  43.80 
# 2015-10-15 44.10 44.48 43.50  44.46 8179500  44.46 
+0

謝謝Joshua! –