繼續用backtrader進行回測,這次采用布林線來判斷買賣點。數據還是從證券寶獲取,整理成pandas的csv文件格式。
數據采用了2020年-2021年的工商銀行。下面貼代碼。
import datetime
import pandas as pd
import backtrader as bt
import matplotlib.pyplot as plt
class Boll_strategy(bt.Strategy):
#自定義參數,每次買入1800手
params=(('size',1800),)
def __init__(self):
self.dataclose=self.datas[0].close
self.order=None
self.buyprice=None
self.buycomm=None
##使用自帶的indicators中自帶的函數計算出支撐線和壓力線,period設置周期,默認是20
self.lines.top=bt.indicators.BollingerBands(self.datas[0],period=20).top
self.lines.bot=bt.indicators.BollingerBands(self.datas[0],period=20).bot
def next(self):
if not self.position:
if self.dataclose<=self.lines.bot[0]:
#執行買入
self.order=self.buy(size=self.params.size)
else:
if self.dataclose>=self.lines.top[0]:
#執行賣出
self.order=self.sell(size=self.params.size)
dataframe = pd.read_csv(r"C:\gsyh.csv", index_col=0, parse_dates=True)
dataframe['openinterest'] = 0
data = bt.feeds.PandasData(dataname=dataframe,
fromdate = datetime.datetime(2020, 1, 1),
todate = datetime.datetime(2021, 3, 31)
)
# 初始化cerebro回測系統設置
cerebro=bt.Cerebro()
#將數據傳入回測系統
cerebro.adddata(data)
# 將交易策略加載到回測系統中
cerebro.addstrategy(Boll_strategy)
# 設置初始資本為10,000
startcash=10000
cerebro.broker.setcash(startcash)
# 設置交易手續費為 0.25%
cerebro.broker.setcommission(commission=0.001)
#運行回測系統
cerebro.run()
#獲取回測結束后的總資金
portvalue=cerebro.broker.getvalue()
pnl=portvalue-startcash
#打印結果
print(f'總資金: {round(portvalue,2)}')
#最后可視化
cerebro.plot()
看下測試結果,原始資金1w,最后是11132,收益率11%。看上去不錯,不過還是沒有算上分紅(分紅在6月,貌似沒有影響)。
有建議請留言。