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

量化交易策略——阿隆指标

(2017-01-14 19:57:34)
标签:

量化交易

阿隆指标

分类: 交易策略
    1995年,图莎尔·钱德(Tushar Chande)发明了阿隆指标(Aroon),目前还是一个比较冷门的指标,它通过计算自价格达到近期最高值和最低值以来所经过的期间数,可以帮助预测价格趋势到区域,或趋势区域到趋势的变化。

    该指标由三部分组成:

     其中:N=确定的时间段,HH=在此期间出现最高价后的天数,LL=在此期间出现最低价后的天数。

    1.阿隆向上(Aroon-Up): [(N - HH)/ N]×100% ] ;
    2.阿隆向下(Aroon-Down): [(N - LL)/ N]×100% ] ;
    3.阿隆震荡线(Aroon Oscillator):阿隆Up - 阿隆Down 。

    观察三种状态来分析Aroon指标:

    1.Up线:达到100时,表示市场处于多头强势,跌破50表示向上的趋势正在失去动力,达到0时,表示多头处于极弱势;

      Down线:达到100时,市场正处于空头强势,跌破50时表示向下的趋势正在失去动力,达到0时,表示空头处于极弱势;
      
    两条线如果同处于底部,股票则处于盘整阶段,无趋势。

    2.两条线平行运动时,表明市场原有趋势仍在继续,直到由极值水平或交叉穿行而改变市场方向为止。

    3.当下行线上穿上行线时,表明原有趋势逐渐减弱,预计趋势将开始反转。反之亦然。

    阿隆指标可以说是一个跟踪趋势的指标,如果把它用来择时会有什么效果呢?

def aroonIndex(account,timeLength=20):
    #构建指数阿隆指标
    indexSeries = pd.Series(account.get_symbol_history('benchmark', timeLength)['closeIndex'])
    indexAronUp = (nlargest(1,range(len(indexSeries)),key=indexSeries.get)[0]+1)*100/timeLength
    indexAronDown = (nsmallest(1,range(len(indexSeries)),key=indexSeries.get)[0]+1)*100/timeLength
    indexOsc = indexAronUp - indexAronDown
    return indexOsc

当indexOsc 大于 0时,可以考虑开仓

start = '2009-08-01'                       # 回测起始时间
end = '2015-08-31'                         # 回测结束时间
benchmark = 'HS300'                        # 策略参考标准
universe = set_universe('HS300')             # 证券池,支持股票和基金
capital_base = 100000                      # 起始资金
freq = 'd'                                 # 策略类型,'d'表示日间策略使用日线回测,'m'表示日内策略使用分钟线回测
refresh_rate = 10                          # 调仓频率,表示执行handle_data的时间间隔,若freq = 'd'时间间隔的单位为交易日,若freq = 'm'时间间隔为分钟

def initialize(account):                   # 初始化虚拟账户状态
    
    pass

def handle_data(account):                  # 每个交易日的买入卖出指令
    eq_AroonUp = aroonUp(account,20)
    eq_AroonDown = aroonDown(account,20)
    index_osc = aroonIndex(account,20)
    buyList = []
    for stk in account.valid_secpos:
            order_to(stk, 0)

    if index_osc > 0:
        for stk in account.universe:
            if  eq_AroonUp[stk] - eq_AroonDown[stk] > 50:
                buyList.append(stk)

        for stk in buyList[:]:
            if stk not in account.universe or account.referencePrice[stk] == 0 or np.isnan(account.referencePrice[stk]):
                buyList.remove(stk)

        for stk in buyList:
            order(stk, account.referencePortfolioValue/account.referencePrice[stk]/len(buyList))  


如果让indexOsc > 50呢:

start = '2009-08-01'                       # 回测起始时间
end = '2015-08-31'                         # 回测结束时间
benchmark = 'HS300'                        # 策略参考标准
universe = set_universe('HS300')             # 证券池,支持股票和基金
capital_base = 100000                      # 起始资金
freq = 'd'                                 # 策略类型,'d'表示日间策略使用日线回测,'m'表示日内策略使用分钟线回测
refresh_rate = 10                          # 调仓频率,表示执行handle_data的时间间隔,若freq = 'd'时间间隔的单位为交易日,若freq = 'm'时间间隔为分钟

def initialize(account):                   # 初始化虚拟账户状态
    
    pass

def handle_data(account):                  # 每个交易日的买入卖出指令
    eq_AroonUp = aroonUp(account,20)
    eq_AroonDown = aroonDown(account,20)
    index_osc = aroonIndex(account,20)
    buyList = []
    for stk in account.valid_secpos:
            order_to(stk, 0)

    if index_osc > 50:
        for stk in account.universe:
            if  eq_AroonUp[stk] - eq_AroonDown[stk] > 50:
                buyList.append(stk)

        for stk in buyList[:]:
            if stk not in account.universe or account.referencePrice[stk] == 0 or np.isnan(account.referencePrice[stk]):
                buyList.remove(stk)

        for stk in buyList:
            order(stk, account.referencePortfolioValue/account.referencePrice[stk]/len(buyList))  

0

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

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

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

新浪公司 版权所有