Я хотел бы рассчитать RSI 14 в соответствии с графиком трейдинга.
Согласно этой вики это должно быть решение: https://www.tradingview.com/wiki/Talk: Relative_Strength_Index_ (RSI)
Я реализовал это в объекте под названием RSI: Вызов в объекте RSI:
self.df['rsi1'] = self.calculate_RSI_method_1(self.df, period=self.period)
Реализация кода вычисления:
def calculate_RSI_method_1(self, ohlc: pd.DataFrame, period: int = 14) -> pd.Series:
delta = ohlc["close"].diff()
ohlc['up'] = delta.copy()
ohlc['down'] = delta.copy()
ohlc['up'] = pd.to_numeric(ohlc['up'])
ohlc['down'] = pd.to_numeric(ohlc['down'])
ohlc['up'][ohlc['up'] < 0] = 0
ohlc['down'][ohlc['down'] > 0] = 0
# This one below is not correct, but why?
ohlc['_gain'] = ohlc['up'].ewm(com=(period - 1), min_periods=period).mean()
ohlc['_loss'] = ohlc['down'].abs().ewm(com=(period - 1), min_periods=period).mean()
ohlc['RS`'] = ohlc['_gain']/ohlc['_loss']
ohlc['rsi'] = pd.Series(100 - (100 / (1 + ohlc['RS`'])))
self.currentvalue = round(self.df['rsi'].iloc[-1], 8)
print (self.currentvalue)
self.exportspreadsheetfordebugging(ohlc, 'calculate_RSI_method_1', self.symbol)
Я протестировал несколько других решений, таких как, например, но не возвращает правильное значение:
https://github.com/peerchemist/finta https://gist.github.com/jmoz/1f93b264650376131ed65875782df386
Поэтому я создал юнит-тест на основе: https://school.stockcharts.com/doku.php?id=technical_indicators :lative_strength_index_rsi
Я создал входной файл: (см. изображение Excel ниже) и выходной файл: (см. изображение Excel ниже)
Выполнение unittest (код unittest здесь не включен) ) должен привести к, но проверяет только последнее значение.
if result == 37.77295211:
log.info("Unit test 001 - PASSED")
return True
else:
log.error("Unit test 001 - NOT PASSED")
return False
Но опять я не могу пройти тест. Я проверил все значения с помощью Excel.
Так что теперь я немного растерялся.
Если я после этого вопроса: Рассчитать индикатор RSI из pandas DataFrame? Но это не даст никакого значения в усилении.
- a) Каким должен быть расчет для выравнивания юнит-тест?
- б) Каким должен быть расчет, чтобы соответствовать торговому представлению?