量化回测框架-backtrader-交易框架

本文通过SMA策略实例,详细介绍了如何利用Backtrader(BT)交易框架进行量化交易的回测,展示了该框架在策略实现和回测分析上的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下以SMA策略为例子来说明Backtrader-BT交易框架

from datetime import datetime
import backtrader
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')

def Function_For_Build_SmaCross_Strategy_Object(short_sma, long_sma):

    class SmaCross(backtrader.SignalStrategy):
        def __init__(self):
            sma1, sma2 = backtrader.ind.SMA(period=short_sma), backtrader.ind.SMA(period=long_sma)
            crossover = backtrader.ind.CrossOver(sma1, sma2)
            self.signal_add(backtrader.SIGNAL_LONG, crossover)
               
    return SmaCross
Cerebro_Object = backtrader.Cerebro()
Cerebro_Object.addstrategy(Function_For_Build_SmaCross_Strategy_Object(10, 20))
data0 = backtrader.feeds.YahooFinanceData(dataname='MSFT', fromdate=datetime(2020, 1, 1),todate=datetime(2020, 2, 2))
Cerebro_Object.adddata(data0)
dir(data0)
vars(data0)
#Cerebro_Object.run()
class Trading_Picture_Generator:

    Trading_Object_Name = ""
    Trading_Level_Multiplier = 1000
    
    Trading_DateTime_Start = datetime(2018,1,1)
    Trading_DateTime_End = datetime(2019,9,22)

    I_Am_Trading_Cerebro_Object = backtrader.Cerebro()
    Short_MovingAverage = 10 
    Long_MovingAverage = 20

    def __init__(
        self, 
        Trading_Object_Name_Input, 
        Trading_Level_Multiplier_Input, 
        Trading_DateTime_Start_Input, 
        Trading_DateTime_End_Input):

        self.Trading_Object_Name = Trading_Object_Name_Input
        self.Trading_Level_Multiplier = Trading_Level_Multiplier_Input

        self.Trading_DateTime_Start = Trading_DateTime_Start_Input
        self.Trading_DateTime_End = Trading_DateTime_End_Input

        


    def Function_Run_MovingAverage(self, Short_MovingAverage_Input, Long_MovingAverage_Input): 

        Cerebro_Object = backtrader.Cerebro()
        Cerebro_Object.broker.setcommission(mult=self.Trading_Level_Multiplier)
        Cerebro_Object.addstrategy(Function_For_Build_SmaCross_Strategy_Object(Short_MovingAverage_Input, Long_MovingAverage_Input))

        data0 = backtrader.feeds.YahooFinanceData(
            dataname = self.Trading_Object_Name , 
            fromdate=self.Trading_DateTime_Start, 
            todate=self.Trading_DateTime_End)    

        Cerebro_Object.adddata(data0)
        Cerebro_Object.run()
        
        self.Short_MovingAverage = Short_MovingAverage_Input
        self.Long_MovingAverage = Long_MovingAverage_Input
        self.Trading_Cerebro_Object = Cerebro_Object


    def Function_Plotting(self) : 

    #    cerebro.plot()
        figure = matplotlib.pyplot.figure()
        figure = self.Trading_Cerebro_Object.plot()[0][0]
        figure.savefig('Object[{}]_Short{}Long{}_Position[{}%].jpg'.format(
            self.Trading_Object_Name, 
            self.Short_MovingAverage, 
            self.Long_MovingAverage, 
            self.Trading_Cerebro_Object.broker.getvalue()/100))
        matplotlib.pyplot.close(figure)
        matplotlib.pyplot.close("all")
        

    def Function_Batch_MovingAverage(self, Trading_Object_Name_List, Trading_Level_Multiplier_List, Short_MovingAverage_Interval, Long_MovingAverage_Interval):

        for Specific_Trading_Object_Counter in range(len(Trading_Object_Name_List)):
            for I_Am_Long_MovingAverage in range(Long_MovingAverage_Interval[0],Long_MovingAverage_Interval[1]):
                for I_Am_Short_MovingAverage in range(Short_MovingAverage_Interval[0] ,Short_MovingAverage_Interval[1]):

                    self.Trading_Object_Name = Trading_Object_Name_List[Specific_Trading_Object_Counter]
                    self.Trading_Level_Multiplier = Trading_Level_Multiplier_List[Specific_Trading_Object_Counter]
                    self.Function_Run_MovingAverage(I_Am_Short_MovingAverage , I_Am_Long_MovingAverage)
                    self.Function_Plotting()

# Build Instance and draw single plot
%matplotlib inline

I_Am_Trading_Instance = Trading_Picture_Generator("TSM", 1000, datetime(2018,1,1), datetime(2019,11,10))
I_Am_Trading_Instance.Function_Run_MovingAverage(3 , 6)
I_Am_Trading_Instance.Function_Plotting()
## US Index ##

#SP500  #DOW  #NASDAQ
I_Am_Trading_Instance.Function_Batch_MovingAverage(["^GSPC", "^DJI","^IXIC"], [500,1000,500],[3,5], [13,15])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值