AttributeError: 'Lines_LineSeries_LineIterator_DataAccessor_Strateg' object has no attribute 'dates'
一直显示这个错误,但是数据好像都是正确的,也不是很明白
open high low close volume openinterest
date
2022-01-04 2055.00 2068.95 2014.00 2051.23 2.576751e+12 0
2022-01-05 2045.00 2065.00 2018.00 2024.00 2.542544e+12 0
2022-01-06 2022.01 2036.00 1938.51 1982.22 2.490060e+12 0
2022-01-07 1975.00 1988.88 1939.32 1942.00 2.439536e+12 0
求解答,感谢!!
import backtrader as bt
from datetime import datetime
import pandas as pd
import matplotlib.pyplot as plt
import backtrader.analyzers as btanalyzers
import backtrader.feeds as btfeeds
import akshare as ak
def get_data(name):
df1 = ak.stock_zh_a_hist_163(symbol=name, start_date="20220101", end_date="20220329")
df = df1.loc[:, ['日期', '名称', '开盘价', '最高价', '最低价', '收盘价', '总市值']]
df.columns = ["date", "name", "open", "high", "low", "close", "volume"]
df.index = pd.to_datetime(df.date)
df['openinterest'] = 0
df = df[["open", "high", "low", "close", "volume", "openinterest"]]
print(df)
return df
stock_df = get_data("sh600519")
fromdate = datetime(2022, 1, 4)
todate = datetime(2022, 3, 29)
data = bt.feeds.PandasData(dataname=stock_df, fromdate=fromdate, todate=todate)
# 2、构建策略
# 上穿20买入,跌穿20卖出
class MyStrategy(bt.Strategy):
params = (
('maperiod', 20),
)
def __init__(self):
self.order = None
self.ma = bt.indicators.SimpleMovingAverage(self.dates[0], period=self.params.maperiod)
# 每个bar都会执行一日,回测的每个日期都会执行一次
def next(self):
# 判断是否有交易指令正在进行
if (self.order):
return
# 空仓
if not (self.position):
if self.dates[0].close[0] > self.ma[0]:
self.order = self.buy(size=200)
else:
if self.dates[0].close[0] > self.ma[0]:
self.order = self.sell(size=200)
# 3、策略设置
cerebro = bt.Cerebro() # 创建大脑
# 把数据加入大脑
cerebro.adddata(data)
# 加入自己的策略
cerebro.addstrategy(MyStrategy)
# 经纪人
startcash = 100000
cerebro.broker.setcash(startcash)
# 设置手续费
cerebro.broker.setcommission(0.0002)
# 4、执行回测
s = fromdate.strftime("%Y-%m-%d")
t = todate.strftime("%Y-%m-%d")
print(f'初始资金:{startcash}\n回测时间:{s}-{t}')
cerebro.run()
class MyStrategy(bt.Strategy):
params = (
('maperiod', 20),
)
def __init__(self,datas):
self.order = None
self.datas = datas
self.ma = bt.indicators.SimpleMovingAverage(self.dates[0], period=self.params.maperiod)
init函数要传入一个形参datas,调用函数时才能将数据传入
如有用请采纳