【问题标题】:pybacktest library hello world error: builtins.AttributeError: 'Series' object has no attribute 'ix'pybacktest 库 hello world 错误:builtins.AttributeError:“系列”对象没有属性“ix”
【发布时间】:2021-07-24 09:44:13
【问题描述】:

运行以下pybacktest 代码:

import matplotlib
import matplotlib.pyplot as plt
import pybacktest
import pandas as pd

short_ma = 50
long_ma = 200

ohlc = pybacktest.load_from_yahoo('AAPL', start=2000)
ohlc.tail()

ms = ohlc.C.rolling(short_ma).mean()
ml = ohlc.C.rolling(long_ma).mean()

buy = cover = (ms > ml) & (ms.shift() < ml.shift())  # ma cross up
sell = short = (ms < ml) & (ms.shift() > ml.shift())  # ma cross down

bt = pybacktest.Backtest(locals(), 'ma_cross')

print(bt.summary())

bt.plot_equity()

我在标题中遇到错误,有关更多信息,请参阅此屏幕截图:

有人知道解决这个问题的方法吗?

【问题讨论】:

  • .ix[] 自 pandas 0.20 起已弃用,您可以降级 pandas 或编辑 pybacktest 源代码,将 .ix[] 替换为 .loc[]
  • @GustiAdli,你 100% 不应该用 iloc 替换它?

标签: python python-3.x finance quantitative-finance back-testing


【解决方案1】:

根据这个帖子:

AttributeError: 'DataFrame' object has no attribute 'ix'

我使用 WingWare 的调用堆栈备份到调用 __getattribute__ 的内容

我换了行:

    eq = self.equity.ix[subset].cumsum()

(backtest.py 的第 188 行)与:

    eq = self.equity.loc[subset].cumsum()

也感谢评论者@GustiAdli 的确认。

该代码也适用于 Jupyter 笔记本,正确的代码应该是:

import matplotlib
import matplotlib.pyplot as plt
import pybacktest
import pandas as pd

short_ma = 50
long_ma = 200

ohlc = pybacktest.load_from_yahoo('AAPL', start=2000)
ohlc.tail()

ms = ohlc.C.rolling(short_ma).mean()
ml = ohlc.C.rolling(long_ma).mean()

buy = cover = (ms > ml) & (ms.shift() < ml.shift())  # ma cross up
sell = short = (ms < ml) & (ms.shift() > ml.shift())  # ma cross down

bt = pybacktest.Backtest(locals(), 'ma_cross')

print(bt.summary())

fig,ax = bt.plot_equity()
plt.show()

正确的输出应该是:

我正在为此更改(以及需要完成的其他修复)创建一个新的存储库:

https://github.com/enjoysmath/pybacktest

由于原件似乎没有任何作用(最近的问题消息来自去年)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 2020-03-22
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    相关资源
    最近更新 更多