【backtrader的信号策略——基于python环境】

前言

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/

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

马尔可夫宽

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

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

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

打赏作者

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

抵扣说明:

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

余额充值