3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Backtraderで「TkAggを使用できない」というエラーが出てプロットできない場合の対処法

Posted at

Pythonバックテスト用ライブラリのbacktraderで、以下のようなエラーが出た場合の(一時しのぎの)解決策です。

backtraderにてバックテストの結果をcerebro.plot()とする際に、環境によっては、

ImportError: Cannot load backend 'TkAgg' which requires the 'tk' interactive framework, as 'headless' is currently running

のようなエラーがでることがあります。私は、google colaboratoryを使っている場合に直面しました。

エラーの内容:plotモジュールをimportするとき、matplotlibのbackendとしてTkAggが使われてしまう

backtrader/plot/__init__.pyにかかれているとおりですが、plotモジュールを使おうとすると、matplotlib.use('TkAgg')が実行されてしまうのがエラーの原因です。

もし、使用環境でTkAggを使えれば問題はありませんが、colaboratoryのjupyter notebookはheadlessモード(--no-browser)で動作しているため、backendとして(例えば)aggを設定する必要がありました。

matplotlibのbackendとして、単に他のものを使うだけなら、
cerebro.plot(use="agg")
のように対応できそうですが、そもそも、TkAggを利用できない環境では、モジュールのimportの段階でエラーがでます。

Cerebroクラスのplotをオーバーライドしようにも、matplotlib.use('TkAgg')は、__init__.pyで読み込まれてしまうため、回避できません。

解決策:__init__.pyを書き換えて、別のライブラリとしてimportする

苦肉の策として、backtraderのリポジトリをforkして、matplotlib.use('TkAgg')を削除するという手を使いました。

backtrader/plot/__init__.py

from __future__ import (absolute_import, division, print_function,
                        unicode_literals)

try:
    import matplotlib
except ImportError:
    raise ImportError(
        'Matplotlib seems to be missing. Needed for plotting support')

# ここの部分を削除した
# else:
#    matplotlib.use('TkAgg')


from .plot import Plot, Plot_OldSync
from .scheme import PlotScheme

このようにしたフォークリポジトリをgithubにあげています。
私がcolaboratoryでbacktraderを使うときには、

pip install git+https://github.com/yuki-data/backtrader@dev/ito/remove-tkagg-import

としています。colaboratoryでbacktraderを使って困った方は、是非どうぞ。

よりスマートな解決策をコメントしていただけると大変助かります。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?