From 藍色投機客

今天要報告的系統是”Building winning Trading Systems with TradeStation”裡面的第四個系統。這是屬於適應性(Adaptive)系統之一,所謂的適應性系統的觀念,是指這種系統的參數,會依據市場目前的狀況而自行調整。


舉例來說,Donchian Channel(也就是我最愛的Price Channel Breakout)系統,如果參數設的太短(比如說20天的價格突破),那麼在趨勢明確的市場裡就會表現的不錯,因為可以在行情剛啟動的時候就產生訊號進場。而且出場的機制也會跟蹤的比較緊密,不容易讓到手的獲利回吐出去。但是太短的參數在擺盪的市場裡,就會因為進出場訊號出現的太頻繁而導致常常被巴來巴去。所以在擺盪的市場裡,應該要把參數設得比較長一點(比如說60天的價格突破),讓訊號不要產生的那麼頻繁而導致反覆被巴的情形。而Adaptive System(適應性系統)的設計原則,就是讓系統本身的參數會依據目前市場的狀況而自行調整參數本身的值,而不是像一般人常用的固定參數值的方式。


而如何讓參數的值會依據市場狀況的變動而自行調整呢?之前報告過的ChoppyMarketIndex可以是一種方式,ADX也可以是一種方式。這兩種指標都可以指出目前市場是屬於趨勢市場或者是擺盪市場。而在這本書裡,用的則是市場的波動度來做為衡量的標準。作者認為在擺盪市場裡,市場的波動會隨著變大,所以應該要隨著增加Donchian Channel系統參數的值(在這裡用look back days),這樣比較不容易產生進反覆的出場訊號。而在趨勢市場裡,市場的走勢趨向明確,而波動度會隨著變小,因此應該要減少參數的值,讓行情一發動的時候就可以進場,也讓出場的點位追蹤的比較緊密。(藍色投機客註:我發現波動度跟市場的趨勢性不一定呈現負相關,但是為了忠於原著,所以繼續用作者的觀點來做說明。畢竟重點是要讓大家知道適應性系統Adaptive System的觀念)


在決定了採用什麼指標來代表目前市場的趨勢性之後,我們可以根據 Donchian Channel在過去歷史資料的回測,來看理想的參數值應該訂在什麼樣的上下限之間。而根據作者的一些回測顯示,參數值最低不應該低於20天,最高不應該高過60天。所以我們訂出參數值的上下限應該介於20天到60天之間。


接下來我們就來看如何界定市場的波動度。一開始的時候,這個系統會以20天的價格突破來做為基準,之後每天收盤的時候,去計算最近30天收盤價的標準差,然後用這30天收盤價的標準差來定義市場的波動度。我們也可以用ATR來代替標準差。然後每天來比較市場波動度的增減,如果市場波動度變大10%,那麼也就把look back days參數值增加10%。而如果市場波動度減少10%,那麼也就跟著把look back days參數值減少10%。


在作者第一代的Dynamic Breakout Strategy裡面,只有單純的使用Adaptive Donchian Channel 來作為進出場的系統,並且很簡單的放了一個USD$1,500的停損機制而已。而在這個第二代的Dynamic Breakout Strategy 裡面,則是加入了Adaptive Bollinger Band的濾網機制。這個Adaptive Bollinger Band計算的長度,就是用上面所計算出來的look back days的長度,也就是當收盤價要在Bollinger Band的Upband 的上方,才可以進行多方的交易。而也只有當收盤價在Bollinger Band的 Downband的下方,才可以進行空方的交易。而停損的機制也由固定USD$1,500的停損,改為Adaptive移動平均線的停損。而這個Adaptive移動平均線的計算長度,也是用上面所計算出來的look back days的長度。


所以下面就是這個系統的程式碼:

{Dynamic Break Out II by George Pruitt

This system is an extension of the original Dynamic Break Out system written

by George for Futures Magazine in 1996. In addition to the channel break out

methodology, DBS II incorporates Bollinger Bands to determine trade entry.}

Inputs: ceilingAmt(60),floorAmt(20),bolBandTrig(2.00);

Vars: lookBackDays(20),todayVolatility(0),yesterDayVolatility(0),deltaVolatility(0);

Vars: buyPoint(0),sellPoint(0),longLiqPoint(0),shortLiqPoint(0),upBand(0),dnBand(0);

todayVolatility = StandardDev(Close,30,1);

yesterDayVolatility = StandardDev(Close[1],30,1); {See how I offset the function call to get yesterday's value}

deltaVolatility = (todayVolatility - yesterDayVolatility)/todayVolatility;

lookBackDays = lookBackDays * (1 + deltaVolatility);

lookBackDays = Round(lookBackDays,0);

lookBackDays = MinList(lookBackDays,ceilingAmt); {Keep adaptive engine within bounds}

lookBackDays = MaxList(lookBackDays,floorAmt);

upBand = BollingerBand(Close,lookBackDays,+bolBandTrig);

dnBand = BollingerBand(Close,lookBackDays,-bolBandTrig);

buyPoint = Highest(High,lookBackDays);

sellPoint = Lowest(Low,lookBackDays);

longLiqPoint = Average(Close,lookBackDays);

shortLiqPoint = Average(Close,lookBackDays);


if(Close > upBand) then Buy("DBS-2 Buy") tomorrow at buyPoint stop;

if(Close < dnBand) then SellShort("DBS-2 Sell") tomorrow at sellPoint stop;

if(MarketPosition = 1) then Sell("LongLiq") tomorrow at longLiqPoint stop;

if(MarketPosition = -1) then BuyToCover("ShortLiq") tomorrow at shortLiqPoint stop;

arrow
arrow
    全站熱搜

    JinShiang 發表在 痞客邦 留言(0) 人氣()