量化交易軟件:蒙特卡洛方法在交易策略優(yōu)化中的應(yīng)用
上面的想法即蒙特卡洛方法可以用類比的方法來描述 — 一種科學(xué)知識方法,其他類比法的例子有哈密頓(Hamilton)的視神經(jīng)機(jī)械類比于生物學(xué)中的類似器官。

編輯切換為居中
如果赫茲量化交易軟件有兩個對象可以使用相同的理論來描述,則從研究它們其中一種所獲得的知識可以用于另外一種,這種方法在一個對象比另一個更容易作研究的情況下非常有用。更容易訪問的對象可以當(dāng)作另一個對象的模型,這種方法本身被稱為建模。根據(jù)上下文,所謂模型是指兩個對象都通用的其中一個對象或者一種理論。
有的時候,研究者會錯誤理解建模的結(jié)果。當(dāng)我們探討一些明顯的例子時,例如在一個風(fēng)洞內(nèi)摧毀一個飛機(jī)的簡單復(fù)制品時,一切看起來很明顯。但是,當(dāng)對象不相關(guān)并且第一眼看來并不像的時候,結(jié)論有的時候看起來會有些奇怪,或者從基礎(chǔ)上看都很不合理。對象的通用類理論一般只能描述它們中的某些方面,所要求的對象描述精確度越低,可以應(yīng)用某個理論的對象集合就越寬。例如,只有當(dāng)光波的長度趨于零時,哈密頓的光學(xué)機(jī)械類比才是完全滿足的。在現(xiàn)實(shí)中,這種類比近似于一個小但總是有限的長度。由于任何理論模型應(yīng)該足夠簡單,作為計算和結(jié)論的基礎(chǔ),所以總是過于簡化。
現(xiàn)在讓赫茲量化交易軟件清晰了解一下蒙特卡洛方法的概念,這是以一種對于理論上有概率(隨機(jī))性質(zhì)的對象建模的方法。該模型是在按照這一理論構(gòu)建了一個算法的計算機(jī)程序,它使用的偽隨機(jī)數(shù)發(fā)生器模擬所必需的隨機(jī)變量(隨機(jī)過程)所需的分布。
值得強(qiáng)調(diào)的是(盡管我們這里并不重要),研究對象的性質(zhì)可以是概率的和確定性的。一個具有概率性質(zhì)的理論的存在對赫茲量化交易軟件來說是重要的,例如,蒙特卡洛方法用于近似計算普通積分,這是可能的,因?yàn)槿魏芜@樣的積分都可以看作是隨機(jī)變量的數(shù)學(xué)期望。
使用蒙特卡洛方法的第一個例子通常是布豐投針問題的解決方案,其中 Pi 數(shù)是由在表格上隨機(jī)投針來決定的,方法的名稱在很久之后才出現(xiàn),是在某某世紀(jì)的中葉。畢竟,賭博游戲——例如輪盤賭——是隨機(jī)數(shù)發(fā)生器。此外,對賭博的深思熟慮暗示了概率理論的起源,它從玩骰子和紙牌的計算開始。
建模程序算法簡單,這是該方法流行的原因之一。該算法具有多個隨機(jī)生成的變體(樣本)的研究對象狀態(tài)與理論對應(yīng)的分布,為它們中的每個都計算所需的特征集合,這樣,赫茲量化交易軟件就有了很多的樣本。雖然我們對所研究的對象只有一組特征,但是蒙特卡洛方法允許我們大量地獲得它們,并構(gòu)造它們的分布函數(shù),這給了我們更多的數(shù)據(jù)。
上面描述的通用蒙特卡洛建模結(jié)構(gòu)似乎很簡單,然而,當(dāng)嘗試實(shí)現(xiàn)時,它會產(chǎn)生多個甚至有時相當(dāng)復(fù)雜的變化。即使我們把我們的應(yīng)用限制在金融方面,我們?nèi)匀豢梢钥吹剿卸鄰V泛, 例如在 這本書中。我們將會嘗試把蒙特卡洛方法應(yīng)用在 EA 交易的穩(wěn)定性研究上,為此,我們需要一個概率模型來描述它們的工作。
概率性 EA 模型
在開始使用 EA 交易開始實(shí)際交易之前,赫茲量化交易軟件通常會在報價歷史上測試和優(yōu)化它。但是為什么我們會相信,過去的交易結(jié)果會影響到未來的交易結(jié)果呢?當(dāng)然,我們并不期望未來的所有交易都會形成與過去相同的順序,盡管我們還是有假定它們會有“相似性”。讓我們用概率論對這種“相似性”的直覺概念進(jìn)行形式化。根據(jù)這種形式化,我們認(rèn)為每個交易的結(jié)果都是某種隨機(jī)變量的某種實(shí)現(xiàn)。在這種情況下,交易的“相似性”是通過對應(yīng)的分布函數(shù)的接近來確定的。在這種形式化中,過去的交易有助于澄清未來的分配類型,并評估其可能的結(jié)果。 概率形式化使我們能夠構(gòu)建各種理論,讓我們考慮最簡單和最常用的一個。在這個理論中,由于各行業(yè)明確定義的相對利潤在這個理論中,由于每個交易明確定義的相對利潤k=C1/C0, 其中 C0和 C1 是交易前后的資產(chǎn)量。此外,相對交易利潤將簡單被稱為利潤,而 C1-C0 的差是絕對交易利潤。假設(shè)所有交易的利潤(無論是過去還是將來)都是相互獨(dú)立的,包括均勻分布的隨機(jī)值。它們的分布由 F(x) 分布函數(shù)決定,這樣,赫茲量化交易軟件的任務(wù)就是通過使用過去獲利交易的數(shù)值來定義這個函數(shù)的類型,這是數(shù)理統(tǒng)計的標(biāo)準(zhǔn)問題——通過樣本恢復(fù)分布函數(shù),它的任何解決方案總是提供近似答案,讓我們看看其中一些方法。
經(jīng)驗(yàn)分布函數(shù)用作近似值,
赫茲量化交易軟件使用一個簡單的離散分布,其中以交易利潤作為兩個值中的一個。這是一個虧損概率的平均虧損,或者是一個獲利概率的平均利潤。
我們構(gòu)造一個不是離散的,而是連續(xù)的(具有密度)近似的分布函數(shù)。為此,我們使用例如核密度估計這樣的方法。
此外,我們將使用第一個選項(xiàng)-它是最簡單和通用的。交易者對于了解函數(shù)本身并不是很感興趣,然而,重要的是要知道什么金額表示可能的利潤,從EA操作,其使用的風(fēng)險水平或利潤的可持續(xù)性。這些值可以通過了解分布函數(shù)來獲得。 讓我們在我們的例子中指定建模算法,我們的興趣對象就是 EA 運(yùn)行在未來的可能結(jié)果。它使用交易序列來定義是很明確的,每個交易都設(shè)置利潤值,利潤是根據(jù)上面描述的經(jīng)驗(yàn)分布來分布的,我們應(yīng)當(dāng)生成大量這樣的序列來計算它們每個可能的特性。生成這樣的序列很簡單,讓我們定義,在歷史中交易利潤的序列為 k1, k2, ..., kn,通過使用長度 N 來生成序列, 我們將會隨機(jī)(使用相等的概率 1/n) 選擇 ki (有返回的樣本) N 次。通常假定 N=n, 因?yàn)?N 較大時, F(x) 經(jīng)驗(yàn)分布的近似精確度會下降。這個版本的蒙特卡洛方法有時被稱為 bootstrap 方法,
讓我們通過圖片來解釋上面的內(nèi)容,它顯示了幾條資金曲線,它們中的每個都是根據(jù)生成的交易序列決定的。為了更方便,我使用不同的顏色對曲線做了標(biāo)記,實(shí)際上,它們的數(shù)量要大得多 — 有好幾萬。對于它們中的每一個,我們都計算所需的參數(shù)并根據(jù)其整體性做出統(tǒng)計結(jié)論,很明顯,這些特性中最重要的就是最終的利潤。

編輯切換為居中
其他形式的概率形式化和進(jìn)一步的EA操作建模也是可能的,例如,不是通過交易序列,赫茲量化交易軟件可以模擬價格序列和研究EA所獲得的總利潤。可以根據(jù)要解決的任務(wù)來選擇生成價格系列的原理,然而,這種方法需要更多的計算資源。此外,赫茲量化交易軟件目前還沒有提供使用隨機(jī)EA的常規(guī)方法。
應(yīng)用理論
赫茲量化交易軟件的任務(wù)是構(gòu)建特定的優(yōu)化標(biāo)準(zhǔn),它們中的每個都對應(yīng)某個目標(biāo),主要的一個是一系列交易所獲得的最終利潤。根據(jù)利潤優(yōu)化已經(jīng)在測試器中內(nèi)建了,由于我們對未來的利潤感興趣,所以我們應(yīng)該以某種方式來評估其目前偏離利潤的可能程度。偏差越小,系統(tǒng)的利潤越穩(wěn)定。讓我們探討三種方法。
通過蒙特卡洛方法獲得了一個可能的利潤值的大樣本,赫茲量化交易軟件可以研究它的分布和與之相關(guān)的數(shù)量。這個利潤的平均值非常重要,方差也很重要——它越小,EA的工作就越穩(wěn)定,其未來結(jié)果的不確定性也就越小。我們的標(biāo)準(zhǔn)將等于平均利潤與平均分散的比率,這與夏普比率類似。
另一個重要的特點(diǎn)是一系列交易中利潤的回撤,回撤太大可能會導(dǎo)致存款的虧損,哪怕 EA 是獲利的。為此,回撤通常會被約束。了解它會怎樣影響到可能的利潤很有用,該標(biāo)準(zhǔn)簡單地定義為平均利潤,但是條件是當(dāng)超過允許的回撤水平時,交易終止。
赫茲量化交易軟件將建立一個衡量利潤的穩(wěn)定性的持久性的貿(mào)易利潤分配。從概率論的角度,這意味著交易利潤在原則上,價格變化不穩(wěn)定的時候的 穩(wěn)定性。為此,赫茲量化交易軟件將會使用類似于前瞻測試的想法。讓我們把最初的交易樣本分為最初和最終子樣本,為了驗(yàn)證它們的同質(zhì)性,我們可以應(yīng)用統(tǒng)計學(xué)檢驗(yàn)?;谶@個測試,我們將創(chuàng)建一個優(yōu)化準(zhǔn)則。
為了演示我們的理論,我們將會使用包含在赫茲量化交易軟件標(biāo)準(zhǔn)發(fā)布包中的 "Moving Average.mq5" EA 交易。我們會在它的代碼中實(shí)現(xiàn)一些小的修改,在 EA 的開始,加上一行代碼來包含我們的頭文件:
#include <mcarlo.mqh>
加上代碼用于在 EA 的最后獲得和使用我們的優(yōu)化參數(shù):
double OnTester() ?{ ? return optpr(); ? ? ? ? // 優(yōu)化參數(shù) ?}
基本計算都是在位于 "mcarlo.mqh" 頭文件的函數(shù)中進(jìn)行的,我們把它放在 "MQL5/Include/" 文件夾下。這個文件中的主函數(shù)是 optpr(),滿足必要條件時,它計算由noptpr參數(shù)指定的優(yōu)化標(biāo)準(zhǔn),否則它就返回零。
double optpr() ?{ ? if(noptpr<1||noptpr>NOPTPRMAX) return 0.0; ? double k[]; ? if(!setks(k)) return 0.0; ? if(ArraySize(k)<NDEALSMIN) return 0.0; ? MathSrand(GetTickCount()); ? switch(noptpr) ? ? { ? ? ?case 1: return mean_sd(k); ? ? ?case 2: return med_intq(k); ? ? ?case 3: return rmnd_abs(k); ? ? ?case 4: return rmnd_rel(k); ? ? ?case 5: return frw_wmw(k); ? ? ?case 6: return frw_wmw_prf(k); ? ? } ? return 0.0; ?}
setks() 函數(shù)根據(jù)交易歷史計算出交易利潤的數(shù)組。
bool setks(double &k[]) ?{ ? if(!HistorySelect(0,TimeCurrent())) return false; ? uint nhd=HistoryDealsTotal(); ? int nk=0; ? ulong hdticket; ? double capital=TesterStatistics(STAT_INITIAL_DEPOSIT); ? long hdtype; ? double hdcommission,hdswap,hdprofit,hdprofit_full; ? for(uint n=0;n<nhd;++n) ? ? { ? ? ?hdticket=HistoryDealGetTicket(n); ? ? ?if(hdticket==0) continue; ? ? ?if(!HistoryDealGetInteger(hdticket,DEAL_TYPE,hdtype)) return false; ? ? ?if(hdtype!=DEAL_TYPE_BUY && hdtype!=DEAL_TYPE_SELL) continue; ? ? ?hdcommission=HistoryDealGetDouble(hdticket,DEAL_COMMISSION); ? ? ?hdswap=HistoryDealGetDouble(hdticket,DEAL_SWAP); ? ? ?hdprofit=HistoryDealGetDouble(hdticket,DEAL_PROFIT); ? ? ?if(hdcommission==0.0 && hdswap==0.0 && hdprofit==0.0) continue; ? ? ?++nk; ? ? ?ArrayResize(k,nk,NADD); ? ? ?hdprofit_full=hdcommission+hdswap+hdprofit; ? ? ?k[nk-1]=1.0+hdprofit_full/capital; ? ? ?capital+=hdprofit_full; ? ? } ? return true; ?}
sample() 函數(shù)從最初的a[]序列生成隨機(jī)的 b[] 序列。
void sample(double &a[],double &b[]) ?{ ? int ner; ? double dnc; ? int na=ArraySize(a); ? for(int i=0; i<na;++i) ? ? { ? ? ?dnc=MathRandomUniform(0,na,ner); ? ? ?if(!MathIsValidNumber(dnc)) {Print("MathIsValidNumber(dnc) error ",ner); ExpertRemove();} ? ? ?int nc=(int)dnc; ? ? ?if(nc==na) nc=na-1; ? ? ?b[i]=a[nc]; ? ? } ?}
下面,我們將詳細(xì)探討上面所述的三種優(yōu)化標(biāo)準(zhǔn)中的每一個,在每個例子中,我們都針對相同的時間段 - EURUSD 在2017年春/夏, 來進(jìn)行優(yōu)化。時段將總是1小時,而測試模式是1分鐘圖表的 OHLC。全都使用自定義優(yōu)化中的遺傳算法,因?yàn)槲覀兊娜蝿?wù)是證明理論而不是準(zhǔn)備實(shí)際交易的EA,這種簡單化的方法似乎是很自然的。
利潤魯棒性對隨機(jī)散射
假設(shè)我們有一個產(chǎn)生最終利潤的樣本,我們可以借助數(shù)理統(tǒng)計的方法進(jìn)行研究。面的圖像顯示了一個帶有虛線標(biāo)記的選擇中值的直方圖。

編輯切換為居中