我想获取列表的最后一个元素。我使用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)
答案 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也可以帮助您更快地进行分析。