【发布时间】:2020-11-25 05:21:15
【问题描述】:
在给定特定输入的情况下,我正在尝试获取股票价格的 MACD、MACD 信号和 MACD 差异线。下面是我正在使用的自定义代码。
def create_MACD(long_term,short_term,dataframe,signal_ema_length):
#obtain the SMA data that we need to obtain the MACD ema values
short_sma = create_sma(short_term,dataframe)
long_sma = create_sma(long_term,dataframe)
#create the EMAs that will be subtracted to obtain the MACD line
short_ema = create_ema(short_term,2,dataframe)
long_ema = create_ema(long_term,2,dataframe)
#calculate length of MACD array and starting indicies for line and signal
length = len(dataframe)
#calculate the starting index of the line
start_line = long_term
#calculate the starting index of the signal line
start_signal = long_term+signal_ema_length
#create the smoothing variables for the signal line
smoothing = 2/(signal_ema_length+1)
smoothing_minus = 1-smoothing
#calculate number of iterations for macd and macd signal
num_iters_macd = len(dataframe)-long_term
num_iters_signal = num_iters_macd - signal_ema_length
#create the MACD dataframe change dataframe to array for iterations
macd = np.zeros(length)
macd_signal = np.zeros(length)
array = dataframe.to_numpy()
#for loop for MACD data
for i in range(num_iters_macd):
index = start_line+i
macd[index] = short_ema[index]-long_ema[index]
#for loop for MACD signal
for i in range(num_iters_signal):
index = start_signal+i
macd_signal[index] = macd[index]*smoothing + macd_signal[index-1]*smoothing_minus
#create sma of first X days of MACD
sma_MACD = sum(macd[:signal_ema_length])/signal_ema_length
#insert the first value into the MACD signal array
macd_signal[start_signal-1] = macd[start_signal-1]*smoothing +sma_MACD*smoothing_minus
#create array for MACD difference
macd_diff = np.zeros(length)
#create starting index for MACD difference
start_diff = start_signal
num_iters_diff = num_iters_signal
for i in range(num_iters_diff):
index = i+start_diff
macd_diff[index] = macd[index]-macd_signal[index]
#send all array's to pandas dataframe
MACD_line = pd.DataFrame(data=macd)
MACD_signal = pd.DataFrame(data=macd_signal)
MACD_difference = pd.DataFrame(data=macd_diff)
return MACD_line, MACD_signal, MACD_difference
macd_av,signal_av,diff_av = create_MACD(26,12,price,9)
我得到的错误是
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
~/opt/anaconda3/envs/tensorflow/lib/python3.7/site-packages/pandas/core/indexes/range.py in get_loc(self, key, method, tolerance)
354 try:
--> 355 return self._range.index(new_key)
356 except ValueError as err:
ValueError: 26 is not in range
The above exception was the direct cause of the following exception:
KeyError Traceback (most recent call last)
<ipython-input-20-a1e7f9a89bbb> in <module>
----> 1 macd_av,signal_av,diff_av = create_MACD(26,12,price,9)
<ipython-input-19-78834be35c60> in create_MACD(long_term, short_term, dataframe, signal_ema_length)
35 for i in range(num_iters_macd):
36 index = start_line+i
---> 37 macd[index] = short_ema[index]-long_ema[index]
38
39 #for loop for MACD signal
~/opt/anaconda3/envs/tensorflow/lib/python3.7/site-packages/pandas/core/frame.py in __getitem__(self, key)
2900 if self.columns.nlevels > 1:
2901 return self._getitem_multilevel(key)
-> 2902 indexer = self.columns.get_loc(key)
2903 if is_integer(indexer):
2904 indexer = [indexer]
~/opt/anaconda3/envs/tensorflow/lib/python3.7/site-packages/pandas/core/indexes/range.py in get_loc(self, key, method, tolerance)
355 return self._range.index(new_key)
356 except ValueError as err:
--> 357 raise KeyError(key) from err
358 raise KeyError(key)
359 return super().get_loc(key, method=method, tolerance=tolerance)
KeyError: 26
我已经测试了自定义 SMA 和 EMA 函数,因此它们可以输出正确的数组。我知道这个错误意味着我的 for 循环范围不正确,但我不确定为什么这是错误的。
【问题讨论】:
-
看起来这不是错误的全文 - 您可以编辑您的帖子以包含错误的全文和回溯吗?
-
看起来
short_ema和long_ema是重新定义索引运算符的类的实例,而这个异常来自那里。如果它们是普通列表,你会得到IndexError,而不是ValueError。 -
但基本问题似乎是
index超出了其中一个的有效范围。 -
Barmar、short_ema 和 long_ema 是我需要减去以获得 MACD 的 ema 值的数组
标签: python pandas numpy alpha-vantage