2016-08-30 2 views
1

xtsに数値を含めるだけでxtsをデータフレームに変換した後に列を追加しようとしています。追加私は最後の結果として行ごとにバインドしたいが、私は失敗し、解決策を見つけることができない。ここで私のコードは、stackoverflow上の別の著者から収集されます。それに感謝します!zooをデータフレームに変換した後にTickerで列を追加します

library(quantmod) 

# Fetch all Symbols from AMEX 
symbols <- stockSymbols(exchange = c("AMEX")) 
symbols <- symbols[,1] 

# define environment 
data <- new.env() 

# Load Stock data in environment 
getSymbols(symbols,from="2016-01-01", env=data) 

# build function to convert zoo to dataframe 
zoo.to.data.frame <- function(x, index.name="Date") { 
    stopifnot(is.zoo(x)) 
    xn <- if(is.null(dim(x))) deparse(substitute(x)) else colnames(x) 
    setNames(data.frame(index(x), x, row.names=NULL), c(index.name,xn)) 
} 

# build function to calculate different signals (...only price and ADX in this example) 
"SignalCalculator" <- function(x) { 
     # Adjusted Price 
     price <- x[,c(6)] 

     # ADX 
     adx <- ADX(x[,c("High","Low","Close")], n =14) 
     DIp <- adx$DIp 
     DIn <- adx$DIn 
     Adx <- adx$ADX 

     # bind single values together and convert to dataframe 
     result <- zoo.to.data.frame(cbind(price, DIp, DIn, Adx)) 
     # the following is not working respectively I don´t know how to 
     # result2 <- cbind(result, Ticker = x) 
} 

# Loop function on data # 
lapply(data,FUN = SignalCalculator) 

機能は、すべてのティッカーに適用された後、私がやりたい何か、csvファイルにエクスポートするために内部のすべてのティッカーで、行バインドを一つの巨大なデータフレームを生成することです。これは次のようになります。しかし、私にとってそれらを結びつける方法は不明です。私はこのトピックに関する助けに感謝します。ありがとう。以下

Table with stock data

答えて

0

out2あなたが提供されるリンクの表の形式です。 xtsのヘルパー関数を使用することができます。HLCAdは、列の選択をハードコーディングするよりも柔軟性があり、そのような操作を行う必要はありません。zoo.to.data.frame

# define environment 
data <- new.env() 

# Load Stock data in environment 
getSymbols(symbols,from="2016-01-01", env=data) 

SignalCalculator2 <- function(x) { 
    # Assumes first colname format is still [tickername].Open 
    tickername <- strsplit(colnames(x)[1], "\\.")[[1]][1] 
    # Adjusted Price: 
    price <- Ad(x) 
    colnames(price) <- "Price" 
    adx <- ADX(HLC(x), n = 14) 
    # You dont want this column in your table: 
    adx$DX <- NULL 
    res <- merge(price, adx) 
    # res is an xts object. Now convert to data.frame 
    df_res <- data.frame("Date" = index(res), "Ticker" = tickername, coredata(res)) 
    df_res 
} 

# data is an environment, not a list, so can use eapply (similar to lapply): 
out <- eapply(env = data, FUN = SignalCalculator2) 
out2 <- do.call(rbind, out) 
# If you want to order rows by date: 
out2 <- out2[order(out2$Date),] 
# Optional tidy up: 
rownames(out2) <- NULL 


> tail(out2) 
# Date Ticker Price  DIp  DIn  ADX 
# 164 2016-08-25 AAMC 12.72 17.67766 21.28021 11.31483 
# 330 2016-08-25 AAU 1.42 22.36896 23.64023 30.50243 
# 165 2016-08-26 AAMC 12.80 16.48608 21.07136 11.37868 
# 331 2016-08-26 AAU 1.36 23.02102 21.80518 28.51742 
# 166 2016-08-29 AAMC 13.15 15.75814 20.14096 11.43797 
# 332 2016-08-29 AAU 1.43 21.63012 22.30030 26.58943 
+0

素晴らしい!それはどのように見えるかです。私のコードも簡素化してくれてありがとう!ただ一つの質問。各ティッカーの最終日のみを選択することは可能ですか? – Sven

+0

最後の日付がティッカーごとに異なると仮定すると、簡単なアプローチです: 'library(data.table); dt_out < - as.data.table(out2); dt_out [Date == max(Date)、SD、by = list(Ticker)]; ' – FXQuantTrader

+0

Ok。これはよさそうだ。コードを実行すると、結果がコンソールにどのように表示されるかが表示されます。しかし、 'View(dt_out)'を実行すると、前と同じようにすべての日付が取得されますか? – Sven

関連する問題