美文网首页
ATR:一个较为完整的代码

ATR:一个较为完整的代码

作者: 哈劳斯军士 | 来源:发表于2017-05-01 16:10 被阅读539次

    聚宽,平台API还是很友好的,就是回测慢了点。

    在上一篇文章中,我们主要介绍了ATR的思想内容。

    真实波幅(ATR average true range)主要应用于了解股价的震荡幅度和节奏,在窄幅整理行情中用于寻找突破时机。通常情况下股价的波动幅度会保持在一定常态下,但是如果有主力资金进出时,股价波幅往往会加剧。另外,在股价横盘整理、波幅减少到极点时,也往往会产生变盘行情。真实波幅(ATR)正是基于这种原理而设计的指标。使用Talib中的ATR函数进行回测。

    计算方法:
    1.TR=∣最高价-最低价∣和∣最高价-昨收∣和∣昨收-最低价∣的最大值
    2.真实波幅(ATR)=TR的N日简单移动平均
    3.参数N设置为14日

    使用方法,先来个追涨杀跌:
    如果当前价格比之前的价格高一个ATR的涨幅,买入股票
    如果之前的价格比当前价格高一个ATR的涨幅,卖出股票

    代码如下:

    #此例子采用Talib提供的平均真实波幅ATR指标作为买入/卖出信号。
    #如果当前价格比之前的价格高一个ATR的涨幅,买入股票
    #如果之前的价格比当前价格高一个ATR的涨幅,卖出股票
    import talib
    #import numpy as np
    #import pandas as pd
    
    def initialize(context):
        # 定义一个全局变量, 保存要操作的证券
        context.stocks = ['601328.XSHG','600036.XSHG','600196.XSHG','600010.XSHG']
        # 设置我们要操作的股票池:交通银行,招商银行,复星医药,包钢股份
        set_universe(context.stocks)
    # 初始化此策略
    def handle_data(context, data):
        # 取得当前的现金
        cash = context.portfolio.cash
        # 循环股票列表
        for stock in context.stocks:
            # 获取股票的数据
            h = attribute_history(stock, 30, '1d', ('high','low','close'))
            # 创建ATR买卖信号,包括最高价,最低价,收盘价和参数timeperiod
            # 注意:ATR函数使用的price必须是narray
            atr = talib.ATR(h['high'].values,h['low'].values,h['close'].values, timeperiod=14)[-1]
            # 获取当前股票的数据
            current_position = context.portfolio.positions[stock].amount
            # 获取当前股票价格
            current_price = data[stock].price
            #获取四天前的收盘价
            prev_close = h['close'].values[-5]
            #如果当前价格比之前的价格高一个ATR的涨幅,买入股票
            upside_signal = current_price - (prev_close + atr)
            #如果之前的价格比当前价格高一个ATR的涨幅,卖出股票
            downside_signal = prev_close - (current_price + atr)
            # 当downside_signal大于0,且拥有的股票数量大于0时,卖出所有股票
            if downside_signal > 0 and current_position > 0:
                order_target(stock, 0)
            # 当upside_signal大于0, 且拥有的股票数量为0时,则全仓买入
            elif upside_signal > 0 and current_position == 0:
                number_of_shares = int(cash/current_price)
                # 购买量大于0时,下单
                if number_of_shares > 0:
                    # 买入股票
                    order(stock, +number_of_shares)
                    # 记录这次买入
                    log.info("Buying %s" % (stock))
        #record(upside_signal=upside_signal,downside_signal=downside_signal,ATR=atr)
    

    搞个收益曲线看看:


    我们发现该方法在单边市基本没用,震荡市则会加剧趋势。

    那我们再看看最大回撤产生的11年:


    可见震荡上行趋势一旦建立,该策略能捕捉利润的能力还是有的,一旦震荡下行趋势建立,又会产生很大的回撤。
    可见该策略可以认为是一种放大杠杆的方法。

    相关文章

      网友评论

          本文标题:ATR:一个较为完整的代码

          本文链接:https://www.haomeiwen.com/subject/pqzftxtx.html