我正在运行 Stefan Jansen 的书“算法交易的机器学习”第二版中的一些代码,特别是在第 1 章中。 5,第 2 节。“backtest_with_pf_optimization”使用 Visual Studio Code 中的 forked Github Repo,来自此处的原始源。
我一直遇到一个问题,我无法迭代 DataFrame 中的回测结果,因为我想要迭代的特定列实际上是“Series”对象而不是“DataFrame”。
returns, positions, transactions = extract_rets_pos_txn_from_zipline(backtest)
返回以下错误:
AttributeError Traceback (most recent call last)
/tmp/ipykernel_3528/3074314327.py in ?()
----> 1 returns, positions, transactions = extract_rets_pos_txn_from_zipline(backtest)
~/.python/current/lib/python3.10/site-packages/pyfolio/utils.py in ?(backtest)
151 if backtest.index.tzinfo is None:
152 backtest.index = backtest.index.tz_localize('UTC')
153 returns = backtest.returns
154 raw_positions = []
--> 155 for dt, pos_row in backtest.positions.iteritems():
156 df = pd.DataFrame(pos_row)
157 df.index = [dt] * len(df)
158 raw_positions.append(df)
~/.local/lib/python3.10/site-packages/pandas/core/generic.py in ?(self, name)
6292 and name not in self._accessors
6293 and self._info_axis._can_hold_identifiers_and_holds_name(name)
6294 ):
6295 return self[name]
-> 6296 return object.__getattribute__(self, name)
AttributeError: 'Series' object has no attribute 'iteritems'
我已经通过运行
print(type(backtest['column_name']))
验证了问题中的每一列确实是“系列”,但我无法理解为什么会发生这种情况。查看 extract_rets_pos_txn_from_zipline()
方法 (link) 的源文档表明 returns, positions, transactions
的预期输出应分别为 Series, DataFrame, DataFrame
。
我不确定为什么这些特定对象没有作为 DataFrame 对象返回,并且它阻止我执行更多文件。
有没有办法解决这个问题?
如果您只想在回测中使用
column_name
,则需要使用 backtest.loc[:, ['column_name]]
,它返回 pd.DataFrame
而不是 pd.Series