调用backtrader_plotting绘制回测图时报错
import backtrader as bt
from support import *
from backtrader_plotting import Bokeh, OptBrowser
from backtrader_plotting.schemes import Tradimo
#画回测图
b = Bokeh(style='bar',plot_mode='single',tabs='multi',scheme=Tradimo())
cerebro.plot(b)
Traceback (most recent call last):
File "<ipython-input-24-9d2a911f184e>", line 1, in <module>
cerebro.plot(b)
File "C:\ProgramData\Anaconda3\lib\site-packages\backtrader\cerebro.py", line 989, in plot
rfig = plotter.plot(strat, figid=si * 100,
File "C:\Users\Administrator\AppData\Roaming\Python\Python38\site-packages\backtrader_plotting\bokeh\bokeh.py", line 509, in plot
self._blueprint_strategy(obj, start, end, tradingdomain, **kwargs)
File "C:\Users\Administrator\AppData\Roaming\Python\Python38\site-packages\backtrader_plotting\bokeh\bokeh.py", line 244, in _blueprint_strategy
figure.plot(master, None)
File "C:\Users\Administrator\AppData\Roaming\Python\Python38\site-packages\backtrader_plotting\bokeh\figureenvelope.py", line 301, in plot
self.plot_indicator(obj, master)
File "C:\Users\Administrator\AppData\Roaming\Python\Python38\site-packages\backtrader_plotting\bokeh\figureenvelope.py", line 459, in plot_indicator
self._plot_indicator_observer(obj, master)
File "C:\Users\Administrator\AppData\Roaming\Python\Python38\site-packages\backtrader_plotting\bokeh\figureenvelope.py", line 462, in _plot_indicator_observer
pl = plotobj2label(obj)
File "C:\Users\Administrator\AppData\Roaming\Python\Python38\site-packages\backtrader_plotting\bokeh\label_resolver.py", line 49, in plotobj2label
return f'{indicator2label(obj)}@{indicator2fullid(obj)}'
File "C:\Users\Administrator\AppData\Roaming\Python\Python38\site-packages\backtrader_plotting\bokeh\label_resolver.py", line 79, in indicator2fullid
return datatarget2label([x._owner]) + '[L]'
File "C:\Users\Administrator\AppData\Roaming\Python\Python38\site-packages\backtrader_plotting\bokeh\label_resolver.py", line 32, in datatarget2label
raise RuntimeError(f'Unexpected data type: {d.__class__}')
RuntimeError: Unexpected data type: <class 'support.MyStrategy'>
我搞定了,看这个连接
https://programmerah.com/tag/runtimeerror-unexpected-data-type/
def datatarget2label(datas: List[Union[bt.AbstractDataBase, bt.Indicator]]):
"""Convert datas (usually a datafeed but might also be an indicator if one indicator operates on another indicator) to a readable string.
If a name was provided manually then use that."""
# try some popular attributes that might carry string represantations
# _name: user assigned value upon instantiation
# shortname: used by some datafeeds
# _dataname: underlying bt dataname (should always be available as last resort)
prim_names = ['_name', 'shortname', '_dataname']
labels = []
for d in datas:
if isinstance(d, bt.Indicator):
labels.append(indicator2label(d))
elif isinstance(d, bt.AbstractDataBase):
for n in prim_names:
val = getattr(d, n, "")
if val is None:
continue
val = str(val)
if len(val) > 0:
labels.append(val)
break
else:
raise RuntimeError(f'Unexpected data type: {d.__class__}')
if len(labels) == 0:
return "Unidentified"
return ','.join(labels)
这是说不识别backtrader的strategy类?
不错,你会点开堆栈指向的代码来查看,你只看了一层,不如层层往上跟踪下?例如 datas 又是上层什么地方传进来的?
遇到同样问题。
解决了吗?
me too
同问