2017-02-26 53 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沒有單一的答案,當你說「選擇明天的股票符號」(出於何種目的?)時,你的意思並不完全清楚。我猜測你的目標很可能是試圖預測哪些股票將在未來的某個時間段(例如明天的交易時段)跑贏/跑輸大盤,並根據這些預測行事。

你的問題的答案真的取決於你如何定義你的模型,以及如何根據你獲得的預測選擇你的股票。也許選擇一個優化AUC的模型是分類股票回報的好選擇......或者其他指標可以更好地工作(沒有單一的正確答案)。

您使用的模型涉及許多決定。您可以按照您的建議對回報進行分類,也可以使用迴歸方法來估算回報,而不是使用分類模型。您可能希望在決定「選擇明天的股票代碼」之前過濾從模型中獲得的預測。選項是無窮無盡的......難的部分是找到實際的工作。我懷疑有人在這裏是要告訴你什麼顯而易見的原因,做工精良;)

問題2,

使用fromto論據getSymbols如果你想使用quantmod通過雅虎來收集數據。具體查看?getSymbols.yahoo,和/或打印源代碼(即print(getSymbols.yahoo))。另外,在使getSymbols請求更新已存儲的數據之前,您可能會發現endend(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 
+0

對於問題一,假設情景是明天音量是否會上升。所以訓練模型是白天,每個有音量的符號第二天都會得到一個1,否則它會得到0.剛編輯的問題包含方程。所以,現在我不想進行培訓,我想根據所有數據知道哪些符號明天會得到1(即模型認爲它們的音量會增加) – Alteredorange

+0

對於問題2,我知道我可以指定getSymbols的日期,但它只是在前面的xts上寫的,我不得不考慮將它與'end'結合起來,所以它只是增加它。 – Alteredorange

+1

@Alteredorange你對問題1的要求是微不足道的,或者我不明白你的意思。您的預測表明明天哪些股票可能會有更高的成交量 對於問題2,當然您需要將您的新數據附加到舊數據中,舊數據存儲在具有不同名稱和/或理想值的變量中在一個不同的環境中,你並沒有真正地在你的問題中表達清楚,你應該如何做到這一點,只要'rbind(old_OHLC_xts_data,new_data)'。 – FXQuantTrader

0

我工作的同樣的問題,但我想找到一個交易策略的使用插入符包(信心通過「GAFS」功能它有)。

要回答問題的第一部分,在100%的歷史數據上訓練您的數據,您將執行「過度擬合」,這會導致您未來的預測極不可靠。查看此link瞭解有關過度配合的詳細瞭解。我建議你進一步探索Investopedia.com來理解這個概念。

令我驚訝的是,脫字符包不僅爲您提供了將數據集(即歷史數據)分成70%和30%等一次性塊的方法,還提供了多個塊,用於一次性交叉驗證比如遺傳算法的功能。

+0

謝謝阿卜杜勒!我正在研究gafs,你有什麼最喜歡的教程?我還學習了一些關於r的知識並瞭解了交叉驗證。但它也看起來像gafs只尋找一個結果,在這種情況下,我會有多個結果(也就是說,我把許多符號放入模型中)。加夫斯可以處理這個問題嗎? – Alteredorange

+0

沒什麼多大的兄弟。除了YouTube上的一些視頻外,我還參加了Datacamp的機器學習教程: - https://www.datacamp.com/courses/machine-learning-toolbox –