天天看點

卡夫曼自适應移動均線交易系統

傳統的移動均線包括簡單移動均線,權重移動均線以及指數式移動均線,它們有着固有的弱點——慢趨勢和滞後。

短周期的均線系統雖然能快速反映期貨價格的走勢,但是又難以抵抗價格“噪音”的幹擾,多數情況下短周期所給出的趨勢信号并不準确。

為了避免短期噪音産生的虛假信号與長期趨勢中的滞後,考夫曼提出來“自适應的”均線系統,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;
           

繼續閱讀