1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| import datetime import backtrader as bt
class SmaCrossStrategy(bt.Strategy): params = dict( short_period=5, long_period=20 )
def __init__(self): # 定义短期和长期sma指标 self.short_term_sma = bt.ind.SMA(period=self.params.short_period) self.long_term_sma = bt.ind.SMA(period=self.params.long_period)
def log(self, txt, dt=None): dt = dt or bt.num2date(self.datas[0].datetime[0]) print('[{}] {}'.format(dt.isoformat(), txt))
def next(self): if not self.position: if self.short_term_sma[0] > self.long_term_sma[0]: self.buy() self.log('buy@{}'.format(self.data.close[0])) else: if self.short_term_sma[0] < self.long_term_sma[0]: self.sell() self.log('sell@{}'.format(self.data.close[0]))
if __name__ == '__main__': cerebro = bt.Cerebro() # 设置初始资金和交易手续费 cerebro.broker.setcash(1000000.0) cerebro.broker.setcommission(commission=0.001)
data = bt.feeds.GenericCSVData( dataname="data/BTC-USDT_15m_2021-07-01_2021-08-01.csv", dtformat=lambda x: datetime.datetime.utcfromtimestamp(float(x) / 1000.0), timeframe=bt.TimeFrame.Minutes, datetime=0, open=1, high=2, low=3, close=4, volume=5, openinterest=-1 )
cerebro.adddata(data) cerebro.addstrategy(SmaCrossStrategy)
print('初始资金: %.2f' % cerebro.broker.getvalue()) cerebro.addanalyzer(bt.analyzers.DrawDown, _name='draw_down') cerebro.addanalyzer(bt.analyzers.Returns, _name="returns") strats_results = cerebro.run() # run返回一个列表,应该是对应多策略回测结果 for result in strats_results: print('最终资金: %.2f' % cerebro.broker.getvalue()) print('回撤指标:', result.analyzers.draw_down.get_analysis()) print('收益率指标:', result.analyzers.returns.get_analysis())
|