Backtrader-Broker05

ops/2024/11/1 21:10:19/

本系列是使用Backtrader在量化领域的学习与实践,着重介绍Backtrader的使用。Backtrader 中几个核心组件:

  • Cerebro:BackTrader的基石,所有的操作都是基于Cerebro的。
  • Feed:将运行策略所需的基础数据加载到Cerebro中,一般为K线数据。
  • Indicator:BackTader自带的指标,并集成了talib中的指标。我们也可以选择继承一个Indicator实现自己的指标。
  • Strategy:交易策略。这里是整个过程中最复杂的部分,需要我们计算买入/卖出信号。
  • Analyzer:分析器,以图形和风险收益等指标对交易策略的回测结果进行分析评价。
  • Order:订单,记录了与当前订单相关的所有数据。
  • Trader:交易,记录了与当前交易相关的所有数据。
  • Position:持仓,记录了与当前持仓相关的所有数据。
  • Broker:可以理解成经纪人,整个策略的初始资金、交易费率、滑点等参数需要通过Broker进行设置。
  • Observer:观察者,对数据进行监控观察,比如资金曲线等等。
  • Plotting:可视化组件

本次介绍Backtrader中Broker模块,其是Backtrader核心模块之一, Broker模拟经纪商交易系统相关功能。

在使用Backtrader时,结合量化策略编写过程通常会考虑:

  1. Broker是什么?它在回测时有什么作用?
  2. Broker经纪商模块,在资金管理、滑点管理等基础参数上,在回测中如何使用?
  3. Broker在交易撮合上都支持哪些模式?

Broker 经纪商模块

Broker模拟经纪商交易系统相关功能,支持不同订单类型、对交易进行“验资验券”,并模拟交易所进行交易撮合。最常见的有初始资金、交易税费、滑点、期货保证金比率等。

Broker

在 Backtrader 中,从数据准备、策略编制、策略回测到绩效分析,整个回测流程各个模块相互协调,从交易流程大致如下:

  • step1:设置交易条件:初始资金、交易税费、滑点、成交量限制等;
  • step2:在 Strategy 策略逻辑中下达交易指令 buy、sell、close,或取消交易 cancel;
  • step3:Order 模块会解读交易订单,解读的信息将交由经纪商 Broker 模块处理;
  • step4:经纪商 Broker 会根据订单信息检查订单并确定是否接收订单;
  • step5:经纪商 Broker 接收订单后,会按订单要求撮合成交 trade,并进行成交结算;
  • step6:Order 模块返回经纪商 Broker 中的订单执行结果。

在backtrader中做策略回测,在策略运行前,Broker实现账户资金、份额等信息初始化;在回测过程中,接受订单Order发出的信息,并进行模拟撮合操作,同时实时更新账户资金、份额信息。

Broker 支持的订单类型

  • Order.Market 按下一个 Bar (即生成订单的那个交易日的下一个交易日)的开盘价来执行成交;
  • Order.Close 按下一个 Bar 的收盘价来执行成交
  • Order.Limit 限价单,需要指定成交价格,只有达到指定价格(limit Price)或有更好价格时才会执行,即以指定价或低于指点价买入,以指点价或更高指定价卖出;
  • Order.Stop 止损单,需要指定止损价格(Stop Price),一旦股价突破止损价格,将会以市价单的方式成交;
  • Order.StopLimit 止损限价单,需要指定止损价格(Stop price)和限价(Limit Price),一旦股价达到设置的止损价格,将以限价单的方式下单
  • Order.StopTrail 跟踪止损订单,是一种止损价格会自动调整的止损单,调整范围通过设置止损价格和市场价格之间的差价来确定
  • Order.StopTrailLimit 跟踪止损限价单,是一种止损价格会自动调整的止损限价单,订单中的限价 Limit Price 不会发生变动,止损价会发生变动,变动逻辑与上面介绍的跟踪止损订单一致;

Broker 如何管理参数

通过使用Broker实现初始资金、手续费、滑点等管理,通过2中方式实现:

  • 方法1:通过创建backtrader.brokers.BackBroker()实例 ,将该实例赋值与cerebro.broker;
python">    # samples/cheat-on-open/cheat-on-open.pycerebro.broker = bt.brokers.BackBroker()# 各参数初始值为:# params = (# ('cash', 10000.0),       # ('checksubmit', True),   # ('eosbar', False),# ('filler', None),# # slippage options# ('slip_perc', 0.0),# ('slip_fixed', 0.0),# ('slip_open', False),# ('slip_match', True),# ('slip_limit', True),# ('slip_out', False),# ('coc', False),# ('coo', False),# ('int2pnl', True),# ('shortcash', True),# ('fundstartval', 100.0),# ('fundmode', False),)
  • 方法2:通过broker中的“set_xxx"方法赋值或修改参数,可通过"get_xxx"方法查看设置参数的值;
python">    # samples/slippage/slippage.pycerebro.broker.set_slippage_fixed(args.slip_fixed,slip_open=args.slip_open,slip_match=not args.no_slip_match,slip_out=args.slip_out)

Broker 资金与持仓如何管理

在backtrader中,每次订单Order执行完后将更新持仓与金额。

如何了解,策略回测资金情况?

  • 在策略执行前,可以通过set_cash(或setcash)对资金进行初始化;在策略执行过程中,可调用add_cash(cash)调整资金(cash 为正数表示增加资金;cash 为负数表示减少资金)。
  • 在执行过程中通过get_cash()(或getcash)查看持有资金。

如何了解,策略回测持仓情况?

  • 通过getposition(data) 查看当前标的持仓数据;

Broker ”滑点“ 提升成交率

在实盘和回测中,为提高在”预期“价格成交概率,通常会取个价格范围,比如:计划价格2.00元买入, 实际买入价格:2.02元。

在backtrader中,提供了百分比滑点和固定滑点:

  • 百分比滑点
    假设perc=n%:

    • 若计划买入价格为x,实际成交买入价格:x * (1 + n% )
    • 若计划卖出价格为x,实际成家卖出价格:x * (1 - n%)
    python">BackBroker.set_slippage_perc(perc, slip_open=True, slip_limit=True, slip_match=True, slip_out=False)
    
  • 固定滑点
    假设fixed=n:

    • 若计划买入价格为x,实际成交买入价格:x + n
    • 若计划卖出价格为x,实际成家卖出价格:x - n
    python">BackBroker.set_slippage_fixed(fixed, slip_open=True, slip_limit=True, slip_match=True, slip_out=False)
    

在backtrader中,不同的订单类型中slippage是如何工作的呢?

  • Close 不支持该订单类型

  • Market 支持该订单类型
    在Market订单类型(即以开票价成交)下,需设置slip_open = True。需要注意的是通过BackBroker() 实例化broker,其默认值为False,而通过方式2,即set_slippage_perc和set_slipage_fixed 其默认值为True。

  • Limit 需要根据参数设置情况而定

    • 如果匹配价格是开盘价,则根据参数 slip_open 应用滑点。如果适用,价格永远不会低于要求的限价;
    • 如果匹配价格不是限价,则滑点将应用于最高价/最低价。在这种情况下,slip_mlimit适用于决定在超过上限的情况下是否会进行匹配
  • Stop 支持该订单类型
    执行逻辑同Market订单类型逻辑

  • StopLimit 需要根据参数设置情况而定
    执行逻辑同Limit订单类型逻辑

Broker 中的 ”Cheating 交易“

Backtrader 默认是 “当日收盘后下单,次日以开盘价成交”,这种模式在回测过程中能有效避免使用未来数据。
Backtrader 还提供了一些 cheating 式的交易时机模式:Cheat-On-Open 和 Cheat-On-Close。

  • Cheat-On-Open 是“当日下单,当日以开盘价成交”模式
  • Cheat-On-Close 是“当日下单,当日以收盘价成交”模式
python">cerebro = bt.Cerebro(cheat_on_open=True)

Broker 中的 成交量限制

通过 Backtrader 中的 fillers 模块来限制实际成交量,fillers 会告诉 Broker 在各个成交时间点应该成交多少量,一共有 3 种形式:

  • 形式1:bt.broker.fillers.FixedSize(size)
  • 形式2:bt.broker.fillers.FixedBarPerc(perc)
  • 形式3:bt.broker.fillers.BarPointPerc(minmov=0.01,perc=100.0)

在 Broker 中使用Filler同样有两种方式:

  • 方式一:通过broker中‘set_filler"进行设置
python">import backtrader as btcerebro = Cerebro()
cerebro.broker.set_filler(bt.broker.fillers.FixedSize())
  • 方式二:通过创建backtrader.broker.BrokerBack(filler=filler)实例,赋值与broker
python">import backtrader as btcerebro = Cerebro()
filler = bt.broker.fillers.FixedSize()
newbroker = bt.broker.BrokerBack(filler=filler)
cerebro.broker = newbroker
python">import pandas as pd
import numpy as np%matplotlib inline
import matplotlib.pyplot as plt
import matplotlib
plt.rcParams['figure.figsize'] = 15, 15daily_price = pd.read_csv("./data/daily_price.csv", parse_dates=['datetime'])# 筛选 600466.SH 和 603228.SH 2只股票的数据集
data1 = daily_price.query(f"sec_code=='600466.SH'").set_index('datetime').drop(columns=['sec_code'])
data2 = daily_price.query(f"sec_code=='603228.SH'").set_index('datetime').drop(columns=['sec_code'])

http://www.ppmy.cn/ops/130237.html

相关文章

Docker 安装使用操作指南

Docker 是一种开源的容器化平台,它允许开发者将应用及其所有依赖项打包到一个轻量级的容器中,这样就可以在任何地方一致地运行它们。无论是开发环境、测试环境还是生产环境,Docker 都能够提供一致的环境,从而消除“在我的机器上能…

使用text-embedding-3-small生成向量并将向量插入Mlivus Cloud用于语义搜索的深度解析与实战操作

使用text-embedding-3-small生成向量并将向量插入Mlivus Cloud用于语义搜索的深度解析与实战操作 在当今的大数据时代,文本数据的处理与分析显得尤为重要。如何高效地存储、查询和理解这些海量文本数据,成为了许多企业和研究机构面临的重大挑战。幸运的是,随着向量数据库技…

生成ssh密钥步骤

如果已经使用了https方式 先删除https方式 删除命令: git remote rm origin 查看是否成功命令: 生成ssh密钥步骤 将此文件夹复制到

pytorch分批加载大数据集

pytorch分批加载大数据集 本文处理的数据特点:加载图片表格数据 本文处理的数据特点: (1)数据量大,无法一次读取到内存中 (2)数据是图片或者存储在csv中(每一行是一个sample,包括fe…

【vue项目中添加告警音频提示音】

一、前提: 由于浏览器限制不能自动触发音频文件播放,所以实现此类功能时,需要添加触发事件,举例如下: 1、页面添加打开告警声音开关按钮 2、首次进入页面时添加交互弹窗提示:是否允许播放音频 以上两种方…

江协科技STM32学习- P29 实验- 串口收发HEX数据包/文本数据包

🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝​…

【hector mapping参数设置】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 hector mapping部分参数介绍调整hector_mapping中的参数ros常见问题总结 hector mapping部分参数介绍 在wiki.ros.org/hector_mapping界面找到3.1.4 Parameters章节…

3D Gaussian Splatting代码详解(一):模型训练、数据加载

1 模型训练 这段代码实现了一个 3D 高斯模型的训练循环,旨在通过逐步优化模型参数,使其能够精确地渲染特定场景。以下是代码的详细解析: def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoint_iterations,…