2017-02-26 20 views
0

私はRとQuantmodを学習しており、非常にシンプルな在庫モデル予測を構築しました。私はxgboostとキャレットモデルの両方を持って、ここで全体の例です:xgboost、caret、Quantmod(R)の実際在庫予測を取得する方法

library(quantmod) 
library(xts) 
# get market data 
Nasdaq100_Symbols <- c("AAPL", "ADBE", "ADI", "ADP", "ADSK", "AKAM") 
getSymbols(Nasdaq100_Symbols) 

# merge them all together 
nasdaq100 <- data.frame(as.xts(merge(AAPL, ADBE, ADI, ADP, ADSK, AKAM))) 
# set outcome variable 
outcomeSymbol <- 'ADP.Volume' 

# shift outcome value to be on same line as predictors 
nasdaq100 <- xts(nasdaq100,order.by=as.Date(rownames(nasdaq100))) 
nasdaq100 <- as.data.frame(merge(nasdaq100, lm1=lag(nasdaq100[,outcomeSymbol],-1))) 
nasdaq100$outcome <- ifelse(nasdaq100[,paste0(outcomeSymbol,'.1')] > nasdaq100[,outcomeSymbol], 1, 0) 

# remove shifted down volume field 
nasdaq100 <- nasdaq100[,!names(nasdaq100) %in% c(paste0(outcomeSymbol,'.1'))] 

# cast date to true date and order in decreasing order 
nasdaq100$date <- as.Date(row.names(nasdaq100)) 
nasdaq100 <- nasdaq100[order(as.Date(nasdaq100$date, "%m/%d/%Y"), decreasing = TRUE),] 

# calculate all day differences and populate them on same row 
GetDiffDays <- function(objDF,days=c(10), offLimitsSymbols=c('outcome'), roundByScaler=3) { 
    # needs to be sorted by date in decreasing order 
    ind <- sapply(objDF, is.numeric) 
    for (sym in names(objDF)[ind]) { 
    if (!sym %in% offLimitsSymbols) { 
     print(paste('*********', sym)) 
     objDF[,sym] <- round(scale(objDF[,sym]),roundByScaler) 

     print(paste('theColName', sym)) 
     for (day in days) { 
     objDF[paste0(sym,'_',day)] <- c(diff(objDF[,sym],lag = day),rep(x=0,day)) * -1 
     } 
    } 
    } 
    return (objDF) 
} 

# call the function with the following differences 
nasdaq100 <- GetDiffDays(nasdaq100, days=c(1,2,3,4,5,10,20), offLimitsSymbols=c('outcome'), roundByScaler=2) 

# drop most recent entry as we don't have an outcome 
nasdaq100 <- nasdaq100[2:nrow(nasdaq100),] 

# use POSIXlt to add day of the week, day of the month, day of the year 
nasdaq100$wday <- as.POSIXlt(nasdaq100$date)$wday 
nasdaq100$yday <- as.POSIXlt(nasdaq100$date)$mday 
nasdaq100$mon<- as.POSIXlt(nasdaq100$date)$mon 

# remove date field and shuffle data frame 
nasdaq100 <- subset(nasdaq100, select=-c(date)) 
nasdaq100 <- nasdaq100[sample(nrow(nasdaq100)),] 

# xgboost Modeling 
library(xgboost) 
predictorNames <- names(nasdaq100)[names(nasdaq100) != 'outcome'] 

set.seed(1234) 
split <- sample(nrow(nasdaq100), floor(0.7*nrow(nasdaq100))) 
train <-nasdaq100[split,] 
test <- nasdaq100[-split,] 

bst <- xgboost(data = as.matrix(train[,predictorNames]), 
       label = train$outcome, 
       verbose=0, 
       eta = 0.1, 
       gamma = 50, 
       missing = NaN, 
       nround = 150, 
       colsample_bytree = 0.1, 
       subsample = 1, 
       nthread = 4, 
       objective="binary:logistic") 

predictions <- predict(bst, as.matrix(test[,predictorNames]), missing = NaN, outputmargin=TRUE) 

library(pROC) 
auc <- roc(test$outcome, predictions) 
print(paste('AUC score:', auc$auc)) 

は質問1:
今では、70%に列車が30%に予測し、私は最後にAUCスコアをプリントアウトすることができます。私は100%で練習し、明日何が起こるかを予測したいと思いますか?私。モデルの音量が明日に上がると思うシンボルを入手してください。

質問2:
理想的には、今日の終わりデータをモデルに追加しておき、明日のシンボルを予測することが理想です。今、私はgetSymbols()を使用して履歴全体を再度プルする必要があるようです。今日のデータを引き出し、そのシンボルのxtsオブジェクトに追加する方法はありますか?

答えて

0

質問1には1つの答えはなく、「明日の株価を選ぶ」とは何を意味するのかは完全にはっきりしていません。私は、あなたの目標は将来の水平線(例えば、明日の取引セッション)を上回っているかどうかを予測し、予測することを試みることを推測しています。

あなたの疑問に対する答えは、実際にモデルを定義する方法と、得た予測に基づいて株式を選ぶ方法に大きく依存します。多分、AUCを最適化したモデルを選択することは、株式リターン・サインを分類するための良い選択です。あるいは、他のメトリックがうまくいくかもしれません(1つの正解はありません)。

使用するモデルには多くの決定が含まれます。あなたは提案したように戻り標識のための分類を使用することができ、または分類モデルを使用する代わりに回帰法を使用して戻り値を推定することができます。 「明日の株価を選ぶ」ことを決める前に、あなたのモデルから得た予測を何らかの形でフィルタリングすることができます。オプションは無限です...難しい部分は実際に何が起こっているかを見つけることです。そして、私はここで誰もが明白な理由のために働くん何を伝えるために起こっている疑い。

質問2、

)あなたはquantmodを使用してヤフーを介してデータを収集する場合getSymbolsためfromto引数を使用します。具体的には?getSymbols.yahooを参照し、ソースコード(print(getSymbols.yahoo))を印刷します。また、end(xts_object)のようにendが見つかると、既に保存したデータを更新するgetSymbolsリクエストを行う前に、xtsオブジェクトに最新のタイムスタンプを与えると便利です。

getSymbols(Symbols = "AAPL", from = "2014-01-01", to = "2014-12-31")

更新:

# Get data for 2014 
sym <- "AAPL" 
md <- new.env() 
getSymbols(Symbols = sym, from = "2014-01-01", to = "2014-12-31", env = md) 
last_date <- end(get(sym, md)) 
new <- getSymbols(Symbols = sym, from = last_date + 1, to = Sys.Date(), auto.assign= FALSE) 
assign(x = sym, value = rbind(get(sym, md), new), envir = md) 
head(md$AAPL, 3) 
# AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted 
# 2014-01-02 555.68 557.03 552.02  553.13 58671200  74.11592 
# 2014-01-03 552.86 553.70 540.43  540.98 98116900  72.48790 
# 2014-01-06 537.45 546.80 533.60  543.93 103152700  72.88317 
tail(md$AAPL, 3) 
# AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted 
# 2017-02-22 136.43 137.12 136.11  137.11 20745300  137.11 
# 2017-02-23 137.38 137.48 136.30  136.53 20704100  136.53 
# 2017-02-24 135.91 136.66 135.28  136.66 21690900  136.66 
+0

質問1の場合、シナリオは、ボリュームが明日上がるかどうかです。だから、訓練モデルは1日であり、それを持っている各シンボルは翌日に1になり、そうでなければ0になります。方程式を含むように編集しました。つまり、トレーニングの代わりに、私はすべてのデータに基づいて、明示的に1つのシンボルが得られることを知りたいと思っています(つまり、モデルは彼らのボリュームが上がると考えています)。 – Alteredorange

+0

質問2では、getSymbols、 – Alteredorange

+1

@Alteredorange質問1の質問は、あなたが何を意味するのか分かりませんが、あなたは何を意味するのか分かりません。 質問2については、当然のことながら、新しいデータを古いデータに追加する必要があります。古いデータは別の名前の変数や理想的には変数に保存する必要がありますあなたは本当にそれを明確にしていないのですが、どうすればいいのでしょうか? 'rbind(old_OHLC_xts_data、new_data)'。 – FXQuantTrader

0

私は同じ問題に取り組んでいますが、私は「GAFS」機能を通じてキャレットパッケージを(使用して取引戦略の信頼を見つけようとしていますそれは持っている)。

ヒストリカルデータの100%でデータをトレーニングすると、質問の最初の部分に答えるために、 "オーバーフィッティング"が実行され、今後の予測が非常に信頼性が低くなります。 Overfittingの詳細についてはlinkをチェックしてください。このコンセプトをさらに理解するために、さらにInvestopedia.comを探索することをお勧めします。

私の驚きには、キャレットパッケージは、あなたのデータセット、つまり履歴データを70%と30%という1回のチャンクに分割する方法を提供するだけでなく、1回のクロスバリデーションのために複数のチャンクを提供します例えば、遺伝的アルゴリズムの機能。

+0

ありがとうAbdul!私はgafsを探しています、お気に入りのチュートリアルはありますか?私はrについてもう少し学び、相互検証について理解しています。しかし、gafsは1つの結果のみを探すようにも見えます。このシナリオでは、複数の結果(モデルに入れた多くの記号があります)があります。ガフがそれを処理できますか? – Alteredorange

+0

何もない兄弟。 YouTubeの一部のビデオとは別に、私は機械学習に関するこのDatacampのチュートリアルを取った: - https://www.datacamp.com/courses/machine-learning-toolbox –

関連する問題