Backtrader回测教学【附免费行情源】

1. Backtrader简介

Backtrader 是 2015 年开源的 Python 量化回测框架(支持实盘交易),功能丰富,操作方便灵活:

在这里插入图片描述

  • 品种多:股票、期货、期权、外汇、数字货币;
  • 周期全:Ticks 级、秒级、分钟级、日度、周度、月度、年度;
  • 速度快:pandas 矢量运算、多策略并行运算;
  • 组件多:内置 Ta-lib 技术指标库、PyFlio 分析模块、plot 绘图模块、参数优化等;
  • 超灵活:即可以随意搭配组件,又支持扩展自己开发的功能,想怎么玩就怎么玩。

2. INSIGHT免费数据源简介

INSIGHT为华泰提供的行情数据源,其中level1数据是免费的,包含沪深市场tick,日k,分钟k,月k,etf,各类指数,金融资讯数据以及融券通数据

提供pythonjavac++cs 等多种语言,同时提供SDK和可视化金融数据下载终端,方便快捷的访问数据。本文数据将以可视化金融数据下载终端为例。

详情可访问(社区版免费):
https://findata-insight.htsc.com:9151/help/sdk/SDKDownload/


3. 如何使用两者进行回测

本文将介绍如何使用INSIGHT和Backtrader实现回测,【点击demo下载】,最终结果如:
在这里插入图片描述

3.1 回测流程:

通常我们使用Backtrader回测时,流程如下:

  • Step 1:构建策略
    (1) 确定策略潜在的可调参数;
    (2) 计算策略中用于生成交易信号的指标;
    (3) 按需打印交易信息;
    (4) 编写买入、卖出的交易逻辑。

  • Step 2:结合行情数据,实例化策略引擎 cerebro,由 cerebro 来驱动回测
    (1) 由 DataFeeds 加载数据,再将加载的数据添加给 cerebro;
    (2) 将上一步生成的策略添加给 cerebro;
    (3) 按需添加策略分析指标或观测器;
    (4) 通过运行 cerebro.run() 来启动回测;
    (5) 回测完成后,按需运行 cerebro.plot() 进行回测结果可视化展示。

Backtrader 最基础的回测代码编写流程如下:

import backtrader as bt # 导入 Backtrader
import backtrader.indicators as btind # 导入策略分析模块
import backtrader.feeds as btfeeds # 导入数据模块

# 创建策略
class TestStrategy(bt.Strategy):
    # 可选,设置回测的可变参数:如移动均线的周期
    params = (
        (...,...), # 最后一个“,”最好别删!
    )
    def log(self, txt, dt=None):
        '''可选,构建策略打印日志的函数:可用于打印订单记录或交易记录等'''
        dt = dt or self.datas[0].datetime.date(0)
        print('%s, %s' % (dt.isoformat(), txt))

    def __init__(self):
        '''必选,初始化属性、计算指标等'''
        pass

    def notify_order(self, order):
        '''可选,打印订单信息'''
        pass

    def notify_trade(self, trade):
        '''可选,打印交易信息'''
        pass

    def next(self):
        '''必选,编写交易策略逻辑'''
        sma = btind.SimpleMovingAverage(...) # 计算均线
        pass

# 实例化 cerebro
cerebro = bt.Cerebro()
# 通过 feeds 读取数据
data = btfeeds.BacktraderCSVData(...)
# 将数据传递给 “大脑”
cerebro.adddata(data)
# 通过经纪商设置初始资金
cerebro.broker.setcash(...)
# 设置单笔交易的数量
cerebro.addsizer(...)
# 设置交易佣金
cerebro.broker.setcommission(...)
# 添加策略
cerebro.addstrategy(TestStrategy)
# 添加策略分析指标
cerebro.addanalyzer(...)
# 添加观测器
cerebro.addobserver(...)
# 启动回测
cerebro.run()
# 可视化回测结果
cerebro.plot()

下面就参照上面的模板,一步步教大家如何用 Backtrader 进行选股回测。

3.2 如何进行回测

在此我们以一个策略进行示范讲解~

3.2.1 策略说明

本文省去了选股过程,直接提供最终的选股结果,然后对选股结果做回测,具体的回测条件如下:
股票池:600466.SH,603866.SH,688088.SH,603816.SH。
回测区间:2020-02-03至2021-01-28。
持仓周期:月度调仓,每月第一个交易日,以开盘价买入或卖出。
持仓权重:流通市值占比。
总资产:100,000,000元。
佣金:0.0003双边。
滑点:0.0001双边。

3.2.2 策略逻辑

假设已经在每个月最后一个交易日基于选股规则选出了表现最优的4只的股票作为下一个月的持仓成分股,然后在下个月的第一个交易日,卖出已有持仓,买入新的持仓

3.2.3 数据准备

测试用到 2 个数据集,一个是日度历史行情数据,另一个是股票数据集 。

  1. 日度行情数据集
    日度行情数据集来源华泰的 可视化金融数据下载终端

    免费下载地址为https://findata-insight.htsc.com:9151/help/terminal/download/。

    下载成功之后,需要先申请一个账号(如何申请),登陆后终端提供了多类数据的查询和下载。

    本篇文章我们用到的是日度行情数据,可在 【金融数据下载终端】-> 【行情数据】->【基本面指标】中获取需要的数据,可将查询的数据导出成csv(点击下载数据)至本地供backertrader使用。

    如图所示为金融数据下载终端
    注意!!!
    日度行情数据集 daily_price.csv 对应的是4只股票各自从 2020-02-03至2021-01-28的日度行情数据(后复权),共有 18 个字段:

    daily_price=pd.read_csv(r'D:\terminalfindata\daily_price.csv',encoding='gbk',parse_dates=['MDDate'])
    

    此处为csv中的具体数据数据
    在这里插入图片描述

    2. 月末调仓成分股数据集
    测试用的数据集 trade_info.csv 就是最终的选股结果,共包含 3 个字段:trade_date 调仓期(每月最后一个交易日)、sec_code 持仓成分股代码、weight 持仓权重 。

    trade_info = pd.read_csv("trade_info.csv", parse_dates=['trade_date'])
    

在这里插入图片描述

3.2.4 常规数据导入

将数据导入 backtrader,构建“大脑”

导入 backtrader 时,约定俗成的将其缩写为 bt 。由于回测用到的各种原材料都是需要被添加给“大脑” cerebro的,所以最开始可以先实例化大脑:

import backtrader as bt # 导入 Backtrader

# 实例化 cerebro
cerebro = bt.Cerebro()

如果没啥感觉,可以运行如下代码小试一下,若返回下面的结果,恭喜你!成功完成一个“空”回测 ~

import backtrader as bt # 导入 Backtrader

# 实例化 cerebro
cerebro = bt.Cerebro()
# 打印初始资金
print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
# 启动回测
cerebro.run()
# 打印回测完成后的资金
print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())

结果如下展示:
Starting Portfolio Value: 10000.00
Final Portfolio Value: 10000.00

3.2.5 多只股票的历史行情数据导入

Backtrader 通过 DataFeeds 模块来导入各式各样的数据。由于读取 daily_price.csv 文件后就生成了 DataFrame 表格,所以选用 DataFeeds 的 PandasData() 方法来导入,导入的 DataFrame 有默认的格式要求:

以交易日 ‘datetime’ 为 index,

列为’open’、‘high’、‘low’、‘close’、‘volume’、‘openinterest’ 字段。

首先我们要将daily_price.csv中的字段对应backtrader的默认格式要求,这里我们定义了一个函数用来修改字段名,因为我们只需要用到这几个数据,所以只修改这几个就好:

# 修改字段名与backtrader一致
def change_column_name(data):

    name_clomuns = data.columns.tolist()
    new_name_dict = {
   }

    for name in name_clomuns:

        if name == 'MDDate':
            new_name_dict[name] = 
  • 10
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

量化NPC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值