2014年5月26日 星期一

順勢與逆勢策略的測試 [程式碼]

EasyTrader ArtNo 156
趨勢追隨(Trend Following)無疑是常見的交易系統。一般情況下,趨勢追隨系統的目的是根據商品、 利率、 匯率、 或股票指數的長期趨勢的方向作投資。趨勢是一定的時間範圍內被認為占主導地位的市場運動方向

趨勢可以用多種方法定義,但通常它們使用基於價格系統的移動平均交叉來描述。如果一個市場趨勢是向上的 (市場的價格是其移動平均線以上或不斷突破前高),那麼趨勢追隨系統將在這一市場作多。相反地,如果有下降趨勢 (價格都是低於其移動平均或不斷跌破前低),之後系統的趨勢將會在這一市場作空。趨勢追隨系統的的交易模型是是來自對價格反應的系統,意思它不會對未來的價格做明確的預測,它也不嘗試判斷市場頭部和底部。相反,這些模型被設計為對最近價格 運動方向作反應買入和賣出的信號完全基於已發生在市場中的價格變化,而不是可能會發生什麼事。這些特點,使趨勢追隨系統執行那些可行和可靠的策略
逆勢系統(Counter-trend Trading)是在交易策略中比較不常見的。然而,逆勢模型提供一個有系統的、 反應的買賣架構,如同趨勢追隨系統是同樣有效,但完全相反的方法。相較於趨勢追隨系統而言,逆勢系統一般持倉的時間較短、 較高交易勝率和較小的贏/輸比率。

大部分的逆勢模型找尋短期超買水準的賣點和與短期超賣水準的買點。這些目標像是等候橡皮筋,變得拉緊到了極點,然後期待它回彈到原始鬆弛的狀態。此類操作方式讓逆勢策略的模型在無方向 / 波動性市場的蓬勃發展,並迅速反應市場的轉折點。但逆勢模型的缺點就是它們經常在穩定的趨勢環境中起落。

接下來我使用一個簡單通道系統來作測試 ,觀察順勢與逆勢策略的表現

台指期 日K 留倉 交易期間 2004/5/17 ~2014/5/16 交易成本 1200
1.順勢策略 (固定及對稱的時間通道 EntryLen [M] 與多空一樣持倉時間 ExitLen [N])
當日價格創 M 日新高且空手時當日收盤時多單買進,並且持有至次 N 交易日收盤時出場
當日價格創 M 日新低且空手時當日收盤時空單賣出,並且持有至次 N 交易日收盤時出場

績效前十名如下表:



2.逆勢策略 (固定及對稱的時間通道 EntryLen [M] 與多空一樣的持倉時間 ExitLen [N])
當日價格創 M 日新高且空手時當日收盤時空單賣出,並且持有至次 N 交易日收盤時出場
當日價格創 M 日新低且空手時當日收盤時多單買進,並且持有至次 N 交易日收盤時出場

績效前十名如下表:



令人驚訝的是在逆勢策略中的表現是優於順勢策略 ,因此再測試幾種不同進場組合

3.順勢策略 (固定及對稱的時間通道 EntryLen [M] 與不固定持倉時間 ExitLen [N])
當日價格創 M 日新高且空手時當日收盤時多單買進,並且持有至次 N 交易日收盤時出場
當日價格創 M 日新低且空手時當日收盤時空單賣出,並且持有至次 N 交易日收盤時出場

績效前十名如下表: ( M = 10)


4.逆勢策略 (固定及對稱的時間通道 EntryLen [M] 與不固定的持倉時間 ExitLen [N])
當日價格創 M 日新高且空手時當日收盤時空單賣出,並且持有至次 N 交易日收盤時出場
當日價格創 M 日新低且空手時當日收盤時多單買進,並且持有至次 N 交易日收盤時出場

績效前十名如下表: ( M = 10)


5.順勢策略 (非固定及非對稱的時間通道 EntryLen [M] 與不固定持倉時間 ExitLen [N])
當日價格創 M 日新高且空手時當日收盤時多單買進,並且持有至次 N 交易日收盤時出場
當日價格創 M 日新低且空手時當日收盤時空單賣出,並且持有至次 N 交易日收盤時出場

績效前十名如下表: ( 有反手單)



6.逆勢策略 (非固定及非對稱的時間通道 EntryLen [M] 與不固定的持倉時間 ExitLen [N])
當日價格創 M 日新高且空手時當日收盤時空單賣出,並且持有至次 N 交易日收盤時出場
當日價格創 M 日新低且空手時當日收盤時多單買進,並且持有至次 N 交易日收盤時出場

績效前十名如下表: ( 有反手單)



從上面幾組報表來看
  • 1.逆勢策略的持倉時間確實是比順勢策略來的短
  • 2.非對稱式的交易邏輯績效表現比對稱式的交易邏輯好
  • 3.創新高或創新低時有較大的機會回檔/反彈作逆勢交易
程式碼如下 [有興趣讀者可以再作一些變化,例如 60 分K , 加入停損利]

input:Symmetric(1),EntryType(1),ExitType(1),LengthHigh(10), LengthLow(10),EntryLen(10),ExitLen(1) TradeProfit(0.05),TradeStopLoss(0.015),NBarL(2),NBarS(2);

vars: IsBalanceDay(False),MP(0),PF(0),PL(0),DayHigh(0),DayLow(0),NBAREL(0),NBarES(0),NBarXL(0),NBarXS(0);

MP = MarketPosition ;

if DAYofMonth(Date) > 14 and DAYofMonth(Date) < 22 and DAYofWeek(Date)= 3 then isBalanceDay = True else isBalanceDay =False ;

PF = AvgPrice*TradeProfit ;
PL = AvgPrice*TradeStopLoss ;

{ for symmetrical fix BarLen }

if Symmetric = 1 then Begin { 對稱式 }
   if Date <> Date[1] then Begin {交易日替換時先計算過去高/低點 }
       if DataCompression < 2 then Begin { 分 K週期 }
           DayHigh = HighD(0) ;
           DayLow = LowD(0) ;
           For value1 = 0 to EntryLen-1 Begin
               if HighD(Value1) > DayHigh then DayHigh = HighD(Value1) ;
               if LowD(Value1) < DayLow then DayLow = LowD(Value1) ;
           end ;
       end else begin { 日K }
           DayHigh = High ;
           DayLow = Low ;
           For value2 = 0 to EntryLen-1 Begin
               if High[Value2] > DayHigh then DayHigh = High[Value2] ;
               if Low[Value2] < DayLow then DayLow = Low[Value2] ;
           end ;
       end;
   end;
end;

{ for unsymmetrical lookback Length }
if Symmetric = 2 then Begin { 非對稱時機 }
   if Date <> Date[1] then Begin {交易日替換時先計算過去高/低點 }
       if DataCompression < 2 then Begin { 分 K週期 }
           DayHigh = HighD(0) ;
           DayLow = LowD(0) ;
           For value1 = 0 to LengthHigh-1 Begin
               if HighD(Value1) > DayHigh then DayHigh = HighD(Value1) ;
           end ;
           For value2 = 0 to LengthLow-1 Begin
               if LowD(Value2) < DayLow then DayLow = LowD(Value2) ;
           end ;
        end else begin { 日K }
           DayHigh = High ;
           DayLow = Low ;
           For value1 = 0 to LengthHigh-1 Begin
               if High[Value1] > DayHigh then DayHigh = High[Value1] ;
           end ;
           For value2 = 0 to LengthLow-1 Begin
               if Low[Value2] < DayLow then DayLow = Low[Value2] ;
           end ;
      end;
   end;
end;

{ daily K }
if EntryType = 1 then Begin { 順勢 }
    if MP = 0 and High = DayHigh then Buy this bar on Close ;
    if MP = 0 and Low = DayLow then Sell this bar on Close ;
end;

if EntryType = 2 then Begin { 逆勢}
   if MP = 0 and High = DayHigh then Sell this bar on Close ;
   if MP = 0 and Low = DayLow then Buy this bar on Close ;
end;

{ 不同出場方式 }

if ExitType = 1 then SetStopLoss(PL * BigPointValue) ;

if ExitType = 2 then Begin
   SetStopLoss(PL * BigPointValue) ;
   SetProfitTarget(PF * BigPointValue) ;
end;

if ExitType = 3 then Begin { 固定持倉時間 }
   if MP > 0 and BarsSinceEntry = ExitLen then ExitLong this bar on close ;
   if MP < 0 and BarsSinceEntry = ExitLen then ExitShort this bar on close ;
end;

if ExitType = 4 then Begin { 不固定持倉時間 }
   if MP > 0 and BarsSinceEntry = NBarL then ExitLong this bar on close ;
   if MP < 0 and BarsSinceEntry = NBarS then ExitShort this bar on close ;
end;

if ExitType = 5 then Begin
   SetStopLoss(PL * BigPointValue) ;
   SetProfitTarget(PF * BigPointValue) ;
   if MP > 0 and BarsSinceEntry = NBarL then Sell {ExitLong} this bar on close ;
   if MP < 0 and BarsSinceEntry = NBarS then Buy {ExitShort} this bar on close ;
end;

if IsBalanceDay then setExitonClose ;

沒有留言:

張貼留言