卡夫曼自适应移动均线交易系统

传统的移动均线包括简单移动均线,加权移动均线以及指数式移动均线,它们有着固有的弱点——慢趋势和滞后。


短周期的均线系统虽然能快速反映期货价格的走势,但是又难以抵抗价格“噪音”的干扰,多数情况下短周期所给出的趋势信号并不准确。


为了避免短期噪音产生的虚假信号与长期趋势中的滞后,考夫曼提出来“自适应的”均线系统,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;



卡夫策略是一种趋势跟踪策略,基于移动平均线和波动率计算,可以用Python来实现。下面是一个简单的示例代码: ```python import pandas as pd def kaufman_strategy(df, n=10, m=2, atr=10): # 计算ER df['change'] = abs(df['close'] - df['close'].shift(1)) df['volatility'] = df['change'].rolling(n).sum() df['ER'] = df['change'] / df['volatility'] # 计算SC和FCR df['SC'] = ((m - 1) * df['ATR'] + df['TR']) / m df['FCR'] = ((m - 1) * df['SC'] + df['ER']) / m # 计算KAMA df['KAMA'] = df['close'] for i in range(n, len(df)): df['KAMA'][i] = df['KAMA'][i-1] + df['FCR'][i] * (df['close'][i] - df['KAMA'][i-1]) # 生成交易信号 df['position'] = 0 df['position'][n:] = (df['KAMA'][n:] > df['KAMA'][n-1:-1].values) * 1 # 计算收益率 df['strategy_return'] = df['position'] * df['pct_chg'] return df['strategy_return'].cumsum() # 示例运行 data = pd.read_csv('data.csv', index_col='date') data.index = pd.to_datetime(data.index) data['pct_chg'] = data['close'].pct_change() data['TR'] = pd.concat([data['high']-data['low'], abs(data['high']-data['close'].shift()), abs(data['low']-data['close'].shift())], axis=1).max(axis=1) data['ATR'] = data['TR'].rolling(10).mean() kaufman_strategy(data).plot() ``` 其中,`n`代表计算ER和KAMA的移动平均周期,`m`代表计算SC和FCR的权重,`atr`代表计算ATR的移动平均周期。`df`是一个包含股票数据的DataFrame,包括日期、开盘价、最高价、最低价、收盘价等信息。最后,该函数返回一个Series,包含了Kaufman策略的收益率序列,并画出了策略的累计收益曲线。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值