2017年7月14日

【MultiCharts】Adaptive Moving Averages(AMA)(附程式碼)

自適應移動平均線(Adaptive Moving Averages, AMA) 是Perry Kaufman在他的「Smarter Trading」(1995)一書中首度提出,Kaufman另一本書「New Trading Systems and Methods(2005)」可能大家比較有聽過(努力找,網路上可以找到電子書,必讀),其中討論如何做到自適應(Adaptive)效果的章節裡這本也有提到AMA。在還沒能做到Machine Learning之前,Adaptive指的就是交易系統最基本可以動態適應市場變化的概念。

AMA是EMA的進化版

均線是最普遍使用的技術指標,傳統簡單移動平均線(Simple Moving Average, SMA)缺陷就是對反轉行情反應太慢以及盤整盤被來回修理,於是後來就發展出許多改良版的均線。大家比較熟悉的指數平滑移動平均(Exponential Moving Average,EMA)的做法就是給予近期的價格較大權重,公式如下(亦可參看PowerLanguage函式「XAverage」):

EMAtoday=EMAyesterday+α×(Pricetoday−EMAyesterday)
其中α=2/N+1,N即要算的N日移動平均

算出來的移動平均線就會較貼著近期走勢,算是相當程度克服了對行情反轉時均線反應過慢的問題,但是盤整被巴的問題未解,而自適應移動平均線(Adaptive Moving Averages, AMA)則是試圖進一步解決這個問題,它的作法很簡單,基本上是沿用EMA的概念,給予近期價格較高權重,但EMA中α是固定的,AMA則依波動狀況,動態調整α,如下圖(截自「New Trading Systems and Methods(2005)」),亦即當行情雜訊小時α變大,賦予近期價格更大權重,使均線變得更敏感,可以即時反應價格變化,而當行情雜訊大時α變小,均線變得較鈍,劇烈上下震盪行情避免頻繁進場。



AMA公式解析

以下是AMA指標的公式:
其中,
Price =目前價格
SCt =平滑後的調整參數,相當於上面EMA公式理的α

整個公式架構跟EMA一樣,精妙之處就在這個SCt,它的計算目地就是達到前面講的「亦即當行情雜訊小時使均線變得更敏感,可以即時反應價格變化,而當行情雜訊大時,均線變得較鈍」。為了達到這個動態調整效果,SCt公式如下:
其中,
fastest=2/(快線極值+1),快線極值預設值2
slowtest=2/(慢線極值+1),慢線極值預設值30
其中,
ERt簡單講就是衡量一段期間內,價格走勢是趨勢盤還是盤整盤,如果期間內每天都漲或每天都跌,ERt會趨近1,進一步使SCt值變大,最後算出之AMA更敏感,反之,期間內漲脹跌跌,最後價格回到起點,ERt會趨近0,進一步使SCt值變小,算出之AMA較鈍。

PowerLanguage 程式碼

以下程式碼改自「New Trading Systems and Methods(2005)」並配合上述方程式演繹過來,其實在MultiCharts裡面可以找到技術指標「Mov Avg Adoptive」也就是我們今天探討的AMA指標。

===================================
Inputs: Period(20),fastestend(2),lowestend(30); 
Vars:ER(0),SC(1),fastest(0),slowest(0),AMA(0),diff(0),direction(0),volatilitys(0);

IF CurrentBar <= Period Then AMA = Close;


IF CurrentBar > Period Then Begin

       Diff = AbsValue(Close - Close[1]);
       direction = AbsValue(Close - Close[Period]);
       volatilitys = Summation(Diff, Period);             
       if volatilitys <> 0 then ER = direction / volatilitys;
       
       fastest=2/(fastestend+1);
       slowest=2/(lowestend+1);             
       SC = Power(ER * (Fastest - Slowest) + Slowest, 2);
       AMA = AMA[1] + SC * (Close - AMA[1]);
End;

plot1(AMA);

==================================

Power()函式是計算N次方。

程式碼很簡單,其中比較會讓人困惑的是fastestend及lowestend為什麼要各設為2跟30呢?主要的目的是要限制AMA在敏感與遲鈍間仍要有個上限,這關於平滑後調整參數SC的計算內涵,如有興趣進一步了解可以參考本文

AMA具體效果

我們把AMA、EMA以及最簡單的SMA放在K線圖來比較,如下圖,可以很清楚看出來,當行情呈現一個趨勢很強近的走勢,AMA的機制設計會自動變得很敏感,AMA就會貼著K線走,當行情是上上下下震盪(沒有趨勢),AMA降低其敏感度,避免隨著價格來回被巴。
跟其他技術指標一樣,怎麼運用還是端看個人,例如Robert Colby 在他的「 The Encyclopedia of Technical Market Indicators」一書中有針對AMA做研究與回測,提出結論就並不是很裡想: "Although the adaptive moving average is an interesting newer idea with considerable intellectual appeal, our preliminary tests fail to show any real practical advantage to this more complex trend smoothing method." 

結論

我們都知道盤勢結構不會永遠一樣,指標設計終極設計就是希望它能很”Smart”,先不講甚麼Machine learning這麼高端的技術,很簡單地,我們透過衡量波動度的變化,告訴指標要適時調整參數,這就是「Adaptive」或稱「Dynamic」的概念,很多進階指標都有這樣的設計,後面會陸續跟大家介紹。

延伸閱讀:

歡迎加入LINE@
加入好友
(點擊上方圖示)

沒有留言:

張貼留言

歡迎留言討論!