刚接触Backtrader,完全按照教程写的,但无法回测,请问是哪里出了问题?

新手上路,请多包涵

不知道TypeError问题出在哪,我是新手,刚开始接触backtrader

Traceback (most recent call last):
File "C:\Virtual Hard Drive D\Python project\venv\backtrader\trader.py", line 27, in <module>

data = bt.feeds.PandasData(stock_df, fromdate=fromdate, todate=todate)

File "C:\Users\34063\AppData\Local\Programs\Python\Python39\lib\site-packages\backtrader\metabase.py", line 88, in call

_obj, args, kwargs = cls.doinit(_obj, *args, **kwargs)

File "C:\Users\34063\AppData\Local\Programs\Python\Python39\lib\site-packages\backtrader\metabase.py", line 78, in doinit

_obj.__init__(*args, **kwargs)

TypeError: __init__() takes 1 positional argument but 2 were given

import pandas as pd
from datetime import datetime
import backtrader as bt
import matplotlib.pyplot as plt
import tushare as ts


'''plt.rcParams["front.sans-serif"] = ["SimHei"]  # 设置画图时的中文显示
plt.rcParams["axes.unicode_minus"] = False  # 设置画图时的负号显示'''


# 1.数据加载
def get_data(code='600519', starttime='2017-01-10', endtime='2020-01-01'):
    df = ts.get_k_data(code, start=starttime, end=endtime)
    df.index = pd.to_datetime(df.date)
    df['openinterest'] = 0
    # 对df的数据列进行一个整合
    df = df[['open', 'high', 'low', 'volume', 'openinterest']]
    print(df)
    return df

stock_df = get_data()
fromdate = datetime(2017, 1, 1)
todate = datetime(2020, 1, 1)

# 加载并读取数据源 dataname(数据来源) fromdata(date格式) todate
data = bt.feeds.PandasData(stock_df, fromdate=fromdate, todate=todate)

# 2.构建策略
class Mystrategy(bt.Strategy):
    params = (
        ('maperiod',20),
              )

    def __init__(self):
        self.order = None
        self.ma = bt.indicators.SimpleMovingAverage(self.datas[0], period = self.params.maperiod)

    # 每个bar都会执行一次,回测的每个日期都会执行一次
    def next(self):
        # 判断是否有交易指令
        if self.order:
            return
        # 判断是否空仓
        if not self.position:
            if self.datas[0].close[0]>self.ma[0]:
                self.order = self.buy(size=200)  # 买二百股
            else:
                if self.datas[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(100000)
# 设置手续费
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()
portval = cerebro.broker.getvalue()
print(f"剩余总资金:{portval}\n回测时间: {s}  {t}")
阅读 2.4k
1 个回答

问题出在这一行代码:

data = bt.feeds.PandasData(stock_df, fromdate=fromdate, todate=todate)

在创建PandasData对象时,你需要将stock_df作为dataname参数传递。所以,应该是这样的:

data = bt.feeds.PandasData(dataname=stock_df, fromdate=fromdate, todate=todate)

把这一行代码进行相应修改后,你的代码应该可以正常运行。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题