【问题标题】:How To Get Actual Stock Prediction Out of xgboost, caret and Quantmod (R)如何从 xgboost、caret 和 Quantmod (R) 中获得实际的股票预测
【发布时间】:2017-03-16 03:56:29
【问题描述】:

我正在学习 R 和 Quantmod,并构建了一个非常简单的股票模型预测。我有一个 xgboost 和 caret 模型,这是整个例子:

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% 训练并想预测明天会发生什么? IE。获取模型认为明天体积会上升的符号。

问题 2:
理想情况下,我想继续将今天的日终数据添加到模型中,然后让它预测明天的符号。现在看来我不得不使用getSymbols() 再次拉出整个历史记录。有什么方法可以提取今天的数据并将其附加到该符号的 xts 对象?

【问题讨论】:

    标签: r r-caret quantmod xgboost


    【解决方案1】:

    问题 1 没有单一的答案,当您说“选择明天的股票代码”(出于什么目的?)时,您的意思并不完全清楚。我推测您的目标可能是尝试预测哪些股票在未来某个时期(例如明天的交易时段)会跑赢/跑输,并根据这些预测采取行动。

    您的问题的答案实际上取决于您如何定义模型以及如何根据您获得的预测选择股票。也许选择一个优化了 AUC 的模型是对股票收益迹象进行分类的好选择……或者其他指标可能会更好(没有一个正确的答案)。

    您使用的模型涉及做出许多决定。您可以按照您的建议对返回符号使用分类,或者您可以使用回归方法而不是使用分类模型来估计返回。在决定“选择明天的股票代码”之前,您可能希望以某种方式过滤从模型中获得的预测。选择是无穷无尽的……困难的部分是找到真正有效的方法。而且我怀疑这里的任何人会告诉您出于明显的原因什么效果很好;)

    问题 2,

    如果您想使用 quantmod 通过 Yahoo 收集数据,请使用 getSymbolsfromto 参数。具体查看?getSymbols.yahoo,和/或打印源代码(即print(getSymbols.yahoo))。此外,在发出 getSymbols 请求以更新您已存储的数据之前,您可能会发现 end(xts_object) 中的 end(xts_object) 有助于在 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
    

    【讨论】:

    • 对于问题一,假设明天成交量是否会上涨。所以训练模型是按天计算的,每个交易量在第二天上升的符号都会得到 1,否则会得到 0。刚刚编辑了包含方程式的问题。所以现在我不想训练,而是想知道,根据所有数据,明天哪些符号会得到 1(即模型认为它们的数量会增加。
    • 对于问题 2,我知道我可以为 getSymbols 指定一个日期,但它只是覆盖了之前的 xts。我将不得不考虑将它与end 结合起来,所以它只是添加它。
    • @Alteredorange 你问的问题 1 要么是微不足道的,要么我不明白你的意思。您的预测向您表明明天哪些股票的成交量可能会更高。对于问题 2,您当然需要将新数据附加到旧数据中,其中旧数据存储在具有不同名称和/或理想情况下在不同环境中的变量中。你的问题并没有真正说清楚。你如何做到这一点应该是直截了当的。只需rbind(old_OHLC_xts_data, new_data)
    • 对不起,我真的很陌生,我在网上找不到任何可靠的教程 :( 就预测而言,这总是预测第二天吗?我的 predictions 只是nope yes 1 0.9962924 0.003707607 2 0.9962670 0.003733027 的行我还没有使用环境,所以我也会研究一下。感谢所有的帮助和澄清,我真的很感激!
    • 添加了更多详细信息,说明您可以存储 Q2 数据的一种方式。您如何应对第一季度的预测值取决于您自己。如果您从分类器返回估计的概率,一种基本方法是选择一个概率截止值,超过该概率截止值,您估计明天的库存量将高于正常水平(结果 1)。如果您一开始就正确使用 AUC,您应该了解如何执行此操作。
    【解决方案2】:

    我正在解决同样的问题,但我正在尝试使用 caret 包(通过它具有的“gafs”功能)找到交易策略的信心。

    要回答您问题的第一部分,在 100% 的历史数据上训练您的数据,您将执行“过度拟合”,这会导致您的未来预测非常不可靠。查看此link 以详细了解过度拟合。我建议您进一步探索Investopedia.com 以了解此概念。

    令我惊讶的是,插入符号包不仅为您提供了将数据集(即历史数据)划分为 70% 和 30% 的一次性块的方法,而且一次性提供了多个块用于交叉验证, 遗传算法的功能。

    【讨论】:

    • 感谢阿卜杜勒!我正在研究 gafs,你有什么最喜欢的教程吗?我还学到了更多关于 r 的知识并了解交叉验证。但它也看起来像 gafs 只寻找一个结果,在这种情况下我会有多个结果(即,无论我在模型中放入多少符号)。 gafs 可以处理吗?
    • 没什么大不了的兄弟。除了 youtube 上的一些视频,我还学习了 Datacamp 的机器学习教程:- datacamp.com/courses/machine-learning-toolbox
    猜你喜欢
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    相关资源
    最近更新 更多