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金叉策略過於簡單了,很難賺錢。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM