backtrader学习之四-买入并持有策略回测
这次选择最简单的买入并持有,买入工商银行一直持有。
from __future__ import (absolute_import, division, print_function,
unicode_literals)
import datetime # For datetime objects
import backtrader as bt
import backtrader.feeds as btfeed
import math
class BSCSVData(btfeed.GenericCSVData):
params = (
("fromdate", datetime.datetime(2020, 7, 1)),
("todate", datetime.datetime(2021, 3, 30)),
('dtformat', ('%Y/%m/%d')),
('openinterest', -1)
)
# Create a Stratey
class BahStrategy(bt.Strategy):
def log(self, txt, dt=None):
''' Logging function fot this strategy'''
dt = dt or self.datas[0].datetime.date(0)
print('%s, %s' % (dt.isoformat(), txt))
def __init__(self):
# Keep a reference to the "close" line in the data[0] dataseries
self.dataclose = self.datas[0].close
def next(self):
# self.log('Close, %.2f' % self.dataclose[0])
if not self.position:
self.buy(size=math.floor(self.broker.get_cash() / self.dataclose[0]))
if __name__ == '__main__':
filename = 'gsyh.csv'
cerebro = bt.Cerebro()
# 加载自定义策略
cerebro.addstrategy(BahStrategy)
# 设置金额为一百万
cerebro.broker.set_cash(10000.0)
# 加载历史数据
data = BSCSVData(dataname="c:\{0}".format(filename))
cerebro.adddata(data)
print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
cerebro.run()
print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())
# 计算总回报率和年度回报率
return_all = cerebro.broker.getvalue()/1000000.0
print('Total ROI: {0}%, Annual ROI{1}%'.format(
round((return_all - 1.0) * 100, 2),
round((pow(return_all, 1.0 / 10) - 1.0) * 100, 2)
))
cerebro.plot(style='candlestick')