索引越界python

时间:2019-04-15 16:22:37

标签: python pandas numpy

我正在做一个小的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

1 个答案:

答案 0 :(得分:0)

好像datos['strategy'].cumsum()[-1]正在返回熊猫系列。这就是为什么[-1]索引可能无法正常工作的原因。

尝试np.array(datos['strategy']).cumsum()[-1]

希望这会有所帮助