加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

量化交易策略——CCI指标

(2017-01-22 13:48:38)
标签:

量化交易

cci

分类: 交易策略
    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)) 



0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有