import pandas as pd
from WindPy import w
import backtrader as bt
import datetime as dt
import matplotlib.pyplot as plt
import numpy as np
w.start()
w.isconnected
HS300 = pd.read_excel('C:/Users/baiyi/Desktop/Temp.xlsx')
class SMAStrategy(bt.Strategy):
def __int__(self):
self.dataclose = self.data0.close
self.order = None
self.buyprice = None
self.buycomm = None
self.sma = bt.indicators.SimpleMovingAverage(self.data0, period=15)
def next(self):
if not self.position:
if self.dataclose[0] > self.sma[0]:
self.buy()
else:
if self.dataclose[0] < self.sma[0]:
self.close()
def notify_order(self, order):
if order.status in [order.Submitted, order.Accepted]:
return
if order.status in [order.Completed]:
if order.isbuy():
self.log(
'BUY EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' %
(order.executed.price,
order.executed.value,
order.executed.comm))
self.buyprice = order.executed.price
self.buycomm = order.executed.comm
else:
self.log('SELL EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' %
(order.executed.price,
order.executed.value,
order.executed.comm))
self.bar_executed = len(self)
elif order.status in [order.Canceled, order.Margin, order.Rejected]:
self.log('Order Canceled/Margin/Rejected')
self.order = None
def notify_trade(self, trade):
if not trade.isclosed:
return
self.log('OPERATION PROFIT, GROSS %.2f, NET %.2f' %
(trade.pnl, trade.pnlcomm))
def log(self, txt, dt=None, doprint=True):
if doprint:
dt = dt or self.dates[0].datetime.date(0)
print('%s, %s' % (dt.isoformat(), txt))
if __name__ =='__main__':
cerebro = bt.Cerebro()
HS300['Datetime'] = pd.to_datetime(HS300['Date'])
HS300.set_index('Datetime', inplace=True)
HS300 = bt.feeds.PandasData(dataname = HS300, fromdate = dt.datetime(2010,1,1), todate = dt.datetime(2021,12,31))
cerebro.adddata(HS300)
cerebro.addstrategy(SMAStrategy)
cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name= 'SharepRatio')
cerebro.addanalyzer(bt.analyzers.DrawDown, _name= 'DrowDown')
cerebro.broker.setcash(10000.0)
cerebro.broker.setcommission(commission=0.0006)
cerebro.addsizer(bt.sizers.PercentSizer, percents=90)
result = cerebro.run()
对象没有dataclose属性
看看是不是dataclose属性名写错了
或者对象用错了
self.dataclose = self.data0.close 改成
self.dataclose = self.data[0].close