今天花半小时试用了一下Backtrader,发现还真的挺简单的,而且发现它的回测结果展示挺炫酷的。
一、安装,直接用pip install backtrader
二、回测
1.成果展示(双均线)
打印的内容:
2.代码
test.py
# from __future__ import (absolute_import, division, print_function, # unicode_literals) import backtrader as bt import datetime from strategy import SmaCross cerebro = bt.Cerebro() # Create a Data Feed data = bt.feeds.YahooFinanceCSVData( dataname="oracal.csv", # Do not pass values before this date fromdate=datetime.datetime(2000, 1, 1), # Do not pass values after this date todate=datetime.datetime(2000, 12, 31), reverse=False) # Add the Data Feed to Cerebro cerebro.adddata(data) cerebro.addstrategy(SmaCross) # Set our desired cash start cerebro.broker.setcash(100000.0) print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue()) cerebro.run() print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())
2.strategy.py
import backtrader as bt from datetime import datetime # Create a subclass of Strategy to define the indicators and logic class SmaCross(bt.Strategy): # list of parameters which are configurable for the strategy params = dict( pfast=10, # period for the fast moving average pslow=30 # period for the slow moving average ) def log(self, txt, dt=None): ''' Logging function for this strategy''' dt = dt or self.datas[0].datetime.date(0) print('%s, %s' % (dt.isoformat(), txt)) 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 self.dataclose = self.datas[0].close self.order = None def next(self): self.log('Close,%.2f' % self.dataclose[0]) print(len(self)) print(self.order) print(self.position) if not self.position: # not in the market if self.crossover > 0: # if fast crosses slow to the upside self.order = self.buy() # enter long self.log('-----buy, close price is: %.2f' % self.dataclose[0]) elif self.crossover < 0: # in the market & cross to the downside self.order = self.close() # close long position self.log('-----sell, close price is:%.2f' % self.dataclose[0]) cerebro = bt.Cerebro() # create a "Cerebro" engine instance # Create a data feed data = bt.feeds.YahooFinanceData(dataname='MSFT', fromdate=datetime(2011, 1, 1), todate=datetime(2012, 12, 31)) cerebro.adddata(data) # Add the data feed cerebro.addstrategy(SmaCross) # Add the trading strategy cerebro.run() # run it all cerebro.plot() # and plot it with a single command
3.oracal.csv
Date,Open,High,Low,Close,Adj Close,Volume 1995-01-03,2.179012,2.191358,2.117284,2.117284,1.883304,36301200 1995-01-04,2.123457,2.148148,2.092592,2.135803,1.899776,46051600 1995-01-05,2.141975,2.148148,2.086420,2.092592,1.861340,37762800 1995-01-06,2.092592,2.154321,2.061728,2.117284,1.883304,41864400 1995-01-09,2.135803,2.179012,2.129630,2.179012,1.938211,34639200 1995-01-10,2.191358,2.216049,2.185185,2.185185,1.943701,42088000 1995-01-11,2.203704,2.216049,2.098765,2.120370,1.886049,46762000 1995-01-12,2.123457,2.129630,2.086420,2.104938,1.872322,41294400
参考:
oracal
https://www.youtube.com/watch?v=K8buXUxEfMc
https://www.backtrader.com/home/helloalgotrading/
运行代码出错的了??