量化交易軟件:用于一組指標(biāo)信號(hào)的樸素貝葉斯分類器
條件概率模型的簡介
文章的標(biāo)題提到了 樸素貝葉斯分類器。它基于著名的 貝葉斯公式, 本文會(huì)進(jìn)行簡要的研究。它之所以被稱為 "樸素", 在于公式以隨機(jī)變量的獨(dú)立性為必要假設(shè)。指標(biāo)的獨(dú)立性將在后面討論, 但現(xiàn)在 — 是公式本身。

?(1)
其中 H 是系統(tǒng)內(nèi)部狀態(tài)的假設(shè) (在我們的案例中是行情狀態(tài)和交易系統(tǒng)的假設(shè)), E 是觀察事件 (在我們的案例中是指標(biāo)的信號(hào)), 和它們的概率描述:

編輯切換為居中
P(H) 是先驗(yàn)概率, 從觀測歷史已知, 狀態(tài) H 的概率;
P(E) 是事件 E 的總概率, 考慮了所有存在的假設(shè), 其中幾個(gè)通常存在 (應(yīng)當(dāng)注意的是, 假設(shè)必須是不相交的, 即系統(tǒng)中一次只能有一個(gè)狀態(tài); 鏈接是為那些想深入研究理論的人所提供);
P(E|H) 是假設(shè) (狀態(tài)) H 為真時(shí), 事件 E 的發(fā)生概率;
P(H|E) 是當(dāng)觀察事件 E 時(shí), 假設(shè) (狀態(tài)) H 的后驗(yàn)概率。
考察一個(gè)簡單的交易系統(tǒng)為例。行情狀態(tài)諸如走勢向上 (買入), 走勢向下 (賣出) 和橫向波動(dòng) (等待) 通常視為假設(shè) H。指標(biāo)信號(hào)描述的行情可能狀態(tài)可作為事件 E。
對(duì)于特定指標(biāo)的信號(hào), 可依據(jù)歷史數(shù)據(jù)輕松地從公式 (1) 的右側(cè)計(jì)算概率, 隨后找出行情最可能的狀態(tài) P(H|E)。
然而, 計(jì)算需要對(duì)假設(shè)和收集統(tǒng)計(jì)數(shù)據(jù)的方法進(jìn)行更明確的定義, 這將作為獲取概率的依據(jù)。
首先, 假設(shè)交易依據(jù)柱線 (而非即時(shí)報(bào)價(jià)) 進(jìn)行的。交易績效可以通過盈利, 盈利因子或其它特征來評(píng)估。但為了簡單起見, 赫茲量化將使用入場的盈虧比率。這便直接將系統(tǒng)的評(píng)估與成功交易 (使用信號(hào)) 的概率聯(lián)系起來。
赫茲量化還將限制我們的交易系統(tǒng), 不使用止盈和止損價(jià)位, 無需尾隨停止以及修改手?jǐn)?shù)。所有這些參數(shù)都可以引入到模型中, 但是它們會(huì)使概率的計(jì)算復(fù)雜化, 并將其轉(zhuǎn)化為多維分布。交易系統(tǒng)的唯一參數(shù)是以柱線為單位的持倉時(shí)間。換言之, 一旦使用指標(biāo)在選擇的方向上入場, 則在預(yù)定時(shí)間之后自動(dòng)執(zhí)行離場。這種做法的好處在于它強(qiáng)調(diào)了在報(bào)價(jià)增長或下降基礎(chǔ)上所做假設(shè)的正確性或虛假性。假設(shè)以這種純粹的形式進(jìn)行測試, 無需保障和鋪墊。
為了完滿地簡化這個(gè)話題, 赫茲量化將做出兩個(gè)激進(jìn)的舉動(dòng)。
上面提到的 "買入", "賣出" 和 "等待" 通常被視為交易假設(shè)。忽略 "等待" 將大大減少計(jì)算, 而闡述不會(huì)缺失一般性。似乎這種簡化會(huì)對(duì)獲得的結(jié)果的適用性產(chǎn)生負(fù)面影響, 至少部分如此。然而, 如果您注意到, 即便如此簡化仍需閱讀大量的材料, 那么, 您也許會(huì)同意首先取得操作模型是一件好事, 然后逐步補(bǔ)充細(xì)節(jié)。那些想要構(gòu)建更復(fù)雜模型從而研究概率密度的人可在互聯(lián)網(wǎng)上找到相應(yīng)的成果 (包括英語, 如 合并財(cái)務(wù)的推理方法技術(shù)指標(biāo), 其中描述了一種混合概率決策系統(tǒng))。
最后, 第二個(gè)也是最后一個(gè)激進(jìn)的舉措是將 "買入" 和 "賣出" 的狀態(tài)結(jié)合在一起, 但具有普遍意義 — "入場"。一款指標(biāo)的不同指向信號(hào), 通常以相似的方式對(duì)稱使用。例如, 根據(jù)指標(biāo)的超買狀態(tài)變成賣出信號(hào), 而超賣狀態(tài) — 為買入信號(hào)。
換言之, 假設(shè) H 現(xiàn)在是兩個(gè)方向 (買入或賣出) 中成功的入場。
在這些條件下, 公式 (1) 右側(cè)的概率可以根據(jù)選定的報(bào)價(jià)歷史計(jì)算如下。

由于可以在任何柱線上成功入場 — 其中一個(gè)方向變得有利可圖 (此處忽略點(diǎn)差, 因?yàn)?D1 被選為操作時(shí)間幀, 更詳細(xì)的描述如下)。
P(E) = 帶指標(biāo)信號(hào)的柱線數(shù) / 柱線總數(shù)
P(E|H) = 盈利交易方向匹配的指標(biāo)信號(hào)柱線數(shù) / 柱線總數(shù)
可以使用簡化后獲得的公式, 依據(jù)歷史數(shù)據(jù)計(jì)算所選指標(biāo)的信號(hào)指向成功交易條件的概率。

?(2)
其中 Nok 是正確信號(hào)的數(shù)量, Ntotal 是信號(hào)的總數(shù)。
用于計(jì)算任意指標(biāo)概率的框架將會(huì)稍后實(shí)現(xiàn)。如赫茲量化將看到的, 這個(gè)概率通常接近 0.5, 有必要進(jìn)行一些研究, 以便找到穩(wěn)定超過 0.5 的條件。然而, 數(shù)值較大的指標(biāo)是罕見的。對(duì)于主要研究的標(biāo)準(zhǔn)指標(biāo), 概率在 0.51-0.55 的范圍內(nèi)變化。很明顯, 這些數(shù)值太小, 更像是 "盈虧平衡", 而不能令資金穩(wěn)定地增長。
為了解決這個(gè)問題, 需要使用多個(gè)指標(biāo)而不僅僅是一個(gè)指標(biāo)。這個(gè)決定本身就不是新的, 它被大多數(shù)的交易者所使用。但是, 概率理論允許對(duì)不同組合的指標(biāo)效率進(jìn)行定量分析, 并評(píng)估潛在的影響。
公式 (1) 對(duì)應(yīng)三個(gè)指標(biāo) (A, B, C) 的情況, 將如下所示:

編輯
? (3)
應(yīng)該采用方便算法計(jì)算的形式。幸運(yùn)地是, 貝葉斯理論可應(yīng)用在許多行業(yè), 因此可以為我們的案例找到現(xiàn)成的食譜。
特別是, 有這樣的一個(gè)領(lǐng)域 樸素貝葉斯垃圾過濾。沒有必要徹底研究它。僅有基本概念是相關(guān)的。如果一份文檔 (例如, 電子郵件) 當(dāng)中包含某些特征單詞, 則它被標(biāo)記為垃圾。一般單詞在語言中出現(xiàn)的概率, 以及在垃圾中發(fā)現(xiàn)的概率是已知的。類似地, 赫茲量化已知指標(biāo)信號(hào)的一般概率及其 "命中率" 的百分比。換句話說, 為了使垃圾處理理論完全融入我們的概率交易理論中, 用 "成功交易" 來代替 "垃圾" 假設(shè), 以及 "指標(biāo)信號(hào)" 來代替 "單詞" 事件就足夠了。
那么公式 (3) 可以通過獨(dú)立指標(biāo)的概率以下列方式進(jìn)行擴(kuò)展 (見上面的計(jì)算):

編輯
?(4)
根據(jù)公式 (2) 分別計(jì)算每個(gè)指標(biāo)的 P(H|A), P(H|B), P(H|C)。
當(dāng)然, 在必要時(shí)將公式 (4) 擴(kuò)展到任意數(shù)量的指標(biāo)是很容易地。為了得出指標(biāo)數(shù)量如何影響正確交易決策的概率的想法, 假設(shè)所有指標(biāo)具有相同的概率值:

編輯
則公式 (4) 變?yōu)?
? (5)
其中 N 是指標(biāo)數(shù)量。
N 的各種數(shù)值的函數(shù)圖形顯示在如圖例 1 當(dāng)中。

編輯切換為居中
圖例. 1. 帶有不同數(shù)量隨機(jī)變量的聯(lián)合概率的外貌
因此, 在 p = 0.51, 赫茲量化得到 P(3) = 0.53, 這是不利的; 但在 p = 0.55, P(3) = 0.65, 這是一個(gè)明顯的改善。
指標(biāo)的獨(dú)立性
上面研究的公式是基于所分析的隨機(jī)過程的獨(dú)立性假設(shè), 其為這種情況下的指標(biāo)信號(hào)。但遇到這種條件了嗎?
顯然, 某些指標(biāo), 包括許多來自標(biāo)準(zhǔn)的指標(biāo), 有很多共通之處。作為直觀的圖解, 圖例 2 顯示了一些內(nèi)置指標(biāo)。

編輯切換為居中
圖例. 2. 一組相似的標(biāo)準(zhǔn)指標(biāo)
很容易看出, 相同周期的隨機(jī)指標(biāo)和 WPR 指標(biāo), 在最后一個(gè)窗口中相互交疊, 彼此幾乎重復(fù)。這并不令人驚奇, 因?yàn)樗鼈兊墓绞堑葍r(jià)的。
在屏幕截圖中的稍高處, MACD 和動(dòng)量振蕩器指標(biāo)相同, 針對(duì)移動(dòng)均線類型進(jìn)行了修正。此外, 由于都是基于移動(dòng)平均線 (MA) 來繪制的, 所以它們不能被稱為獨(dú)立于 MA 本身。
RSI, RVI, CCI 也是強(qiáng)相關(guān)的。應(yīng)當(dāng)注意的是, 幾乎所有的標(biāo)準(zhǔn)振蕩器都是相似的, 相關(guān)系數(shù)接近 1。
特別是 ATR 和 StdDev, 波動(dòng)指標(biāo)之間顯著巧合。
在形成交易系統(tǒng)的一套指標(biāo)時(shí), 應(yīng)考慮所有這些因素, 因?yàn)樗罁?jù)指標(biāo)的委員會(huì)的真實(shí)效果在實(shí)際中將遠(yuǎn)遠(yuǎn)低于理論期望。
順便說一下, 當(dāng)訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí)也會(huì)發(fā)生相同的情形。交易者們經(jīng)常用它們來嘗試處理來自眾多自愿選擇的指標(biāo)數(shù)據(jù)。然而, 喂養(yǎng)依賴載體作為輸入顯著降低了訓(xùn)練的效率, 因?yàn)榫W(wǎng)絡(luò)的計(jì)算能力被浪費(fèi)。所分析數(shù)據(jù)的容量也許看起來很大, 但其中包含的信息是重復(fù)的, 沒有意義。
針對(duì)這個(gè)問題的嚴(yán)格方法需要計(jì)算指標(biāo)和最小成對(duì)數(shù)值形成的集合之間的相關(guān)性。這是一個(gè)單獨(dú)且大范圍的研究。有興趣的人可以在互聯(lián)網(wǎng)上找到相關(guān)文章。在此, 我們所遵循的一般思路將會(huì)基于上述觀察結(jié)果。例如, 其中一組也許如下所示: 隨機(jī), ATR, AC (加速/減速) 或 WPR, 布林帶, 動(dòng)量。
應(yīng)當(dāng)注意的是, 加速/減速 (AC) 指標(biāo)本質(zhì)上是振蕩器的派生體。為什么它適合納入該組?
赫茲量化以簡化的形式來表示報(bào)價(jià)序列 (或從它們派生的振蕩器) 作為周期性振蕩, 例如余弦或正弦。這些函數(shù)的導(dǎo)數(shù)等于:

?(6)

這些函數(shù)與其導(dǎo)數(shù)的相關(guān)性為零。

?(7)

所以, 通常考慮使用指標(biāo)的一階導(dǎo)數(shù)作為額外獨(dú)立指標(biāo)的良好候選者。
另一方面, 二階導(dǎo)數(shù)在這種振蕩處理中是一個(gè)可疑的候選者, 因?yàn)榈玫皆夹盘?hào)副本的機(jī)會(huì)很高。
為了總結(jié)有關(guān)指標(biāo)獨(dú)立性的討論, 有意將參照不同周期計(jì)算的指標(biāo)副本視為獨(dú)立的。
可假設(shè)答案取決于周期的比率。輕微的差異顯然掩蓋了指標(biāo)的依賴性, 因此需要明顯的差異。這與經(jīng)典方法有部分一致, 例如 Elder 的三聯(lián)屏方法, 其時(shí)間幀通常與不同時(shí)間周期的分析指標(biāo)有相當(dāng)于 5 倍的差別。
應(yīng)當(dāng)注意的是, 在所研究的系統(tǒng)中, 不僅指標(biāo)值事實(shí)上應(yīng)是獨(dú)立變量, 且交易信號(hào)應(yīng)由它們直接產(chǎn)生。然而, 對(duì)于大多數(shù)相同類型的指標(biāo) (例如振蕩器), 交易信號(hào)產(chǎn)生的原理是相似的。所以, 時(shí)間序列的強(qiáng)弱依賴性等價(jià)于信號(hào)的強(qiáng)弱依賴性。
設(shè)計(jì)
所以, 赫茲量化已掌握了這個(gè)理論, 如今已準(zhǔn)備好去了解怎樣以及如何編碼。
指標(biāo)的交易信號(hào)統(tǒng)計(jì)將在特殊的智能系統(tǒng)中收集。為令智能系統(tǒng)能夠根據(jù)任意指標(biāo)的數(shù)值進(jìn)行交易, 有必要實(shí)現(xiàn)一個(gè)框架 (本質(zhì)上是一個(gè) mqh 頭文件), 它通過輸入?yún)?shù)獲取所用指標(biāo)和信號(hào)生成方法的描述。舉例, 在設(shè)置中應(yīng)有一個(gè)選項(xiàng)可以設(shè)置兩條不同周期的移動(dòng)平均線, 并且當(dāng)快速均線穿越慢速均線時(shí)分別產(chǎn)生買入和賣出信號(hào)。
EA 將由柱線開盤明確控制, 并以開盤價(jià)進(jìn)行交易。這不是真正的智能系統(tǒng), 而是計(jì)算概率和測試假設(shè)的工具。其重點(diǎn)是快速檢查, 因?yàn)橹笜?biāo)集合有無窮多個(gè)選項(xiàng)。。
D1 將用作省缺的操作時(shí)間幀。當(dāng)然, 沒有什么可以阻止您使用任意其它時(shí)間幀進(jìn)行分析。不過, D1 最不容易受到隨機(jī)噪聲的影響, 并且存在于若干年份中的規(guī)律性分析更符合概率方法的特異性。此外, D1 的交易策略通??梢院雎渣c(diǎn)差, 從而抵消系統(tǒng)的 "等待" 狀態(tài)。然而, 對(duì)于日內(nèi)交易, 無法做出這樣的假設(shè), 有必要計(jì)算更多假設(shè)數(shù)量的概率。
如早前所述, EA 將根據(jù)指標(biāo)信號(hào)開倉, 并在預(yù)定時(shí)間后平倉。為此目的, 引入相應(yīng)的輸入?yún)?shù)。其省缺值為 5 天。這是 D1 時(shí)間幀的一個(gè)特征周期, 它被用于眾多也使用 D1 進(jìn)行交易的研究。
EA 和框架將是跨平臺(tái)的, 也就是說, 它們將能夠在 赫茲量化中編譯和運(yùn)行。該功能將由公開的包裝頭文件提供, 這些文件允許在赫茲量化環(huán)境中使用 赫茲量化 MQL API。甚或, 在某些情況下將會(huì)條件編譯: 代碼的特定部分將封裝在 #ifdef __MQL4__ 和 #ifdef __MQL5__ 預(yù)處理程序指令中。
以 MQL 實(shí)現(xiàn)
指標(biāo)框架
處理指標(biāo)信號(hào)的框架總覽將從研究所需指標(biāo)類型開始。最明顯的枚舉包括所有內(nèi)置指標(biāo), 以及自定義指標(biāo)的 iCustom 項(xiàng)目。利用框架的輸入?yún)?shù)選擇指標(biāo)所需的枚舉。
enum IndicatorType { ?iCustom, ?iAC, ?iAD, ?tADX_period_price, ?tAlligator_jawP_jawS_teethP_teethS_lipsP_lipsS_method_price, ?iAO, ?iATR_period, ?tBands_period_deviation_shift_price, ?iBearsPower_period_price, ?iBullsPower_period_price, ?iBWMFI, ?iCCI_period_price, ?iDeMarker_period, ?tEnvelopes_period_method_shift_price_deviation, ?iForce_period_method_price, ?dFractals, ?dGator_jawP_jawS_teethP_teethS_lipsP_lipsS_method_price, ?fIchimoku_tenkan_kijun_senkou, ?iMomentum_period_price, ?iMFI_period, ?iMA_period_shift_method_price, ?dMACD_fast_slow_signal_price, ?iOBV_price, ?iOsMA_fast_slow_signal_price, ?iRSI_period_price, ?dRVI_period, ?iSAR_step_maximum, ?iStdDev_period_shift_method_price, ?dStochastic_K_D_slowing_method_price, ?iWPR_period };
每個(gè)內(nèi)置指標(biāo)的名稱包含一個(gè)帶有指標(biāo)本身參數(shù)信息的后綴。元素的第一個(gè)字符表示可用緩存區(qū)的數(shù)量, 例如: i — 一個(gè)緩沖區(qū), d — 兩個(gè), t — 三個(gè)。這只是給用戶的一個(gè)提示。如果他指定了不正確的參數(shù)數(shù)量或不存在的緩沖區(qū)索引, 框架將在日志里輸出錯(cuò)誤。
自然地, 對(duì)于每個(gè)指標(biāo), 不僅需要指定輸入?yún)?shù)中的類型, 還要指定實(shí)際參數(shù)作為字符串, 緩沖區(qū)編號(hào)和開始讀取數(shù)據(jù)的柱線編號(hào)。
還有用于產(chǎn)生信號(hào)的指標(biāo)值。理論上, 可以有任意數(shù)量的不同信號(hào), 但主要的變體將匯總在另一個(gè)枚舉當(dāng)中。
enum SignalCondition { ?Disabled, ?NotEmptyIndicatorX, ?SignOfValueIndicatorX, ?IndicatorXcrossesIndicatorY, ?IndicatorXcrossesLevelX, ?IndicatorXrelatesToIndicatorY, ?IndicatorXrelatesToLevelX };
因此, 形成信號(hào)的條件:
指標(biāo)值不為空;
指標(biāo)值帶有所需的符號(hào) (正或負(fù));
指標(biāo)穿越另一個(gè)指標(biāo) (這里應(yīng)當(dāng)注意的是, 當(dāng)描述信號(hào)時(shí), 必須提供設(shè)置 2 個(gè)指標(biāo)的能力);
指標(biāo)穿越某些等級(jí) (此處很明顯, 必須進(jìn)入等級(jí)的一個(gè)區(qū)域);
指標(biāo)相對(duì)于另一個(gè)指標(biāo)以所需的方式定位 (例如, 高于或低于);
指標(biāo)相對(duì)于給定等級(jí)以所需方式定位;
第一個(gè)元素 — '禁用' — 允許禁止產(chǎn)生信號(hào)的任何條件。我們將提供若干相同的輸入?yún)?shù)組, 用來描述信號(hào), 省缺情況下每個(gè)信號(hào)均被禁用。
從以前的枚舉項(xiàng)目的名稱可以很容易地猜出, 需要以某種方式為數(shù)值設(shè)置所需的符號(hào)以及彼此的相對(duì)行數(shù)位置。為此目的將添加另一個(gè)枚舉。
enum UpZeroDown { ?EqualOrNone, ?UpSideOrAboveOrPositve, ?DownSideOrBelowOrNegative, ?NotEqual };
EqualOrNone 允許檢查:
SignOfValueIndicatorX 組合的空值
與 IndicatorXrelatesToLevelX 組合的級(jí)別相等
UpSideOrAboveOrPositve 允許檢查:
上穿 IndicatorXcrossesIndicatorY
SignOfValueIndicatorX 數(shù)值為正
上穿 IndicatorXcrossesLevelX 的等級(jí)
如果 X 和 Y 是相同的指標(biāo), 在連續(xù)柱線上 IndicatorXrelatesToIndicatorY 的指標(biāo)值增長
如果 X 和 Y 是不同的指標(biāo), relatedToIndicatorY 的 X 高于 Y 的位置
一個(gè)指標(biāo)的位置高于 IndicatorXrelatesToLevelX 的一個(gè)等級(jí)
DownSideOrBelowOrNegative 允許檢查:
下穿 IndicatorXcrossesIndicatorY
SignOfValueIndicatorX 數(shù)值為負(fù)
上穿 IndicatorXcrossesLevelX 的等級(jí)
如果 X 和 Y 是相同的指標(biāo), 在連續(xù)柱線上 IndicatorXrelatesToIndicatorY 的指標(biāo)值下降
如果 X 和 Y 是不同的指標(biāo), relatedToIndicatorY 的 X 低于 Y 的位置
一個(gè)指標(biāo)的位置低于 IndicatorXrelatesToLevelX 的一個(gè)等級(jí)
NotEqual 允許檢查:
不等于 IndicatorXrelatesToLevelX 的一個(gè)等級(jí) (數(shù)值)
當(dāng)一個(gè)信號(hào)被觸發(fā)時(shí), 它必須被處理。為此, 我們來定義一個(gè)特殊的枚舉。