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

【量化回测】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.xdnf.cn/news/19447.html

相关文章:

  • Rsync 数据同步工具及实时同步配置
  • SAP PP中的MRP
  • 【OpenGL】LearnOpenGL学习笔记18 - Uniform缓冲对象UBO
  • 模型系列(篇三)-Llama
  • vscode克隆远程代码步骤
  • 合约服务架构-OOP 方式
  • leetcode 371 两个整数之和
  • 微软开源TTS模型VibeVoice,可生成 90 分钟4人语音
  • TFS-1996《The Possibilistic C-Means Algorithm: Insights and Recommendations》
  • 一些八股总结
  • 如何快速学习新技能
  • Redis 7.0 高性能缓存架构设计与优化
  • [Android] UI进阶笔记:从 Toolbar 到可折叠标题栏的完整实战
  • IDEA插件ApifoxHelper
  • C++ 登录状态机项目知识笔记
  • Nginx虚拟主机配置
  • CTFshow系列——命令执行web69-72
  • 数据结构 04(线性:双向链表)
  • 【大前端】React配置配置 开发(development)、生产(production)、测试(test)环境
  • 学习数据结构(15)插入排序+选择排序(上)
  • 算法——链表
  • 开源协作白板 – 轻量级多用户实时协作白板系统 – 支持多用户绘图、文字编辑、图片处理
  • 进程间通信IPC(interprocess communicate)
  • Introduction to GIS —— Chapter 4(Raster Data Model)
  • 解读IEC 60529-2013
  • MySQL 公用表达式
  • AI军团协同作战:Manus Wide Research深度解析
  • CAN数据链路层、网络层(ISO11898、15765)
  • JVM-指针压缩
  • Day 01(02): 精读HDFS概念