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线下穿上轨,卖出你也可以尝试其它做法比如:
当收盘价由下向上穿过上轨的时候,做多;然后由上向下穿过中轨的时候,平仓。当收盘价由上向下穿过下轨的时候,做空;然后由下向上穿过中轨的时候,平仓。这部分与双均线策略是一样的,只是图2的变量名做了修改
def analyze(context, perf): # 保存交易记录 perf.to_csv('performance.csv') # 获取计价货币(USDT) exchange = list(context.exchanges.values())[0] quote_currency = exchange.quote_currency.upper() # 图1:输出资产值 ax1 = plt.subplot(411) perf.loc[:, ['portfolio_value']].plot(ax=ax1) # ax1.legend_.remove() # 设置y轴 ax1.set_ylabel('Portfolio Value\n({})'.format(quote_currency)) # 设置区间 start, end = ax1.get_ylim() # 设置刻度 ax1.yaxis.set_ticks(np.arange(start, end, (end - start) / 5)) # 图2:输出资产货币价格、布林带和买卖点 ax2 = plt.subplot(412, sharex=ax1) perf.loc[:, ['price', 'upper', 'middle', 'lower']].plot(ax=ax2) # ax2.legend_.remove() ax2.set_ylabel('{asset}\n({quote})'.format( asset=context.asset.symbol, quote=quote_currency )) start, end = ax2.get_ylim() ax2.yaxis.set_ticks(np.arange(start, end, (end - start) / 5)) # 提取交易时间点 transaction_df = extract_transactions(perf) # 交易dataframe if not transaction_df.empty: buy_df = transaction_df[transaction_df['amount'] > 0] # 取到amount>0,买入点 sell_df = transaction_df[transaction_df['amount'] < 0] # 取到amount<0,卖出点 ax2.scatter( buy_df.index.to_pydatetime(), perf.loc[buy_df.index, 'price'], # 找到index marker='^', s=100, c='green', label='' ) ax2.scatter( sell_df.index.to_pydatetime(), perf.loc[sell_df.index, 'price'], marker='v', s=100, c='red', label='' ) # 图3:比较价格变化率和资产变化率(即比较策略收益率和基准收益率) ax3 = plt.subplot(413, sharex=ax1) perf.loc[:, ['algorithm_period_return', 'price_change']].plot(ax=ax3) # ax3.legend_.remove() ax3.set_ylabel('Percent Change') start, end = ax3.get_ylim() ax3.yaxis.set_ticks(np.arange(start, end, (end - start) / 5)) # 图4:现金数量 ax4 = plt.subplot(414, sharex=ax1) perf.cash.plot(ax=ax4) ax4.set_ylabel('Cash\n({})'.format(quote_currency)) start, end = ax4.get_ylim() ax4.yaxis.set_ticks(np.arange(0, end, end / 5)) plt.show()第一个图是持有BCH资产的价值走势 第二个图中绿色三角形代表买入点,红色三角形代表卖出点 第三个图是策略收益与基准收益的对比 第四个图是现金变动情况