其中EMD库的安装参考
1.指标
在每天分钟数据积累mlen个bar的位置,将今日的数据通过EMD分解为噪声部分和趋势部分。 定义信噪比
SNR = std(趋势数据)/std(噪声数据)
2.交易逻辑
当SNR小于一定的范围
此时收盘价大于此日开盘价时做多
此时收盘价小于此日开盘价时做空
3.止损止盈
固定点数止损
跟踪回撤止盈:即盈利达到一定幅度后回撤一定比例则被平仓
回测曲线(由Auto-trader提供回测报告)
策略源码:
function EMDStrategy(bInit,bDayBegin,cellPar)%%% 函数说明% 上面的三个参数是一种固定结构。% 当在调用该函数如 DualThrust(a1,a2,a3,a4,a5,...).所有的参数都会被赋值给cellPar,即cellPar={a1,a2,a3,a4,a5,...}% bInit,在策略逻辑运行前为1,类似优矿等平台的initialize函数。当bInit为0时,交易启动。% bDayBegin判断是否为一天的开始。%% 外部和全局参数声明 % 这是一个固定结构. % 日数据是分钟数据的合成.如在日中获取日数据,仅是已出现分钟数据的合成,不包含之后的数据。 global g_idxKDay; global g_idxKMin; global openPrice; % 记录开盘价 global histExtre; % 记录历史达到的有利极值,用于跟踪止盈 global TLen; global startBar; global Range; global TSNR; %SIGNAL-NOISE RATIO的累积 mlen=cellPar{1}; Freq=cellPar{2}; lens = cellPar{3}; ThresHold = cellPar{4}; stopGap = cellPar{5}; profitGap = cellPar{6}; dropGap = cellPar{7}; %% 初始化回测帐户 if bInit % 数据只有先注册才能使用 % 基本数据注册 % traderRegKData('day',Freq).Freq为bar的周期。数据的更新频率依据外部运行命令。分钟获取,将'day'变为'min'。 % 因子注册 % traderRegUserIndi(@Fun,{para1,para2,...})。 % Fun为自定义函数,其固定结构参考后面代码,大括号内为函数输入参数。 traderSetParalMode(false);%%默认是true,因子计算函数并行执行,速度快,不能调试,false串行执行可以设断点调试 g_idxKDay=traderRegKData('day',1); g_idxKMin=traderRegKData('min',Freq); TLen = length(g_idxKDay(:,1)); openPrice = nan(1,TLen); histExtre = nan(1,TLen); Range = nan(1,TLen); startBar = 0; for t = 1:TLen TSNR(t).value = []; end %% 交易逻辑% 交易启动、先平后开 else [mp,~,~]=traderGetAccountPositionV2(1,1:TLen); % 获取仓位信息 [BarNum,BarTime] = traderGetCurrentBarV2(); % 获取当下时间 dateVec = datevec(BarTime); % datevec将时间转化为序列。对应[年,月,日,时,分,...] nowTime = dateVec(4)*100 + dateVec(5); if bDayBegin startBar= BarNum; Range = nan(1,TLen); for i = 1:TLen regKMatrix = traderGetRegKData(g_idxKDay(i,:),lens+1,false); regKMatrix(:,any(isnan(regKMatrix),1))=[]; [~,KLen]=size(regKMatrix); if KLen>lens hh = max(regKMatrix(3,end-lens:end-1)); ll = min(regKMatrix(4,end-lens:end-1)); hc = max(regKMatrix(5,end-lens:end-1)); lc = min(regKMatrix(5,end-lens:end-1)); Range(i)= max(hh-lc,hc-ll); end end end %% 日内 14:50 - 15:30 平仓 if nowTime >= 1450 && nowTime <= 1530 for i=1:TLen if mp(i) ~= 0 traderPositionToV2(1,i,0,0,'market','close'); end end return; end for i=1:TLen dataDay = traderGetRegKData(g_idxKMin(i,:),6,false); dataDay(:,any(isnan(dataDay),1))=[]; [~,KLen]=size(dataDay); %% 数据有效:长度足够;非空;成交价不为0;高低不同 if KLen==0 || dataDay(6,end) ==0 || dataDay(3,end)- dataDay(4,end)==0 continue; end if mp(i)~=0 %% 记录历史达到的最大有利值 if mp(i)>0 histExtre(i) = max(histExtre(i),dataDay(3,end)); elseif mp(i)<0 histExtre(i) = min(histExtre(i),dataDay(4,end)); end %% 平仓,信号依次为反转平仓、止损平仓、跟踪止损平仓 %多单平仓条件 closeBuy1 = mp(i)>0 && (dataDay(5,end)<openPrice(i)-stopGap*Range(i)); closeBuy2 = mp(i)>0 && (histExtre(i)>openPrice(i)+profitGap*Range(i)) && dataDay(5,end)<histExtre(i)-dropGap*Range(i) ; %空单平仓条件 closeSell1 = mp(i)<0 && (dataDay(5,end)>openPrice(i)+stopGap*Range(i)); closeSell2 = mp(i)<0 && (histExtre(i)<openPrice(i)-profitGap*Range(i)) && dataDay(5,end)>histExtre(i)+dropGap*Range(i); %平仓操作 if closeBuy1 + closeBuy2 + closeSell1 + closeSell2 >0 traderPositionToV2(1,i,0,0,'market','close'); end end end %% EMD 分解 if BarNum-startBar >=mlen && BarNum-startBar<mlen + Freq && nowTime>=0930 && nowTime<=1430 for i=1:TLen dataDay = traderGetRegKData(g_idxKMin(i,:),mlen,false); dataDay(:,any(isnan(dataDay),1))=[]; dataDays = traderGetRegKData(g_idxKDay(i,:),3,false); dataDays(:,any(isnan(dataDays),1))=[]; [~,KLen]=size(dataDay); %% 数据有效:长度足够;非空;成交价不为0;高低不同 if KLen<mlen || dataDay(6,end) ==0 || dataDay(3,end)- dataDay(4,end)==0 continue; end imf = emd(dataDay(5,:),'MAXMODES',4); R = imf(end,:);% 原函数去除本征态函数后余下的趋势部分 noise = dataDay(5,:)-R; SNR = log(std(noise)/std(R)); TSNR(i).value = [TSNR(i).value,SNR]; TSNR(i).value = TSNR(i).value(max(end-39,1):end); amount =1; if length(TSNR(i).value)>10 && SNR < mean((TSNR(i).value)) && abs(dataDay(5,end)-dataDay(5,1))> ThresHold*Range(i) if dataDay(5,end)> max(dataDay(5,1),dataDays(2,end)) traderDirectBuyV2(1,i,amount,0,'market','buy1');%开多单 openPrice(i)=dataDay(5,end); histExtre(i) = dataDay(5,end); elseif dataDay(5,end)< min(dataDay(5,1),dataDays(2,end)) traderDirectSellV2(1,i,amount,0,'market','sell1');%开空单 openPrice(i)=dataDay(5,end); histExtre(i) = dataDay(5,end); end end end end endend
更多免费策略源码下载请登录DigQuant社区-策略资源下载~