股票交易軟件:以橫盤和趨勢行情為例強化策略測試器的指標優(yōu)化
問題
有太多的參數(shù)可以優(yōu)化。

帶有多個指標的智能交易程序需要花費大量時間來組合參數(shù)進行測試。在我們開始優(yōu)化智能交易程序之前能否降低組合的數(shù)量?換言之, 在編寫交易 EA 之前, 我們可以編寫偽 EA. 只針對行情查詢特殊問題。我們將一個大問題細分為一個個小問題, 并分別解決他們。這個偽 EA 不可進行交易!作為例子, 我們選擇了 ADX. 并檢查此指標是否能夠區(qū)分橫盤行情和趨勢行情, 可能的話, 我們也許能夠獲得額外的信息。赫茲量化軟件
想象一款短線交易 EA, 依據(jù)行情是否橫盤來進行 '振蕩-交易' (回至移動均線) 或應用趨勢策略進行順交易 (沿著移動均線交易)。為了區(qū)分, 我們的交易 EA 應在較高的時間幀使用 (唯一) ADX - 此處是 1 小時柱線。除了 ADX, 交易 EA 也許還有 5 個指標 (用于短線交易管理)。每個指標大概有 4 個設置參數(shù), 并且由于它們的步長較小所以它們當中的每一個都有 2000 個不同的數(shù)值。這將總計產(chǎn)生 2000*5*4 = 40,000。讓我們現(xiàn)在來加入 ADX。對于 ADX 的每個參數(shù)組合, 理論上, 我們要進行額外的 40,000 次計算。赫茲量化軟件
在此例中我們設置 ADX 的周期 (PER), 它的價格 (PRC) 和極限 (LIM), 因此我們定義趨勢開始為 ADX (MODE_MAIN) 上穿 LIM, 而橫盤行情為下穿 LIM。對于周期 PER 我們可以嘗試 2,..,90 (步長 1=> 89 不同的數(shù)值), 對于價格我們可以選擇 0,..,6 (=收盤價,.., 加權, 步長 1=> 7), 而對于 LIM 我們嘗試 4,..,90 (步長 1=> 87)??傆嬑覀円M行 89*7*87 = 54,201 次組合測試。這里是策略測試器的設置:赫茲量化軟件
如果您要重復優(yōu)化, 不要忘記刪除在 \tester\cache\ 里的緩存文件。否則您將發(fā)現(xiàn)在策略測試器里的優(yōu)化結(jié)果和優(yōu)化圖形并未保存在 csv-文件, 因為在此情況下 OnTester() 根本就未執(zhí)行。赫茲量化軟件
當然, 一般人會通過策略測試器使用這個參數(shù)范圍來優(yōu)化, 但首先我們應查找無意義的結(jié)果, 看看我們能否檢測并排除它們, 其次是有無教育理由來擴展范圍。由于事實上我們的偽 EA 不會交易 (無需使用每筆分時!) 且我們只有一個指標和 54,201 次組合來測試, 我們可以關閉遺傳模式并讓測試器計算所有組合。赫茲量化軟件
如果我們不做這個預-Adx-優(yōu)化 或者我們不能降低 Adx 參數(shù)組合的數(shù)量, 我們將不得不把交易 EA 其它變量的 40,000 次組合乘以 ADX 的 54,201 次組合, 然后我們將得到 2,168,040,000 次組合來優(yōu)化 - 工作量很大, 以至于我們不得不使用遺傳優(yōu)化。赫茲量化軟件
最后我們可以大幅降低 Adx 的參數(shù)范圍 - 這很好, 符合預期!我們將會更好地理解 ADX, 因為我們能夠看到 ADX 確實有能力在橫盤和趨勢行情之間進行鑒別 - 即使判斷橫盤行情略滯后于趨勢行情 (改進的余地?)!進而, 我們會有一些想法, 根據(jù)所發(fā)現(xiàn)的橫盤和趨勢行情的范圍來確定交易 EA 的止損和目標。測試的 ADX 周期 PER 從: 11..20 (步長 1=> 10), PRC: 0,6 (步長 6=>2) 以及 LIM: 17,..,23 (步長 1=> 7) - 總計 140 組合。這意味著, 我們僅用 4,680,000 次組合即可替換 2,168,040,000 詞組和來測試交易 EA, 即在非遺傳模式, 速度快了 ~460 倍, 或比遺傳模式快了 ~460 倍。在遺傳模式, 測試僅需 ~10.000 遍, 但現(xiàn)在交易 EA 的其它參數(shù)的更多數(shù)值也被測試!赫茲量化軟件
備注, 如果您使用遺傳算法: 其結(jié)果很大程度上要依據(jù)可用組合總數(shù)和實際執(zhí)行遍數(shù)的關系。在優(yōu)化期間您遇到的最壞結(jié)果, 比較小的是來自下一組選擇設置的優(yōu)良結(jié)果數(shù)量。赫茲量化軟件
理念
我們建立的偽 EA 不進行交易。它只實現(xiàn)了三個重要功能。OnTick(), 在此我們查驗指標并判斷行情狀態(tài), OnTester() 在此我們輸出最終結(jié)果到我們的 csv 文件, 還有 calcOptVal() 在此我們計算 OptVal 值, 它將由 OnTester() 返回到策略測試器用于排序和遺傳算法。函數(shù) OnTester() 將會在一次優(yōu)化過程的結(jié)尾調(diào)用, 返回一個特殊值, 且它在 csv 文件里添加一個新行用來在整個優(yōu)化完成后進行分析。
偽 EA, 第一種方法
現(xiàn)在我們需要確定準則用來計算返回值:?OptVal。我們選擇橫盤和趨勢行情的范圍, 即實際行情中最高價的最高值與最低價的最低值之間的差價, 以及 "TrndRange" 除以 "FlatRange" 以便優(yōu)化可以將其最大化:
double?? TrndRangHL,?????? // 趨勢行情的 (最高價最高值 - 最低價的最低值) 之和???????? TrndNum,??????????// 趨勢行情的編號???????? FlatRangHL,?????? // 橫盤行情的 (最高價最高值 - 最低價的最低值) 之和???????? FlatNum,??????????// 橫盤行情的編號???????? RangesRaw,????????// 趨勢行情范圍除以橫盤行情的范圍 (越大越好)???????? // ... ? ? ? ? ? ?參閱以下double calcOptVal() // 第一種方法?。?? {
??????FlatRange????= FlatRangHL / FlatNum;
??????TrndRange????= TrndRangHL / TrndNum;
??????RangesRaw????= FlatRange>0 ? TrndRange/FlatRange : 0.0;
??????return(RangesRaw);
?? }
...double OnTester()
?? {
??????OptVal = calcOptVal();
??????return( OptVal );
?? }
可笑的高關聯(lián)!如果我們查看 csv 文件, 我們會看到橫盤行情的平均長度為 1 根柱線, 而開關數(shù)量 (橫盤行情編號 + 趨勢行情編號) 對于實際應用也太小了。(奇怪的數(shù)字 PRC=1994719249 而非 0,..,6 應該不會干擾我們, 因為 Adx 的價格正確數(shù)字被寫在 csv 文件里!)。赫茲量化軟件
這個不令人滿意的結(jié)果意味著, 我們必須多補充一些準則, 以排除那些可笑的情況。