
致初学者:
大家好,我是一个马叉虫的宽客:Tao,从本期开始,我将为大家带来一系列的量化指标。众所周知,认识技术指标是作为一个从事二级市场必不可少的技能。相信开始对量化感兴趣的宽客们都有一两个自己擅长的技术指标,而对技术指标进行量化策略的构建是最简单最基本的量化实现,宽客们,通过本期学习,一起来实现并尝试改善专属于自己的技术指标吧!
宽客:Tao
简介
EMV简易波动指标,是为数不多的考虑价量关系的技术指标。它刻画了股价在下跌的过程当中,由于买气不断的萎靡退缩,致使成交量逐渐的减少,EMV 数值也因而尾随下降,直到股价下跌至某一个合理支撑区,捡便宜货的买单促使成交量再度活跃,EMV 数值于是作相对反应向上攀升。
当EMV 数值由负值向上趋近于零时,表示部分信心坚定的资金,成功的扭转了股价的跌势,行情不断反转上扬,并且形成另一次的买进信号。
基本用法
本策略用法
EMV 在0 以下表示弱势,在0 以上表示强势;EMV 由负转正应买进,由正转负应卖出。
CCI计算方法

策略代码
function AT_EMV(bInit,bDayBegin,cellPar)
%EMV简易波动指标量化择时策略:
%arrayfun函数:MATLAB的滚动窗口运行函数,具有并行运算效果,提高代码的运行效率
%%
%全局变量:
global g_idxK;
global g_idxAlpha;
global TLen;
global DayNum;
global EMVvalue;
global EMVconut;
%赋值:
Len = cellPar{
1};
DayTime=cellPar{
2};
freq = cellPar{
3};
%%
if bInit
%初始化读取所有数据:
traderSetParalMode(
false); %并行执行时方便设置断点调试
g_idxK=traderRegKData(freq,
1); %数据提取
TLen = length(g_idxK(
:,
1)); %股票总数量
g_idxAlpha=traderRegUserIndi(@myEMV,{Len}); %策略逻辑实现
DayNum=
0;
EMVconut=
1;
else
%主题策略部分:
if bDayBegin
%每日交易第一根Bar初始化设置:
DayNum=DayNum+
1;
end
if DayNum==
1||mod(DayNum,DayTime)==
0
disp(DayNum);
%提取数据:
EMV = traderGetRegUserIndi(g_idxAlpha,
1); %alpha因子值读取
if (sum(EMV==
0)==TLen)
return;
else
if EMVconut
EMVvalue(
:,
2)=EMV;
EMVconut=
0;
return;
else
EMVvalue=[EMVvalue(
:,
2),EMV]; %用于存储多个计算出的EMV值
%资金分配:
num=sum(EMVvalue(
:,
1)<
0&EMVvalue(
:,
2)>
0); %准备下单的标的数
mp=traderGetAccountPositionV2(
1,
1:TLen); %仓位读取
[~,MarketCap,~,~,~] = traderGetAccountInfoV2(
1); %获取动态权益
Stock_flow = ((MarketCap)*
0.
4)/num; % 每只股票分配的资金
getKData = traderGetRegKData(g_idxK,
1,
false);%获取K线数据
Close=getKData(
5:8:end,
1);
shareNum =
100*floor((Stock_flow./Close)/
100); %计算购买股票数量;
%信号设置:
A=EMVvalue(
:,
1)<
0&EMVvalue(
:,
2)>
0&mp==
0&shareNum>
0; %买入
B=EMVvalue(
:,
1)>
0&EMVvalue(
:,
2)<
0&mp~=
0; %卖出
idx=
1:TLen;
%进仓:
arrayfun(@(x) traderDirectBuyV2(
1,x,shareNum(x),
0,
'market',
'buy1'), idx(A==
1),
'UniformOutput',
false);
%平仓:
arrayfun(@(x) traderPositionToV2(
1,x,
0,
0,
'market',
'sell'), idx(B==
1),
'UniformOutput',
false);
end
end
end
end
end
function value=myEMV(cellPar,bpPFCell)
%全局变量声明:
global g_idxK;
global TLen;
%赋值:
Len = cellPar{
1};
%提取数据:
getKData = traderGetRegKData(g_idxK,Len+
1,
false,bpPFCell);%getKData:双标签矩阵:每
8行表示一只标的,
%八行中每行对应的数据为:(
1)时间、(
2)开盘价、(
3)最高价、(
4)最低价、(
5)收盘价、(
6)成交量、(
7)成交金额、(
8)持仓量。
high=getKData(
3:8:end,
:);
low=getKData(
4:8:end,
:);
volume=getKData(
6:8:end,
:);
value=zeros(size(high(
:,
1))); %只返回每只标的当天计算的值
if sum(isnan(high(
:,
1)))==TLen
return;
else
%
step1:
MID=((high(
:,
2:end)+low(
:,
2:end))/
2)-((high(
:,
1:end-1)+low(
:,
1:end-1))/
2); %MID有可能等于
0
%
step2:
BRO=volume(
:,
2:end)./(high(
:,
2:end)-low(
:,
2:end));%BRO有可能为inf
%
step3:
EM=MID./BRO;
%
step4:
EMV=MEAN(EM,Len);
EMV(EMV==inf)=
0;
EMV(isnan(EMV))=
0;
value=EMV(
:,
end);
end
end
function value = MEAN(A,N)
value=cell2mat(arrayfun(@(L) mean(A(
:,L-N+
1:L),
2),
N:size(A,
2),
'UniformOutput',
false));
回测分析
回测设置:
1、回测标的:HS300
2、回测时间:20050901-20180101,共13年
3、初始资金:1千万
4、资金分配:40%流动资金均等分配给准备下单的股票。
回测结果:


结论
1、EMV 策略操作简单,策略回测效果一般。
2、该策略在2008年金融危机以及2015年证券危机时段并没有判断出熊市趋势。
3、下面我们来探讨就以上两个亏损点的主要原因。
- 对于亏损点一:
回顾EMV 指标计算公式,若行情没有经历或者短暂经历价格下跌伴随着成交量放大的情况,而快速过渡到量价起升的阶段,这使得EMV 数值不会这么快回复到0(这种情况往往是行情阶段底部V 字反转的形态。
- 对于亏损点二:
指标在0 附近波动,意味着小的价格移动或者大的成交量。
参考文献[1]百度云盘:技术指标系列(九)——EMV指标改进用法识别尖部能力强 ,密码:q71s
https://pan.baidu.com/share/init?surl=WgDaG6KceH_1SA7ur0e_Rw
[2]百度百科:EMV指标
[3]MBA智库百科:简易波动指标