楼主: 挖矿专家
2889 1

[源码分享] 【每日一策】Matlab量化交易策略之 Aberration [推广有奖]

  • 0关注
  • 74粉丝

讲师

22%

还不是VIP/贵宾

-

威望
0
论坛币
2016 个
通用积分
5.2622
学术水平
21 点
热心指数
21 点
信用等级
21 点
经验
6055 点
帖子
403
精华
0
在线时间
151 小时
注册时间
2017-2-8
最后登录
2017-6-27

楼主
挖矿专家 发表于 2017-3-24 17:16:16 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

Aberration 交易系统由Keith  Fitschen 于 1986  年发明,1993  年Keith Fitschen 将该系统商业化发布在 Future Trust 杂志上,自发布之日起,该系统业绩一直名列前茅,在1997 年、2001 年、2005 年已发布交易系统的业绩排名中该系统 均排名前十。该交易系统的特点是同时交易在8 种不同的品种上,包括谷物、肉类、金属、能源、外汇、金融以及股指期货等。Aberration交易系统的交易频率常常是每年交易某一品种3-4  次,60%的时间都持有仓位,平均每笔交易持仓 60  天。它通过长线交易捕捉趋势来获取巨额利润。那它如何来弥补亏损呢?因为它同时交易在多个不相关的市场, 当某一品种损失时,另一品种可能获利。在一年的时间里,总是有某一种或者多种品种能获得巨额利润。这些大的利润弥补了那些没趋势市场的小额亏损。Aberration交易系统对资金进行组合管理,因此可以接受比较大的资金量。

//类别:中长线
中轨 Mid = MA(CLOSE,M)
上轨 Upper = MA(CLOSE,M) + N*STD(CLOSE,M);
下轨 lower = MA(CLOSE,M) - N*STD(CLOSE,M)

开多条件:= 前一时刻的close低于上轨,此时的价格高于上轨
开空条件:= 前一时刻的close高于下轨,此时的价格低于上轨
平多条件:=  close 中轨以下
平空条件:=  close 中轨以上

一个好的交易策略要很好的配置资金。上面的策略每次开单数量相同,仅用于研究择时。


回测曲线(由Auto-trader提供回测报告)

Aberration.png

策略源码:

function Aberration(bInit,bDayBegin,cellPar)%%% 函数说明%  上面的三个参数是一种固定结构。%  当在调用该函数如 DualThrust(a1,a2,a3,a4,a5,...).所有的参数都会被赋值给cellPar,即cellPar={a1,a2,a3,a4,a5,...}%  bInit,在策略逻辑运行前为1,类似优矿等平台的initialize函数。当开始判断是否下单后,该变量为0.%  bDayBegin 在一天的第一根Bar为1,其他时刻为0%% 外部和全局参数声明,这是一个固定结构.    global g_idxKDay; % 注册日数据的index.日数据是分钟数据的合成.如在日中获取,当日的数据仅是当日已出现数据的合成,不包含之后的数据。                           global g_idxSignal;    global openPrice; %记录开盘价    global histExtre; %记录历史达到的极值点,用于跟踪止盈    m=cellPar{1};                                n=cellPar{2};                                                       stoploss = cellPar{3};                       stopprofit = cellPar{4};                     trailinggap = cellPar{5};                                  %% 初始化回测帐户    if bInit        traderSetParalMode(false);%默认是true,因子计算函数并行执行,速度快,不能调试,false串行执行可以设断点调试        g_idxKDay = traderRegKData('day',1);% 只有注册之后才能获取数据。分钟数据的获取方法为 traderRegKData('min',1)。后面的数字是刷新频率。        g_idxSignal = traderRegUserIndi(@getSignal,{g_idxKDay,m,n}); %计算因子。调用需要函数如getRange,大括号内是输入参数        openPrice = containers.Map;        histExtre = containers.Map;%% 交易逻辑    else        targetList = traderGetTargetList(); % 获取标的信息。        TLen = length(targetList);          dSignal = traderGetRegUserIndi(g_idxSignal,1);        [mp,~,~]=traderGetAccountPositionV2(1,1:TLen);        % ――――――――――――――――――调仓―――――――――――――――――――        for i=1:TLen           dataDay = traderGetRegKData(g_idxKDay(i,:),1,false);           % 数据长度足够;数据非空;当日的成交价不为0;当日高低不同           if isempty(dSignal(i,:)) || isempty(dataDay) || dataDay(6,end) ==0 || dataDay(3,end)- dataDay(4,end)==0                continue;           end                      %%平仓,信号依次为反转平仓、止损平仓、跟踪止损平仓           %多单           closeBuy1 = mp(i)>0 && (dSignal(i,end)<0);           closeBuy2 = mp(i)>0 && (dataDay(5,end)<openPrice(targetList(i).Code)*(1-stoploss));           closeBuy3 = mp(i)>0 && (histExtre(targetList(i).Code)>openPrice(targetList(i).Code)*(1+stopprofit) && ...               dataDay(5,end)<histExtre(targetList(i).Code)*(1-trailinggap));           %空单           closeSell1 = mp(i)<0 && (dSignal(i,end)>0);           closeSell2 = mp(i)<0 && (dataDay(5,end)>openPrice(targetList(i).Code)*(1+stoploss));           closeSell3 = mp(i)<0 && (histExtre(targetList(i).Code)<openPrice(targetList(i).Code)*(1-stopprofit) &&...               dataDay(5,end)>histExtre(targetList(i).Code)*(1+trailinggap));             if closeBuy1 + closeBuy2 + closeBuy3>0 || closeSell1 + closeSell2 + closeSell3>0               traderPositionToV2(1,i,0,0,'market','close');           end                      % 开仓           amount = 1;           if mp(i) <= 0 && dSignal(i,end)==1               traderDirectBuyV2(1,i,amount,0,'market','buy1');%开多单               openPrice(targetList(i).Code) = dataDay(5,end);               histExtre(targetList(i).Code) = dataDay(5,end);           elseif  mp(i) >= 0   &&  dSignal(i,end)==-1               traderDirectSellV2(1,i,amount,0,'market','sell1');%开空单               openPrice(targetList(i).Code) = dataDay(5,end);               histExtre(targetList(i).Code) = dataDay(5,end);           end        end    end   end%% 计算因子的自定义函数function value=getSignal(cellPar,bpPFCell)%调用该函数的参数将会全部被赋给cellPar%bpPFCell为一个时间序列,标记特定的刷新时刻%%%参数声明    idxK =cellPar{1};    m = cellPar{2};    n = cellPar{3};%%%函数计算    [targetNum,~]=size(idxK);    value = nan(1,targetNum);    for i=1:targetNum        regKMatrix = traderGetRegKData(idxK(i,:),m+1,false,bpPFCell);         [~,KLen]=size(regKMatrix);        if KLen>=m+1             closeNow = regKMatrix(5,end);            closePre = regKMatrix(5,end-1);            meanNow = mean(regKMatrix(5,end-m+1:end));            meanPre = mean(regKMatrix(5,end-m:end-1));            stdNow = std(regKMatrix(5,end-m+1:end),1);            stdPre = std(regKMatrix(5,end-m:end-1),1);                        if closeNow>meanNow+n*stdNow && closePre<meanPre+n*stdPre                value(i)=1;            elseif closeNow<meanNow-n*stdNow && closePre>meanPre-n*stdPre                value(i) = -1;            elseif closeNow > meanNow                value(i) = 2;            elseif closeNow < meanNow                value(i) =-2;            end        end    endend

更多策略源码下载请登录DigQuant社区-策略资源下载~




二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝


沙发
65425856 发表于 2017-3-27 20:34:35
学习中~

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群
GMT+8, 2026-1-28 19:25