我正在做一个小的Python代码来测试股票的买/卖策略,并且使该索引超出了错误范围,但仅包含一些值。
错误日志:
KeyError Traceback (most recent call last)
~\Anaconda3\envs\finance\lib\site-packages\pandas\core\indexes\base.py in get_value(self, series, key)
3102 return self._engine.get_value(s, k,
-> 3103 tz=getattr(series.dtype, 'tz', None))
3104 except KeyError as e1:
pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_value()
pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_value()
pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()
pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()
KeyError: -1
During handling of the above exception, another exception occurred:
IndexError Traceback (most recent call last)
<ipython-input-81-3e66a7abf00d> in <module>()
20 for i, s in enumerate(short):
21 for j, l in enumerate(long):
---> 22 rets, sharpe = ma_strat( s, l)
23 profit[i,j] = rets
24 sharperat[i,j] = sharpe
<ipython-input-81-3e66a7abf00d> in ma_strat(short_, long_)
9 datos['strategy'] = datos['ret'] * datos['pos'].shift(1)
10 sh = np.sqrt(252) * (datos['strategy'].mean() / datos['strategy'].std())
---> 11 rets = datos['strategy'].cumsum()[-1]
12 return rets, sh
13
~\Anaconda3\envs\finance\lib\site-packages\pandas\core\series.py in __getitem__(self, key)
764 key = com._apply_if_callable(key, self)
765 try:
--> 766 result = self.index.get_value(self, key)
767
768 if not is_scalar(result):
~\Anaconda3\envs\finance\lib\site-packages\pandas\core\indexes\base.py in get_value(self, series, key)
3107
3108 try:
-> 3109 return libindex.get_value_box(s, key)
3110 except IndexError:
3111 raise
pandas\_libs\index.pyx in pandas._libs.index.get_value_box()
pandas\_libs\index.pyx in pandas._libs.index.get_value_box()
IndexError: index out of bounds
如果我将linspace值设置为可以正常工作:
short = np.linspace(2, 4, 2, dtype=int)
long = np.linspace(10, 12, 2, dtype=int)
但是如果我将值设置为此:(在下面的代码中) 不起作用。显示索引超出范围错误。
def ma_strat(short_, long_):
datos['sh'] = ta.EMA(datos['Adj Close'].values, short_)
datos['lg'] = ta.EMA(datos['Adj Close'].values, long_)
datos.dropna(inplace=True)
datos['pos'] = np.where(datos['sh']>datos['lg'], 1, 0)
datos['ret'] = np.log(datos['Adj Close'] / datos['Adj Close'].shift(1))
datos['strategy'] = datos['ret'] * datos['pos'].shift(1)
sh = np.sqrt(252) * (datos['strategy'].mean() / datos['strategy'].std())
rets = datos['strategy'].cumsum()[-1]
return rets, sh
short = np.linspace(3, 13, 11, dtype=int)
print(short)
long = np.linspace(13, 23, 11, dtype=int)
print(long)
profit = np.zeros((len(short), len(long)))
sharperat = np.zeros((len(short), len(long)))
for i, s in enumerate(short):
for j, l in enumerate(long):
rets, sharpe = ma_strat( s, l)
profit[i,j] = rets
sharperat[i,j] = sharpe
答案 0 :(得分:0)
好像datos['strategy'].cumsum()[-1]
正在返回熊猫系列。这就是为什么[-1]
索引可能无法正常工作的原因。
尝试np.array(datos['strategy']).cumsum()[-1]
希望这会有所帮助