本帖最后由 TaoZzzzz 于 -4-16 15:30 编辑
【指标量化】超买超卖——CCI 顺势指标
1523335607(1).png (60.65 KB, 下载次数: 13)
-4-16 15:29 上传
致初学者:
大家好,我是一个马叉虫的宽客:Tao,从本期开始,我将为大家带来一系列的量化指标。众所周知,认识技术指标是作为一个从事二级市场必不可少的技能。相信开始对量化感兴趣的宽客们都有一两个自己擅长的技术指标,而对技术指标进行量化策略的构建是最简单最基本的量化实现,宽客们,通过本期学习,一起来实现并尝试改善专属于自己的技术指标吧!
研究基地及产出地
DigQuant点宽网,全网唯一基于 MATLAB 的专业在线量化社区,“不是人人都能成为宽客”,成为宽客的你都是独特的!
点宽网策略资源池全面开放216+基于MATLAB的量化投资策略,随你下载,任你玩!点宽量化策略研究平台auto-trader支持股票、期货、期权等多品种标的回测、实盘交易。
简介
CCI顺势指标,由唐纳德拉姆伯特所创,是通过测量股价的波动是否已超出其正常范围,来预测股价变化趋势的技术分析指标。属于超买超卖类指标中较特殊的一种,波动于正无限大和负无限大之间,但是,又不须要以0中轴线,这一点也和波动于正无限大和负无限小的指标不同。CCI主要测量脱离价格正常范围的变异性,同时适用于期货商品及股价。
参考文献
[1]百度百科:CCI
[2]MBA智库百科:顺势指标
本策略基本用法
1、当 CCI 上穿 100,买入。
2、当 CCI 下穿 -100,卖空。
CCI计算方法
step1:
step2:
MATP表示在第t时刻,求最近n日TP的移动平均线。
step3:
meanDev表示在第t时刻,求最近n日TP的一阶均差。
step4:
其中, \alpha=0.015,n为计算周期,一般取20.
策略代码
请到点宽策略资源池下载:【指标量化】超买超卖——CCI顺势指标
策略函数:
function AT_CCI(bInit,bDayBegin,cellPar)
%RSRS阻力支撑相对强度市场择时策略:
%arrayfun函数:MATLAB的滚动窗口运行函数,具有并行运算效果,提高代码的运行效率
%%
%全局变量:
global g_idxK;
global g_idxAlpha;
global TLen;
global DayNum;
%赋值:
Len = cellPar{1};
alpha=cellPar{2};
s1=cellPar{3};
s2=cellPar{4};
DayTime=cellPar{5};
freq = cellPar{6};
%%
if bInit
%初始化读取所有数据:
traderSetParalMode(false); %并行执行时方便设置断点调试
g_idxK=traderRegKData(freq,1); %数据提取
TLen = length(g_idxK(:,1)); %股票总数量
g_idxAlpha=traderRegUserIndi(@myCCI,{Len,alpha}); %策略逻辑实现
DayNum=0;
else
%主题策略部分:
if bDayBegin
%每日交易第一根Bar初始化设置:
DayNum=DayNum+1;
end
if DayNum==1||mod(DayNum,DayTime)==0
disp(DayNum);
%提取数据:
CCI = traderGetRegUserIndi(g_idxAlpha,1); %alpha因子值读取
if (sum(CCI==0)==TLen)
return;
else
%资金分配:
num=sum(CCI>s1);
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=CCI>s1&mp==0&shareNum>0;%买入
B=CCI
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
function value=myCCI(cellPar,bpPFCell)
%全局变量声明:
global g_idxK;
global TLen;
%赋值:
Len= cellPar{1};
alpha= cellPar{2};
%提取数据:
getKData = traderGetRegKData(g_idxK,Len,false,bpPFCell);%getKData:双标签矩阵:每8行表示一只标的,
%八行中每行对应的数据为:(1)时间、(2)开盘价、(3)最高价、(4)最低价、(5)收盘价、(6)成交量、(7)成交金额、(8)持仓量。
high=getKData(3:8:end,:);
low=getKData(4:8:end,:);
close=getKData(5:8:end,:);
value=zeros(size(high(:,1))); %只返回每只标的当天计算的值
if sum(isnan(close(:,1)))==TLen
return;
else
%step1:
TP=(high+low+close)/3;
%step2:
MATP=MEAN(TP,Len);
%step3:
meanDev=MEAN(TP-MATP,Len);
%step4:
CCI=(TP-MATP)./(alpha*meanDev);
CCI(abs(CCI)==inf)=0;
CCI(isnan(CCI))=0;
value=CCI(:,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));
end复制代码
执行脚本:
tic;
%读取证券数据:
targetList = traderGetCodeList('hs300');
%参数设置:
Len = 20; %计算长度
alpha=0.015; %计算系数
s1=100;
s2=-100; %阈值
DayTime=1;
freq='day';
initTime = 0901;
lastTime = 0101;
% 在回测时设置初始资本10 000 000元、手续费率0.000026、无风险利率0.02、滑价0、默认1下一个bar的开盘价、默认0成交价、默认0直接成交
traderSetBacktest(10000000,0.000026,0.02,0,1,0,0);
AccountList(1) = {'StockBackReplay'};
traderRunBacktestV2('runAT_CCI',@AT_CCI,{Len,alpha,s1,s2,DayTime,freq},AccountList,targetList,freq,1,initTime,lastTime,'FWard');
toc;
回测分析
一、回测设置:
1、回测标的:HS300
2、回测时间:0901-0101,共
3、初始资金:1千万
4、资金分配:40%流动资金均等分配给准备下单的股票。
二、回测结果:
权益曲线:
绩效分析:指标名称指标值指标名称指标值指标名称指标值
初始资金收益率314.27%最大回撤率34.53%夏普比率0.88
算术年化收益率26.41%净利/最大潜在亏损3.54Calmar比率0.31
几何年化收益率12.69%手续费/净利0.1446Sortino比率1.21
盈利因子1.18胜率49.48%平均盈利/平均亏损1.2
结论:
1、从该指标的设计来看,在一般常态行情下,CCI指标不会发生作用。
2、当CCI扫描到异常股价波动时,也就是当CCI突破+/-100时,抓住市场趋势。但是在上涨/下跌行情中出现短暂反方向运动时,该策略会出现误判,又因为策略的信号频率不高,也因此带来比较大的回撤。
3、回测收益与光大证券研报【技术指标系列(五)——CCI的顺势而为】不一致,有可能是资金分配不一致导致的,本策略每次交易仅仅使用40%的流动资金下单交易。