本帖最后由 faruto 于 2011-12-28 09:38 编辑
SMA:Simple MA 简单平均线
EMA:Exp MA指数平均线
AMA:Adaptive MA 卡夫曼自适应移动平均
算法过程
卡夫曼自适应移动平均算法过程整理
http://www.matlabsky.com/thread-22095-1-1.html
对比图:
[attachimg]23054[/attachimg]
对比测试代码(测试数据使用HS300指数,数据直接从Yahoo上下载):
%% MA_EMA_AMA_Test<br />
% 脚本函数<br />
% Last Modified by LiYang 2011/12/27<br />
% Email:faruto@163.com<br />
% 程序实现测试所使用的MATLAB版本:MATLAB R2011b(7.13)<br />
% 如果程序在您本机运行不了,请首先检查您MATLAB的版本号,推荐使用较新版本的MATLAB。</p>
<p>%% A little clean work<br />
tic;<br />
clear;<br />
clc;<br />
close all;<br />
format compact;</p>
<p>%% Connect to Yahoo!<br />
Connect = yahoo;<br />
% load yhfields.mat;</p>
<p>%% Get Data from Yahoo</p>
<p>Fields = {'Close'};<br />
FromDate = '01-Sep-2011';<br />
ToDate = '26-Dec-2011';<br />
HS300 = fetch(Connect, '000300.SS', Fields, FromDate, ToDate);</p>
<p>HS300 = HS300( end:(-1):1, : );</p>
<p>MA5 = MA(HS300(:,2), 5);<br />
EMA5 = EMA(HS300(:,2), 5);<br />
AMA5 = AMA(HS300(:,2), 5);</p>
<p>%% Plot MA EMA AMA<br />
figure;<br />
plot(HS300(:,2));<br />
hold on;<br />
grid on;<br />
plot(MA5,'g');<br />
plot(EMA5,'k');<br />
plot(AMA5,'r');</p>
<p>legend('HS300', 'SMA5', 'EMA5', 'AMA5');<br />
%% Record Time<br />
toc;
AMA 卡夫曼自适应移动平均线 代码:
function AMAvalue = AMA(Price, len, fastlen, slowlen)<br />
% 卡夫曼自适应移动平均线 函数<br />
% Last Modified by LiYang 2011/12/27<br />
% Email:faruto@163.com<br />
% 程序实现测试所使用的MATLAB版本:MATLAB R2011b(7.13)<br />
% 如果程序在您本机运行不了,请首先检查您MATLAB的版本号,推荐使用较新版本的MATLAB。</p>
<p>%% 输入参数检查<br />
error(nargchk(1, 4, nargin))<br />
if nargin < 4<br />
slowlen = 30;<br />
end<br />
if nargin < 3<br />
fastlen = 2;<br />
end<br />
if nargin < 2<br />
len = 10;<br />
end</p>
<p>%% 指定AMA系数<br />
fast = 2/(fastlen + 1);<br />
slow = 2/(slowlen + 1);</p>
<p>%% 计算EMAvalue<br />
AMAvalue = zeros(length(Price), 1);<br />
AMAvalue(1:len) = Price(1:len);</p>
<p>for i = len+1:length(Price)</p>
<p> direction = abs( Price(i)-Price(i-len) );<br />
p1 = Price( (i-len+1):i );<br />
p2 = Price( (i-len):(i-1) );<br />
volatility = sum( abs(p1-p2) );<br />
% Efficiency_Ratio<br />
ER = direction/volatility;</p>
<p> smooth = ER*(fast-slow) + slow;<br />
c = smooth*smooth;</p>
<p> AMAvalue(i) = AMAvalue(i-1) + c*( Price(i)-AMAvalue(i-1) );<br />
end<br />
</p>