2016-11-17 12 views
0

私はquantmodを使って配当と分割を調整しています。それは動作するようですが、私は次の問題を発見しました:私のsma(200,0)の調整時に、歴史的な値が間違っていて、日付が現在の日付に近づくと修正されます。以下のコードをご覧ください。quantmodを使った被除数と分割の調整

stockData <- new.env() #Make a new environment for quantmod to store data in 
symbols = c("IWM","SPY","TLT","TSLA") 
nr.of.positions<-3 
getSymbols(symbols, src='yahoo',from = "2015-10-01",to = Sys.Date()) 
for (i in 1:length(symbols)) { 
    assign (symbols[i], adjustOHLC(get(symbols[i]), 
       adjust=c("split", "dividend"), 
       use.Adjusted=FALSE, 
       symbol.name=symbols[i])) 
} 

x <- list() 
for (i in 1:length(symbols)) { 
    x[[i]] <- get(symbols[i], pos=stockData) # get data from stockData environment 
    x[[i]]$sma <-SMA(Cl(x[[i]]),10) 
    x[[i]]$smalong <-SMA(Cl(x[[i]]),200) 
    x[[i]]$adx<-ADX(HLC(x[[i]]),10) 
    x[[i]]$rsi <-RSI(Cl(x[[i]]),14) 
    x[[i]]$close <-(Cl(x[[i]])) 
} 
+0

[this thread](http://stackoverflow.com/questions/39195608/quantmod-adjustohlc-function-dividend-adjusted-prices?rq=1)をご覧ください。これはおそらくあなたの質問に答えるでしょう。 – hvollmeier

答えて

0

あなたのコードはうまく動作します。または、あなたが何か間違っていたことを間違いが知らせるので、あなたは不運です。

stockData環境を作成し、その中にプルするデータを保存するとのコメントが表示されます。しかし、getSymbolsへの呼び出しではstockData環境を指定しないでください。または、最初のforループでassigngetを呼び出してもかまいません。だから、彼らはすべて地球環境に配属されています。

getassignをforループ内で使用しないで、便利な関数lapplyeapplyを代わりに使用すると、コードがより明確になります。

stockData <- new.env() 
symbols <- c("IWM","SPY","TLT","TSLA") 
nr.of.positions <- 3 
getSymbols(symbols, from = "2015-10-01", env = stockData) 

# loop over objects in an environment with eapply 
adj <- eapply(stockData, function(x) { 
    symbol <- sub("\\.Close$", "", colnames(Cl(x))) 
    adjustOHLC(x, symbol.name=symbol) 
}) 

# loop over list returned by eapply 
x <- lapply(adj, function(x) { 
    x$sma <- SMA(Cl(x),10) 
    x$smalong <- SMA(Cl(x),200) 
    x$adx <- ADX(HLC(x),10) 
    x$rsi <- RSI(Cl(x),14) 
    x$close <- Cl(x) 
    x 
}) 

クリーンなRセッションでそれぞれ実行すると、自分のコードとコードの結果が同じになります。だからあなたのコードが "間違った"結果を生み出した理由は、おそらく、あなたのワークスペースに、getassignを使って割り当てられたり、アクセスされたりしていたオブジェクトがあったからでしょう。

関連する問題