20世纪80年代,美国股市分析家唐纳德·蓝伯特(Donald Lambert)发明了顺势指标,即CCI指标,早期被用于期货市场的判断,后来被广泛应用在股票市场的研判。与大多数技术分析指标相比,根据统计学原理的CCI指标是比较独特的,它通过测量股价的波动是否已超出其正常范围,来预测股价变化趋势的技术分析指标,属于超买超卖类指标的一种。
CCI与其他技术分析指标一样,由于选用的计算周期不同,其中包括:分钟CCI指标、日CCI指标、周CCI指标、年CCI指标等很多种类型。其中,日、周CCI指标较为常用在股市研判。
与其他技术分析指标相比,CCI指标的计算是比较复杂的,以日CCI计算为例的两种计算方法:
1.CCI = (TP-MA)÷MD÷0.015
其中:TP=(最高价 最低价 收盘价)÷3;
MA= 最近N日收盘价的累计之和÷N;
MD=最近N日(MA-收盘价)的累计之和÷N;
0.015为计算系数,N为计算周期。
2.中价与中价的N日内移动平均的差÷N日内中价的平均绝对偏差
其中:中价=(最高价﹢最低价﹢收盘价)÷3;
平均绝对偏差为统计函数。
CCI指标和其他没有运行区域限制的指标不同之处就是,它有一个相对的技术参照区域,按市场的通行的标准可分为三大类:﹢100、﹣100和﹢100—﹣100之间:
1.当CCI>﹢100时,表示股价已进入超买区间,需要多加关注股价的异动现象;
2.当CCI<﹣100时,表示股价已进入超卖区间,投资者可以逢低吸纳股票;
3.当CCI介于﹢100—﹣100之间时,表示股价处于窄幅振荡整理的区间——常态区间,投资者应以观望为主。
CCI策略
选取CCI处于100—150之间,处于上涨趋势的股票。
from CAL.PyCAL import *
import pandas as pd
import numpy as np
start = '2010-08-01' # 回测起始时间
end = '2014-08-01' # 回测结束时间
benchmark = 'HS300' # 策略参考标准
universe = set_universe('HS300') # 证券池,支持股票和基金
capital_base = 100000 # 起始资金
freq = 'd' # 策略类型,'d'表示日间策略使用日线回测,'m'表示日内策略使用分钟线回测
refresh_rate = 20 # 调仓频率,表示执行handle_data的时间间隔,若freq = 'd'时间间隔的单位为交易日,若freq = 'm'时间间隔为分钟
def initialize(account): # 初始化虚拟账户状态
pass
def handle_data(account): # 每个交易日的买入卖出指令
eq_CCI = cci(account,85)
buylist = []
for stk in account.universe:
try:
if eq_CCI[stk] > 100 and eq_CCI[stk] < 150:
buylist.append(stk)
except:
pass
for stk in account.valid_secpos:
order_to(stk, 0)
for stk in buylist[:]:
if stk not in account.universe or account.referencePrice[stk] == 0 or np.isnan(account.referencePrice[stk]):
bulist.remove(stk)
for stk in buylist:
order(stk, account.referencePortfolioValue/account.referencePrice[stk]/len(buylist))
样本外测试
from CAL.PyCAL import *
import pandas as pd
import numpy as np
start = '2014-08-01' # 回测起始时间
end = '2015-08-01' # 回测结束时间
benchmark = 'HS300' # 策略参考标准
universe = set_universe('HS300') # 证券池,支持股票和基金
capital_base = 100000 # 起始资金
freq = 'd' # 策略类型,'d'表示日间策略使用日线回测,'m'表示日内策略使用分钟线回测
refresh_rate = 20 # 调仓频率,表示执行handle_data的时间间隔,若freq = 'd'时间间隔的单位为交易日,若freq = 'm'时间间隔为分钟
def initialize(account): # 初始化虚拟账户状态
pass
def handle_data(account): # 每个交易日的买入卖出指令
eq_CCI = cci(account,85)
buylist = []
for stk in account.universe:
try:
if eq_CCI[stk] > 100 and eq_CCI[stk] < 150:
buylist.append(stk)
except:
pass
for stk in account.valid_secpos:
order_to(stk, 0)
for stk in buylist[:]:
if stk not in account.universe or account.referencePrice[stk] == 0 or np.isnan(account.referencePrice[stk]):
bulist.remove(stk)
for stk in buylist:
order(stk, account.referencePortfolioValue/account.referencePrice[stk]/len(buylist))
--------------------------------------------------------------------------------------------------------------------------
推荐阅读:
1.一个量化策略师的自白(好文强烈推荐)
2.股票期货经典的量化交易策略都在这里了!(源码)
3.期货/股票数据大全查询(历史/实时/Tick/财务等)
4.史上最全的Python定量金融三方库汇总
5.干货 | 量化选股策略模型大全
6.量化金融经典理论、重要模型、发展简史大全