私は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オブジェクトに追加する方法はありますか?
質問1の場合、シナリオは、ボリュームが明日上がるかどうかです。だから、訓練モデルは1日であり、それを持っている各シンボルは翌日に1になり、そうでなければ0になります。方程式を含むように編集しました。つまり、トレーニングの代わりに、私はすべてのデータに基づいて、明示的に1つのシンボルが得られることを知りたいと思っています(つまり、モデルは彼らのボリュームが上がると考えています)。 – Alteredorange
質問2では、getSymbols、 – Alteredorange
@Alteredorange質問1の質問は、あなたが何を意味するのか分かりませんが、あなたは何を意味するのか分かりません。 質問2については、当然のことながら、新しいデータを古いデータに追加する必要があります。古いデータは別の名前の変数や理想的には変数に保存する必要がありますあなたは本当にそれを明確にしていないのですが、どうすればいいのでしょうか? 'rbind(old_OHLC_xts_data、new_data)'。 – FXQuantTrader