量化交易1-backtrader介绍

1、backtrader介绍 关于backtrader本身的背景此处不做过多的介绍,中文文档的传送门: http://backtrader.com.cn/ 中文文档写的很好。

不过对于熟悉python语言的同学,比如我这种的 非专业的python语言开发者来说是有一个很大的弊端,就是没有办法把照着文档一步一步的把策略回测起来。

因为文档中的行情源来自于雅虎,由于不可抗拒的原因,我们应该是没有办法 直接获取雅虎的行情源,并且我们对老美的行情数据并不怎么感兴趣,我们还是非常热爱大A,虽然他常常让我们关灯吃面。

因此本文档会把行情源换成我们大A行情源,并且会把回测结果用图像展示出来,话不多说,先上结果,以下是回测结果图形的展示:

量化交易1-backtrader介绍_第1张图片

以下是搭建backtrader的过程: 基本要求是: Python 2.7 Python 3.2 / 3.3 / 3.4 / 3.5 pip install backtrader pip install matplotlib==3.2.2(此处一定要使用3.2.2版本,如果直接使用pip install matplotlib命令进行安装最新的版本,会导致显示回测结果图像时报错) 后续代码运行过程中缺什么包就是用,pip安装什么包

废话不多,上代码: 

    import datetime  # 
    import os.path  # 路径管理
    import sys  # 获取当前运行脚本的路径 (in argv[0])
    #导入backtrader框架
    import backtrader as bt
    import pandas as pd
    # 创建策略继承bt.Strategy
    class TestStrategy(bt.Strategy):
        def log(self, txt, dt=None):
            # 记录策略的执行日志
            dt = dt or self.datas[0].datetime.date(0)
            print('%s, %s' % (dt.isoformat(), txt))
    
        def __init__(self):
            # 保存收盘价的引用
            self.dataclose = self.datas[0].close
            # 跟踪挂单
            self.order = None

        def notify_order(self, order):
            if order.status in [order.Submitted, order.Accepted]:
                # broker 提交/接受了,买/卖订单则什么都不做
                return
    
            # 检查一个订单是否完成
            # 注意: 当资金不足时,broker会拒绝订单
            if order.status in [order.Completed]:
                if order.isbuy():
                    self.log('已买入, %.2f' % order.executed.price)
                elif order.issell():
                    self.log('已卖出, %.2f' % order.executed.price)
    
                # 记录当前交易数量
                self.bar_executed = len(self)
    
            elif order.status in [order.Canceled, order.Margin, order.Rejected]:
                self.log('订单取消/保证金不足/拒绝')
    
            # 其他状态记录为:无挂起订单
            self.order = None
        def next(self):
            # 记录收盘价
            self.log('Close, %.2f' % self.dataclose[0])
    
            # 如果有订单正在挂起,不操作
            if self.order:
                return
            # 如果没有持仓则买入
            if not self.position:
                # 今天的收盘价 < 昨天收盘价 
                if self.dataclose[0] < self.dataclose[-1]:
                    # 昨天收盘价 < 前天的收盘价
                    if self.dataclose[-1] < self.dataclose[-2]:
                        # 买入
                        self.log('买入, %.2f' % self.dataclose[0])
                         # 跟踪订单避免重复
                        self.order = self.buy()
            else:
                # 如果已经持仓,且当前交易数据量在买入后5个单位后
                if len(self) >= (self.bar_executed + 5):
                    # 全部卖出
                    self.log('卖出, %.2f' % self.dataclose[0])
                    # 跟踪订单避免重复
                    self.order = self.sell()
    if __name__ == '__main__':  
        # 创建Cerebro引擎
        cerebro = bt.Cerebro()
        # Cerebro引擎在后台创建broker(经纪人),系统默认资金量为10000
        # 为Cerebro引擎添加策略
        cerebro.addstrategy(TestStrategy)
         # Create a Data Feed
        # 本地数据,笔者用Wind获取的东风汽车数据以csv形式存储在本地。
        # parase_dates = True是为了读取csv为dataframe的时候能够自动识别datetime格式的字符串,big作为index
        # 注意,这里最后的pandas要符合backtrader的要求的格式
        dataframe = pd.read_csv('dfqc.csv', index_col=0, parse_dates=True)
        dataframe['openinterest'] = 0
        data = bt.feeds.PandasData(dataname=dataframe,
                            fromdate = datetime.datetime(2015, 1, 1),
                            todate = datetime.datetime(2016, 12, 31)
                            )
        # Add the Data Feed to Cerebro
        cerebro.adddata(data)    
        # 设置投资金额100000.0
        cerebro.broker.setcash(100000.0)
        # 引擎运行前打印期出资金
        print('组合期初资金: %.2f' % cerebro.broker.getvalue())
        cerebro.run()
        # 引擎运行后打期末资金
        print('组合期末资金: %.2f' % cerebro.broker.getvalue())
        
        # Plot the result
        cerebro.plot()
 

上面这段代码整个框架来自于backtrader的官网 (http://backtrader.com.cn/) 笔者自己修改了获取数据的方式,以及增加了打印出了运行结果, 其中数据源文件:dfqc.csv的下载地址 链接:https://pan.baidu.com/s/1slnULbv 密码:wi3k 下载完dfqc.csv文件放到和需要运行的Python代码的同级 大家安装完backtrader, 放到行情数据之后,就可以把代码可以复制过去运行,运行的结果就是如上图,图像就描述了策略的运行结果

以上的博文借鉴了Backtrader量化平台教程(一):backtrader的整体框架_钱塘小甲子的博客-CSDN博客_backtrader

感谢大佬

你可能感兴趣的:(java,金融)