美文网首页
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