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')
を削除するという手を使いました。
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を使って困った方は、是非どうぞ。
よりスマートな解決策をコメントしていただけると大変助かります。