list [-1]报告索引超出范围错误

时间:2017-08-24 01:30:21

标签: python-2.7 list numpy indexoutofrangeexception

我想获取列表的最后一个元素。我使用list [-1]但它报告索引超出范围。函数的步骤是针对范围(0,天)中的每个i,首先计算tr,然后设N =平均值tr。比较当前N与之前的N,如果当前N> 1.5之前的N,则生成信号1,否则,生成信号0.如何解决此问题?

以下是代码:

def cal_N():

    if days <= number_days: 
        lst = []
        for i in range(0,days): #cal tr
            h_l = sh600004['high'][i]-sh600004['low'][i]
            h_p = sh600004['high'][i]-sh600004['close'][i-1]
            p_l = sh600004['close'][i-1]-sh600004['high']
            tr = np.max(h_l,h_p,p_l)
            lst.append(tr) #append tr
        #calculate current N
            current_N = np.mean(np.array(lst))
            #signals['sys1 add'][date] = np.where( current_N > (N[-1]*0.5), 1.0, 0.0)
            if current_N>(N[-1]*0.5):
                positions['sh600004'] = 100 * signals['system1'] + 100*signals['system1'][i]
                print(positions)
            else:
                positions['sh600004'] = 100 * signals['system1']
                print(positions)
            N.append(current_N)
    else: 
            h_l = sh600004['high'][0]-sh600004['low'][0]
            h_p = sh600004['high'][0]-sh600004['close'][0]
            p_l = sh600004['close'][0]-sh600004['low'][0]
        # Calculate the True Range
            tr = max(h_l, h_p, p_l)
            current_N = (tr + (number_days -1)*(N))/number_days
            #signals['sys1 add'][date] = np.where( current_N > (N[-1]*0.5), 1.0, 0.0)
            if current_N>(N[-1]*0.5):
                positions['sh600004'] =   100 * signals['system1'] + 100*signals['system1'][i]
                print(positions)
            else:
                positions['sh600004'] = 100 * signals['system1'] 
                print(positions)
            N.append(current_N)

2 个答案:

答案 0 :(得分:1)

喜欢这个吗?

In [1143]: [][-1]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-1143-aeb23779f804> in <module>()
----> 1 [][-1]

IndexError: list index out of range

我没有看到N初始化的位置。但如果它以[]开头,则此测试会出现问题:current_N>(N[-1]*0.5)。即使索引有效,结果也是空的,并且比较不起作用,current_N > [][]*.5都会引发错误。因此,当N为空时,您有几个理由需要测试或阻止此操作。

答案 1 :(得分:0)

第一次进入循环时会出现问题。此时,N是一个空列表。可以通过添加检查列表是否为空或者您可以为N提供默认值来修复它。

顺便说一下,计算股票的时间序列数据(真实范围或其他分析),我建议你尝试一下熊猫。它将保存循环并支持数组/矩阵操作。效率也会更高。

在分析SH股票时,即使是JQK也可以帮助您更快地进行分析。