(1)Backtrader策略实现(一) | 简单双均线


本系列文章主要是对Backtrader框架的学习使用,文章中会使用一些有意思的策略来实现复现Backtrader的强大回测功能。大黄也是在一边学习一边摸索着Backtrader的使用技巧,如有错误,请指正,谢谢!


文章目录

  • (1)Backtrader策略实现(一) | 简单双均线
  • 前言
  • 一、简单双均线策略介绍
  • 二、Backtrader实现策略
    • 1. 引入库
    • 2. 数据库连接
    • 3. 读取数据
    • 4. 策略类代码实现
    • 5. 主程序代码实现
  • 总结

前言

本文是本系列文章的第一篇,实现的策略是大家耳熟能详的双均线策略~
在看文章时,希望读者注重于策略类的生命周期以及DataFrame类型的数据是如何构造成Backtrader所需的行情数据~


一、简单双均线策略介绍

双均线策略,又称金叉死叉(这里的短线和长线用多少日自个定,文中是10日均线与30日均线作比较)。
金叉:当10日均线向上突破30日均线时,10日均线在上,30日均线在下,交叉点即为金叉,此时是市场由空走向多的信号,应进入市场(买)。
死叉:当10日均线向下突破30日均线时,30日均线在上,10日均线在下,交叉点即为死叉,此时是市场由多走向空的信号,应退出市场(卖)。

二、Backtrader实现策略

1. 引入库

代码如下(示例):

from __future__ import (absolute_import, division, print_function,unicode_literals)import datetime
import pymysql
import pandas as pdimport backtrader as bt
import backtrader.feeds as btfeeds
import backtrader.indicators as btind

2. 数据库连接

代码如下(示例):

def database_conn():conn = pymysql.connect(host='ip地址',  # 如果是本地的话就是:127.0.0.1user='用户名',password='密码',database='数据库名',charset='utf8')cursor = conn.cursor()return conn, cursor

这里的数据是从数据库中读取,因此先要连接数据库。(如果你的从tushare中直接获取的数据就可以跳过这步)

3. 读取数据

数据库读取数据代码如下(示例)【数据库与Tushare二选一】:

def get_data(symbol):"""从数据库中读取数据:param symbol: 股票代码  类型:str:return: 对应symbol的股票日线数据  类型:DataFrame""" conn, cursor = database_conn()sql_q_daily = 'select daily.* from stock join daily on stock.id = daily.stock_id' \' and stock.symbol=%s' % symboldata_daily = pd.read_sql(sql=sql_q_daily, con=conn)data_daily.index = pd.to_datetime(data_daily.trade_date)data_daily = data_daily[['open', 'high', 'close', 'low']]return data_daily

这部分的sql语句需按照个人数据库的情况进行更改,当然也可以直接从Tushare直接获取数据来实现双均线策略;重点是在读取到DataFrame类型的数据后,需要将日期(trade_date)设为索引,代码中用了pd.to_datetime()方法。 如果不将日期设为索引,Backtrader将不能正常对数据进行处理。

Tushare读取数据代码如下(示例)【数据库与Tushare二选一】:

def get_data(ts_code: str):token = '你的tushare token'ts.set_token(token)pro = ts.pro_api(token)data_daily = pro.daily(ts_code=ts_code, start_date='2020-01-03').sort_values('trade_date')data_daily.index = pd.to_datetime(data_daily.trade_date)data_daily = data_daily[['open', 'high', 'low', 'close']]return data_daily

4. 策略类代码实现

代码如下(示例):

class DoubleAverages(bt.Strategy):params = (('period_sma10', 10),('period_sma30', 30))# 打印日志def log(self, txt, dt=None):dt = dt or self.data.datetime.date(0)print('%s, %s' % (dt, txt))def __init__(self):# 用于保存订单self.order = None# 订单价格self.buyprice = None# 订单佣金self.buycomm = None# 定义变量保存所有收盘价self.dataclose = self.data.close#计算10日均线self.sma10 = btind.MovingAverageSimple(self.dataclose, period=self.params.period_sma5)# 计算30日均线self.sma30 = btind.MovingAverageSimple(self.dataclose, period=self.params.period_sma20)def notify_order(self, order):# 等待订单提交、订单被cerebro接受if order.status in [order.Submitted, order.Accepted]:return# 等待订单完成if order.status in [order.Completed]:if order.isbuy():self.log('BUY EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' %(order.executed.price,order.executed.value,order.executed.comm))else:self.log('SELL EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' %(order.executed.price,order.executed.value,order.executed.comm))# 如果订单保证金不足,将不会完成,而是执行以下拒绝程序elif order.status in [order.Canceled, order.Margin, order.Rejected]:self.log('Order Canceled/Margin/Rejected')self.order = Nonedef notify_trade(self, trade):if not trade.isclosed:returnself.log('OPERATION PROFIT, GROSS %.2f, NET %.2f' %(trade.pnl, trade.pnlcomm))  # pnl:盈利  pnlcomm:手续费# 策略逻辑实现def next(self):# 当今天的10日均线大于30日均线并且昨天的10日均线小于30日均线,则进入市场(买)if self.sma10[0] > self.sma30[0] and self.sma10[-1] < self.sma30[-1]:# 判断订单是否完成,完成则为None,否则为订单信息if self.order:return#若上一个订单处理完成,可继续执行买入操作self.order = self.buy()# 当今天的10日均线小于30日均线并且昨天的10日均线大于30日均线,则退出市场(卖)elif self.sma10[0] < self.sma30[0] and self.sma10[-1] > self.sma30[-1]:# 卖出self.order = self.sell()

自定义的策略类继承了Backtrader的策略类(bt.Strategy)。
类中使用params来保存参数,这里是大元组里包含小元组,但它在类中调用时可以以方法形式:self.params.period_sma5(因为继承了bt中的类,所以不必去深究它是如何实现的,只需知道它是在调用参数就好了)。

简单描述strategy类的生命周期:

1. 实例化期间,执行__init__()方法,此时会创建变量并赋值(order、buyprice…)和计算指标(sma10、sma30)。

2. 当执行cerebro.run()时,会循环执行next()方法,在方法中会执行策略逻辑,分别完成买(self.order=self.buy())、卖(self.order=self.sell())操作;当执行这两个操作时,又会调用订单变动通知方法(notify_order())及交易通知方法(notify_trade()),如此反复,直至数据循环完毕。

3. notify_order()方法:一个订单从提交到被cerebro接受至少触发三个通知,分别为:SumbittedAcceptedCompleted。代码中,当触发前两个通知时,什么事都不做,当触发Completed时,将调用log()方法打印出订单信息。而后续的CanceledMarginRejected通知只有在订单没有完成(有可能是因为保证金不足…)时才触发。详情参考:Order Status values.

4. notify_trade()方法:在order状态执行完毕后,会进入notify_trade中执行log()方法打印出盈利及手续费 。

5. 主程序代码实现

代码如下(示例):

if __name__ == '__main__':cerebro = bt.Cerebro()  # 实例化cerebrocerebro.optstrategy(DoubleAverages)  # 将自己写的策略类添加到cerebrodata_daily = get_data(ts_code='000001.SZ')  # 调用函数获取数据,这里是Tushare的数据# data_daily = get_data(symbol='000001')  # 调用函数获取数据,这里是数据库的数据# 创建数据行情对象,这里使用的是较为通用的PandasData方法,与获取的数据格式是一致的。data = btfeeds.PandasData(dataname=data_daily,  # 数据源fromdate=datetime.date(2020, 1, 3),  # 时间区间:开始时间todate=datetime.date.today()  # 时间区间:结束时间)cerebro.adddata(data)  # 将数据添加到cerebro中cerebro.broker.set_cash(10000.0)  # 设置初始现金# 打印初始现金print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())cerebro.run()  # 执行策略# 打印策略运行结束后的现金print('Ending Portfolio Value: %.2f' % cerebro.broker.getvalue())

具体解析见代码注释~


总结

以上就是文章的全部内容,本文主要讲述的是策略类的生命周期以及最常用的数据加载方式。
这样就完成了???不!!!
买啥都需要看价格合不合适,股票也不例外。
那要怎么以自己想要的价格入手一支股票呢?(限价单)
怎么设置止损止盈点呢?

下一篇再说~

Backtrader策略实现(一) | 简单双均线相关推荐

  1. 量化策略回测01双均线

    回测时间:20130101-20190610 手续:卖买各万分之一 滑点:买入卖出各一跳 初始资金:各品种不同,每个品种1手的资金

  2. 2020-12-24 如何编写一个简单的双均线策略

    如何编写一个简单的双均线策略 目的:编写一个无需写入函数.类的简单策略,对比文字与代码表达的区别,了解编写逻辑与原理 策略类型:双均线策略 策略原理: 双均线策略,指的是运用两条不同周期的移动平均线, ...

  3. python 量化交易_Python量化交易,tushare与talib学习示例演示,双均线(DMA)买卖策略...

    本篇文章为tushare与talib的学习示例,通过双均线策略演示如何使用talib与tushare.下面我们对代码进行详细解析. 引入3个包,分别是talib,tushare和pandas impo ...

  4. Python数据分析之股票双均线策略制定

    Python数据分析之股票双均线策略制定 需求:双均线策略制定 库 tushare包 预处理数据 df = pd.read_csv('./maotai.csv').drop(labels='Unnam ...

  5. 【vn.py】源码解析之双均线(Double Moving Average)策略以及策略底层实现

    文章目录 双均线策略(Double MA) DoubeMA源码分析 1.策略类初始化 2.策略初始化 3.策略启动 4.接收Tick数据 5.处理Bar数据 6.订单以及交易的回调 7.策略结束 流程 ...

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

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

  7. 量化择时——平均K线图双均线策略(第1部分—策略效果测算)

    文章目录 平均K线图概述 OHLC的计算方式 K线图走势对比 平均K线图阴阳线交易策略 交易规则 测算结论 双均线策略测算 测算规则 测算结论 平均K线图概述 平均K线图是蜡烛图的一种分支,在日本,H ...

  8. 双均线通道过滤交易系统

    本策略简介 传统的双均线交易系统是通过快速均线与慢速均线的交叉来捕捉趋势:当快速均线上穿慢速均线的时候,出现买入信号,指示有一波上涨趋势:当快速均线下穿慢速均线的时候,出现卖出信号,指示有一波下跌趋势 ...

  9. 6、如何用backtrader实现双均线策略?以工商银行为例

    在第五讲中,我们配置好了backtrader的运行,在这一讲中,我将会和一步步分享下,如何使用backtrader,验证下双均线交易策略(均线金叉做多,均线死叉做空)在工商银行上的表现. 一.交易策略 ...

  10. Tushare + Backtrader实现双均线策略 以工商银行为例

    参看文章: Welcome - Backtrader 6.如何用backtrader实现双均线策略?以工商银行为例_云金杞-CSDN博客 Python量化交易学习笔记(53)--backtrader的 ...

最新文章

  1. Twitter Heron 实时流处理系统简介
  2. 【HDOJ】2577 How to Type
  3. 笔记本网络计算机和设备不可见,WIN10局域网电脑和设备显示不完整
  4. MATLAB无穷大上的反常积分
  5. docker 修改容器的主机名
  6. Exploiting the Syntax-Model Consistency for Neural Relation Extraction(关系抽取,语法模型,跨领域关系抽取
  7. 经典面试题(35):以下代码将输出的结果是什么?
  8. 干货整理!10个Python图像处理工具,入门必看,提效大法 | 资源
  9. JS中定时器的返回数值ID值
  10. PyRobot开辟 AI 机器人框架
  11. 20200515每日一句
  12. python读取特定单词_Python:如何从txt文件中的特定单词开始读取到文件结尾
  13. 计算机主机五大结构,计算机由哪五大部分组成?
  14. 蓝牙解码格式哪个最好_柏韵Pureaudio AirDSD Pro 串流播放解码前级
  15. 通信原理-确定信号分析
  16. python爬取b站弹幕分析_B站直播弹幕获取 - 用python写一个B站弹幕姬吧
  17. 视频服务器(4) webrtc-streamer(windows下卡住了)
  18. 逃跑吧少年服务器维护中怎么回事,逃跑吧少年7月6日更新维护公告
  19. 2019java 开发工程师 最新面试官 问的问题
  20. POJ1984 Navigation Nightmare —— 种类并查集

热门文章

  1. 大数据带来了哪些改变
  2. LDUOJ spj 修改
  3. 无线电波是怎么产生的
  4. 2021-05-11PLC通信Libnodave-明天继续
  5. 转发:五个方向告诉你如何运营好一个公众号!
  6. 网络适配器不见了网络连接不见了的解决方法
  7. 台式电脑经常碰到的一些问题
  8. 用HTML加css做成的新年特效,使用css3和html给网站添加上春节灯笼特效的源码分享...
  9. php date 格式时分秒,PHP 把秒数转为时分秒格式
  10. Java整合极光推送