接下來(lái)的時(shí)間,想花一些時(shí)間跟大家來(lái)報(bào)告一些國(guó)外有名的交易系統(tǒng)?;蛟S各位可以從這些系統(tǒng)裡面找到一些自己在開(kāi)發(fā)系統(tǒng)的想法和靈感。我想就從很有名的一本書(shū)”Building Winning Trading Systems with TradeStation”裡面的交易系統(tǒng)開(kāi)始報(bào)告起好了。
“Building Winning Trading Systems with TradeStation”是由George Pruitt & John Hill在2003年所寫(xiě)的。這本算是TradeStation的教科書(shū)吧。因?yàn)檫@本書(shū)就是在教我們?nèi)绾尾僮鱐radeStation和如何寫(xiě)Easy Language的程式。同時(shí)裡面的第六章也列出了一些範(fàn)例的交易系統(tǒng)。今天要報(bào)告的是裡面介紹的第一個(gè)系統(tǒng),叫做凱特國(guó)王系統(tǒng)”King Keltner Trading Strategy”。
在交易系統(tǒng)設(shè)計(jì)的領(lǐng)域中,通道是常常被拿來(lái)使用的觀念之一。像是很有名的Bollinger Band就是採(cǎi)用通道的觀念所設(shè)計(jì)出來(lái)的系統(tǒng)。我們通常會(huì)先利用一條移動(dòng)平均線(xiàn)來(lái)作為通道的中線(xiàn),然後在這條移動(dòng)平均線(xiàn)的上方加入一個(gè)數(shù)值,讓他變成上通道。然後在這條移動(dòng)平均線(xiàn)的下方減去一個(gè)數(shù)值,讓他變成下通道。
而上下通道應(yīng)該要加減多少數(shù)值,就各有巧妙不同了。最古老的方式是直接加減移動(dòng)平均線(xiàn)的一個(gè)比率(比如說(shuō)2%),這種系統(tǒng)就叫做envelop trading system。如果是加減2個(gè)標(biāo)準(zhǔn)差形成上下通道的話(huà),這種系統(tǒng)就叫做Bollinger Band。而Chester Keltner在1960年提出的觀念,則是在這條移動(dòng)平均線(xiàn)上加減Average True Range,形成上下通道。
Chester Keltner的這個(gè)系統(tǒng),是要在價(jià)格突破上通道的時(shí)候做多,跌破下通道的時(shí)候做空。而George Pruitt & John Hill在這本書(shū)裡面,則改進(jìn)了這個(gè)系統(tǒng),加入了移動(dòng)平均線(xiàn)出場(chǎng)的觀念,所以他們提的進(jìn)出場(chǎng)的方式會(huì)變成下面這樣:
Setup:40天的移動(dòng)平均線(xiàn)上揚(yáng)只做多。40天的移動(dòng)平均線(xiàn)下跌只做空。
Entry:價(jià)位突破上通道做多。價(jià)位跌破下通道做空。
Exit:當(dāng)進(jìn)場(chǎng)之後,等待價(jià)位回到移動(dòng)平均線(xiàn)就出場(chǎng)。
觀念很簡(jiǎn)單,程式碼也不複雜。書(shū)裡面的程式碼如下:
{King Keltner by George Pruitt—based on trading system presented by Chester Keltner}
Inputs: avgLength(40), atrLength(40);
Vars: upBand(0),dnBand(0),liquidPoint(0),movAvgVal(0);
movAvgVal = Average((High + Low + Close)/3,avgLength);
upBand = movAvgVal + AvgTrueRange(atrLength);
dnBand = movAvgVal - AvgTrueRange(atrLength);
if(movAvgVal > movAvgVal[1]) then Buy ("KKBuy") tomorrow at upBand stop;
if(movAvgVal < movAvgVal[1]) then Sell Short("KKSell") tomorrow at dnBand stop;
liquidPoint = movAvgVal;
If(MarketPosition = 1) then Sell tomorrow at liquidPoint stop;
If(MarketPosition = -1) then Buy To Cover tomorrow at liquidPoint stop;
而這個(gè)系統(tǒng)在 1982-2002年這20年的績(jī)效表現(xiàn)列出在下面這個(gè)表。
這個(gè)表在我看來(lái),有一點(diǎn)特別引起我的興趣。就是績(jī)效表現(xiàn)特別好的商品就是日幣和天然氣這兩個(gè)商品。跟我這幾年的交易心得相同,看來(lái)容易操作的商品,用簡(jiǎn)單的系統(tǒng)就可以得到很好的績(jī)效。
雖然King Keltner交易系統(tǒng)的概念很簡(jiǎn)單,但是有一個(gè)小小的缺點(diǎn),就是上下通道的寬度是固定的,也就是固定在一倍的ATR寬度。所以如果我們想要改用intraday資料來(lái)做交易的話(huà),會(huì)想要試試看不同通道寬度,對(duì)於整體績(jī)效的影響。所以小弟在這裡做了個(gè)小小的修正,將我們可以試試看不同的通道寬度,也就是加入atrRatio這個(gè)參數(shù)。修改後的程式碼會(huì)變成是下面這樣:
Inputs: avgLength(40), atrLength(40),atrRatio(2);
Vars: upBand(0),dnBand(0),liquidPoint(0),movAvgVal(0);
movAvgVal = Average((High + Low + Close)/3,avgLength);
upBand = movAvgVal + atrRatio * AvgTrueRange(atrLength);
dnBand = movAvgVal - atrRatio * AvgTrueRange(atrLength);
if(movAvgVal > movAvgVal[1]) then Buy ("KKBuy") tomorrow at upBand stop;
if(movAvgVal < movAvgVal[1]) then Sell Short("KKSell") tomorrow at dnBand stop;
liquidPoint = movAvgVal;
If(MarketPosition = 1) then Sell tomorrow at liquidPoint stop;
If(MarketPosition = -1) then Buy To Cover tomorrow at liquidPoint stop;