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')

 

posted @ 2021-05-21 09:01  ZhongciWang  阅读(652)  评论(0编辑  收藏  举报