GitHub:https://github.com/enigmampc/catalyst
官方文档:https://enigma.co/catalyst/index.html
系统环境:macOS High Sierra 10.13.6
官方没有布林带策略的示例文件,不过我们很容易自己实现。
首先安装开源技术指标库TA-Lib,在Catalyst环境下
pip install TA-Lib
一. 布林带
布林带由三条线构成,分别是上轨(Upper),中轨(Middle,即均线),下轨(Lower)
布林线中轨:n天收盘价的移动平均线
布林线上轨:n天收盘价的移动平均线 + (m x n天收盘价的标准差)
布林线下轨:n天收盘价的移动平均线 - (m x n天收盘价的标准差)
其中m称为标准差,是整数,因此布林带的参数是[n, m]。
用TA-Lib很容易得到这三条线:
upper, middle, lower = talib.BBANDS(history_data, timeperiod=BOLL_N, nbdevdn=BOLL_M, nbdevup=BOLL_M)
其中history_data
是历史收盘价dataframe,timeperiod
是统计周期n天,nbdevdn
和nbdevup
就是上下轨要乘的标准差m。
二. 策略逻辑
布林带的策略逻辑有很多,为了简单起见,这里仅做如下示例:
- K线上穿下轨,买入
- K线下穿上轨,卖出
你也可以尝试其它做法比如:
- 当收盘价由下向上穿过上轨的时候,做多;然后由上向下穿过中轨的时候,平仓。
- 当收盘价由上向下穿过下轨的时候,做空;然后由下向上穿过中轨的时候,平仓。
三. 代码实现
1. 常数设置和程序初始化
NAMESPACE = 'bollinger_bands'
log = Logger(NAMESPACE)
SIGNAL_BUY = 'buy' # 买入信号
SIGNAL_SELL = 'sell' # 卖出信号
SIGNAL_INIT = '' # 观望信号
BOLL_N = 20 # bbands参数n
BOLL_M = 2 # bbands参数m
def initialize(context):
"""
初始化
"""
context.i = 0 # 经历过的交易周期
context.asset = symbol('bab_usd') # 交易对
context.base_price = None # 初始价格
context.signal = SIGNAL_INIT # 交易信号
2. 策略实现
def handle_data(context, data):
"""
策略
"""
# 经历过的交易周期大于周期窗口才开始计算
context.i += 1
if context.i < BOLL_N + 1:
return
# 获取历史数据,返回dataframe
history_data = data.history(context.asset,
'close',
bar_count=BOLL_N + 1,
frequency="1D",
)
# 获取当前持仓数量
pos_amount = context.portfolio.positions