@Aurum_Stella

Pandas, Python. Есть отрывок кода индикатора RSI с использованием pandas, есть список, куда его притулить?

Есть код взят на просторах интернета, суть его в том "если я правильно понял" что он анализирует список чисел и выводит значение RSI (индекс относительной силы).
Сначала я два дня пытался самостоятельно написать этот индикатор по формулам с интернета, но постоянно получал не тот результат сравнивал на сайте tradingview. Наткнулся тут на код который вроде как выполняет требуемые мне действия, но я не знаю Pandas.
Суть такова, у меня есть список чисел [1,2,3...n], он хранится в json файле, как мне передать этот список в данный код? Куда притулить переменную с списком что бы он заработал?

Приму любую помощь, и буду очень благодарен, впредь обещаю подучить pandas.
spoiler

import pandas as pd
import numpy as np


def rsi_tradingview(ohlc: pd.DataFrame, period: int = 14, round_rsi: bool = True):
    """ Implements the RSI indicator as defined by TradingView on March 15, 2021.
        The TradingView code is as follows:
        //@version=4
        study(title="Relative Strength Index", shorttitle="RSI", format=format.price, precision=2, resolution="")
        len = input(14, minval=1, title="Length")
        src = input(close, "Source", type = input.source)
        up = rma(max(change(src), 0), len)
        down = rma(-min(change(src), 0), len)
        rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
        plot(rsi, "RSI", color=#8E1599)
        band1 = hline(70, "Upper Band", color=#C0C0C0)
        band0 = hline(30, "Lower Band", color=#C0C0C0)
        fill(band1, band0, color=#9915FF, transp=90, title="Background")
    :param ohlc:
    :param period:
    :param round_rsi:
    :return: an array with the RSI indicator values
    """

    delta = ohlc["close"].diff()

    up = delta.copy()
    up[up < 0] = 0
    up = pd.Series.ewm(up, alpha=1/period).mean()

    down = delta.copy()
    down[down > 0] = 0
    down *= -1
    down = pd.Series.ewm(down, alpha=1/period).mean()

    rsi = np.where(up == 0, 0, np.where(down == 0, 100, 100 - (100 / (1 + up / down))))

    return np.round(rsi, 2) if round_rsi else rsi

  • Вопрос задан
  • 317 просмотров
Пригласить эксперта
Ответы на вопрос 1
phaggi
@phaggi
лужу, паяю, ЭВМы починяю
Не вдаваясь в математику, набросал пример для работы с приведенной функцией. Не уверен, что оно выдает то, что ожидается, но что-то оно таки выдает.

код примера

import json

import numpy as np
import pandas as pd

from pathlib import Path

#  тут я формирую тестовый файл json со списком длиной 50
n = 50
list_for_json = [i for i in range(n)]
my_json_file = Path('myjson.json')
with open(my_json_file, 'w') as myfile:
    json.dump(fp=myfile, obj=list_for_json)

#  тут открываю этот файл, создаю из него dataframe Pandas и именую колонку с данными 'close', 
#  так как такое имя используется в приведенной вами функции.
with open(my_json_file, 'r') as myfile:
    df = pd.read_json(myfile)
df.rename(columns={0: 'close'}, inplace=True)
print(df.head())

#  собственно функция без изменений
def rsi_tradingview(ohlc: pd.DataFrame, period: int = 14, round_rsi: bool = True):
    """ Implements the RSI indicator as defined by TradingView on March 15, 2021.
        The TradingView code is as follows:
        //@version=4
        study(title="Relative Strength Index", shorttitle="RSI", format=format.price, precision=2, resolution="")
        len = input(14, minval=1, title="Length")
        src = input(close, "Source", type = input.source)
        up = rma(max(change(src), 0), len)
        down = rma(-min(change(src), 0), len)
        rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
        plot(rsi, "RSI", color=#8E1599)
        band1 = hline(70, "Upper Band", color=#C0C0C0)
        band0 = hline(30, "Lower Band", color=#C0C0C0)
        fill(band1, band0, color=#9915FF, transp=90, title="Background")
    :param ohlc:
    :param period:
    :param round_rsi:
    :return: an array with the RSI indicator values
    """

    delta = ohlc["close"].diff()

    up = delta.copy()
    up[up < 0] = 0
    up = pd.Series.ewm(up, alpha=1/period).mean()

    down = delta.copy()
    down[down > 0] = 0
    down *= -1
    down = pd.Series.ewm(down, alpha=1/period).mean()

    rsi = np.where(up == 0, 0, np.where(down == 0, 100, 100 - (100 / (1 + up / down))))

    return np.round(rsi, 2) if round_rsi else rsi

#  ну а дальше просто вызываю функцию и передаю в неё dataframe и печатаю, что она возвращает. #  Насколько это вменяемо внутри функции, не знаю.

print(rsi_tradingview(ohlc=df))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы