暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

技术指标代码学习三-RSI

量化分析之路 2020-03-29
1549

RSIRelative Strength Index。)相对强弱指数

 

RSI是根据一定时期内上涨点数和下跌点数之和的比率制作出的一种技术曲线。能够反映出市场在一定时期内的景气程度。由威尔斯.威尔德(Welles Wilder)最早应用于期货买卖

 

该分析指标的设计是以三条线来反映价格走势的强弱,适合做短线差价操作。



简单原理

 

譬如有100个人面对一件商品,如果50个人以上要买,竞相抬价,商品价格必涨。相反,如果50个人以上争着卖出,价格自然下跌。

强弱指标理论认为,任何市价的大涨或大跌,均在0-100之间变动,根据常态分配,认为RSI值多在30-70之间变动,通常80甚至90时被认为市场已到达超买状态,至此市场价格自然会回落调整。当价格低跌至30以下即被认为是超卖状态,市价将出现反弹回升。

 

数学公式

RSI=100-100÷(1+RS)

或者RSI=100×RS/(1+RS)


RS=[A÷B]×100%

A——N日内收盘涨幅之和

B——N日内收盘跌幅之和(取正值)

回测代码如下

第一部分 准备工作

import numpy as np
import pandas as pd
import talib


start = '2016-05-01' # 回测起始时间
end = '2016-11-01' # 回测结束时间
universe = set_universe('HS300') # 证券池,支持股票、基金、期货、指数四种资产
benchmark = 'HS300' # 策略参考标准
freq = 'd' # 策略类型,'d'表示日间策略使用日线回测,'m'表示日内策略使用分钟线回测
refresh_rate = 1 # 调仓频率,表示执行handle_data的时间间隔,若freq = 'd'时间间隔的单位为交易日,若freq = 'm'时间间隔为分钟

# 配置账户信息,支持多资产多账户
accounts = {
'fantasy_account': AccountConfig(account_type='security', capital_base=10000000)
}


##买入卖出阈值
buy_threshold = 0
sell_threshold = 0

def initialize(context):
wvad = Signal('WVAD') #默认24天
context.signal_generator = SignalGenerator(wvad)


def handle_data(context):
timing(context)

第二部分

在RSI<30的时候买入 在RSI>70的时候卖出(简单策略)
  基于仓位管理的需要 每只股票的最大投资为100000元(风控)

def timing(context):
return timing_Basic_RSI(context)

def timing_Basic_RSI(context):
##在RSI<30的时候买入 在RSI>70的时候卖出(策略)
##基于仓位管理的需要 每只股票的最大投资为100000元(风控)
account = context.get_account('fantasy_account')
current_universe = context.get_universe( exclude_halt=True)
security_position = account.get_positions()
cash = account.cash
history = context.history(symbol=current_universe, time_range=N+1, attribute='closePrice' ,rtype='array')

##策略 rsi< 30买入 >70卖出
buy_list = []
for sec in current_universe:
close = history[sec]['closePrice']
rsi = talib.RSI(close,timeperiod = N)[-1]
if rsi < buy_threshold and sec not in security_position:
buy_list.append(sec)
elif rsi > buy_threshold and sec in security_position:
account.order(sec,0)
cash += security_position[sec].amount * context.current_price(sec)


d = min(len(buy_list),int(cash)//100000)
for sec in buy_list[:d]:
account.order(sec,100000/context.current_price(sec))

跑了一下回测  也还可以


下面简单介绍一下 实战的例子


三条不同周期的RSI曲线,分别是RSI 6、RSI12和RSI 24。其中RSI 6的波动最频繁,RSI 12次之,RSI 24的波动最缓慢。在实战中,被用到最多的是RSI 6。

 

买点一 如上图

RS16跌破时,说明市场进入了超卖状态。

买点1RSI 6跌破20时。

买点2RSI 6见底回升,突破20时。

1)如果RSI 6跌破20的时候成交量萎缩,RSI 6突破20时成交量放大,则验证了空方量衰弱,多方力量复苏的信号。这样的情况下该形态的看涨信号更加强烈。

2)不同股票的超卖区间会有所不同。对于波动幅度较小的股票,投资者可以将超卖区间范围放大到025。对于波动幅度较大的股票,投资者可以将超卖区间范围缩小到015

3)一些热点股票的股价波动可能会十分剧烈。这会带动RSI 6也快速波动。在快速波动过程中,该指标可能会频繁地给出超卖信号。其信号准确率也就难以保证。为了过滤这些错误信号,投资者可以参考更加平缓的RSI 12做出判断。



文章转载自量化分析之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论