以下以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])