相似文件
换一批
经管之家送您一份
应届毕业生专属福利!
求职就业群
感谢您参与论坛问题回答
经管之家送您两个论坛币!
+2 论坛币
MACD指标是量化投资策略里面较为常见的技术指标,但是LZ直接简单用MACD信号进行交易,出现进出场过于频繁的情况。受国信证券的金融工程报告启发,考虑用小波分析进行去噪处理,发现结果好多了。
LZ选用的是30min频率进行回测,选择的标的是沪深300主力合约,从策略表现看:整体还是不错的,后尾能够跑赢大盘,权益曲线在持有曲线上方,但是从交易类型看,空头表现还好,但是多头一开始表现还不错,后尾就很差了,这要怎么避免呢?
LZ刚进入量化入门,圣杯的光都没看到,请路过的各位量化老司机带带,让LZ上个车就好~
策略表现:
单还是能跑赢大盘的
多头比较不理想
空头表现还不错
- function wavmacd(Freq,len,len1,len2,shareNum) %基于小波消噪后的MACD策略
- global s1;%定义s1全局变量,记录实时的消噪后的收盘价
- targetList = traderGetTargetList(); %获取回测标的信息
- HandleList = traderGetHandleList();%获取回测账户信息
- marketposition=traderGetAccountPosition(HandleList(1),targetList(1).Market,targetList(1).Code); %读取仓位信息
- lags=420;%每次的测试数据时间长度
- barnum=traderGetCurrentBar(targetList(1).Market,targetList(1).Code);%获取当前的bar的编号
- if(barnum(1)<=lags)
- return;
- end
- %%
- %获取频率为Freq=5的标的的数据,数据长度为从当前往回找lags=420这么长
- [time,open,high,low,close,volume,turnover,openinterest] = traderGetKData(targetList(1).Market,targetList(1).Code,'min',Freq, 0-lags, 0,false,'NA');
- if(length(time)<len)
- return;
- end
- %%
- %小波去噪
- if isempty(s1)
- for i=1:len-1
- data=close(end-len+i-101:end-len+i);
- [c,l]=wavedec(data,2,'haar');
- ca2=appcoef(c,l,'haar',2);
- cd1=detcoef(c,l,1);
- cd2=detcoef(c,l,2);
- cdd1=zeros(1,length(cd1));
- cdd2=zeros(1,length(cd2));
- c1=[rot90(ca2,1),cdd2,cdd1];
- ss=waverec(c1,l,'haar');
- s1(barnum(1)-len+i)=ss(end);
- end
- end
- data=close(end-101:end);%对close价进行小波消噪
- [c,l]=wavedec(data,2,'haar'); %进行两层分解
- ca2=appcoef(c,l,'haar',2);%获取低频信号
- cd1=detcoef(c,l,1);%获取第一层高频信号
- cd2=detcoef(c,l,2);%获取第二层高频信号
- cdd1=zeros(1,length(cd1));
- cdd2=zeros(1,length(cd2));
- c1=[rot90(ca2,1),cdd2,cdd1];%小波重构
- ss=waverec(c1,l,'haar');%去噪后的close价
- s1(barnum(1))=ss(end);%s1为消噪后的实时close价
- %%
- %计算MACD入场指标
- [DIF,DEA,macd]=MACD(s1,12,26,9);
- ma1=EMA(s1,len1);
- ma2=EMA(s1,len2);
- con1= macd(end)>0 && ma1(end)>ma2(end)&&DIF(end)>DEA(end) ;%满足条件,看多,发出做多信号
- con2= macd(end)<0 && ma1(end)<ma2(end)&&DIF(end)<DEA(end);%满足条件,看空,发出做空信号
- con3= ma1(end)<ma2(end)&&macd(end)<0;%多头势头回归,平多
- con4=ma1(end)>ma2(end)&&macd(end)>0;%空头势头回归,平空
- if marketposition(1)==0
- if con1
- traderBuy(HandleList(1),targetList(1).Market,targetList(1).Code,shareNum,0,'market','buy');%开多单
- elseif con2
- traderSellShort(HandleList(1),targetList(1).Market,targetList(1).Code,shareNum,0,'market','sellshort');%开空单
- end
- end
- if marketposition(1)>0 && con3
- traderSell(HandleList(1),targetList(1).Market,targetList(1).Code,shareNum,0,'market','sell');%开空单
- end
- if marketposition(1)<0 && con4
- traderBuyToCover(HandleList(1),targetList(1).Market,targetList(1).Code,shareNum,0,'market','buytocover');%开空单
- end
- end
- function [DIF,DEA,MACDValue]=MACD(Price,FastLength,SlowLength,DEALength)
- DIF=zeros(length(Price),1);
- DEA=zeros(length(Price),1);
- MACDValue=zeros(length(Price),1);
- DIF=EMA(Price,FastLength)-EMA(Price,SlowLength);
- DEA=EMA(DIF,DEALength);
- MACDValue=2*(DIF-DEA);
- end
- function EMAValue=EMA(Price,Length)
- EMAValue=zeros(length(Price),1);
- K=2/(Length+1);
- for i=1:length(Price)
- if i==1
- EMAValue(i)=Price(i);
- else
- EMAValue(i)=Price(i)*K+EMAValue(i-1)*(1-K);
- end
- end
- end
复制代码
扫码加我 拉你入群
请注明:姓名-公司-职位
以便审核进群资格,未注明则拒绝
|