4

タイトルで質問を明確に説明できない場合があります。申し訳ありません。これがコードに関する質問です。より明確になります。

library(zoo);library(quantmod)
stockData <- new.env()#Make a new environment for quantmod to store data in
startDate = as.Date("2006-12-29") #Specify period of time we are interested in
endDate = as.Date("2012-12-31")
monthlyStartDate = as.Date("2007-01-01")

# tickers <- c("AAPL","GOOG", "IBM")
tickers <- c("AAPL","GOOG", "IBM", "MSFT", "INTC", "YHOO", "F", "GS", "UL") 
# The tickers vector could be even larger, i.e.  50 stocks

stockData$AAPL.ret=diff(log(stockData$AAPL$AAPL.Adjusted)) # Compute log returns
stockData$GOOG.ret=diff(log(stockData$GOOG$GOOG.Adjusted)) # Compute log returns
stockData$IBM.ret=diff(log(stockData$IBM$IBM.Adjusted)) # Compute log returns
head(stockData$GOOG.ret)
head(stockData$GOOG$GOOG.Adjusted)

AAPLmonthly<-aggregate.zoo(stockData$AAPL.ret[2:nrow(stockData$AAPL$AAPL.Adjusted),],as.yearmon,sum)
GOOGmonthly<-aggregate.zoo(stockData$GOOG.ret[2:nrow(stockData$GOOG$GOOG.Adjusted),],as.yearmon,sum)
IBMmonthly<-aggregate.zoo(stockData$IBM.ret[2:nrow(stockData$IBM$IBM.Adjusted),],as.yearmon,sum)


head(AAPLmonthly)
stockret = cbind(AAPLmonthly, GOOGmonthly, IBMmonthly)
head(stockret)

上記のコードは例として 3 のみを使用しました。ティッカーのベクトル全体をオブジェクトにするために R でtickersa を実行する方法を知りたいのですが、誰か助けてもらえますか? とても有難い。loopstockret zoo

関数が本体、引数、およびその環境を含むクロージャーであることを学びましたが、新しい環境を作成できるとは知りませんでした。ここで立ち往生しました。値を割り当てるためにループを実行しているときに、各要素の前stockData$AAPL.retに配置するにはどうすればよいですか? stockData$これを行うために使用"["する必要がありますか?さらに、assign関数を使用してこれを行うと、コードで

stockData$AAPL.ret=diff(log(stockData$AAPL$AAPL.Adjusted)) # Compute log returns

stockData$AAPL$AAPL.Adjustedこれを行う方法、関数でこれをより一般的な引数にする方法について混乱しているだけですassign。どんな例でも大歓迎です!

4

4 に答える 4

4

get環境からデータを取得し、assign環境内のシンボルにデータを割り当てるために使用できます。

library(quantmod)
stockData <- new.env()
tickers <- c("AAPL","GOOG", "IBM", "MSFT", "INTC", "YHOO", "F", "GS", "UL") 
getSymbols(tickers, src="yahoo", env=stockData)

for (tick in tickers) {
  x <- get(tick, pos=stockData)  # get data from stockData environment
  x$ret <- diff(log(Ad(x)))      # add a column with returns
  assign(tick, x, pos=stockData) # assign back into stockData environment
  assign(paste0(tick, "monthly"), 
         apply.monthly(x, sum, na.rm=TRUE), 
         pos=stockData) # calc monthly sum and assign in stockData environment
}

または、eapply を使用して、環境内のすべてのオブジェクトに関数を適用できます。結果は、強制的に環境に戻すことができるリストになります。

stockData <- as.environment(eapply(stockData, function(x) {
  x$ret <- diff(log(Ad(x)))
  x
}))

または、収益のみのリストを作成し、それをループして毎月の合計を計算することもできます

R <- eapply(stockData, function(x) diff(log(Ad(x))))
monthly <- lapply(R, apply.monthly, sum, na.rm=TRUE)

このように、結果を単一のオブジェクトにマージできます

do.call(merge, R)
do.call(merge, monthly)
于 2014-01-18T01:27:59.100 に答える
1

lapplyたとえば、do.call私にとっては仕事のように見えます(テストされていません)

tickers <- c("AAPL","GOOG", "IBM")

as_monthly <- function(sym) {
    log_returns <- diff(log(stockdata[[sym]][[paste(sym, "Adjusted", sep=".")]]))
    aggregate(log_returns[2:nrow(log_returns),], as.yearmon, sum)
}

assign("stockret", do.call(cbind, lapply(tickers, as_monthly)), envir=stockdata)

ただし、あなたの質問からは、stockdata環境にどのようにデータを入力するかは明確ではありません。

于 2014-01-17T22:29:57.793 に答える
0

Quantmodは、その結果を囲んでいる環境に追加するという異常な動作をします。

> getSymbols(c("AAPL","ORCL"))
[1] "AAPL" "ORCL"

取得したシンボルのリストを返しますが、結果を呼び出し元の環境に割り当てるという副作用があります。

ls()
[1] "AAPL" "ORCL"

> nrow(AAPL)
1774
> class(AAPL)
[1] "xts" "zoo"

スクリプトを作成する場合、これは面倒な場合があるため、OP が示唆しているように、専用の環境を作成することをお勧めします。

> stocks <- new.env()
> getSymbols(c("AAPL","ORCL"),stocks)
> ls(stocks)
[1] "AAPL" "ORCL"

このアプローチにより、名前の競合が回避され、返された結果をグループとして処理できます。データをまとめて収集したので、環境をより伝統的なデータ構造に置き換える方が便利です。たとえば、各ティッカーをリスト要素にします。

> stocksL <- as.list(stocks)

これで、Map や Lapply を効果的に使用できるようになりました。

> Map(function() { "do something " }, stocksL)

getSymbols列名の前にティッカー名が付いているため、それを削除すると便利です。

> stocksL2 <- Map(function(x) {names(x)<-gsub(".*\\.","",names(x));x}, stocksL)

これで再処理できます

> adj <- Map(function(x) {diff(log(x$Adjusted))}, stocksL2)
于 2014-01-18T01:38:26.597 に答える