python mql4_可以转发文章不?老外用随机森林预测外汇分钟涨跌准确率高达85%。求高手用python重写。...
[https://www.mql5.com/zh/articles/1165][1]
簡(jiǎn)介
創(chuàng)建任何交易系統(tǒng)的目的都是為了能夠預(yù)測(cè)金融產(chǎn)品的市場(chǎng)行為,如一個(gè)貨幣對(duì)。預(yù)測(cè)的目標(biāo)可以是不同的。我們?cè)诖讼薅轭A(yù)測(cè)貨幣的走勢(shì),或者更準(zhǔn)確的說(shuō)是預(yù)測(cè)貨幣報(bào)價(jià)的漲(多頭)跌(空頭)。
要預(yù)測(cè)貨幣價(jià)格走勢(shì),交易者通常在圖標(biāo)上附加一些指標(biāo),以期找到一種可用于預(yù)測(cè)的模式。
本文探討使用R統(tǒng)計(jì)分析系統(tǒng)中的Rattle包,來(lái)自動(dòng)選取相關(guān)模式進(jìn)行價(jià)格行為預(yù)測(cè)。
1. 關(guān)于Rattle
我們使用R這一理想的金融市場(chǎng)預(yù)測(cè)工具,來(lái)對(duì)貨幣對(duì)價(jià)格行為進(jìn)行預(yù)測(cè)。話說(shuō),R主要是一種給有經(jīng)驗(yàn)的統(tǒng)計(jì)人員使用的編程語(yǔ)言,對(duì)許多交易者來(lái)說(shuō)較難掌握。R語(yǔ)言的復(fù)雜性在于,用于預(yù)測(cè)的工具非常多并且分散在許多R的基本功能工具包中。
Rattle(簡(jiǎn)單易學(xué)的R語(yǔ)言分析工具)集成了一系列R語(yǔ)言包,對(duì)于交易系統(tǒng)開(kāi)發(fā)者來(lái)說(shuō)非常重要,但初學(xué)者用起來(lái)并不容易。你不必了解掌握R語(yǔ)言就能開(kāi)始使用Rattle包。對(duì)Rattle報(bào)的使用將用R語(yǔ)言來(lái)編寫(xiě),將可以被用于開(kāi)發(fā)真實(shí)的交易系統(tǒng)。然而,在這個(gè)階段就需要對(duì)R語(yǔ)言有所了解。
任何情況下,在交易系統(tǒng)設(shè)計(jì)的階段,Rattle是不可替代的工具。它能夠讓新手快速的看到各種策略想法的結(jié)果并且使用之。
Rattle (Williams, 2009) 是一個(gè)開(kāi)源的軟件包,它是R的一部分(R開(kāi)發(fā)小組,2011)。因?yàn)樗敲赓M(fèi)軟件,Rattle的R語(yǔ)言源代碼沒(méi)有使用限制。Rattle源代碼用C語(yǔ)言編寫(xiě),鼓勵(lì)用戶學(xué)習(xí)、測(cè)試及擴(kuò)展代碼。
2. 源數(shù)據(jù)描述
本文的計(jì)算結(jié)果都是基于EURUSD, GBPUSD, USDCHF, USDJPY, EURGBP, USDCAD這六個(gè)貨幣對(duì)在H1時(shí)間框架下從 10.01.2011 到 24.12.2013 的收盤(pán)價(jià)。這組數(shù)據(jù)有超過(guò)18000個(gè)K線組成,因此計(jì)算結(jié)果是可靠的。基于上面貨幣對(duì)的數(shù)據(jù)集用于搜尋預(yù)測(cè)多空的模式。
原始報(bào)價(jià)數(shù)據(jù)集在文件kot60_110101_131231_UA.txt中。
2.1. 創(chuàng)建目標(biāo)變量
首先我們要準(zhǔn)確的確定我們要預(yù)測(cè)的對(duì)象。雖然看上去很簡(jiǎn)單,但是選擇正確的預(yù)測(cè)目標(biāo)以及用于預(yù)測(cè)的數(shù)據(jù)集合是非常關(guān)鍵的。
預(yù)測(cè)趨勢(shì)的目的是基于進(jìn)行趨勢(shì)交易的期望。
根據(jù)“趨勢(shì)”的定義,所謂上升趨勢(shì)就是后續(xù)的價(jià)格比前面K線的價(jià)格高,反之則為下降趨勢(shì)。因此,有必要根據(jù)趨勢(shì)的定義來(lái)進(jìn)行貨幣對(duì)的價(jià)格預(yù)測(cè)。如果EURUSD的初始價(jià)格是1.3500,預(yù)測(cè)價(jià)格是1.3550,那么這是上升趨勢(shì)則立即買(mǎi)入。
而然,訂單為“買(mǎi)”和“賣(mài)”,預(yù)測(cè)是針對(duì)價(jià)格水平的。例如,價(jià)格水平在交易系統(tǒng)中用于預(yù)測(cè)突破。為了實(shí)現(xiàn)趨勢(shì)交易的想法,需進(jìn)行一次額外的價(jià)格對(duì)比。顯然,我們預(yù)測(cè)的東西和想要做的交易不是一回事。
然而,如果交易系統(tǒng)被設(shè)計(jì)為趨勢(shì)跟隨,那么模型就用于預(yù)測(cè)趨勢(shì)。模型必須經(jīng)過(guò)訓(xùn)練來(lái)識(shí)別趨勢(shì),目標(biāo)變量只有兩個(gè)值“買(mǎi)”和“賣(mài)”。在代碼中目標(biāo)變量為“1”和“-1”。
使用源數(shù)據(jù)集計(jì)算金融標(biāo)的價(jià)格的模型和將源數(shù)據(jù)集進(jìn)行分類的模型之間有根本的區(qū)別。第一種類型屬于回歸模型,第二種屬于聚類模型。
回歸類型的預(yù)測(cè)模型用于計(jì)算一些未來(lái)的值。當(dāng)未來(lái)來(lái)到時(shí),我們將預(yù)測(cè)值和實(shí)際值進(jìn)行對(duì)比。
聚類類型的預(yù)測(cè)模型用于計(jì)算預(yù)測(cè)時(shí)一組接收到的源數(shù)據(jù)將被歸于哪個(gè)類別。就是“多”和“空”兩種類型。如其他聚類類型一樣,這兩個(gè)類型沒(méi)有任何特定的值。因此,“多”類型無(wú)法和“空”類型進(jìn)行對(duì)比。雖然為了簡(jiǎn)化起見(jiàn)我們將“多”編碼成“1”,“空”編碼成“0”,但這并不是說(shuō)“多”比“空”大。為了強(qiáng)調(diào)這點(diǎn),對(duì)于這種定性的變量,R和Rattle中定義了一種特定的分類變量。
多和空作為目標(biāo)變量并不存在,這就是和下面描述的獨(dú)立變量之間的主要區(qū)別。這和我們將要預(yù)測(cè)當(dāng)下并不存在的將來(lái)事件相吻合。我們很容易基于歷史數(shù)據(jù)繪制趨勢(shì),因?yàn)槲覀円阎缹?lái)和過(guò)去的關(guān)系。
在歷史數(shù)據(jù)中標(biāo)識(shí)趨勢(shì),我們用ZigZag指標(biāo)。對(duì)于歷史數(shù)據(jù)來(lái)說(shuō)這是一個(gè)很好的指標(biāo),但對(duì)于實(shí)時(shí)數(shù)據(jù)就沒(méi)有用了,因?yàn)榻?jīng)常會(huì)對(duì)前一個(gè)極點(diǎn)進(jìn)行重繪。歷史數(shù)據(jù)是靜態(tài)的,因此我們能用這個(gè)指標(biāo)畫(huà)出非常漂亮的趨勢(shì)線。
參數(shù)“反轉(zhuǎn)點(diǎn)之間的間距”為0.0035的ZigZag指標(biāo)用于計(jì)算目標(biāo)變量。圖. 1 為結(jié)果。
圖1. ZigZag指標(biāo)
圖 1. ZigZag指標(biāo)
現(xiàn)在指標(biāo)值被轉(zhuǎn)化為“多” = 1 和 “空” = 0。
結(jié)果顯示在圖2上。
圖2. 分類形式的ZigZag指標(biāo)
圖 2. 分類形式的ZigZag指標(biāo)
讓我們對(duì)目標(biāo)值做最后的操作。如果我們將ZigZag指標(biāo)左移,則當(dāng)前K線將對(duì)應(yīng)ZigZag指標(biāo)的未來(lái)值。本文中平移1根K線,相當(dāng)于用一小時(shí)前的數(shù)據(jù)來(lái)預(yù)測(cè)。
可以平移更多的K線,相應(yīng)于預(yù)測(cè)更多的K線。本方法有別于其他預(yù)測(cè)方法,在累積預(yù)測(cè)誤差下,前一個(gè)值可用于預(yù)測(cè)多個(gè)未來(lái)值。
本文中提出的模型及一般分類模型不累積誤差。在分類模型中,提前預(yù)測(cè)2根K線有它自身的預(yù)測(cè)誤差,和任何提前預(yù)測(cè)1根k線的方法都沒(méi)有關(guān)系。
2.2. 創(chuàng)建獨(dú)立變量
因?yàn)樗鼈儊?lái)自于外部模型,因此稱作獨(dú)立變量或者預(yù)測(cè)器。他們是外部的可測(cè)變量或者基于外部變量計(jì)算的變量。任何經(jīng)濟(jì)和金融數(shù)據(jù)包括貨幣匯率都是獨(dú)立變量,因?yàn)樗鼈兊闹凳鞘袌?chǎng)行為的結(jié)果。技術(shù)指標(biāo)的值也是這類變量,因?yàn)樗鼈兪腔趫?bào)價(jià)計(jì)算的。
獨(dú)立變量的選擇和目標(biāo)變量的選擇一樣重要。事實(shí)上,模型的成功與否取決于獨(dú)立變量的選擇。模型開(kāi)發(fā)的絕大多數(shù)時(shí)間都是用在分析和選擇獨(dú)立參數(shù)組上。
源文件kot60_110101_131231_UA中的變量包含六種貨幣的報(bào)價(jià)、時(shí)間和日期,能用于預(yù)測(cè)。
從本方法的角度看,時(shí)間和日期信息更為有用。時(shí)間和日期一直被嘗試用于交易系統(tǒng)的設(shè)計(jì)中。在我們的模型中,一些基于時(shí)間和星期的隱藏的貨幣報(bào)價(jià)信息能夠被分類模型自動(dòng)識(shí)別出來(lái)。這里唯一需要做的就是將這兩個(gè)變量轉(zhuǎn)換成類型形式。時(shí)間變換為24個(gè)分類,日期變換為5個(gè)分類變量對(duì)應(yīng)一周中的星期幾。
除了用于預(yù)測(cè)的原始因子,我們還將創(chuàng)造在我看來(lái)能夠揭示源報(bào)價(jià)中存在的趨勢(shì)的額外預(yù)測(cè)因子。我們將使用眾所周知的指標(biāo)來(lái)創(chuàng)建額外預(yù)測(cè)因子。
下面的指標(biāo)將被引用:5,10 和 15; MACD(12,26,9),周期為 14,21,28 的RSI指標(biāo)。在它們之上,我們將使用報(bào)價(jià)的增量和移動(dòng)平均。所有這些轉(zhuǎn)換都將被應(yīng)用于六個(gè)貨幣對(duì)的報(bào)價(jià)。
ZigZag指標(biāo)將被包含在獨(dú)立變量中,用于輔助目的。它不會(huì)用于模型的開(kāi)發(fā),因?yàn)閷?duì)應(yīng)右側(cè)遠(yuǎn)方K線的指標(biāo)值是未知的。
因此,我們得到88個(gè)獨(dú)立變量,一個(gè)目標(biāo)變量和一個(gè)輔助變量(ZigZag)。每一個(gè)變量的數(shù)據(jù)量為18083跟K線。
此數(shù)據(jù)集為R工作空間格式,能夠在本文的附件TC.RData中找到。這個(gè)數(shù)據(jù)集能夠通過(guò)如下方式使用:
加載R;
加載Rattle庫(kù);
進(jìn)入標(biāo)簽頁(yè)File/Workspace;
在磁盤(pán)中找到TC.RData文件并加載。
3. 智能分析源數(shù)據(jù)
Rattle包提供一系列預(yù)處理工具,或智能數(shù)據(jù)處理 - 數(shù)據(jù)挖掘。
3.1. 輸入?yún)?shù)預(yù)覽
執(zhí)行上述命令后,讓我們看看接下來(lái)能夠干什么。
結(jié)果見(jiàn)圖 3。
圖 3. Rattle首頁(yè)
圖 3. Rattle首頁(yè)
我們從Data頁(yè)切換到Log頁(yè),在Rattle中開(kāi)發(fā)模型。
Rattle的首頁(yè)是Data。由命名不難看出此頁(yè)加載數(shù)據(jù),用于后續(xù)操作。
我們對(duì)Spreadsheets和R Dataset兩個(gè)按鈕尤其感興趣。
Spreadsheets按鈕可用于上傳Excel文件。如果讀者想測(cè)試他們的想法,可以用他們自己的Excel文件在Rattle中做測(cè)試。
要重現(xiàn)本文所述或者使用本文附件原始數(shù)據(jù)執(zhí)行一些額外任務(wù),請(qǐng)使用R Dataset按鈕。此按鈕將文件以R格式加載。文件叫做"Working Directory" 或 "Work file"。它們的后綴名為.RData。文件能夠上傳到R,并點(diǎn)擊此按鈕后變?yōu)榭捎谩?/p>
上傳我們準(zhǔn)備好的文件,得圖4上半部分以及圖5的下半部分。
圖 4. 源文件的上半部分
圖 4. 源文件的上半部分
圖. 5. 源文件下半部分
圖. 5. 源文件下半部分
3.2. 帶獨(dú)立變量的目標(biāo)變量相關(guān)性
注意。“Run”按鈕起關(guān)鍵作用。所有的操作都準(zhǔn)備好了但并未執(zhí)行。要執(zhí)行任請(qǐng)按“Run”按鈕。要重復(fù)執(zhí)行本文中的操作,每次都要按下此按鈕。
圖4顯示了變量列表,他們的特性及這些變量的用途。因?yàn)槲覀儾幌朐谀P椭惺褂肸igZag指標(biāo),我們就將其設(shè)置為Ignore。
其他變量都被用作存儲(chǔ)輸入?yún)?shù),除了最后一個(gè),用作目標(biāo)變量。
“Partition”按鈕在證實(shí)模型結(jié)果的授信水平上發(fā)揮重要作用。數(shù)據(jù)集在需要的時(shí)候可以用這個(gè)按鈕分割為三個(gè)部分。用于訓(xùn)練、驗(yàn)證和測(cè)試模型的數(shù)據(jù)集的比例在此階段確認(rèn)。
在下一階段,確定生成偽隨機(jī)數(shù)的種子。例如,從源數(shù)據(jù)集中隨機(jī)選擇70%的源數(shù)據(jù)用作訓(xùn)練數(shù)據(jù)集。另外兩個(gè)15%(如我們的情況)也是隨機(jī)的K線序列。
因此,改變?cè)磾?shù)據(jù)集的生成種子,就能夠獲取無(wú)限多的訓(xùn)練和其他數(shù)據(jù)集。
圖. 6. 變量的相關(guān)性
圖. 6. 變量的相關(guān)性
在接收到的表中找到名稱為ZZ.35的列。下表樣例取自此列。
變量
ZZ.35
RSI_cad.14
-0.0104122177
JPY.dif2
-0.0088412685
EUR.dif3
-0.0052379279
CHF.dif3
-0.0049692265
GBP.dif3
-0.0047409208
GBP.dif1
0.0044691430
MA_cad.15.dif1
-0.0039004722
JPY.dif1
-0.0023831247
GBP.dif2
-0.0015356091
EUR.dif2
-0.0013759749
CHF.dif2
-0.0012447101
EUR.dif1
0.0005863149
MA_cad.10.dif1
0.0023981433
CHF.dif1
0.0024543973
MA_gbp.5.dif1
0.0043757197
MA_cad.5.dif1
0.0075424397
MA_gbp.10.dif1
0.0094964069
EURGBP.dif1
0.0095990416
CAD.dif1
0.0110571043
表1 變量相關(guān)性
如我們所見(jiàn),有很多變量同ZZ.35的相關(guān)性小于0.01. 小于0.1的相關(guān)性無(wú)法得出獨(dú)立變量對(duì)于目標(biāo)變量產(chǎn)生影響的結(jié)論。
在這一階段我們要注意這個(gè)事實(shí),用它來(lái)對(duì)模型進(jìn)行恰當(dāng)?shù)脑u(píng)估。
在分類模型中,預(yù)測(cè)因子對(duì)于目標(biāo)變量的影響程度起到關(guān)鍵作用。在相關(guān)性低的水平,預(yù)測(cè)因子被認(rèn)為是模型中的噪聲,需要重新訓(xùn)練。當(dāng)模型考慮細(xì)節(jié)和預(yù)測(cè)因子對(duì)于目標(biāo)變量的非顯著性時(shí),就需要重新訓(xùn)練。
不存在建議的相關(guān)性水平。通常使用統(tǒng)計(jì)數(shù)字 – 5%。實(shí)際上是不正確的。移除模型中被認(rèn)為是噪聲的預(yù)測(cè)因子,可以減小預(yù)測(cè)誤差。移除模型中的非噪聲因子,會(huì)導(dǎo)致預(yù)測(cè)誤差的增加。因此,模型的預(yù)測(cè)因子列表需通過(guò)實(shí)驗(yàn)來(lái)確立。
3.3. 尺度
某些模型,如支持向量機(jī)(SVM),對(duì)預(yù)測(cè)因子的跨度非常敏感,如下說(shuō)明。例如,貨幣對(duì)EURUSD的數(shù)據(jù)在0.5內(nèi)變動(dòng),而USDJPY的數(shù)據(jù)在數(shù)十單位內(nèi)變動(dòng)。要去排除測(cè)因子不同尺度的影響,需要將他們?cè)赥ransform頁(yè)中歸一化到同一尺度下。最好將預(yù)測(cè)因子的波動(dòng)都限定在0-1之間。
要進(jìn)行尺度縮放,選擇Transform/Rescale/Scale [0-1]。之后我們勾選左右變量并按下“Run”按鈕。
3.4. 轉(zhuǎn)換成分類形式
轉(zhuǎn)換成分類形式就是說(shuō)將數(shù)字化的變量值轉(zhuǎn)換成一些分類因子。RSI指標(biāo)是第一個(gè)被轉(zhuǎn)換為多級(jí)因子的指標(biāo)。當(dāng)其值接近0或者100時(shí)被認(rèn)為趨勢(shì)即將反轉(zhuǎn)。
要將RSI指標(biāo)值變換為分類形式,選擇:Transform/Recode/KMeans。之后,將因子等級(jí)設(shè)為8. 勾選所有RSI指標(biāo)并按 "Run"。
當(dāng)設(shè)置ZZ.35變量為Ignore后,我們進(jìn)入開(kāi)發(fā)模型階段。
4. 分類模型的一般算法
下面的模型在Rattle中:
樹(shù)狀分類模型(樹(shù));
隨機(jī)森林模型(森林);
促進(jìn)樹(shù)模型(ADA);
支持向量機(jī)模型(SVM);
一般線性模型(glm);
神經(jīng)網(wǎng)絡(luò)模型(NNET)。
除了分類模型的基本區(qū)別之外,(我們不僅僅討論Rattle中提供的)他們都有下述特點(diǎn)。
讓我們選擇一個(gè)含字符串的訓(xùn)練序列(共18030個(gè)),包含預(yù)測(cè)因子(88個(gè))以及目標(biāo)變量值("long"和"short")。
任何的分類算法都是為了解決一個(gè)問(wèn)題,即從對(duì)應(yīng)于“多”的預(yù)測(cè)因子組合值中將對(duì)應(yīng)于“空”的預(yù)測(cè)因子組合值分離出來(lái)。這就是模型的訓(xùn)練階段。
緊隨其后的就是模型的驗(yàn)證。
由于我們將源數(shù)據(jù)集分成三部分,我們使用另一個(gè)數(shù)據(jù)集并考慮將預(yù)測(cè)因子的組合同在訓(xùn)練階段的數(shù)據(jù)進(jìn)行比較。如果可歸類于“多”或“空”,則任何預(yù)測(cè)因子的組合都會(huì)被建立。于驗(yàn)證數(shù)據(jù)集包含那些已知的值,其結(jié)果與實(shí)際數(shù)據(jù)進(jìn)行比較。實(shí)際的多空頭寸和預(yù)測(cè)值之間的比就是預(yù)測(cè)誤差。
如果結(jié)果不滿足我們的要求,就返回到智能數(shù)據(jù)分析階段來(lái)改進(jìn)結(jié)果。不幸的是,這一階段的預(yù)測(cè)質(zhì)量完全取決于交易者的經(jīng)驗(yàn)。對(duì)源數(shù)據(jù)集進(jìn)行改變,然后再重新開(kāi)發(fā)模型。
如果從訓(xùn)練和驗(yàn)證數(shù)據(jù)集上獲得的結(jié)果令人滿意,那么我們到測(cè)試數(shù)據(jù)集上驗(yàn)證模型,測(cè)試數(shù)據(jù)集是還沒(méi)有使用過(guò)的。
高質(zhì)量的模型不僅預(yù)測(cè)誤差要小,不同數(shù)據(jù)集在此誤差下的預(yù)測(cè)值的差異也要小。這說(shuō)明該模型的魯棒性及無(wú)需重新訓(xùn)練或者如交易者所稱的超調(diào)。
本文將僅詳細(xì)探討一個(gè)隨機(jī)森林模型。
5. 隨機(jī)森林模型
5.1. 總結(jié)
交易算法如下。一組指標(biāo)加入到貨幣對(duì)的報(bào)價(jià)中,通過(guò)分析當(dāng)前報(bào)價(jià)和指標(biāo)數(shù)據(jù)來(lái)做出交易決定。
在最簡(jiǎn)單的交易系統(tǒng)“移動(dòng)平均”系統(tǒng)中,如果當(dāng)前價(jià)格高于移動(dòng)平均價(jià)格則買(mǎi)入,低于則賣(mài)出。可以添加額外的數(shù)據(jù)如RSI指標(biāo)數(shù)據(jù)。結(jié)果,交易者得到一個(gè)決策樹(shù)。在樹(shù)的葉子節(jié)點(diǎn)是貨幣對(duì)的報(bào)價(jià),移動(dòng)平均值和RSI指標(biāo)。樹(shù)根僅包含兩個(gè)值 — “買(mǎi)”和“賣(mài)”。
上述建立決策樹(shù)的過(guò)程在分類樹(shù)模型中自動(dòng)執(zhí)行。最終僅有一顆樹(shù),或者按交易者的話說(shuō),一種模式。
單一樹(shù)的算法無(wú)法建立精確的模型,但多樣性會(huì)帶來(lái)不穩(wěn)定,這一現(xiàn)象在建立獨(dú)立的決策樹(shù)時(shí)能見(jiàn)到。
讀者可以在Rattle中的樹(shù)形模型中自行驗(yàn)證這一說(shuō)法。本模型實(shí)現(xiàn)上述建立樹(shù)的算法。
隨機(jī)森林模型中包含了許多分類樹(shù)(模式),不僅僅是一個(gè)。因此,隨機(jī)森林具有更高的抗數(shù)據(jù)變化和坑干擾能力(對(duì)目標(biāo)變量的影響很小)。
所使用的隨機(jī)森林算法的隨機(jī)性表現(xiàn)在隨機(jī)選擇表中的行(觀測(cè)值)和預(yù)測(cè)因子。和獨(dú)立樹(shù)狀分類器相比,這種隨機(jī)選擇能夠有效的抗噪聲,異常值和避免重新訓(xùn)練。
也可能顯著的提升計(jì)算效率。要建立一個(gè)獨(dú)立決策樹(shù),模型的開(kāi)發(fā)者可以從訓(xùn)練數(shù)據(jù)集中隨機(jī)選取一組觀察數(shù)據(jù)。此外,當(dāng)構(gòu)建樹(shù)過(guò)程中的每個(gè)節(jié)點(diǎn)時(shí),在確定數(shù)據(jù)集的最佳分割比例時(shí),僅考慮所有可用變量的一小部分。這樣的話對(duì)計(jì)算性能的要求就大為降低了。
因此,有理由開(kāi)發(fā)相信隨機(jī)森林樹(shù)模型是個(gè)很好的選擇。經(jīng)常需要對(duì)數(shù)據(jù)進(jìn)行預(yù)處理,因?yàn)樾枰獙?duì)數(shù)據(jù)進(jìn)行歸一化以及濾除一些異常值。無(wú)需選擇變量,因?yàn)樗惴〞?huì)有效的選擇自己的變量集。使用兩組隨機(jī)數(shù)據(jù)集(觀察和預(yù)測(cè)因子)建立了許多決策樹(shù),因此每棵樹(shù)都是一個(gè)有效的獨(dú)立模型。此模型無(wú)需在測(cè)試數(shù)據(jù)集上重新訓(xùn)練。
隨機(jī)森林算法通常會(huì)產(chǎn)生100到500棵樹(shù)。當(dāng)最終模型確定后,每棵樹(shù)做出的決策和整體做出的決策是一致的。樹(shù)集最終的決策將是占多數(shù)的樹(shù)的決策。如果100顆樹(shù)中有51顆為“多”,則“多”值將被接受,雖然可信度不高。
5.2. 算法
5.2.1. 用數(shù)據(jù)集給出一個(gè)例子
通過(guò)使用引導(dǎo)聚合或者在樣本生成過(guò)程中引入隨機(jī)性,隨機(jī)決策樹(shù)的構(gòu)建算法會(huì)生成很多決策樹(shù)。引導(dǎo)聚合的思想是將觀察值的隨機(jī)樣本聚集起來(lái)打包。許多數(shù)據(jù)包以隨機(jī)的方式生成,包含從訓(xùn)練數(shù)據(jù)集的觀察數(shù)據(jù)中選中的數(shù)據(jù)。
隨機(jī)聚合到數(shù)據(jù)包中。也就是說(shuō)每個(gè)觀察數(shù)據(jù)都有機(jī)會(huì)出現(xiàn)在特定的包中。樣本大小往往和完整的數(shù)據(jù)集一樣。實(shí)踐表明三分之二的觀察數(shù)據(jù)將被包含在包中(含重復(fù)的),三分之一將不會(huì)被包含。每一個(gè)觀察數(shù)據(jù)集都將被用作訓(xùn)練數(shù)據(jù)來(lái)構(gòu)建決策樹(shù)。另外部分的數(shù)據(jù)將被作為獨(dú)立樣本用于評(píng)估最終結(jié)果。
5.2.2. 預(yù)測(cè)因子的選擇
用于分隔數(shù)據(jù)集的預(yù)測(cè)因子的選擇,是生成隨機(jī)決策樹(shù)的第二個(gè)基本的元素。在創(chuàng)建獨(dú)立決策節(jié)點(diǎn)的每一步中,例如,在樹(shù)的每個(gè)分離點(diǎn)上,通常只會(huì)選擇隨機(jī)的很少的預(yù)測(cè)因子。僅考慮分離點(diǎn)上選擇的預(yù)測(cè)因子。使用不同的預(yù)測(cè)因子集來(lái)構(gòu)建樹(shù)的每一個(gè)節(jié)點(diǎn)。
5.2.3. 隨機(jī)性
生成數(shù)據(jù)和變量的隨機(jī)集合,他們接收由數(shù)據(jù)子集確定的不同的決策樹(shù)。這樣能夠?qū)?shù)的組合作為不同能力層次協(xié)同運(yùn)作的專家團(tuán)隊(duì),來(lái)獲得最可靠的預(yù)測(cè)結(jié)果。
采樣生成還有另一個(gè)有意的優(yōu)點(diǎn) - 計(jì)算效率。當(dāng)分割數(shù)據(jù)集時(shí)僅考慮所有預(yù)測(cè)因子的一小部分,能夠大大減少所需的計(jì)算資源。
創(chuàng)建每一顆決策樹(shù),生成隨機(jī)樹(shù)的算法通常不會(huì)削減決策樹(shù)。可以將一個(gè)帶超調(diào)樹(shù)的隨機(jī)森林開(kāi)發(fā)為一個(gè)非常好的預(yù)測(cè)模型,其在新的數(shù)據(jù)上有良好的表現(xiàn)。
5.2.4. 合成計(jì)算
當(dāng)將許多決策樹(shù)作為一個(gè)模型對(duì)待時(shí),在形成最終決策上,每顆樹(shù)的重要程度相等。結(jié)果由簡(jiǎn)單多數(shù)原則決定。也就是說(shuō)占比51%和占比99%將產(chǎn)生一樣的結(jié)果,例如“多”。
Rattle的計(jì)算只是部分,因?yàn)橛脩糇罱K得到的結(jié)果為某種類型。如果在R中使用該模型,那么就能能得到類型概率形式的結(jié)果。
5.3. 開(kāi)發(fā)一個(gè)隨機(jī)森林模型
要?jiǎng)?chuàng)建一個(gè)模型,選擇Model/Forest。使用我們的源數(shù)據(jù)計(jì)算模型將會(huì)花費(fèi)幾分鐘的時(shí)間。
我將把計(jì)算結(jié)果分為幾個(gè)部分逐一說(shuō)明。
讓我們來(lái)回顧一下圖7的結(jié)果。
圖. 7. 隨機(jī)森林模型調(diào)整后結(jié)果的上半部分。
圖. 7. 隨機(jī)森林模型調(diào)整后結(jié)果的上半部分。
這幅圖上的一些信息必須突出說(shuō)明下。
此處TREND是目標(biāo)變量。
本模型生成了500顆樹(shù)。在樹(shù)的每個(gè)分裂節(jié)點(diǎn)上,使用9個(gè)預(yù)測(cè)因子(變量)。另外,Errors按鈕和OOB ROC使我們特別感興趣的。
預(yù)測(cè)誤差看上去像這樣:
OOB 誤差估計(jì):15.97%
混和矩陣:
01class.error
0496011630.1899396
18585677 0.1312930
表 2. 訓(xùn)練集的誤差矩陣列表
應(yīng)該被理解為“包外錯(cuò)誤率15.97%”。
預(yù)測(cè)結(jié)果的錯(cuò)誤率非常明顯。搞清楚錯(cuò)誤率是如何獲得非常重要,或者準(zhǔn)確的說(shuō),是否“袋外”獲得。僅僅部分訓(xùn)練數(shù)據(jù)用于構(gòu)建此模型。此模型自己創(chuàng)造70%源數(shù)據(jù)集。約60%訓(xùn)練數(shù)據(jù)集用于構(gòu)建此模型,其余40%不被使用。這40%的數(shù)據(jù)被稱為“袋外”。15.97%的預(yù)測(cè)誤差是由這些數(shù)據(jù)得到。
繼續(xù)。
偶然性表和誤差矩陣說(shuō)明如下。
頂行包含預(yù)測(cè)的空和多頭寸。左邊一列是真實(shí)的多空頭寸,來(lái)自歷史數(shù)據(jù)上的ZigZag指標(biāo)。
坐標(biāo)(0,0)上的值4960,是預(yù)測(cè)正確的做空和做多的頭寸數(shù)量。下一個(gè)值1163是空被預(yù)測(cè)為了多的頭寸數(shù)量。
坐標(biāo)(1,0)上的值858,是多被預(yù)測(cè)為了空的頭寸數(shù)量。值5677是預(yù)測(cè)正確的做多頭寸數(shù)量。
然后讓我們來(lái)看看模型結(jié)果。
下面是包含模型所有變量的大表中的一些行。這是一個(gè)重要變量列表。
01MeanDecreaseAccuracyMeanDecreaseGini
MA_eur.5.dif142.9741.8554.86 321.86
EUR.dif337.2146.3851.80177.34
RSI_eur.1437.7040.1150.75254.61
EUR.dif2 24.6631.6438.24110.83
MA_eur.10.dif122.9425.3931.48193.08
CHF.dif3 22.9123.4230.1573.36
MA_chf.5.dif1 21.8123.2429.56135.34
表 3. 隨機(jī)森林模型中變量重要性
變量的重要性有一些評(píng)估方式。此處“重要性”反應(yīng)在特定變量對(duì)目標(biāo)變量的影響程度。影響越大,此變量越發(fā)“重要”。
此表提供數(shù)據(jù)依據(jù),用于從模型中剔除最不重要的值。在特定的統(tǒng)計(jì)和特定分類下,模型越簡(jiǎn)單越好,只要模型準(zhǔn)確率變化不大。
在Model標(biāo)簽頁(yè)中,Errors按鈕是最后一個(gè)重要的。按下它我們得到如圖.8。
圖. 8. 模型誤差和樹(shù)數(shù)量的關(guān)系
圖. 8. 模型誤差和樹(shù)數(shù)量的關(guān)系
6. 模型效率
模型效率的評(píng)估在Evaluate標(biāo)簽頁(yè)中,在Rattle中提供了相關(guān)選項(xiàng)。
我們應(yīng)該使用誤差矩陣,原先被稱為似然表,在模型效率評(píng)估可選項(xiàng)列表中。
當(dāng)你從Model標(biāo)簽頁(yè)來(lái)到Evaluate標(biāo)簽頁(yè),最新創(chuàng)建的模型將被自動(dòng)標(biāo)記。和Rattle中的一般運(yùn)作原則相符:我們創(chuàng)建并設(shè)立一個(gè)模型然后在Evaluate標(biāo)簽頁(yè)中研究其效率。
要評(píng)估模型,必須確定用于執(zhí)行檢驗(yàn)的數(shù)據(jù)集。Rattle界面中下一行選項(xiàng)是可選的源數(shù)據(jù)集。
Data的前四個(gè)選項(xiàng)對(duì)應(yīng)于分割Data標(biāo)簽頁(yè)中的數(shù)據(jù)集。選項(xiàng)為T(mén)raining(訓(xùn)練), Validation(檢驗(yàn)), Test(測(cè)試) 和 Full(整個(gè)數(shù)據(jù)集)。將數(shù)據(jù)集分割為訓(xùn)練集,效驗(yàn)集和測(cè)試集已經(jīng)討論過(guò)了。
第一個(gè)選項(xiàng)是在訓(xùn)練集上驗(yàn)證模型。通常這并不是好主意。在訓(xùn)練數(shù)據(jù)集上評(píng)估模型的問(wèn)題在于,模型本身就是從訓(xùn)練集上建立的。模型會(huì)取得很好的結(jié)果,因?yàn)橐婚_(kāi)始我們就是基于此創(chuàng)建的。模型因被用于之前未知的數(shù)據(jù)。
需要一種方法來(lái)保證模型在新數(shù)據(jù)上的表現(xiàn)。同時(shí),我們得到一個(gè)實(shí)際的模型誤差評(píng)級(jí),它反映了模型和實(shí)際數(shù)據(jù)的預(yù)測(cè)間的差異。此誤差評(píng)級(jí)是針對(duì)未知數(shù)據(jù)而非訓(xùn)練數(shù)據(jù),這是最好的評(píng)估模型效率的方法。
我們使用效驗(yàn)數(shù)據(jù)集在模型創(chuàng)建和配置階段來(lái)評(píng)估其效率。因此當(dāng)模型創(chuàng)建后,其效果將在驗(yàn)證數(shù)據(jù)集上被檢驗(yàn)。模型創(chuàng)建中的某些配置項(xiàng)可以改變。我們將基于驗(yàn)證數(shù)據(jù)集的新模型的效率和舊模型進(jìn)行比較。在這個(gè)意義上驗(yàn)證數(shù)據(jù)集用于最終模型的開(kāi)發(fā)。然而,如果依賴于驗(yàn)證數(shù)據(jù)集,仍將存在對(duì)模型效率評(píng)估的偏差。
測(cè)試數(shù)據(jù)集從頭至尾不參與模型的創(chuàng)建。一但我們基于訓(xùn)練和檢驗(yàn)數(shù)據(jù)集確定“最佳”模型后,我們就能夠在測(cè)試數(shù)據(jù)集上評(píng)估模型的效率。這是針對(duì)新數(shù)據(jù)的模型效率的評(píng)估。第四個(gè)選項(xiàng)是使用完整數(shù)據(jù)集來(lái)評(píng)估模型。完整數(shù)據(jù)集包括訓(xùn)練,檢驗(yàn)和測(cè)試數(shù)據(jù)集。這個(gè)選項(xiàng)僅用于滿足好奇心,顯然無(wú)法獲取準(zhǔn)確的模型數(shù)據(jù)。
還有一種可能就是源數(shù)據(jù)通過(guò)采樣獲取。如果Score選項(xiàng)作為評(píng)估類型選中的話。這種情況下會(huì)打開(kāi)一個(gè)可輸入附加數(shù)據(jù)的窗口。
誤差矩陣將用于預(yù)測(cè)目標(biāo)變量。
誤差矩陣對(duì)比展現(xiàn)實(shí)際結(jié)果和預(yù)測(cè)結(jié)果。有兩個(gè)表。第一個(gè)以絕對(duì)數(shù)量的形式展現(xiàn)結(jié)果,第二個(gè)以百分比形式展現(xiàn)結(jié)果。
誤差矩陣能在Rattle中的Evaluate(評(píng)估)標(biāo)簽頁(yè)中找到。按“Run”按鈕將在選定的數(shù)據(jù)集上,用已選模型來(lái)預(yù)測(cè)此數(shù)據(jù)集上每個(gè)觀測(cè)值的結(jié)果。然后預(yù)測(cè)值和實(shí)際觀測(cè)值進(jìn)行比較。
圖.9代表先前計(jì)算的隨機(jī)森林樹(shù)的誤差矩陣。
圖. 9. 隨機(jī)森林模型的評(píng)估結(jié)果
圖. 9. 隨機(jī)森林模型的評(píng)估結(jié)果
圖表顯示平均誤差為0.167,例如16.7%。在訓(xùn)練階段預(yù)測(cè)誤差為15.97%。我們可以認(rèn)為兩者相等。
讓我們?cè)跍y(cè)試數(shù)據(jù)集上計(jì)算誤差。結(jié)果如下:
在TC[測(cè)試]上的隨機(jī)森林樹(shù)模型的誤差矩陣(計(jì)數(shù)):
預(yù)測(cè)
預(yù)測(cè)
實(shí)際 01
01016256
11931248
表 4. 絕對(duì)數(shù)量形式的隨機(jī)森林樹(shù)誤差矩陣(測(cè)試數(shù)據(jù)集)
在TC[測(cè)試]上的隨機(jī)森林樹(shù)模型的誤差矩陣(百分比):
預(yù)測(cè)
預(yù)測(cè)
實(shí)際01誤差
00.370.090.20
10.070.460.13
表 5. 絕對(duì)數(shù)量形式的隨機(jī)森林樹(shù)誤差矩陣(測(cè)試數(shù)據(jù)集)
總誤差:0.1654994,平均分類誤差:0.1649244
預(yù)測(cè)誤差為16.4%。
這三個(gè)數(shù)字大致相等,模型結(jié)果是可以接受的。
請(qǐng)注意,由Rattle計(jì)算生成的模型,必須要在MetaTrader4或MetaTrader5的策略測(cè)試器中檢驗(yàn)其效率。然后應(yīng)該在模擬賬戶做測(cè)試并用小額交易量在實(shí)盤(pán)帳戶上做測(cè)試。只有所有測(cè)試都完成后我們才能得到模型的最終效果。
7. 模型改進(jìn)
當(dāng)我們研究預(yù)測(cè)因子和隨機(jī)變量ZZ.35的相關(guān)性時(shí),我們發(fā)現(xiàn)大量的預(yù)測(cè)因子和目標(biāo)變量的相關(guān)性都很弱。
讓我們剔除相關(guān)系數(shù)小于0.01的預(yù)測(cè)因子。在Data標(biāo)簽頁(yè)中將相關(guān)預(yù)測(cè)因子設(shè)置為Ignore,然后在Model標(biāo)簽頁(yè)中重新計(jì)算隨機(jī)森林模型。
我們獲得如下結(jié)果:
袋外預(yù)測(cè)誤差 = 15.77%;
驗(yàn)證集的預(yù)測(cè)誤差 = 15.67%;
測(cè)試集的預(yù)測(cè)誤差 = 15.77%.
雖然誤差沒(méi)有顯著減少,但是不同數(shù)據(jù)集上的預(yù)測(cè)誤差差異下降了。這是模型穩(wěn)定的標(biāo)志。
你可以繼續(xù)根據(jù)相關(guān)系數(shù)表格來(lái)剔除預(yù)測(cè)因子。使用由模型計(jì)算而得的預(yù)測(cè)因子重要性表格,能夠改進(jìn)模型的效率,例如,預(yù)測(cè)誤差下降。
直到剔除一個(gè)預(yù)測(cè)因子后模型的效率顯著惡化后,結(jié)束剔除預(yù)測(cè)因子的工作。當(dāng)你在一個(gè)給定數(shù)量的預(yù)測(cè)因子下獲得了一個(gè)最小且最有效的模型后,就可以隨時(shí)停止優(yōu)化了。
8. 在MetaTrader 4中使用模型
理論上,使用Rattle交易的方法如下:在Excel中為Rattle準(zhǔn)備的輸入數(shù)據(jù)可以通過(guò)一些外部工具獲取。在交易市場(chǎng)關(guān)閉后,交易者將獲取到的價(jià)格數(shù)據(jù)并存入源文件中。幾分鐘后,下一天的預(yù)測(cè)已經(jīng)做好,并且第二天開(kāi)盤(pán)后即可使用。
對(duì)于日內(nèi)交易,MetaTrader4或者類似交易終端是必須的。
要在Rattle中進(jìn)行自動(dòng)化或半自動(dòng)化交易,需要下列組織構(gòu)成:
一個(gè)訓(xùn)練后的模型,保存在R工作空間中;
進(jìn)行終端操作的類庫(kù)及R;
將新數(shù)據(jù)模塊傳遞到模型中,獲取結(jié)果以及將模型結(jié)果回傳終端的R代碼。
在Rattle中訓(xùn)練六種可用模型的方法已經(jīng)在上面介紹過(guò)了。R中的分類模型有150個(gè)之多,但是Rattle無(wú)法使用他們。
R和MetaTrader4終端交互的類庫(kù)可以在代碼庫(kù)中找到:mt4R for new MQL4。
對(duì)應(yīng)于訓(xùn)練后模型的R代碼在日志(Log標(biāo)簽頁(yè))中。所有模型發(fā)開(kāi)相關(guān)的操作都以R代碼的形式出現(xiàn),這就是可用于實(shí)盤(pán)交易的。
總結(jié)
無(wú)論是交易新手和有經(jīng)驗(yàn)的交易者都會(huì)發(fā)現(xiàn),本文對(duì)于交易系統(tǒng)的初步評(píng)價(jià)以及選擇都非常有用。
使用Rattle開(kāi)發(fā)一個(gè)人工智能交易系統(tǒng)的主要挑戰(zhàn)是如何正確選擇相應(yīng)的目標(biāo)變量以及預(yù)測(cè)因子。有經(jīng)驗(yàn)的交易者已經(jīng)有這方面的知識(shí)了,初學(xué)者則需要Rattle方面的必要經(jīng)驗(yàn)。
[1]: https://www.mql5.com/zh/articles/1165
總結(jié)
以上是生活随笔為你收集整理的python mql4_可以转发文章不?老外用随机森林预测外汇分钟涨跌准确率高达85%。求高手用python重写。...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python遍历指定文件夹的所有文件_p
- 下一篇: 用python打开视频_python读取