GitHub:https://github.com/enigmampc/catalyst
官方文档:https://enigma.co/catalyst/index.html
系统环境:macOS High Sierra 10.13.6
官方没有RSI策略的示例文件,我们很容易通过TA-Lib实现。
一. RSI(相对强弱指数)
举个栗子(详见百度https://baike.baidu.com/item/RSI/6130115?fr=aladdin):
如果最近14天涨跌情形是:第一天升2元,第二天跌2元,第三至第五天各升3元;第六天跌4元 第七天升2元,第八天跌5元;第九天跌6元,第十至十二天各升1元;第十三至十四天各跌3元。
那么,计算RSI的步骤如下:
(一)将14天上升的数目相加,除以14,上例中总共上升16元除以14得1.143(精确到小数点后三位);
(二)将14天下跌的数目相加,除以14,上例中总共下跌23元除以14得1.643(精确到小数点后三位);
(三)求出相对强度RS,即RS=1.143/1.643=0.696(精确到小数点后三位);
(四)1+RS=1+0.696=1.696;
RS/(1+RS)=0.696/(1+0.696)=0.41038
(五)RSI=100*0.41028=41.038.
结果14天的强弱指标RS1为41.038。
不同日期的14天RSI值当然是不同的,连接不同的点,即成RSI的轨迹。
RSI的变动范围在0—100之间,一般来说,RSI>70是超买状态,可以做空;RSI<30是超卖状态,可以做多。
用TA-Lib很容易得到RSI:
rsi_value = talib.RSI(history_data, timeperiod=RSI_PERIOD)
其中history_data
是历史收盘价dataframe,timeperiod
是统计周期。
二. 策略逻辑
- RSI值上穿超卖阈值(30),买入
- RSI值下穿超买阈值(70),卖出
三. 代码实现
1. 常数设置和程序初始化
NAMESPACE = 'bollinger_bands'
log = Logger(NAMESPACE)
SIGNAL_BUY = 'buy' # 买入信号
SIGNAL_SELL = 'sell' # 卖出信号
SIGNAL_INIT = '' # 观望信号
RSI_PERIOD = 14 # RSI计算周期
RSI_OVER_SOLD_THRESH = 30 # 超卖阈值
RSI_OVER_BOUGHT_THRESH = 70 # 超买阈值
def initialize(context):
"""
初始化
"""
context.i = 0 # 经历过的交易周期
context.asset = symbol('bab_usd') # 交易对
context.base_price = None # 初始价格
context.signal = SIGNAL_INIT # 交易信号
2. 策略实现
注意:这里if context.i < RSI_PERIOD + 2
与前面两个策略不同,请看下图,我们将均线(或布林带)和RSI的计算周期都设置成14天,两条线出现的时间相差一天,那是因为均线(或布林带)计算的14天是包括了当天的,而RSI是计算前面14天,也就是说RSI值是从第15天才有的,因此RSI的观察窗口要比均线或布林带增加1天:
def handle_data(context, data):
"""
策略
"""
# 经历过的交易周期大于周期窗口才开始计算
context.i += 1
if context.i < RSI_PERIOD + 2:
return
# 获取历史数据,返回dataframe
history_data = data.history(context.asset,
'close',
bar_count=RSI_PERIOD +