当前位置: 首页 > news >正文

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

backtrader整体框架

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

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

整体流程

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

数据流程

请添加图片描述

实操流程

安装环境

pip install backtrader matplotlib

回测示例

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

import backtrader as bt
import pandas as pd
import matplotlib.pyplot as plt
import datetime as dt
import numpy as npclass SMAStrategy(bt.Strategy):'''自定义的策略, 需继承 bt.Strategy'''def __init__(self):self.dataclose = self.data0.closeself.order = Noneself.buyprice = Noneself.buycomm = Noneself.sma = bt.indicators.SimpleMovingAverage(self.data0, period=15)def next(self):'''一般在这里写实际的策略。这里就是收盘价上穿sma买入,反之则卖出。'''if not self.position:  # 判断是否有持仓if self.dataclose[0] > self.sma[0]:  # 判断收盘价是否上穿smaself.buy()else:if self.dataclose[0] < self.sma[0]:self.close()  # 平仓def notify_order(self, order):'''获取订单状态,这个函数一般可以通用。'''if order.status in [order.Submitted, order.Accepted]:returnif 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.priceself.buycomm = order.executed.commelse: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 = Nonedef notify_trade(self, trade):'''追踪每笔交易的状态,这个函数一般可以通用。'''if not trade.isclosed:returnself.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__":# 实例化cerebrocerebro = 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)# 加载Analyzercerebro.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)# 设置Sizercerebro.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

http://www.dtcms.com/a/359639.html

相关文章:

  • arm容器启动spring-boot端口报错
  • linux 内核 - 常见的文件系统介绍
  • 【K8s】整体认识K8s之存储--volume
  • shell脚本(略)
  • 【Flink】并行度的设置
  • nrf52840 flash 分区
  • 3【鸿蒙/OpenHarmony/NDK】如何在鸿蒙应用中使用NDK?
  • 线阵相机和镜头选型案例介绍
  • 【不懂就问】-手机相关学习
  • 打开多个Excel文件后快速关闭所有的文档,并且退出Excel应用
  • Docker一小时快速上手(附报错解决方式)
  • 并发编程——11 并发容器(Map、List、Set)实战及其原理分析
  • deep seek的对话记录如何导出
  • CICD实战(1) - 使用Arbess+GitPuk+Docker快速实现项目打包构建、docker部署
  • 视频理解与行为识别全景综述
  • 计算机网络:(十六)TCP 的运输连接管理
  • 传统数据库out啦!KINGBASE ES V9R1C10 开启国产数据库“修仙”新纪元!
  • Redis六大常见命令详解:从set/get到过期策略的全方位解析
  • 大模型推理技术解析
  • AI热点周报(8.24~8.30):Grok 2.5开源,OpenAI Realtime正式商用,Meta或与OpenAI或Google合作?
  • 学习记录(二十二)--Overleaf中生成的PDF左上角1.5em问题
  • 【stm32】对射式红外传感器计次以及旋转编码器计次
  • 基于单片机智能大棚/温室大棚/智慧农业/智能栽培种植系统/温湿度控制
  • 使用VBA实现快速多重数据筛选
  • Flink部署实战:从入门到优化
  • 第 14 篇:K-Means与聚类思维——当AI在没有“标准答案”的世界里寻宝
  • python实现滤波器的简单案例
  • python如何打开显示svg图片
  • 阿里云-应用实时监控服务 ARMS
  • Unity笔记(九)——画线功能Linerenderer、范围检测、射线检测