backtrader学习之一-经典sma金叉策略回测

这几天学习了backtrader做股票数据的回测,先用快线慢线交叉的sma金叉策略对工商银行进行回测。

数据源来自baostock.com,由于数据没有复权,因此跳过2020年6月的分红日,取了2020年7月1日-

2021年3月31日的数据进行回测。

回测代码如下

import datetime

import pandas as pd

import backtrader as bt

import matplotlib

 

class SmaCross(bt.Strategy):

    # 全局设定交易策略的参数

    params = (('pfast', 5), ('pslow', 20),)

    def __init__(self):

          

        sma1 = bt.ind.SMA(period=self.p.pfast)  # fast moving average

        sma2 = bt.ind.SMA(period=self.p.pslow)  # slow moving average

        self.crossover = bt.ind.CrossOver(sma1, sma2)  # crossover signal

    def next(self):

        if self.crossover > 0:  # if fast crosses slow to the upside

            self.close()

            print(self.position)

            self.buy(size=1500) # enter long

            print("Buy {} shares".format( self.data.close[0]))

            print(self.position)

        elif self.crossover < 0:  # in the market & cross to the downside

            self.close()# close long position

            print(self.position)

            self.sell(size=1500)

            print("Sale {} shares".format(self.data.close[0]))

            print(self.position)

 

def bt1():

       #从文件gsyh.csv读取数据

    dataframe = pd.read_csv('C:/gsyh.csv', index_col=0, parse_dates=True)

    dataframe['openinterest'] = 0

    data = bt.feeds.PandasData(dataname=dataframe,

                            fromdate = datetime.datetime(2020, 7, 1),

                            todate = datetime.datetime(2021, 3, 31))

    # 初始化cerebro回测系统设置

    cerebro = bt.Cerebro()

    # 将数据传入回测系统

    cerebro.adddata(data)

    # 将交易策略加载到回测系统中

    cerebro.addstrategy(SmaCross)

    # 设置初始资本为10,000

    startcash = 10000

    cerebro.broker.setcash(startcash)

    # 设置交易手续费为 0.1%

    cerebro.broker.setcommission(commission=0.001)

    # 运行回测系统

    cerebro.run()

    # 获取回测结束后的总资金

    portvalue = cerebro.broker.getvalue()

    pnl = portvalue - startcash

    print(f'净收益: {round(pnl,2)}')

    # 打印结果

    print(f'总资金: {round(portvalue,2)}')

    cerebro.plot(style='candlestick')

 

if __name__ == '__main__':

 

bt1()

运行结果如下:

净收益: -729.04
总资金: 9270.96

 

最后看结果,还是出现了亏损。说明经典sma金叉策略过于简单了,很难赚钱。

 

posted @ 2021-05-12 23:00  ZhongciWang  阅读(1319)  评论(0编辑  收藏  举报