聚宽,平台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年:
可见震荡上行趋势一旦建立,该策略能捕捉利润的能力还是有的,一旦震荡下行趋势建立,又会产生很大的回撤。
可见该策略可以认为是一种放大杠杆的方法。