GitHub:https://github.com/enigmampc/catalyst
官方文档:https://enigma.co/catalyst/index.html
参考视频:网易云课堂《从零搭建数字货币量化交易系统》
系统环境:macOS High Sierra 10.13.6

这篇我们在Catalyst的官方示例dual_moving_average.py的基础上研究双均线策略。

一. 策略要点

1. 短期移动均线上穿长期移动均线,买入

2. 短期移动均线下穿长期移动均线,卖出

如图所示(注意:绿涨红跌,这是国际惯例):

3. 买入和卖出的时机(交易逻辑)

如图所示:第一根K线的短周期均线在长周期均线下方,第二根K线的短周期均线上穿长周期均线,当且仅当第二根K线结束我们才能确认这个买点形成,在catalyst中,我们可以在第二根K线结束时买入。

二. 代码详解

1. 常数设置和程序初始化

这里我们用bitfinex交易所的BCH/USD交易对,注意:BCH在bitfinex交易所的名称是BAB,所以symbol是bab_usd

NAMESPACE = 'dual_moving_average'
log = Logger(NAMESPACE)
SIGNAL_BUY = 'buy'  # 买入信号
SIGNAL_SELL = 'sell'  # 卖出信号
SIGNAL_INIT = ''  # 观望信号
SHORT_WIN = 5  # 短周期窗口
LONG_WIN = 20  # 长周期窗口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 += 1if context.i < LONG_WIN + 1:return# 获取历史数据,返回serieshistory_data = data.history(context.asset,'close',bar_count=LONG_WIN + 1,frequency="1D",)# 获取当前持仓数量pos_amount = context.portfolio.positions[context.asset].amount# 计算双均线"""pandas.Series.mean: Return the mean of the values for the requested axis.scalar or Series (if level specified)pandas.Rolling.mean: Calculate the rolling mean of the values.Returned object type is determined by the caller of the rolling calculation."""short_avgs = history_data.rolling(window=SHORT_WIN).mean()long_avgs = history_data.rolling(window=LONG_WIN).mean()# 策略逻辑# 短期均线上穿长期均线,买入if (short_avgs[-2]) < (long_avgs[-2]) and (short_avgs[-1]) >= (long_avgs[-1]) and pos_amount == 0:# target买入百分比,1代表买入100%,0.5代表买入50%,0代表卖出order_target_percent(asset=context.asset, target=1)# 设置交易信号为买入context.signal = SIGNAL_BUY# 短期均线下穿长期均线,卖出if (short_avgs[-2] > long_avgs[-2]) and (short_avgs[-1]) <= (long_avgs[-1]) and pos_amount > 0:# target买入百分比,1代表买入100%,0.5代表买入50%,0代表卖出order_target_percent(asset=context.asset, target=0)# 设置交易信号为卖出context.signal = SIGNAL_SELL# 获取当前价格price = data.current(context.asset, 'price')# 如果初始价格没设置,把当前的价格设置为初始价格if context.base_price is None:context.base_price = price# 计算价格变化百分比,作为基准price_change = (price - context.base_price) / context.base_price# 记录每个交易周期的信息record(price=price,  # 价格cash=context.portfolio.cash,  # 现金price_change=price_change,  # 价格变化率short_mavg=short_avgs[-1],  # 短期均线long_mavg=long_avgs[-1],  # 长期均线signal=context.signal)  # 交易信号# 输出信息print('日期:{}, 价格:{:.4f}, 资产:{:.2f}, 持仓量:{:.8f}, {}'.format(data.current_dt, price, context.portfolio.portfolio_value, pos_amount, context.signal))# 重置交易信号context.signal = SIGNAL_INIT

3. 策略分析和可视化

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[['price', 'short_mavg', 'long_mavg']].plot(ax=ax2)perf.loc[:, ['price', 'short_mavg', 'long_mavg']].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)  # 交易dataframeif 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'],  # 找到indexmarker='^',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()

4. 主函数

因为BCH是在2018年11月13日上币的,所以开始时间选择这天。

if __name__ == '__main__':run_algorithm(capital_base=1000,data_frequency='daily',initialize=initialize,handle_data=handle_data,analyze=analyze,exchange_name='bitfinex',algo_namespace=NAMESPACE,quote_currency='usd',start=pd.to_datetime('2018-11-13', utc=True),end=pd.to_datetime('2019-10-16', utc=True),)

5. 运行程序

首先导入数据:

catalyst ingest-exchange -x bitfinex -i bab_usd -f daily

运行程序:


可以看到,在2018年12月20日有买入信号,就是前文给出买点的那个图。

6. 输出图像


第一个图是持有BCH资产的价值走势
第二个图中绿色三角形代表买入点,红色三角形代表卖出点
第三个图是策略收益与基准收益的对比
第四个图是现金变动情况

开源量化框架Catalyst中文教程(3)——双均线策略相关推荐

  1. Python量化交易实战-38使用开源项目回测双均线策略

    B站配套视频教程观看 使用PyAlgoTrade回测双均线策略 双均线策略:长短周期均线,通过金叉,死叉的方式买入卖出股票,获取收益的策略. 回顾上节课代码的部分,上节课完成了可视化代码的部分, 主要 ...

  2. 双均线策略(期货)——Python量化

    双均线策略 目录 双均线策略 1. 原理 均线的"前世今生" 均线理论为什么有效? 均线理论的缺陷 均线理论的改进 2. 策略逻辑 3. 策略代码 4. 回测结果与稳健性分析 1. ...

  3. python量化 双均线策略(金叉死叉)

    #小策略,策略逻辑是在金叉时候买进,死叉时候卖出,所谓金叉死叉是两条均线的交叉,当短期均线上穿长期均线为金叉,反之为死叉 #下面是策略代码及结构 # 导入函数库 from jqdata import ...

  4. 量化交易入门----双均线策略

    本文采用了聚宽平台接口进行量化策略设置: 一.效果图 双均线策略:双均线策略,当五日均线位于十日均线上方则买入,反之卖出. 二.证券知识: 策略收益(Total Returns) 最容易理解的一个概念 ...

  5. Python量化交易02——双均线策略(移动平均线)

    参考书目:深入浅出Python量化交易实战 本次带来最经典的交易策略,双均线策略的构建和其回测方法. 双均线一般采用5天均值和10天均值,如果5日均线上穿突破了10日均线,说明股价在最近的涨势很猛,买 ...

  6. 量化双均线策略:(二)判断买入卖出信号

    上篇已经介绍了data的获取,此篇介绍ma5与ma10的双均线策略具体实现.双均线策略是一个趋势策略,基本思路是金叉买入,死叉卖出,也就是当ma5向上穿过ma10时,则买入,向下穿过ma10时,则卖出 ...

  7. python双均线策略,当五日均线位于十日均线上方则买入,反之卖出。(聚宽量化平台使用)

    ''' ** python双均线策略,当五日均线位于十日均线上方则买入,反之卖出.(聚宽量化平台使用) ** ''' 初始化函数,设定要操作的股票.基准等等 def initialize(contex ...

  8. Python量化交易策略--双均线策略及代码

    双均线策略是比较经典的策略,股票的价格均线是投资参考的重要指标.均线有快线和慢线之分,当快线向上穿过慢线则是金叉,一般执行买入操作,当快线向下穿过慢线时则形成死叉,一般执行卖出操作.基于这个基本思路, ...

  9. 量化策略初探——使用tushare进行沪深300ETF双均线策略

    使用tushare采集沪深300ETF数据,并对沪深300ETF采用简单移动平均.指数移动平均.进行双均线策略,最后使用backtrader进行回测. 一.基本概念 双均线策略:运用两条不同周期的移动 ...

最新文章

  1. Sizzle引擎--原理与实践(二)
  2. 前端学习(872):注册事件兼容性处理
  3. 5 计算机组成原理第四章 指令系统
  4. http://www.codeproject.com/script/Articles/ViewDownloads.aspx?aid=9332 多broser
  5. rust: 写CTP策略中的几个难点
  6. java项目介绍_java项目介绍及创建
  7. mmap文件内存映射
  8. java 闰年闰月_闰四月,说说中国的“闰月”与“闰年”
  9. 【电力电子技术】浅析IR2110自举电路
  10. 504PHP,php504错误怎么解决_后端开发
  11. Java游戏吉他英雄_《吉他英雄:世界巡演》游戏秘技
  12. 7-4 房产税费计算2022.6.24
  13. cadence常见技巧和错误。。。
  14. 数字孪生是什么,数字孪生能干什么?一文读懂
  15. 不登录系统运行服务器,服务器开机不登录可以远程吗
  16. Addition Chains
  17. Java基础知识梳理
  18. 数组排列组合问题——BACKTRACKING
  19. nvr linux 软件,Linux系统下运行RTSP协议安防视频平台EasyNVR出现安装服务错误,如何解决?...
  20. 淫思奇巧篇 之 Save Actions 替你摆平代码格式问题

热门文章

  1. win10切换输入法快捷键_改掉Win10难用的输入法
  2. 微信支付服务器错误,【支付问题】微信支付宝支付超时、支付异常解决办法
  3. 计算机毕业设计-校园疫情防控系统【PHP源码】
  4. 科学计算基础软件包NumPy入门讲座(4):操作数组
  5. java导出功能(多级表头,复杂表头)
  6. 针对移动式和无线物联网设备的低压电机控制系统的设计
  7. 微信小程序中获取用户微信公众号授权(openid)用来发送模板消息
  8. windows服务器双网卡修改默认路由,windows下双网卡双网关的设置
  9. 机器学习40讲-12正则化处理:收缩方法与边际化
  10. css实现人走路效果,纯css实现机器人走路动画