傳統的移動均線包括簡單移動均線,加權移動均線以及指數式移動均線,它們有著固有的弱點——慢趨勢和滯后。
短周期的均線系統雖然能快速反映期貨價格的走勢,但是又難以抵抗價格“噪音”的干擾,多數情況下短周期所給出的趨勢信號并不準確。
為了避免短期噪音產生的虛假信號與長期趨勢中的滯后,考夫曼提出來“自適應的”均線系統,AMA。AMA可以在市場沿一個方向快速移動的時候,使用快的移動平均值,而在價格在橫盤的市場中拉鋸時,使用慢速的移動平均值。
AMA的計算公式為:
AMA=AMA[1]+C*(PRICE-AMA[1])
這個公式很像指數移動平均線的公式:
EMA=EMA[1]+C*(PRICE-EMA[1]),C=2/(N+1)
AMA的關鍵在于系數C,要完成抗干擾和滯后性的效果,只需當價格快速單向移動時,將C的值賦值為短周期的指數移動均線的系數,當期貨價格成橫盤狀態時,將C賦值為長周期的指數移動均線的系數即可。
如何知道價格變動時區間震蕩還是單向突破呢?引出三個概念,價格方向、波動性和效率系數。
價格方向:len個時間周期中價格的凈變化。
direction = price –price[len];
波動性,市場噪音的數量,計算時使用len個時間周期中所有單周期價格變化的總和。
volatility = @sum(@abs(price –price[1]), n);
效率系數:價格方向除以波動性,表示方向移動與噪音移動的比。
Efficiency_Ratio =direction/volativity;
接下來建立效率系數與C的聯系
整體思路是,趨勢明顯(ER=1)的時候,系數接近短周期均線系數fastest,波段明顯的時候(ER=0),系數接近長周期系數slowest
取系數的平方是讓平均線更趨近于保守,出現波段的時候應該更加謹慎。
fastest = 2/(N+1) = 2/(2+1) =0.6667;
slowest = 2/(N+1) = 2/(30+1) =0.0645;
smooth = ER*(fastest - slowest)+ slowest;
c = smooth*smooth;
為了與系統自適應特性保持一致,不能簡單的用上穿下穿均線來決定買入賣出。因此要設置一個過濾器。
過濾器=percentage*@std(AMA-AMA[1],n) @std(series,n)是n個周期標準差
小的過濾器百分數可以用于較快的交易,比如外匯與期貨市場。
大的過濾器百分數可以用于較慢的交易,比如股票和利率市場。
通常,n=20
具體交易規則:
AMA-@lowest(AMA,n)>過濾器,買入
@highest(AMA,n)-AMA<過濾器,賣出
-
% 卡夫曼自適應移動平均線
-
% Written by Phillip Wan @2013/9/3
-
% Email:hackerwanhappy@foxmail.com
-
-
% clean work
-
tic;
-
clear;
-
clc;
-
close all;
-
format compact;
-
-
-
%% 導入數據
-
Connect = yahoo;
-
Fields = {'Close'};
-
FromDate = '01-Sep-2011';
-
ToDate = '01-Sep-2013';
-
HS300 = fetch(Connect, '000300.SS', Fields, FromDate, ToDate);
-
-
n=5; %定義區間長度
-
p=0.1; %定義過濾器系數
-
fastlen=30; %定義長期平均周期
-
slowlen=2; %定義短期平均周期
-
w=HS300(:,2);
-
equity=0;
-
equityday=zeros(length(w),1);
-
s=0;
-
-
ama=zeros(length(w),1);
-
ama(1:n)=w(1:n);
-
for i=n+1:length(w)
-
%% 計算價格方向
-
direction=abs(w(i,1)-w(i-n,1));
-
%% 計算波動性
-
p1=w(i-n:i-1);
-
p2=w(i-n+1:i);
-
vol=sum(abs(p1-p2));
-
-
if vol~=0
-
%% 計算效率系數(ER)
-
er=direction/vol;
-
fast=2/(fastlen+1);
-
slow=2/(slowlen+1);
-
smooth=er*(fast-slow)+slow;
-
c=smooth*smooth;
-
%% 計算AMA
-
ama(i)=ama(i-1)+c*(w(i,1)-ama(i-1));
-
else
-
ama(i)=ama(i-1);
-
end
-
-
%% 設置過濾器
-
amaminus=zeros(n-1,1);
-
for t=i-n+1:i
-
amaminus(t,1)=ama(t,1)-ama(t-1,1);
-
end
-
k=p*std(amaminus);
-
-
%% 根據過濾器進行交易
-
if ama(i)-min(ama(i-n:i))>k
-
s=s+1;
-
equity=equity-w(i)*300;
-
else if max(ama(i-n:i))-ama(i)<k
-
s=s-1
-
equity=equity+w(i)*300;
-
end
-
end
-
equityday(i,1)=equity+s*w(i)*300;
-
end
-
-
-
%% 作圖
-
figure;
-
subplot(2,1,1);
-
plot(HS300(:,2));
-
hold on;
-
grid on;
-
plot(ama,'g');
-
legend('HS300','AMA');
-
subplot(2,1,2);
-
plot(equityday);
-
grid on;
評論前必須登錄!
立即登錄 注冊