close


這篇文章是Stocks & Commodities2010年10月的文章,這裡提出適應性均線的新概念。並附上TradeStation的程式碼及測試報告。值得研究程式交易的你,花時間好好一讀。

(By John
 Ehlers and Ric Way)


所有平滑過的指標和移動平均都會有落後價格的情形發
生,
這是由於平滑的過程使用到過去的資料,
也就是說,計算出來的平均值包含了過去好幾根K棒前的價格。
這邊就以EMA作為例子在價格平滑及追蹤之間取得平衡。


EMA(Exponential Moving Average) 指數移動平均
EMA是取現在的價格乘上一個平滑因子α,α為一個小於1的分數,
再加上前一根K棒的的EMA乘上(1-α)所得,
也因為先前取得的價格會以指數遞減,
因此稱為指數移動平均,以公式來表示的話如下:
EMA = α*Price + (1-α)*EMA[1]

EMA與簡單移動平均(SMA)的關係最早在1984
Technical Analysis of STOCKS & COMMODITIES
中被提及,

作者是S&C founder Jack Huston。
在文章中提出了EMA的平滑因子與簡單移動平均(SMA)的關係如下:
α=2/(Length+1)

 
上述式子的詳細數學推導過程,
可以在作者John Ehlers的書中 Rocket Science For Traders中找到,
有興趣研究的讀者可以去找來看看。


這邊提出了EMA與價格的差距,以一個誤差項 Price-EMA[1]來表示,
並給誤差項一個參數Gain,得到一個新的式子EC
EC = α*(Price+Gain*(Price-EC[1])) + (1-α)*EC[1]

Gain0的時候,ECEMA相等,而當Gain的數值夠大的時候,
誤差項會使得EC更精準的追蹤價格,
同時造成沒有平滑的效果。
因此要找到一個在價格平滑及追蹤之間能夠取得平衡的Gain參數。


Zero-lag 指標

指標先定義兩個使用者輸入的參數,LengthGainLimit
接下來在變數宣告後是平滑因子α和EMA的運算。
接著是以迴圈來找最小誤差值LeastError
在計算的過程中找到更低的error值時,
便將新的 BestGain LeastError值記錄下來。
完成迴圈計算後,將剛剛運算過程中得到的BestGain值做為計算EC指標用。
最後將ECEMA畫在線圖上。


inputs:
Length(20),
GainLimit(50),
Thresh(1);

vars:
alpha(0),
Gain(0),
BestGain(0),
EC(0),
Error(0),
LeastError(0),
EMA(0);


alpha = 2/(Length+1);
EMA = alpha*C+(1-alpha)*EMA[1];
LeastError = 1000000;
For Value1 = -GainLimit to GainLimit begin
Gain = value1/10;
EC = alpha*(EMA+Gain*(C-EC[1]))+(1-alpha)*EC[1];

Error = C-EC;
If absvalue(Error) < LeastError then begin
LeastError = absvalue(Error);
BestGain = Gain;
end;
end;

plot1(EC);
plot2(EMA);
 

 
Step Function測試,參數的部分Length設為12GainLimit設為50
如下圖所示。黃色線是
EC指標,紅色線是EMA指標,
EC
指標上升及下降的速度明顯較EMA快。

 

另一個壓力測試,評估指標對於wave-like數據的狀態。
參數的部分Length設為12GainLimit設為50
黃色線是EC指標,紅色線是EMA指標,
下圖為3個循環,20K棒長度的測試結果,
根據圖形可以考慮使用兩條線交叉的部分做為進出場的訊號。
 
 



zero-lag指標應用在實際的市場上,價格使用收盤價。
下圖將zero-lag指標應用在Microsoft近一年的資料上,Length設為32GainLimit設為22
黃色線是EC指標,紅色線是EMA指標。當Gain Limit值較高時,EC會精確的追蹤收盤價,
所以這邊不使用GainLimit的最大值,如此一來會提供相對於EMA的領先指標。


但是當
Least error相當小時,ECEMA幾乎是相同的數值,
在這種情形下會造成兩條線不斷的交叉,並一直發出交易訊號。
可以設定另外的條件來降低這種交易情形,當
ECEMA兩條線交叉時,
要同時滿足
LeastError必須大於某個門檻。
策略程式碼如下,這邊增加了一個
Thresh參數做為門檻值使用。

inputs:
Length(20),
GainLimit(50),
Thresh(1);

vars:
alpha(0),
Gain(0),
BestGain(0),
EC(0),
Error(0),
LeastError(0),
EMA(0);


alpha = 2/(Length+1);
EMA = alpha*C+(1-alpha)*EMA[1];
LeastError = 1000000;
For Value1 = -GainLimit to GainLimit begin
Gain = value1/10;
EC = alpha*(EMA+Gain*(C-EC[1]))+(1-alpha)*EC[1];

Error = C-EC;
If absvalue(Error) < LeastError then begin
LeastError = absvalue(Error);
BestGain = Gain;
end;
end;

EC = alpha*(EMA+BestGain*(C-EC[1]))+(1-alpha)*EC[1];

print(Date, time, LeastError, 100*LeastError/C );

if EC crosses over EMA {and 100*LeastError/C > Thresh} then
buy next bar on open;
if EC crosses under EMA {and 100*LeastError/C > Thresh} then
sellshort next bar on open;

 

使用zero-lag 策略回測MSFT 100股五年期間,
 參數設定Length=32GainLimit=22Thresh=0.7的獲利狀況及資金曲線如下

Net proftit
$3,107
#Trades
20
Profit/trade
$155
%Profitable trades  60%
Profit factor  4.1
 

  

 


 


 
 Zero-lag是適應性技術分析上一個新的概念,
 運用兩個指標間測量出的一個誤差項完成一個簡單但有效的策
略。




 
arrow
arrow
    全站熱搜

    trading16888 發表在 痞客邦 留言(1) 人氣()