博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【vn.py】源码解析之 ATR_RSI 策略
阅读量:2051 次
发布时间:2019-04-28

本文共 7656 字,大约阅读时间需要 25 分钟。

文章目录

ATR和RSI量化指标

在介绍vn.py中CTA策略ATR_RSI之前,首先需要对ATR和RSI这两个量化指标有所了解。

1、均幅指标(Average True Range,ATR)

ATR称为均幅指标,也称作平均真实波动或真实波动均值,是一种表示市场变化率的指标。是由威尔德(J Welles Wilder)于1978年在《New Concepts in Technical Trading Systems》中提出。ATR常用于表示趋势的开始或者反转,较低的ATR表示比较平稳、冷清的市场环境,而长时间的ATR则可能会是市场在积蓄力量并开始下一种趋势,这种趋势可能是当前趋势的继续或者趋势的反转;较高的ATR表示波动大、交易频繁的市场环境,而高ATR的意味着短时间的价格大幅变动,通常这种情况不会维持太长。ATR也可以用来动态设置交易的止盈和止损价位,由于ATR表示一段时间的波动真实范围,所以可以用于动态设定止盈止损价位。ATR还可以用来动态设置仓位,如海龟交易准则中就以交易标的的ATR来设置仓位,高ATR意味着高风险,则应设定较低的仓位。

在计算平均真实波幅之前需要需要先计算真实波幅 TR(True Range),真实波幅计算的方法是:

1、计算当前交易日的最高价High(T)和最低价Low(T)之间的价差。
2、计算前一交易日的收盘价Close(T-1)和当前交易日最高价High(T)之间的价差。
3、计算前一交易日的收盘价Close(T-1)和当前交易日最低价Low(T)之间的价差。
然后计算今日最高价与最低价的价差振幅,昨日收盘价与今日最高价的价差振幅,昨日收盘价与今日最低价价差振幅三者之间的最大值。
公式表示为: T R = m a x ( H i g h ( T ) − L o w ( T ) , a b s ( C l o s e ( T − 1 ) − H i g h ( T ) ) , a b s ( C l o s e ( T − 1 ) − L o w ( T ) ) ) TR = max(High(T) - Low(T), abs(Close(T-1) - High(T)), abs(Close(T-1) - Low(T))) TR=max(High(T)Low(T),abs(Close(T1)High(T)),abs(Close(T1)Low(T)))
N日ATR实际上就是TR的N日移动平均值,即: A T R = M A ( T R , N ) ATR = MA(TR, N) ATR=MA(TR,N)

2、相对强弱指标(Relative Strength Index,RSI)

RSI也是威尔德(J Welles Wilder)于1978年在《New Concepts in Technical Trading Systems》中提出。RSI是根据一定时期内上涨点数和涨跌点数之间的比率制作的技术指标,可以表示市场一定时期的景气程度。N日RSI的计算方式为 RSI=100*(N日收盘上涨之和 / N日收盘涨跌之和),它的范围在0到100之间,通常RSI处于30到70之间,在10到20之间时,市场处于超卖状态,后市将会出现价格反弹回升;在80到90之间,市场处于超买状态,后市将会出现价格回落。

ATR_RSI策略

ATR描述市场的变化波动,RSI描述市场强弱的关系,因此也有很多量化策略是以ATR或者RSI指标作为交易信号。

ATR_RSI策略源码分析

vn.py中也有以ATR和RSI的CTA策略,下面就对这个ATR_RSI策略进行分析。

1、完整源码
from vnpy.app.cta_strategy import (    CtaTemplate,    StopOrder,    TickData,    BarData,    TradeData,    OrderData,    BarGenerator,    ArrayManager,)class AtrRsiStrategy(CtaTemplate):    """"""    author = "用Python的交易员"    atr_length = 22    atr_ma_length = 10    rsi_length = 5    rsi_entry = 16    trailing_percent = 0.8    fixed_size = 1    atr_value = 0    atr_ma = 0    rsi_value = 0    rsi_buy = 0    rsi_sell = 0    intra_trade_high = 0    intra_trade_low = 0    parameters = ["atr_length", "atr_ma_length", "rsi_length",                  "rsi_entry", "trailing_percent", "fixed_size"]    variables = ["atr_value", "atr_ma", "rsi_value", "rsi_buy", "rsi_sell"]    def __init__(self, cta_engine, strategy_name, vt_symbol, setting):        """"""        super(AtrRsiStrategy, self).__init__(            cta_engine, strategy_name, vt_symbol, setting        )        self.bg = BarGenerator(self.on_bar)        self.am = ArrayManager()    def on_init(self):        """        Callback when strategy is inited.        """        self.write_log("策略初始化")        self.rsi_buy = 50 + self.rsi_entry        self.rsi_sell = 50 - self.rsi_entry        self.load_bar(10)    def on_start(self):        """        Callback when strategy is started.        """        self.write_log("策略启动")    def on_stop(self):        """        Callback when strategy is stopped.        """        self.write_log("策略停止")    def on_tick(self, tick: TickData):        """        Callback of new tick data update.        """        self.bg.update_tick(tick)    def on_bar(self, bar: BarData):        """        Callback of new bar data update.        """        self.cancel_all()        am = self.am        am.update_bar(bar)        if not am.inited:            return        atr_array = am.atr(self.atr_length, array=True)        self.atr_value = atr_array[-1]        self.atr_ma = atr_array[-self.atr_ma_length:].mean()        self.rsi_value = am.rsi(self.rsi_length)        if self.pos == 0:            self.intra_trade_high = bar.high_price            self.intra_trade_low = bar.low_price            if self.atr_value > self.atr_ma:                if self.rsi_value > self.rsi_buy:                    self.buy(bar.close_price + 5, self.fixed_size)                elif self.rsi_value < self.rsi_sell:                    self.short(bar.close_price - 5, self.fixed_size)        elif self.pos > 0:            self.intra_trade_high = max(self.intra_trade_high, bar.high_price)            self.intra_trade_low = bar.low_price            long_stop = self.intra_trade_high * \                (1 - self.trailing_percent / 100)            self.sell(long_stop, abs(self.pos), stop=True)        elif self.pos < 0:            self.intra_trade_low = min(self.intra_trade_low, bar.low_price)            self.intra_trade_high = bar.high_price            short_stop = self.intra_trade_low * \                (1 + self.trailing_percent / 100)            self.cover(short_stop, abs(self.pos), stop=True)        self.put_event()    def on_order(self, order: OrderData):        """        Callback of new order data update.        """        pass    def on_trade(self, trade: TradeData):        """        Callback of new trade data update.        """        self.put_event()    def on_stop_order(self, stop_order: StopOrder):        """        Callback of stop order update.        """        pass
2、策略参数与变量

从代码中可以看出这个策略有6个超参和5个变量。

六个超参的意义是:

  1. atr_length:ATR指标的周期长度,也即是多少日的TR的均值。
  2. atr_ma_length:ATR指标的移动平均值长度。
  3. rsi_length:RSI指标的周期长度。
  4. rsi_entry:RSI指标的进场数值。
  5. trailing_percent:用于止盈或者止损的百分比。
  6. fixed_size:仓位数。

五个变量的意义是:

  1. atr_value:当前ATR的值。
  2. atr_ma:当前ATR的移动均值。
  3. rsi_value:当前RSI的值。
  4. rsi_buy:RSI的多头上轨。
  5. rsi_sell:RSI的空头上轨。
atr_length = 22    atr_ma_length = 10    rsi_length = 5    rsi_entry = 16    trailing_percent = 0.8    fixed_size = 1    atr_value = 0    atr_ma = 0    rsi_value = 0    rsi_buy = 0    rsi_sell = 0    intra_trade_high = 0    intra_trade_low = 0    parameters = ["atr_length", "atr_ma_length", "rsi_length",                  "rsi_entry", "trailing_percent", "fixed_size"]    variables = ["atr_value", "atr_ma", "rsi_value", "rsi_buy", "rsi_sell"]
3、策略执行逻辑

在策略执行之前需要初始化策略变量,其中rsi+buy和rsi_sell两个超参分别设置为66和34,用于表示开多和开空的上下轨:

def on_init(self):        """        Callback when strategy is inited.        """        self.write_log("策略初始化")        self.rsi_buy = 50 + self.rsi_entry        self.rsi_sell = 50 - self.rsi_entry        self.load_bar(10)

与之前的策略一样,ATR_RSI策略的主要交易逻辑也是在on_bar()函数中,策略开始时先取消上一bar数据中未成交的所有订单。然后需要做的也是将新的bar数据添加到ArrayManger容器,然后通过底层ta-lib计算当前相应的指标ATR、ATR的均值以及RSI。

self.cancel_all()        am = self.am        am.update_bar(bar)        if not am.inited:            return        atr_array = am.atr(self.atr_length, array=True)        self.atr_value = atr_array[-1]        self.atr_ma = atr_array[-self.atr_ma_length:].mean()        self.rsi_value = am.rsi(self.rsi_length)

接下来,如果没有持仓的话就进行判断是否满足开仓条件,先记录当前bar的最高最低价到intra_trade_high和intra_trade_low,分别用于表示日内交易当前bar的最高价和最低价。如果当前ATR的值大于ATR的N均值,并且RSI的值大于开多的上轨时,就以超价限价单开多;如果当前ATR的值大于ATR的N均值,并且RSI的值小于开空的下轨时,就以超价限价单开空。

if self.pos == 0:            self.intra_trade_high = bar.high_price            self.intra_trade_low = bar.low_price            if self.atr_value > self.atr_ma:                if self.rsi_value > self.rsi_buy:                    self.buy(bar.close_price + 5, self.fixed_size)                elif self.rsi_value < self.rsi_sell:                    self.short(bar.close_price - 5, self.fixed_size)

当持有多头仓位时,通过trailing_percent对日内交易的最高价位设置价位,然后以这个价位发出停止单以止盈止损平仓;当持有空头仓位时,也是通过trailing_percent对日内交易的最低价位设置价位,然后以这个价位发出停止单以止盈止损平仓。

elif self.pos > 0:            self.intra_trade_high = max(self.intra_trade_high, bar.high_price)            self.intra_trade_low = bar.low_price            long_stop = self.intra_trade_high *  (1 - self.trailing_percent / 100)            self.sell(long_stop, abs(self.pos), stop=True)        elif self.pos < 0:            self.intra_trade_low = min(self.intra_trade_low, bar.low_price)            self.intra_trade_high = bar.high_price            short_stop = self.intra_trade_low * (1 + self.trailing_percent / 100)            self.cover(short_stop, abs(self.pos), stop=True)

转载地址:http://nwklf.baihongyu.com/

你可能感兴趣的文章
【雅思】金山词霸-单词学习(41-80)
查看>>
【雅思】【写作】【大作文】Report
查看>>
【雅思】【作文】顾家北100句翻译
查看>>
【雅思】【写作】【大作文】Discuss both views and give your own opinion
查看>>
【托业】【金山词霸】21-42
查看>>
【托业】【金山词霸】单词1-20
查看>>
【Python】脚本运行报错:IndentationError: unindent does not match any outer indentation level...
查看>>
【JMeter】前置处理器
查看>>
【Linux】top命令详解
查看>>
【黑盒测试】测试用例的常用方法
查看>>
【Linux】阿里云服务器部署--禅道
查看>>
【Loadrunner】Loadrunner 手动关联技术
查看>>
【性能测试】性能测试表
查看>>
【Mock】mock基础、简单的单元测试代码练习。
查看>>
【Loadrunner】Loadrnner 参数化策略
查看>>
【WebDriver】WebDriver 常用操作
查看>>
【Selenium】selenium中隐藏元素如何定位?
查看>>
【Mock】【接口测试】【面试】mock-server 环境搭建—加分项!
查看>>
【English】【托业】【四六级】写译高频词汇
查看>>
【托业】【新东方全真模拟】01~02-----P5~6
查看>>