[轉(zhuǎn)] 創(chuàng)造性發(fā)展程序化交易的方法
本文不是一篇介紹如何編寫一個性能優(yōu)異模型的文章,本文的初衷是以拋磚引玉的方式來探討發(fā)展和創(chuàng)新程序化交易編程的思路、方式、方法。
人類所有的智慧和文明,來源于對歷史的積累和創(chuàng)新。在期貨交易中,交易的目的是盈利,每一次進(jìn)場和出場,都是對未來行情發(fā)展的一種預(yù)測,只是這種預(yù)測不是來自迷信,而是以歷史數(shù)據(jù)的概率統(tǒng)計(jì)和分析為基礎(chǔ),加上不斷發(fā)展和創(chuàng)新的產(chǎn)物。有人在多頭趨勢中做多,那是因?yàn)闅v史概率告訴他,趨勢大多具有慣性,不會馬上結(jié)束;有人在相對高點(diǎn)做空,同樣也是來自對歷史數(shù)據(jù)概率分析,行情總是以波浪形式在陰陽轉(zhuǎn)換中輪回發(fā)展。因此,概率統(tǒng)計(jì)和分析是交易的基礎(chǔ)和靈魂,但概率在一定范圍內(nèi)不是固定不變的,它自身也在歷史的長河中不斷發(fā)展和變化。
綜上所述,一個擬合歷史的交易模型不一定是性能優(yōu)良的模型,但一個不能擬合歷史的模型肯定不是性能優(yōu)良的程序化交易模型。
用簡單的哲理解決復(fù)雜的問題
光陰一去不復(fù)返,這是大家都知道的道理,它告戒我們要從我做起,從現(xiàn)在做起,今天的事情今天做,那么,在程序化交易的程序中,我們同樣可以用下面這一條簡單的語句告訴計(jì)算機(jī)這一哲理。
TODAY:=ZIGZAG(DATE,0,0);這樣我們可以讓計(jì)算機(jī)在IF(DATE=TODAY,…)的控制下完成今天要做的任何事情,如只在今天(也就是圖表的最后一天)統(tǒng)計(jì)/繪圖甚至交易,當(dāng)然也可以根據(jù)個人習(xí)慣有其他姊妹寫法,前提是天天向上。如:TODAY:=IF(DATE=PEAK(DATE,1,1,0),1,0);或者TODAY:=PEAK(DATE,1,1,0);
程序化交易模型設(shè)計(jì)和調(diào)試過程中,難免發(fā)現(xiàn)這樣那樣的問題。下面我們以大家非常熟悉一個簡單的均線穿透模型為例來分析其中可能出現(xiàn)的問題,以及解決方法。
MA1:=MA(CLOSE,N1);
MA2:=MA(CLOSE,N2);
CROSS(MA1,MA2),BPK;
CROSS(MA2,MA1),SPK;
這個程序化交易模型在使用中很容易出現(xiàn)指令反復(fù)和消失的現(xiàn)象,這是我們發(fā)現(xiàn)的問題,那么我們現(xiàn)在來分析問題。在K線數(shù)據(jù)中,最常用的數(shù)據(jù)有開盤價、最高價、最低價、收盤價,他們有如下特征。
分析問題:從上表價格特征和均價公式可知,導(dǎo)致指令反復(fù)和消失的原因是引用了盤中可變的CLOSE。
解決問題:一個問題可能存在多種解決途徑。下面列舉幾種常用的解決這個程序化交易模型指令反復(fù)和消失的方法。
選擇等待K線走完再發(fā)指令,即勾選文華軟件界面上的等待K線走完選項(xiàng)。
不勾選等待K線走完,但將程序化交易模型更改如下,用開盤價測試比較準(zhǔn)確,程序化交易模型執(zhí)行會在開盤價附近成交,信號顯示與指令同步,指令時效與上面等同。
MA1:=MA(CLOSE,N1);
MA2:=MA(CLOSE,N2);
REF(CROSS(MA1,MA2),1),BPK;
REF(CROSS(MA2,MA1),1),SPK;
上面兩種方法雖然能解決問題,但同時也帶來了與理想設(shè)計(jì)相比的延時現(xiàn)象,要達(dá)到理想效果,我們不妨以上穿為例來分析一下穿透的瞬態(tài),從簡單平均算法的原理及開平條件可以看出,穿透瞬態(tài)必然滿足如下條件,CLOSE=HIGH并且MA1>=MA2,并且CLOSE為MA1和MA2共用,由于HIGH具有上增長不可逆特征,在這個瞬間我們用HIGH代替與之相等的CLOSE,就可以排除指令反復(fù)和消失現(xiàn)象。當(dāng)然,這只是針對這個連續(xù)持倉的程序化交易模型,如果是斷續(xù)持倉的程序化交易模型,則還需要考慮更多問題,在接下來的[信號競爭與仲裁]中會談到。
根據(jù)MA原理可知,下面兩行代碼等價。
MA1:=MA(CLOSE,N1);
MA1:=(REF(MA(CLOSE,N1-1),1)*(N1-1)+CLOSE)/N1;
現(xiàn)在就可以用如下代碼來表達(dá)原模型的思想并解決指令反復(fù)和消失現(xiàn)象。
MA1H:=(REF(MA(CLOSE,N1-1),1)*(N1-1)+HIGH)/N1;
MA2H:=(REF(MA(CLOSE,N2-1),1)*(N2-1)+HIGH)/N2;
MA1L:=(REF(MA(CLOSE,N1-1),1)*(N1-1)+LOW)/N1;
MA2L:=(REF(MA(CLOSE,N2-1),1)*(N2-1)+LOW)/N2;
CROSS(MA1H,MA2H),BPK;
CROSS(MA2L,MA1L),SPK;
通過對歷史數(shù)據(jù)的統(tǒng)計(jì)和分析,前輩們已經(jīng)總結(jié)了很多有價值的規(guī)律,如果善于觀察,我們也許還能發(fā)現(xiàn)一些另外的不曾被重視的規(guī)律。
舉個例子,在設(shè)計(jì)追蹤止損模塊時,按照追蹤止損定義,設(shè)定獲利閥值和回撤止損值都是固定的某一數(shù)值,在實(shí)際應(yīng)用中,雖然有一定效果,但效果并不是特別理想,觀察發(fā)現(xiàn),這個止損的合理值與最近一段時期的振幅有很大關(guān)系,并且這種關(guān)聯(lián)的表現(xiàn)近似為一個頂點(diǎn)在第一象限的二次函數(shù)圖象。那么,假設(shè)D為最小止損值,X為振幅,Y為實(shí)際止損值,文華語言的函數(shù)關(guān)系式可如下表示。Y:=MAX(D,-A*SQUARE(X)+B*X+D);
止損值肯定有一定的范圍,所以必須先定義最小值D和最大值,這可以通過統(tǒng)計(jì)分析得出,同時還可以找到對應(yīng)止損最大值的幅度,設(shè)這個已知幅度為F,由于函數(shù)曲線的頂點(diǎn)在第一象限,頂點(diǎn)值即最大止損值,將已知最大止損值設(shè)定為TOP,那么可以用下面方程組計(jì)算出A和B。
-B/(2*A)=F; ①
(4*A*D-B*B)/4A=TOP;②
解上面方程組,求出A和B的解,然后將A,B,D帶入上面的函數(shù)表達(dá)式,就完成了Y(即止損值)的自適應(yīng)變化,Y將在最小止損值D到最大止損值TOP這個范圍內(nèi)根據(jù)X的變化而變化,它實(shí)際上就是上面拋物線函數(shù)在第一象限的部分連續(xù)曲線段。
通過這個例子,我們將它應(yīng)用到反手操作上,實(shí)際效果也不錯。
在編程過程中,編程邏輯相當(dāng)重要,但并不是排除了所有單條語句或單個模塊的邏輯錯誤,就代表整個模型不再有沖突,當(dāng)有這種沖突發(fā)生時,我們稱之為競爭。為方便說明問題,下面還是列舉一個簡單例子。
HIGH>REF(HHV(HIGH,4),1),BK;
LOW 很顯然,如果將上面兩條語句的條件部分應(yīng)用在持續(xù)持倉的系統(tǒng)中(只使用BPK和SPK),由于平臺有自動過濾機(jī)制,不會有多大問題,但如果將它應(yīng)用在不過濾系統(tǒng)或有混合指令的斷續(xù)交易系統(tǒng)中,若在空倉狀態(tài)下,當(dāng)本周最高價大于前四周最高價且最低價小于前4周最低價,這時在同一周期內(nèi)即做多又做空,形成了沖突,也就是我說的信號競爭,模型到底是多還是空呢?這就需要引入仲裁機(jī)制。對競爭進(jìn)行仲裁,方法很多,可以利用趨勢仲裁,也可以使用已經(jīng)發(fā)生的某一狀態(tài)或指標(biāo)等來進(jìn)行仲裁。在交易模型設(shè)計(jì)中,競爭是允許的,仲裁也不是必須的,但必須根據(jù)實(shí)際情況全面考慮各種因數(shù),然后決定是否使用仲裁。
信號競爭與仲裁更多的被應(yīng)用在對信號的分析和統(tǒng)計(jì)上。
程序開發(fā)過程中和設(shè)計(jì)完成后,都要進(jìn)行驗(yàn)證,驗(yàn)證的方法很多,既可以對單條語句或單個模塊進(jìn)行驗(yàn)證,也可以對整個程序化交易系統(tǒng)模型進(jìn)行驗(yàn)證。我們一般采用的有圖形化驗(yàn)證,歷史數(shù)據(jù)測試,K線復(fù)盤,實(shí)時模擬測試等等。經(jīng)過這些初步驗(yàn)證,各方面性能指標(biāo)達(dá)到滿意后,還要進(jìn)行一段時間的實(shí)盤驗(yàn)證。所有的驗(yàn)證過程中,都有可能發(fā)現(xiàn)新問題,只有在全部問題關(guān)閉后,才可以正式投入使用。
您需要 [注冊] 或 [登陸] 后才能發(fā)表點(diǎn)評