傳統的移動均線包括簡單移動均線,權重移動均線以及指數式移動均線,它們有着固有的弱點——慢趨勢和滞後。
短周期的均線系統雖然能快速反映期貨價格的走勢,但是又難以抵抗價格“噪音”的幹擾,多數情況下短周期所給出的趨勢信号并不準确。
為了避免短期噪音産生的虛假信号與長期趨勢中的滞後,考夫曼提出來“自适應的”均線系統,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
具體交易規則:
[email protected](AMA,n)>過濾器,買入
@highest(AMA,n)-AMA<過濾器,賣出
% 卡夫曼自适應移動平均線
% Written by Phillip Wan @2013/9/3
% Email:[email protected]
% 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;