Почему мой расчет RSI сильно отличается от Yahoo Finance?

Я использую библиотеку yfinance для ежедневного получения цен акций на момент закрытия и расчета различных технических индикаторов. Иногда мой RSI (индекс относительной силы, для тех, кому интересно) совпадает с тем, что я вижу на графике Yahoo Finance. Однако в других случаях это сильно отличается. Я предполагаю, что Yahoo Finance знает, что они делают, и это я совершаю ошибку, но я не вижу, где именно.

Ожидаемое поведение: рассчитанное мной значение RSI будет соответствовать тому, что видно на биржевых диаграммах Yahoo Finance.

Фактическое поведение: иногда мой RSI может отклоняться на 10 или 15 пунктов, но в других случаях он идеально совпадает.

Например, сегодня, 29 декабря 2020 года, RSI, который я рассчитал для FB со вчерашнего дня, составляет 38. Yahoo показывает его как 52. Однако для T (символ AT&T) мой RSI равен 41, а Yahoo показывает его как 42.

Я убедился, что мой код соответствует другим примерам, которые я видел, но в остальном я не знаю, что здесь попробовать. Я не математик.

Ниже мой точный код:

import pandas as pd
import yfinance as yf

# Calculate Relative Strength Indicator (RSI) #
    gainz = []
    losses = []

    # Initialize variable for counting rows of prices
    n = 1

    # For each of the last 14 trading sessions...
    while n <= 14:  

        # ... calculate difference between closing price of each day and of the day before it.
        difference = ((df['Close'][-n]) - (df['Close'][-(n+1)]))

        # If difference is positive, add it to the positive list, and add 0 to the losses list 
        if difference > 0:
            gainz.append(difference)
            losses.append(0)

        # If negative, get the absolute value and add to the negative list, and add 0 to the gainz list
        elif difference < 0:
            losses.append(abs(difference))
            gainz.append(0)

        # Otherwise it must be zero, so add 0 to both lists
        else:
            gainz.append(0)
            losses.append(0)

        # Increment n to move to the next row
        n += 1
        
    avg_gainz = (sum(gainz))/14
    avg_losses = (sum(losses))/14

    RSvalue = (avg_gainz/avg_losses)

    RSI = (100 - (100/(1+RSvalue)))
    RSI = int(RSI)

person MBWD    schedule 29.12.2020    source источник
comment
Расчет RSI с пандами уже объяснен здесь.   -  person Robert Altena    schedule 29.12.2020
comment
Я искал, но по какой-то причине не нашел этого... но это очень помогает, так что спасибо. Я просто собираюсь использовать библиотеку talib, так как кажется, что это очень легко сделать этот расчет.   -  person MBWD    schedule 29.12.2020


Ответы (1)


Ну, во-первых, я считаю, что расчеты RSI выполняются с процентной прибылью / убытком, а не с чистой прибылью / убытком в долларах. Во-вторых, вам нужно разделить массив прибылей и массив потерь на количество прибылей и убытков соответственно, чтобы получить средний выигрыш или убыток за период расчета (не 14). Например. 7 выигрышей и 7 потерь означают деление каждого массива на 7. Поправьте меня, если я ошибаюсь, но вы можете попробовать эти исправления и посмотреть, работают ли они.

Мне была полезна эта ссылка: https://www.investopedia.com/terms/r/rsi.asp

person Giovanni Giacalone    schedule 28.01.2021