【量化回测】backtracker整体架构和使用示例

backtrader整体框架

backtrader 是一个量化回测的库,支持多品种、多策略、多周期的回测和交易。更重要的是可以集成 torch 等神经网络分析模块。

Cerebro类是 backtrader 的核心。Strategy类、Broker和Sizer类都是由Cerebro类实例化而来。

整体流程

  • backtrade 自带的数据源是yahoofinance(),也可使用自己本地的 csv 文件。
  • DataFeed模块会将原始数据导入到 Cerebro ,之后就可以进行矢量化操作。
  • Strategy模块会根据策略将订单提交到Broker。Broker是一个抽象的交易所,里面定义了订单执行、仓位管理和交易费率等。
  • Strategy模块中包括了三个模块Observer、Analyzer和Indicator。Observer负责观测市场数据。Analyzer负责分析算法产生的数据,可以看做是一个评估模块。Indicator是指标和信号模块,策略主要通过指标和信号来判断是否触发交易。
  • Sizer主要负责仓位的管理。因为Strategy只负责触发交易,但不知道怎么分配仓位。Sizer就可以独立控制仓位管理。

数据流程

实操流程

安装环境

python 复制代码
pip install backtrader matplotlib

回测示例

注意,需要准备CSV格式的个股数据。

python 复制代码
import backtrader as bt
import pandas as pd
import matplotlib.pyplot as plt
import datetime as dt
import numpy as np


class SMAStrategy(bt.Strategy):
    '''
    自定义的策略, 需继承 bt.Strategy
    '''
    def __init__(self):
        self.dataclose = self.data0.close
        self.order = None
        self.buyprice = None
        self.buycomm = None

        self.sma = bt.indicators.SimpleMovingAverage(self.data0, period=15)

    def next(self):
        '''
        一般在这里写实际的策略。
        这里就是收盘价上穿sma买入,反之则卖出。
        '''
        if not self.position:  # 判断是否有持仓
            if self.dataclose[0] > self.sma[0]:  # 判断收盘价是否上穿sma
                self.buy()
        else:
            if self.dataclose[0] < self.sma[0]:
                self.close()  # 平仓

    def notify_order(self, order):
        '''
        获取订单状态,这个函数一般可以通用。
        '''
        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)
                )
                self.buyprice = order.executed.price
                self.buycomm = order.executed.comm
            else:
                self.log(
                    'SELL EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' %
                    (order.executed.price,
                    order.executed.value,
                    order.executed.comm)
                )
                self.bar_executed = len(self)
        elif order.status in [order.Canceled, order.Margin, order.Rejected]:
            self.log('Drder Canceled / Margin / Rejected')
        self.order = None
    
    def notify_trade(self, trade):
        '''
        追踪每笔交易的状态,这个函数一般可以通用。
        '''
        if not trade.isclosed:
            return
        self.log('OPERATION PROFIT, GROSS %.2f, NET %.2f' %
                 (trade.pnl, trade.pnlcomm))
        
    def log(self, txt, dt=None, doprint=False):
        '''
        保存日志
        '''
        if doprint:
            dt = dt or self.datas[0].datetiem.date(0)
            print('%s, %s' % (dt.isoformat(), txt))



if __name__ == "__main__":
    # 实例化cerebro
    cerebro = bt.Cerebro()

    # 处理数据
    dataframe = pd.read_csv('TSLA.csv')
    dataframe['Datetime'] = pd.to_datetime(dataframe['Date'])
    dataframe.set_index('Datetime', inplace=True)

    # 加载数据源
    data_TSLA = bt.feeds.PandasData(dataname = dataframe,
                                    fromdate = dt.datetime(2025,1,2), 
                                    todate = dt.datetime(2025,1,31))
    cerebro.adddata(data_TSLA)

    # 加载策略
    cerebro.addstrategy(SMAStrategy)

    # 加载Analyzer
    cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name="SharpeRatio")
    cerebro.addanalyzer(bt.analyzers.DrawDown, _name = "DrawDown")

    # 在Broker中设置初始资金和手续费
    cerebro.broker.setcash(10000.0)
    cerebro.broker.setcommission(commission = 0.0006)

    # 设置Sizer
    cerebro.addsizer(bt.sizers.PercentSizer, percents = 90)

    result = cerebro.run()

    print("夏普比率", result[0].analyzers.SharpeRatio.get_analysis()['sharperatio'])
    print("最大回撤", result[0].analyzers.DrawDown.get_analysis["max"]['drawdown'])
    cerebro.plot()

参考:【【Backtrader教程01】Python Backtrader量化回测框架 | 代码实战教学 | 单均线回测收益率570%?】 https://www.bilibili.com/video/BV1QR4y147rS/?share_source=copy_web\&vd_source=9eb6d7fad45f9fa869cd9abb34fa68ca

相关推荐
投图匠5 小时前
十种不同风格的 CTP接口 框架
开发语言·python
2601_967980116 小时前
深入理解词向量算法及其在Python中的实践
python·word2vec·glove·fasttext·词向量
129Lab6 小时前
电池循环测试数据自动化分析:用Python+AI工具构建一键式寿命评估流水线
python·数据分析·电池测试·数据自动化·寿命评估
treasure1406 小时前
【复古】浅尝Django前后端不分离
前端·css·python·django·bootstrap·html·web
Dmz丶7 小时前
前端转 AI 100 天 Day 44:前端集成实战——用 React 给 Agent 做个正式界面
python
jay神8 小时前
基于 YOLOv8 的手势识别系统(Web 版)
前端·人工智能·python·深度学习·yolo·计算机视觉·计算机毕业设计
DeepVisionary8 小时前
阿里云上线旗舰多模态新模型,不公布跑分且限时14天退役
python·自动化
东莞市云毅网络有限公司8 小时前
FAQ 覆盖度打分:TF-IDF 与向量嵌入双路召回的 Python 实现
python·数据清洗·rag·企业知识库·文档解析
爱笑的k118 小时前
nano-vllm 源码剖析:千行 Python 手写离线推理引擎的调度、显存与并行时序
开发语言·python·vllm
用户8356290780519 小时前
使用 Python 控制 Excel 工作表的分页位置
后端·python