期貨量化交易軟件:采用棧式 RBM 的深度神經(jīng)網(wǎng)絡(luò)。
本文是有關(guān)深度神經(jīng)網(wǎng)絡(luò)和預(yù)測(cè)器選擇的前文之續(xù)篇。在此我們將涵蓋由棧式 RBM 初始化的深度神經(jīng)網(wǎng)絡(luò)特性, 以及它在 "darch" 軟件包里的實(shí)現(xiàn)。還將揭示使用隱藏的馬爾科夫模型來(lái)改進(jìn)神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)性能的可能性??傊? 赫茲期貨量化將以程序化方式實(shí)現(xiàn)一個(gè)可操作的智能交易程序。
目錄

編輯切換為居中
1. DBN 的結(jié)構(gòu)
2. 數(shù)據(jù)的準(zhǔn)備及選擇
2.1. 輸入變量
2.2. 輸出變量
2.3. 初始化數(shù)據(jù)幀
2.3.1. 刪除高相關(guān)性變量
2.4. 最重要變量的選擇
3. 實(shí)驗(yàn)部分。
3.1. 構(gòu)建模型
3.1.1. "darch" 軟件包的簡(jiǎn)述
3.1.2. 構(gòu)建 DBN 模型。參數(shù)。
3.2. 訓(xùn)練和測(cè)試樣品的形成。
3.2.1. 分級(jí)平衡和預(yù)處理。
3.2.2. 目標(biāo)變量編碼
3.3. 訓(xùn)練模型
3.3.1. 預(yù)訓(xùn)練
3.3.2. 微調(diào)
3.4. 測(cè)試模型。標(biāo)尺。
3.4.1. 預(yù)測(cè)解碼。
3.4.2. 改善預(yù)測(cè)結(jié)果
校驗(yàn)
使用馬爾科夫鏈模型進(jìn)行平滑
在理論性平衡曲線上校正預(yù)測(cè)信號(hào)
3.4.3. 標(biāo)尺
4. 智能交易程序的結(jié)構(gòu)
4.1. 智能交易程序操作的描述
4.2. 自控制。自訓(xùn)練
安裝和啟動(dòng)
改進(jìn)定性指標(biāo)的方式方法。
結(jié)論
概論 在準(zhǔn)備進(jìn)行實(shí)驗(yàn)的數(shù)據(jù)時(shí), 赫茲期貨量化將使用來(lái)自 前文 中有關(guān)評(píng)估和選擇預(yù)測(cè)的變量。赫茲期貨量化將形成初始樣本, 清理它并選擇重要的變量。 我們將研究為了訓(xùn)練、測(cè)試和驗(yàn)證而劃分樣本的方法。 我們將使用 "darch" 軟件包構(gòu)建一個(gè) DBN 網(wǎng)絡(luò)模型, 并用我們的數(shù)據(jù)對(duì)它進(jìn)行訓(xùn)練。在模型之后測(cè)試, 我們將能獲得評(píng)估模型質(zhì)量的標(biāo)尺。我們將研究軟件包所提供的神經(jīng)網(wǎng)絡(luò)設(shè)置的多種配置機(jī)會(huì)。 另外, 我們會(huì)看到隱藏的馬爾科夫模型將如何幫助我們改進(jìn)神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)。 我們將開(kāi)發(fā)一款智能交易系統(tǒng), 根據(jù)持續(xù)監(jiān)測(cè)的結(jié)果, 在不打斷交易的情況下對(duì)模型進(jìn)行定期訓(xùn)練。在 EA 中將使用來(lái)自 "darch" 軟件包的 DBN 模型。我們還將結(jié)合使用來(lái)自 前文 的 SAE DBN 構(gòu)建智能交易系統(tǒng)。 再有, 我們將指點(diǎn)改進(jìn)模型的定性指標(biāo)的方式i和方法。1. 由棧式 RBM (DN_SRBM) 初始化的深層神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)我記得 DN_SRBM 是由 n 個(gè)等于神經(jīng)網(wǎng)絡(luò)隱藏層數(shù)的 RBM 組成, 基本上是神經(jīng)網(wǎng)絡(luò)本身。訓(xùn)練包括兩個(gè)階段。 第一階段涉及預(yù)訓(xùn)練。每個(gè) RBM 無(wú)需監(jiān)督者即可依據(jù)輸入集合系統(tǒng)地訓(xùn)練 (無(wú)目標(biāo))。在隱藏層的權(quán)重之后, RBM 被轉(zhuǎn)移到相關(guān)的神經(jīng)網(wǎng)絡(luò)隱藏層。 第二階段涉及微調(diào), 在此神經(jīng)網(wǎng)絡(luò)由監(jiān)督者訓(xùn)練。前文中已提供了有關(guān)它的詳細(xì)信息, 所以我們?cè)诖瞬辉購(gòu)?fù)述。我將簡(jiǎn)單敘述, 不像我們前文用過(guò)的 "deepnet" 軟件包, "darch" 軟件包幫助我們實(shí)現(xiàn)更廣泛的機(jī)會(huì)來(lái)構(gòu)建并微調(diào)模型。更多詳細(xì)信息將在創(chuàng)建模型時(shí)提供。圖例. 1 顯示 DN_SRBM 的結(jié)構(gòu)和處理過(guò)程

編輯切換為居中
圖例. 1. DN SRBM 的結(jié)構(gòu) 2. 數(shù)據(jù)的準(zhǔn)備及選擇 2.1. 輸入變量 (征兆, 預(yù)測(cè)器) 在前文中, 我們研究過(guò)預(yù)測(cè)器的評(píng)估和選擇, 所以在此無(wú)需提供額外信息。我僅論及我們使用的 11 款指標(biāo) (所有的振蕩器: ADX, aroon, ATR, CCI, chaikinVolatility, CMO, MACD, RSI, stoch, SMI, volatility)。選擇了來(lái)自一些指標(biāo)的若干變量。這樣就形成了 17 個(gè)變量的輸入集。赫茲期貨量化從 EURUSD 里取最后 6000 根柱線的報(bào)價(jià), 2016 年 02 月 14 日 M30 時(shí)間幀, 并使用 In() 函數(shù)計(jì)算指標(biāo)值。 #---2--------------------------------------------- In <- function(p = 16){ ? require(TTR) ? require(dplyr) ? require(magrittr) ? adx <- ADX(price, n = p) %>% as.data.frame %>% ? ? ?mutate(.,oscDX = DIp - DIn) %>% ? ? ?transmute(.,DX, ADX, oscDX) %>% ? ? ?as.matrix() ? ar <- aroon(price[ ,c('High', 'Low')], n = p) %>% ? ? ?extract(,3) ? atr <- ATR(price, n = p, maType = "EMA") %>% ? ? extract(,1:2) ? cci <- CCI(price[ ,2:4], n = p) ? chv <- chaikinVolatility(price[ ,2:4], n = p) ? cmo <- CMO(price[ ,'Med'], n = p) ? macd <- MACD(price[ ,'Med'], 12, 26, 9) %>% ? ? ?as.data.frame() %>% ? ? ?mutate(., vsig = signal %>% ? ? ? ? ? ? ? diff %>% c(NA,.) %>% multiply_by(10)) %>% ? ? ?transmute(., sign = signal, vsig) %>% ? ? ?as.matrix() ? rsi <- RSI(price[ ,'Med'], n = p) ? stoh <- stoch(price[ ,2:4], nFastK = p, ? ? ? ? ? ? ? ? ?nFastD =3, nSlowD = 3, ? ? ? ? ? ? ? ? ?maType = "EMA") %>% ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? as.data.frame() %>% ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?mutate(., oscK = fastK - fastD) %>% ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? transmute(.,slowD, oscK) %>% ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?as.matrix() ? smi <- SMI(price[ ,2:4],n = p, nFast = 2, ? ? ? ? ? ? ? nSlow = 25, nSig = 9) ? kst <- KST(price[ ,4])%>% as.data.frame() %>% ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?mutate(., oscKST = kst - signal) %>% ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? select(.,oscKST) %>% as.matrix() ? In <- cbind(adx, ar, atr, cci, chv, cmo, macd, ? ? ? ? ? ? ? ?rsi, stoh, smi, kst) ? return(In) } 我們將在輸出上獲得輸入數(shù)據(jù)矩陣。 2.2輸出數(shù)據(jù) (目標(biāo)白能量) 我們采用取自 ZZ 的信號(hào)作為目標(biāo)變量。函數(shù)計(jì)算之字折線信號(hào): #----3------------------------------------------------ ZZ <- function(pr = price, ch = ch , mode="m") { ? require(TTR) ? require(magrittr) ? if (ch > 1) ch <- ch/(10 ^ (Dig - 1)) ? if (mode == "m") {pr <- pr[ ,'Med']} ? if (mode == "hl") {pr <- pr[ ,c("High", "Low")]} ? if (mode == "cl") {pr <- pr[ ,c("Close")]} ? zz <- ZigZag(pr, change = ch, percent = F, ? ? ? ? ? ? ? ? retrace = F, lastExtreme = T) ? n <- 1:length(zz) ? dz <- zz %>% diff %>% c(., NA) ? sig <- sign(dz) ? for (i in n) { if (is.na(zz[i])) zz[i] = zz[i - 1]} ? return(cbind(zz, sig)) } 函數(shù)參數(shù): pr = 價(jià)格 – OHLCMed 報(bào)價(jià)的矩陣; ch – 之字折線彎曲的最小長(zhǎng)度點(diǎn)數(shù) (4 位) 或是實(shí)際項(xiàng) (例如, ch = 0.0035); mode – 應(yīng)用的價(jià)格 ("m" - 中間價(jià), "hl" - 最高價(jià)和最低價(jià), "cl" - 收盤價(jià)), 省缺使用中間價(jià)。 函數(shù)返回兩個(gè)變量的矩陣 — 事實(shí)上, 之字折線和信號(hào), 是在之字折線角度范圍 [-1;1] 的基礎(chǔ)上取得的。我們將信號(hào)向左平移一根柱線 (朝向未來(lái))。這個(gè)特定的信號(hào)將用于訓(xùn)練神經(jīng)網(wǎng)絡(luò)。 我們計(jì)算信號(hào)時(shí) ZZ 彎曲長(zhǎng)度至少 37 點(diǎn) (4 位)。 > out <- ZZ(ch = 37, mode = "m") Loading required package: TTR Loading required package: magrittr > table(out[ ,2]) ? ?-1 1 2828 3162 如我們所見(jiàn), 分級(jí)略有失衡。當(dāng)形成用于訓(xùn)練模型的樣本時(shí), 我們將采取必要的措施來(lái)令它們平衡。 2.3. 初始化數(shù)據(jù)幀 我們來(lái)編寫創(chuàng)建初始數(shù)據(jù)幀的函數(shù), 清理不確定的數(shù)據(jù) (空) 并轉(zhuǎn)換目標(biāo)變量至兩個(gè)分級(jí)的因子 "-1" 和 "+1"。函數(shù)組合之前編寫的函數(shù) In() 和 ZZ()。我們將立即裁剪最后 500 根柱線, 用于評(píng)估模型預(yù)測(cè)質(zhì)量。 #-----4--------------------------------- form.data <- function(n = 16, z = 37, len = 500){ ? require(magrittr) ? x <- In(p = n) ? out <- ZZ(ch = z, mode = "m") ? data <- cbind(x, y = out[ ,2]) %>% ? ? ?as.data.frame %>% head(., (nrow(x)-len))%>% ? ? ? ? na.omit ? data$y <- as.factor(data$y) ? return(data) } 2.3.1. 刪除高相關(guān)性變量 我們將從初始集合里面刪除相關(guān)性系數(shù)高于 0.9 的變量。我們將編寫形成初始數(shù)據(jù)幀的函數(shù), 刪除高相關(guān)性變量并返回清理后數(shù)據(jù)。 我們可以預(yù)先檢查哪一個(gè)變量的相關(guān)性系數(shù)高于 0.9。 > data <- form.data(n = 16, z = 37) # 準(zhǔn)備數(shù)據(jù)幀 > descCor <- cor(data[ ,-ncol(data)])# 刪除目標(biāo)變量 > summary(descCor[upper.tri(descCor)]) ? ?Min. 1st Qu. ?Median ? ?Mean 3rd Qu. ? ?Max. ?-0.1887 0.0532 0.2077 0.3040 0.5716 0.9588 ?> highCor <- caret::findCorrelation(descCor, cutoff = 0.9) > highCor [1] 12 9 15 > colnames(data[ ,highCor]) [1] "rsi" "cmo" "SMI" 因此, 以上列出的變量可以刪除。我們將從數(shù)據(jù)幀里刪除它們。 > data.f <- data[ ,-highCor] > colnames(data.f) ?[1] "DX" "ADX" "oscDX" "ar" "tr" ? ? ?[6] "atr" "cci" "chv" "sign" "vsig" ? [11] "slowD" "oscK" "signal" "vol" "Class" 我們可在一個(gè)函數(shù)里緊湊地編寫它: #---5----------------------------------------------- cleaning <- function(n = 16, z = 37, cut = 0.9){ ? data <- form.data(n, z) ? descCor <- cor(data[ ,-ncol(data)]) ? highCor <- caret::findCorrelation(descCor, cutoff = cut) ? data.f <- data[ ,-highCor] ? return(data.f) } > data.f <- cleaning() 并非所有軟件包的作者和研究人員都同意將高相關(guān)性的數(shù)據(jù)從集合中刪除。不過(guò), 兩種使用結(jié)果會(huì)在此進(jìn)行比較。在我們的情況中, 我們選擇的選項(xiàng)是刪除。 2.4. 最重要變量的選擇 重要變量的選擇基于三個(gè)指標(biāo): 按照分級(jí)的全局重要性, 局部重要性 (結(jié)合) 和部分重要性。我們要把握前文詳述的 "randomUniformForest" 軟件包的機(jī)會(huì)。為了緊湊性, 所有之前和之后的動(dòng)作均在一個(gè)函數(shù)收集。一旦執(zhí)行, 赫茲期貨量化將獲取三個(gè)集合作為結(jié)果:
具有最佳貢獻(xiàn)和交互的變量;
對(duì)于分級(jí) "-1" 的最佳變量;
對(duì)于分級(jí) "+1" 的最佳變量。
#-----6------------------------------------------------ prepareBest <- function(n, z, cut, method){ ? require(randomUniformForest) ? ?require(magrittr) ? data.f <<- cleaning(n = n, z = z, cut = cut) ? idx <- rminer::holdout(y = data.f$Class) ? prep <- caret::preProcess(x = data.f[idx$tr, -ncol(data.f)], method = method) ? x.train <- predict(prep, data.f[idx$tr, -ncol(data.f)]) ? x.test <- predict(prep, data.f[idx$ts, -ncol(data.f)]) ? y.train <- data.f[idx$tr, ncol(data.f)] ? y.test <- data.f[idx$ts, ncol(data.f)] #--------- ? ruf <- randomUniformForest( X = x.train, Y = y.train, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? xtest = x.test, ytest = y.test, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? mtry = 1, ntree = 300, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? threads = 2, nodesize = 1 ? ? ? ? ? ? ? ? ? ? ? ?) ? imp.ruf <- importance(ruf, Xtest = x.test) ? best <- imp.ruf$localVariableImportance$classVariableImportance %>% ? ? ? ? ? ? ? ? ? ?head(., 10) %>% rownames() #-----部分重要 ? best.sell <- partialImportance(X = x.test, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?imp.ruf, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?whichClass = "-1", ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nLocalFeatures = 7) %>% ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?row.names() %>% ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?as.numeric() %>% ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?colnames(x.test)[.] ? best.buy <- partialImportance(X = x.test, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?imp.ruf, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?whichClass = "1", ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nLocalFeatures = 7) %>% ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?row.names() %>% ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?as.numeric() %>% ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?colnames(x.test)[.] ? dt <- list(best = best, buy = best.buy, sell = best.sell) ? return(dt) }