金融工程--基于backtrader的回测框架

背景

1、使用框架帮助提升回测的准确度

基础概念

量化回测

手续费(Commission):
手续费是交易者在执行交易时需要支付给经纪商的费用。这个费用可能是固定的,也可能是基于交易金额的百分比。

滑点(Slippage):
滑点是指交易实际执行价格与预期执行价格之间的差异。滑点可能是由于市场波动、交易量不足或执行速度慢等原因造成的。

保证金(Margin):
保证金是交易者在进行杠杆交易时需要存入的一部分资金,作为潜在亏损的保证。保证金允许交易者借入资金进行更大额度的交易。

Filler:
在某些交易系统中,Filler 是一个组件,用于模拟订单的执行过程,包括订单如何被填充(即成交)。

Writer:
Writer 在交易系统中可能指的是将交易数据写入文件或数据库的组件,用于记录交易历史和策略表现。

Broker:
Broker 是提供交易平台和执行交易服务的个人或公司。Broker 可以是传统的金融经纪商,也可以是提供算法交易接口的电子经纪商。

策略结果分析和评价:

这是指对交易策略的表现进行定量和定性的评估,以确定其有效性和潜在的改进空间。

Observer与Analyzer:
在量化交易框架如 Backtrader 中,Observer 和 Analyzer 是用于监控和分析策略表现的工具。Observer 可以在策略运行时实时监控数据,而 Analyzer 提供了多种分析方法来评估策略的历史表现。

Pyfolio Analyzer:
Pyfolio 是一个用于分析和可视化金融策略表现的 Python 库。它提供了一套丰富的工具,可以帮助交易者评估策略的表现,并与基准进行比较。

策略结果分析和评价
Observer与Analyzer
Pyfolio Analyzer

什么叫做portfolio基本的回测
有多个资产通常调仓时间固定目标是使得特定资产达到特定权重
使用场景:多因子组合的回测、FOF的回测,大类资产配置.

代码

下面代码创建一个基本的回测策略,并对上证指数的历史数据进行回测。
1、数据获取

import backtrader as bt
import akshare as ak
import pandas as pd

# 获取上证指数的历史数据,这里使用前复权数据
stock_zh_a_hist_df = ak.stock_zh_a_hist(symbol='000001.SH', 
                                       start_date='20200101', 
                                       end_date='20240829', 
                                       adjust='qfq')

# 将数据转换为适合Backtrader的格式
data = pd.DataFrame(stock_zh_a_hist_df['日K线'])
data['date'] = pd.to_datetime(data['日期'])
data.set_index('date', inplace=True)
data = data[['开盘价', '最高价', '最低价', '收盘价', '成交量']]  # 选取需要的列

2、策略构建
使用简单的移动平均线作为策略模式。

# 创建一个简单的移动平均交叉策略
class SmaCross(bt.Strategy):
    params = dict(
        pfast=10,  # 快速移动平均线的周期
        pslow=30   # 慢速移动平均线的周期
    )

    def __init__(self):
        # 初始化两个移动平均线
        self.ma_fast = bt.indicators.SimpleMovingAverage(self.data, period=self.p.pfast)
        self.ma_slow = bt.indicators.SimpleMovingAverage(self.data, period=self.p.pslow)

    def next(self):
        # 检查是否两个移动平均线都已经计算完成
        if self.ma_fast[-1] and self.ma_slow[-1]:
            # 买入条件:快速线从下向上穿过慢速线
            if self.ma_fast[-1] < self.ma_slow[-1] and self.ma_fast[0] > self.ma_slow[0]:
                self.buy()

            # 卖出条件:快速线从上向下穿过慢速线
            elif self.ma_fast[-1] > self.ma_slow[-1] and self.ma_fast[0] < self.ma_slow[0]:
                self.sell()

3、使用回测框架进行测试

# 创建Cerebro引擎
cerebro = bt.Cerebro()

# 将数据添加到Cerebro引擎
data = bt.feeds.PandasData(dataname=data)
cerebro.adddata(data)

# 添加策略
cerebro.addstrategy(SmaCross)

# 设定初始资金
cerebro.broker.setcash(100000)

# 运行回测
cerebro.run()

# 绘制结果
cerebro.plot()

额外内容设置方式

import backtrader as bt

# 定义交易费用和滑点
class MyCommissionInfo(bt.CommInfo):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # 设置滑点为价格的2%,即0.02
        self.perc = 0.02

# 创建 cerebro 对象
cerebro = bt.Cerebro()

# 设置交易费用
cerebro.broker.setcommission(commission=MyCommissionInfo())

# 其余的策略和数据设置...

参考文献

backtrader官网
官方仓库地址

Backtrader 文档学习- 整体架构功能分析理解
backtrader简明教程01
backtrader简明教程02
backtrader简明教程03

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