2017-01-24 7 views
2

私は以下のコードを持っています: これはcsvファイルの履歴ストックデータを保存しますが、正確に何が必要なのですか?すべてのデータは環境フォーマットであり、私はそれを扱うことができません。より簡単な処理のために情報が「データ」として保存されるようにコードを調整することは可能ですか? 環境をよりフレンドリーなフォーマットに移行する方法があるかもしれませんが、これは解決策です。すべてのすべてで、私は私が必要とする情報を持っていますが、私は今それを使用するホット知りません:)Rの環境からデータを抽出するか、コードを調整してデータ形式で保存します。

#install.packages("quantmod") 
library("quantmod") 
#Script to download prices from yahoo 
#and Save the prices to a RData file 
#The tickers will be loaded from a csv file 

#Script Parameters 
tickerlist <- "sp500.csv" #CSV containing tickers on rows 
savefilename <- "stockdata.RData" #The file to save the data in 
startDate = as.Date("2005-01-13") #Specify what date to get the prices from 
maxretryattempts <- 5 #If there is an error downloading a price how many times to retry 

#Load the list of ticker symbols from a csv, each row contains a ticker 
stocksLst <- read.csv("sp500.csv", header = F, stringsAsFactors = F) 
stockData <- new.env() #Make a new environment for quantmod to store data in 
nrstocks = length(stocksLst[,1]) #The number of stocks to download 

#Download all the stock data 
for (i in 1:nrstocks){ 
for(t in 1:maxretryattempts){ 

    tryCatch(
     { 
      #This is the statement to Try 
      #Check to see if the variables exists 
      #NEAT TRICK ON HOW TO TURN A STRING INTO A VARIABLE 
      #SEE http://www.r-bloggers.com/converting-a-string-to-a-variable-name-on-the-fly-and-vice-versa-in-r/ 
      if(!is.null(eval(parse(text=paste("stockData$",stocksLst[i,1],sep=""))))){ 
       #The variable exists so dont need to download data for this stock 
       #So lets break out of the retry loop and process the next stock 
       #cat("No need to retry") 
       break 
      } 

      #The stock wasnt previously downloaded so lets attempt to download it 
      cat("(",i,"/",nrstocks,") ","Downloading ", stocksLst[i,1] , "\t\t Attempt: ", t , "/", maxretryattempts,"\n") 
      getSymbols(stocksLst[i,1], env = stockData, src = "yahoo", from = startDate) 
     } 
    #Specify the catch function, and the finally function 
    , error = function(e) print(e)) 
} 
} 

#Lets save the stock data to a data file 
tryCatch(
{ 
save(stockData, file=savefilename) 
cat("Sucessfully saved the stock data to %s",savefilename) 
} 
, error = function(e) print(e)) 

答えて

1

は、この機能のための典型的なデータのための新しい環境を作成するプロセス(stockData <- new.env())ですか?

あなたのforループは実際にはオブジェクトを割り当てません。結果はgetSymbolsのように表示されます。あなたはすなわち

別に
stockData[i] <- getSymbols(<stuff>) 

、リストにこれらを保存することができます:きちんとフォーマット(tibble)で同じ結果を格納し、新しいtidyquantパッケージを考えてみましょう:https://github.com/mdancho84/tidyquant

1

はIBMを含むテスト環境eを設定し、 MSFT。次に、これらの株式プラスGOOGのベクトルを与えられ、TSLAは残りをダウンロードするeですでにものを除外するためにsetdiffを使用します。私は質問を理解していれば

# test data 
e <- new.env() 
stks <- c("IBM", "MSFT", "GOOG", "TSLA") 
getSymbols(stks[1:2], env = e) 

# run 
rest <- setdiff(stks, ls(e)) 
getSymbols(rest, env = e) 
0

、あなたは最終的に内のすべての株式の株価を取得しようとしていますインデックス。 tidyquantパッケージの優れた使用例です。パッケージにはすでにエラー処理が組み込まれています。エラーはNAsとして返され、ユーザーに警告メッセージを表示しながら結果から削除されます。上記のコードチャンクが変化していること

library(tidyquant) 
    sp_500 <- tq_get("SP500", get = "stock.index") %>% 
     tq_get(get = "stock.prices") 

tidyquantパッケージ、v0.3.0(現在CRANバージョン)からこれを試してみてください。明確なインデックス関数tq_index()については、オプションはtq_get()から非難されています。ここでは、次のCRANバージョンになりますものだ、と何それはdev versionにリリースされ、v0.3.0.9030

library(tidyquant) 
    sp_500 <- tq_index("SP500") %>% 
     tq_get(get = "stock.prices", complete_cases = TRUE) 

デフォルトはcomplete_cases = TRUEです。 NAsで値を返す場合は、complete_cases = FALSEを変更してください。誤った記号などの理由で株価を取得できない場合は、NAが返されることに注意してください。 NAが存在する場合は、「入れ子になった」データフレームと、どのシンボルにエラーがあったかを示す警告メッセージが表示されます。

関連する問題