1

我正在尝试使用Python 3.8 中的backtrader对使用's模块AAPL从 Yahoo Finance 获得的历史股票价格进行回测。backtraderYahooFinanceData

问题:数据似乎是从雅虎财经下载的,但在回测过程中,我们得到一个错误:

FileNotFoundError:[Errno 2] 没有这样的文件或目录:'AAPL'

知道我们如何解决这个问题吗?

系统:

  • Mac OS X 10.15.3
  • Python 3.8.0
  • 反向交易者 1.9.74.123

重现错误的 Python 代码

from datetime import datetime
import backtrader as bt

class SmaSignal(bt.Signal):
    param = (('period', 20), )

    def __init__(self):
        self.lines.signal = self.data - bt.ind.SMA(period=self.p.period)

data = bt.feeds.YahooFinanceData(dataname='AAPL',
                                fromdate=datetime(2018, 1, 1),
                                todate=datetime(2018, 12, 31))
cerebro = bt.Cerebro(stdstats=False)
cerebro.adddata(data)
cerebro.broker.setcash(1000.0)
cerebro.add_signal(bt.SIGNAL_LONG, SmaSignal)
cerebro.addobserver(bt.observers.BuySell)
cerebro.addobserver(bt.observers.Value)

print(f'Starting Portfolio Value: {cerebro.broker.getvalue():.2f}')
cerebro.run()
print(f'Final Portfolio Value: {cerebro.broker.getvalue():.2f}')
cerebro.plot(iplot=True, volume=False)

错误堆栈

Traceback (most recent call last):
  File "02.py", line 21, in <module>
    cerebro.run()
  File "/Users/x/opt/anaconda3/envs/test/lib/python3.8/site-packages/backtrader/cerebro.py", line 1127, in run
    runstrat = self.runstrategies(iterstrat)
  File "/Users/x/opt/anaconda3/envs/test/lib/python3.8/site-packages/backtrader/cerebro.py", line 1210, in runstrategies
    data._start()
  File "/Users/x/opt/anaconda3/envs/test/lib/python3.8/site-packages/backtrader/feed.py", line 203, in _start
    self.start()
  File "/Users/x/opt/anaconda3/envs/test/lib/python3.8/site-packages/backtrader/feeds/yahoo.py", line 352, in start
    super(YahooFinanceData, self).start()
  File "/Users/x/opt/anaconda3/envs/test/lib/python3.8/site-packages/backtrader/feeds/yahoo.py", line 94, in start
    super(YahooFinanceCSVData, self).start()
  File "/Users/x/opt/anaconda3/envs/test/lib/python3.8/site-packages/backtrader/feed.py", line 674, in start
    self.f = io.open(self.p.dataname, 'r')
FileNotFoundError: [Errno 2] No such file or directory: 'AAPL'
4

3 回答 3

4

我在他们的论坛网站上进行了一些谷歌搜索,发现12,这表明 Yahoo api 已经有几年没有工作了。要么使用不同的数据馈送,要么将数据保存为 csv 文件并读入。

于 2020-03-17T05:17:28.503 回答
1

雅虎财经最近改变了他们的输出,特别是 API 响应的内容类型('text/csv' 是预期的,但返回的是 'text/plain')。要修复它,您必须更改文件 backtrader/feeds/yahoo.py 中的代码

在第 330 行,替换:

if 'text/csv' not in ctype:

和:

if ctype not in ['text/csv', 'text/plain']:

有一个使用 backtrader 打开的拉取请求以在包中修复此问题,但尚未提交。

于 2020-05-11T18:54:24.850 回答
1

错误是对 Yahoo API 的请求失败,backtrader然后回退到尝试读取数据的本地副本,但方式也失败了。几年前雅虎 API 发生了变化,backtrader此后一直没有更新。这是一个大问题,因为甚至教程示例都被破坏了!

@mathias-thorsen 在他的回答中提到的更改被提议包含backtrader这个 Pull Request中,但它被关闭了。backtrader发展放缓,一个分叉backtrader2正在争夺它的继任者。backtrader2发现差异修复解决了 Yahoo API 请求失败的根本原因。backtrader他们在此 Pull Request中向上游提出了相同的修复,并且它最近被合并了。虽然创建者走了,但无法向 PyPI 发布新版本。backtrader2还不能接管backtrader( https://pypi.org/project/backtrader/ ) 的 PyPI 命名空间。

那么,如果它们没有在 PyPI 上发布,你如何安装它们的固定版本backtrader或更新版本呢?backtrader2您可以使用以下任一方式从 GitHub 安装最新的开发版本

  • pip install git+https://github.com/mementum/backtrader.git#egg=backtrader
  • pip install git+https://github.com/backtrader2/backtrader.git#egg=backtrader

backtrader使用 latest时也存在问题matplotlib,其中修复已合并,但没有发布。您可以找到从源代码安装的类似方法 ( https://stackoverflow.com/a/66871735/6068036 )。

于 2021-07-15T13:48:30.690 回答