J'apprends R et Quantmod et construit une prédiction de modèle de stock très simple. Je possède un xgboost et le modèle caret, voici l'exemple tout:Comment obtenir la prévision de stock réelle de xgboost, caret et 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))
Question 1:
En ce moment, elle forme à 70%, prédit 30%, et je peux imprimer un score AUC à la fin . Dites-vous que je m'entraîne à 100% et que je veux prédire ce qui se passera demain? C'est à dire. obtenir les symboles dont le volume pensera que le modèle remonte demain.
Question 2:
Idéalement, je veux continuer à ajouter les données de fin de journée d'aujourd'hui dans le modèle, et ensuite faire prédire les symboles de demain. En ce moment, il semble que je devrais utiliser getSymbols()
pour tirer à nouveau l'histoire entière. Une façon de simplement extraire les données du jour et de les ajouter à l'objet xts de ce symbole?
Pour la première question, disons que le scénario est de savoir si le volume va augmenter demain. Donc, le modèle d'entraînement est le jour, et chaque symbole qui a son volume augmente le jour suivant obtient un 1, sinon il obtient 0. Juste la question éditée pour inclure l'équation. Donc maintenant, au lieu de m'entraîner, je veux savoir, en fonction de toutes les données, quels symboles obtiendront un 1 demain (ie le modèle pense que leur volume augmentera.) – Alteredorange
Pour la question 2, je savais que je pourrais spécifier une date pour getSymbols, mais il a juste écrit sur les xts précédents Je vais devoir chercher à le combiner avec 'end' donc il ne fait que l'ajouter – Alteredorange
@Alteredorange Ce que vous demandez pour la question 1 est soit trivial ou je ne comprends pas ce que vous voulez dire. Vos prévisions vous indiquent quels stocks peuvent avoir un volume plus élevé demain Pour la question 2, bien sûr, vous devez ajouter vos nouvelles données à vos anciennes données, où les anciennes données que vous stockez dans une variable avec un nom différent et/ou idéalement dans un environnement différent, vous ne l'avez pas vraiment précisé dans votre question, comment cela devrait être simple, juste 'rbind (old_OHLC_xts_data, new_data)'. – FXQuantTrader