前言
backtrader回测的一些学习经验分享
一、backtrader回测框架
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的信号策略
相较于backtrader的回测框架,信号策略部分则是省去了这一块的内容:
def next(self):
'''必选,编写交易策略逻辑'''
sma = btind.SimpleMovingAverage(...) # 计算均线
pass
这个是系统自带的一个包
官网的解释是:
# 无需编写策略也可以操作backtrader。
# 相较于编写策略类,采取实例化指标,编写买入/卖出逻辑
# 最终用户添加信号(无论如何指标),其余在后台完成
接下来进行一个简单的实现:
# 导入库
import numpy as np
import pandas as pd
from datetime import datetime
import backtrader as bt
import matplotlib.pyplot as plt
import os
# 通过数据库获取数据
def get_data(code,start_time,end_time):
df = get_price(security=code, start_date=start_time, end_date=end_time, frequency='daily')
df.index=pd.to_datetime(df.index)
df['openinterest']=0
df=df[['open','high','low','close','volume','openinterest']] #按照back trader数据格式进行整合
return df
# 加载读取数据
code='600519.XSHG'
start_time='2016-09-07'
end_time='2022-01-22'
stock_df=get_data(code,start_time,end_time)
stock_df
加载后的数据如图所示:
# 将数据导入到back trader中
fromdate=datetime(2016,9,7)
todate=datetime(2021,1,21)
data=bt.feeds.PandasData(dataname=stock_df,fromdate=fromdate,todate=todate)
# 简单的例子
import backtrader as bt
# 将数据导入到back trader中
fromdate=datetime(2016,9,7)
todate=datetime(2021,1,21)
data=bt.feeds.PandasData(dataname=stock_df,fromdate=fromdate,todate=todate)
class MySignal(bt.Indicator):
lines=('signal',)
params=(('period',30),)
'''
收盘价高于简单移动平均线,多头指示
如果收盘价低于简单移动平均线,则做空指示
'''
def __init__(self):
self.dataclose = self.datas[0].close
self.order = None
self.lines.signal=self.data-bt.indicators.SMA(period=self.params.period)
if __name__== '__main__':
cerebro=bt.Cerebro()
cerebro.adddata(data)
cerebro.broker.setcash(100000.0)
cerebro.broker.setcommission(commission=0.002)
# 信号
cerebro.add_signal(bt.SIGNAL_LONGSHORT, MySignal)
# 运行
print(f'组合初始价值:%.2f'%cerebro.broker.getvalue())
cerebro.run()
print(f'组合期末价值:%.2f'%cerebro.broker.getvalue())
结果如下所示:
组合初始价值:100000.00
组合期末价值:100207.80
可以看出,通过自带的信号策略,也可以实现盈利,不过信号策略的盈利效果很一般。
总结
本文简单介绍了基于python环境的backtrader的信号策略。
感兴趣的可以去官网进行学习:
Strategy - Signals - Backtrader https://www.backtrader.com/docu/signal_strategy/signal_strategy/