TA-Lib / ta-lib-python

Python wrapper for TA-Lib (http://ta-lib.org/).
http://ta-lib.github.io/ta-lib-python
Other
9.49k stars 1.74k forks source link

Connors RSI? #450

Closed mayhem7 closed 8 months ago

mayhem7 commented 3 years ago

Hi guys, first of all thanks for this awesome library! I can't find Connors RSI in the indicators, is there any plan to implement it or anyway to do it by myself using this library?

Thanks gain!

mrjbq7 commented 3 years ago

https://school.stockcharts.com/doku.php?id=technical_indicators:connorsrsi

That has a formula, looks pretty straightforward?

On Aug 23, 2021, at 7:32 AM, mayhem7 @.***> wrote:

 Hi guys, first of all thanks for this awesome library! I can't find Connors RSI in the indicators, is there any plan to implement it or anyway to do it by myself using this library?

Thanks gain!

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub, or unsubscribe. Triage notifications on the go with GitHub Mobile for iOS or Android.

mayhem7 commented 3 years ago

https://school.stockcharts.com/doku.php?id=technical_indicators:connorsrsi That has a formula, looks pretty straightforward? On Aug 23, 2021, at 7:32 AM, mayhem7 @.***> wrote:  Hi guys, first of all thanks for this awesome library! I can't find Connors RSI in the indicators, is there any plan to implement it or anyway to do it by myself using this library? Thanks gain! — You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub, or unsubscribe. Triage notifications on the go with GitHub Mobile for iOS or Android.

I tried, but i don't know how to calculate the "Streak" thing or the "PercentRank"...

mrjbq7 commented 3 years ago

This is not verified, but maybe you can use it as a starting point.

import numpy as np
import talib as ta
import pandas as pd

Using this suggestion here:

https://stackoverflow.com/questions/66371344/streak-count-below-0

You can make a "streaks" calculator:

def STREAKS(a):
    df = pd.DataFrame(a)
    lt = df[0] < df[0].shift(1)
    eq = df[0] == df[0].shift(1)

    def count(x):
        n = 0 if count.called == 0 or eq[count.sum] else 1
        r = np.arange(n, len(x) + n)
        if count.called % 2 == 1:
            r = -r

        count.called += 1
        count.sum += len(x)
        return pd.Series(r, x.index)
    count.called = 0
    count.sum = 0

    return np.array(df.groupby((lt != lt.shift(1)).cumsum()).apply(count), dtype=float)

And a percentile rank function, maybe something like this:

def PERCENTRANK(a, n):
    x = np.array([sum(a[i+1-n:i+1] < a[i]) / n for i in range(len(a))])
    x[:n-1] = np.nan
    return x

And then putting it together:

def CONNORSRSI(a, x, y, z):
    return (ta.RSI(a, x) + ta.RSI(STREAKS(a), y) + PERCENTRANK(a, z)) / 3

And using it (similar to the link I posted):

CONNORSRSI(c, 3, 2, 10)

I didn't really verify it's 100% correct...

mayhem7 commented 3 years ago

Thanks i'l ltry! <3