龙听期货论坛's Archiver

龙听 发表于 2019-6-1 10:50

国外有名的凱特國王King Keltner交易系統[古期心得]

接下來的時間,想花一些時間跟大家來報告一些國外有名的交易系統。或許各位可以從這些系統裡面找到一些自己在開發系統的想法和靈感。我想就從很有名的一本書”Building Winning Trading Systems with TradeStation”裡面的交易系統開始報告起好了。





“Building Winning Trading Systems with TradeStation”是由George Pruitt & John Hill在2003年所寫的。這本算是TradeStation的教科書吧。因為這本書就是在教我們如何操作TradeStation和如何寫Easy Language的程式。同時裡面的第六章也列出了一些範例的交易系統。今天要報告的是裡面介紹的第一個系統,叫做凱特國王系統”King Keltner Trading Strategy”。





在交易系統設計的領域中,通道是常常被拿來使用的觀念之一。像是很有名的Bollinger Band就是採用通道的觀念所設計出來的系統。我們通常會先利用一條移動平均線來作為通道的中線,然後在這條移動平均線的上方加入一個數值,讓他變成上通道。然後在這條移動平均線的下方減去一個數值,讓他變成下通道。





而上下通道應該要加減多少數值,就各有巧妙不同了。最古老的方式是直接加減移動平均線的一個比率(比如說2%),這種系統就叫做envelop trading system。如果是加減2個標準差形成上下通道的話,這種系統就叫做Bollinger Band。而Chester Keltner在1960年提出的觀念,則是在這條移動平均線上加減Average True Range,形成上下通道。





Chester Keltner的這個系統,是要在價格突破上通道的時候做多,跌破下通道的時候做空。而George Pruitt & John Hill在這本書裡面,則改進了這個系統,加入了移動平均線出場的觀念,所以他們提的進出場的方式會變成下面這樣:





Setup:40天的移動平均線上揚只做多。40天的移動平均線下跌只做空。



Entry:價位突破上通道做多。價位跌破下通道做空。



Exit:當進場之後,等待價位回到移動平均線就出場。



觀念很簡單,程式碼也不複雜。書裡面的程式碼如下:





{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;









而這個系統在 1982-2002年這20年的績效表現列出在下面這個表。
KK Performance.JPG

這個表在我看來,有一點特別引起我的興趣。就是績效表現特別好的商品就是日幣和天然氣這兩個商品。跟我這幾年的交易心得相同,看來容易操作的商品,用簡單的系統就可以得到很好的績效。







雖然King Keltner交易系統的概念很簡單,但是有一個小小的缺點,就是上下通道的寬度是固定的,也就是固定在一倍的ATR寬度。所以如果我們想要改用intraday資料來做交易的話,會想要試試看不同通道寬度,對於整體績效的影響。所以小弟在這裡做了個小小的修正,將我們可以試試看不同的通道寬度,也就是加入atrRatio這個參數。修改後的程式碼會變成是下面這樣:









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;

龙听小虎 发表于 2023-11-2 22:45

{:48:}

页: [1]