首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Backtrader问题-选择策略AttributeError:模块‘集合’没有属性'Iterable‘

Backtrader问题-选择策略AttributeError:模块‘集合’没有属性'Iterable‘
EN

Stack Overflow用户
提问于 2022-01-20 07:06:04
回答 1查看 853关注 0票数 0

我试着用python优化我在Backtrader上的策略,但是不断地得到这个错误,我在网上找不到任何东西来显示我为什么要得到它。我的代码简单且松散,基于快速启动示例:

代码语言:javascript
复制
from alpaca_trade_api.rest import REST, TimeFrame, TimeFrameUnit
import backtrader as bt
from config import API_KEY, SECRET_KEY

class EMACross(bt.Strategy):

    params = dict(
        ema_short_period=5,
        ema_long_period=10
    )

    def __init__(self):
        self.order = None
        self.short_ma = bt.indicators.ExponentialMovingAverage(period=self.p.ema_short_period)
        self.long_ma = bt.indicators.ExponentialMovingAverage(period=self.p.ema_long_period)

        self.crossover = bt.ind.CrossOver(self.short_ma, self.long_ma)  # crossover signal
        self.crossdown = bt.ind.CrossDown(self.short_ma, self.long_ma)

        self.crossdown.plotinfo.subplot = False
        self.crossover.plotinfo.subplot = False

    def next(self):
        self.log('Close, %.2f' % self.data.close[0])

        if self.position.size > 0:
            if self.crossdown > 0:
                self.log('SELL CREATE, %.2f' % self.data.close[0])
                self.close()
        else:
            if self.crossover > 0:
                self.log('BUY CREATE, %.2f' % self.data.close[0])
                self.buy()

    def log(self, txt, dt=None):
        dt = dt or self.data.datetime.datetime()
        print('%s, %s' % (dt.isoformat(), txt))

    def stop(self):
        self.log('(short EMA Period %2d) (long EMA Period %2d) Ending Value %.2f' %
                 (self.p.ema_short_period, self.p.ema_long_period, self.broker.getvalue()))


rest_api = REST(API_KEY, SECRET_KEY, 'https://paper-api.alpaca.markets')


def run_backtest(strategy, symbols, start, end, timeframe, cash=100000):
    # initialize backtrader broker
    cerebro = bt.Cerebro()
    cerebro.broker.setcash(cash)
    cerebro.addsizer(bt.sizers.PercentSizer, percents=90)

    cerebro.optstrategy(strategy, ema_short_period=4, ema_long_period=6)

    # historical data request
    if type(symbols) == str:
        symbol = symbols
        alpaca_data = rest_api.get_bars(symbol, timeframe, start, end, adjustment='all').df
        data = bt.feeds.PandasData(dataname=alpaca_data, name=symbol)
        cerebro.adddata(data)
    elif type(symbols) == list or type(symbols) == set:
        for symbol in symbols:
            alpaca_data = rest_api.get_bars(symbol, timeframe, start, end, adjustment='all').df
            data = bt.feeds.PandasData(dataname=alpaca_data, name=symbol)
            cerebro.adddata(data)

    # run
    initial_portfolio_value = cerebro.broker.getvalue()
    print(f'Starting Portfolio Value: {initial_portfolio_value}')
    results = cerebro.run()
    final_portfolio_value = cerebro.broker.getvalue()
    print(
        f'Final Portfolio Value: {final_portfolio_value} ---> Return: {(final_portfolio_value / initial_portfolio_value - 1) * 100}%')


run_backtest(EMACross, 'QQQ', '2018-01-01', '2022-01-01', TimeFrame(1, TimeFrameUnit.Day))

运行脚本时,我会得到以下错误:

代码语言:javascript
复制
Traceback (most recent call last):
  File "/Users/usrname/PycharmProjects/test3/main.py", line 79, in <module>
    run_backtest(EMACross, 'QQQ', '2018-01-01', '2022-01-01', TimeFrame(1, TimeFrameUnit.Day))
  File "/Users/usrname/PycharmProjects/test3/main.py", line 54, in run_backtest
    cerebro.optstrategy(strategy, ema_short_period=4, ema_long_period=6)
  File "/Users/usrname/PycharmProjects/test3/venv/lib/python3.10/site-packages/backtrader/cerebro.py", line 893, in optstrategy
    vals = self.iterize(kwargs.values())
  File "/Users/usrname/PycharmProjects/test3/venv/lib/python3.10/site-packages/backtrader/cerebro.py", line 333, in iterize
    elif not isinstance(elem, collections.Iterable):
AttributeError: module 'collections' has no attribute 'Iterable'

Process finished with exit code 1

当运行脚本时没有optstrategy(),而是使用addstrategy(),那么所有操作都很好。只有当更改为optstrategy时,我才会得到这个错误。

我还试着在Google上运行相同的代码(使用optstrategy()方法),而且所有的代码都运行得很好,所以这让我非常困惑……

我使用PyCharm CE在macOS上运行python3.10。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-19 20:05:04

尝试将python 3.10降级为python3.8版本

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70782000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档