首页 > 解决方案 > Python,试图计算 RSI,但我得到的数字异常高

问题描述

我正在尝试在 python 中计算 RSI 公式。我从 AlphaVantage TimeSeries API 获取收盘价数据。

def rsi(data,period):  

    length = len(data) - 1

    current_price = 0 
    previous_price = 0

    avg_up = 0
    avg_down = 0

    for i in range(length-period,length):
        current_price = data[i]
        if current_price > previous_price:
            avg_up += current_price - previous_price
        else:
            avg_down += previous_price - current_price
        previous_price = data[i]

    # Calculate average gain and loss
    avg_up = avg_up/period
    avg_down = avg_down/period
    # Calculate relative strength
    rs = avg_up/avg_down
    # Calculate rsi
    rsi = 100 - (100/(1+rs))

    return rsi

print(rsi(data=closing_price,period=14))

在这种情况下,这将输出一个非常高的数字RSI: 99.824。但根据 TradingView 的说法,当前的 RSI 实际上是62.68.

任何关于我做错了什么的反馈都将非常感激!

这是一些数据,它是 100 分钟的 AAPL 数据

           0
0   118.3900
1   118.4200
2   118.3500
3   118.3000
4   118.2800
5   118.4000
6   118.3400
7   118.4500
8   118.3900
9   118.4100
10  118.4700
11  118.4000
12  118.4000
13  118.3400
14  118.4100
15  118.2850
16  118.2900
17  118.1700
18  118.2600
19  118.2800
20  118.2600
21  118.2400
22  118.2950
23  118.2800
24  118.2900
25  118.2850
26  118.3000
27  118.2150
28  118.2300
29  118.1450
30  118.1200
31  118.0800
32  118.1300
33  118.1100
34  118.1300
35  118.2300
36  118.1000
37  118.1900
38  118.2800
39  118.2400
40  118.2300
41  118.3300
42  118.3200
43  118.3500
44  118.3600
45  118.3650
46  118.3800
47  118.4500
48  118.5000
49  118.5100
50  118.5400
51  118.5100
52  118.5063
53  118.5200
54  118.5400
55  118.4700
56  118.4700
57  118.4300
58  118.4400
59  118.4300
60  118.3800
61  118.4000
62  118.3600
63  118.3700
64  118.3400
65  118.3200
66  118.3000
67  118.3210
68  118.3714
69  118.4000
70  118.4100
71  118.3500
72  118.3300
73  118.3200
74  118.3250
75  118.3200
76  118.3900
77  118.5000
78  118.4800
79  118.5300
80  118.5300
81  118.4800
82  118.5000
83  118.4400
84  118.5400
85  118.5550
86  118.5200
87  118.4600
88  118.4500
89  118.4400
90  118.4300
91  118.4019
92  118.4400
93  118.4400
94  118.4100
95  118.4000
96  118.4400
97  118.4400
98  118.4600
99  118.5050

标签: python

解决方案


我已经设法59.4使用下面的代码进行计算,这与您想要的很接近。这是我所做的更改:

_ 平均值除以n_upn_down 计数器,而不是除以period

_previouscurrent价格被删除以直接访问实际data[i]和以前的data[i-1]价格。

请注意,代码必须与其他数据一起检查。

close_AAPL = [118.4200, 118.3500, 118.3000, 118.2800, 118.4000,
              118.3400, 118.4500, 118.3900, 118.4100, 118.4700,
              118.4000, 118.4000, 118.3400, 118.4100, 118.2850,
              118.2900, 118.1700, 118.2600, 118.2800, 118.2600,
              118.2400, 118.2950, 118.2800, 118.2900, 118.2850,
              118.3000, 118.2150, 118.2300, 118.1450, 118.1200,
              118.0800, 118.1300, 118.1100, 118.1300, 118.2300,
              118.1000, 118.1900, 118.2800, 118.2400, 118.2300,
              118.3300, 118.3200, 118.3500, 118.3600, 118.3650,
              118.3800, 118.4500, 118.5000, 118.5100, 118.5400,
              118.5100, 118.5063, 118.5200, 118.5400, 118.4700, 
              118.4700, 118.4300, 118.4400, 118.4300, 118.3800,
              118.4000, 118.3600, 118.3700, 118.3400, 118.3200,
              118.3000, 118.3210, 118.3714, 118.4000, 118.4100,
              118.3500, 118.3300, 118.3200, 118.3250, 118.3200,
              118.3900, 118.5000, 118.4800, 118.5300, 118.5300,
              118.4800, 118.5000, 118.4400, 118.5400, 118.5550,
              118.5200, 118.4600, 118.4500, 118.4400, 118.4300,
              118.4019, 118.4400, 118.4400, 118.4100, 118.4000,
              118.4400, 118.4400, 118.4600, 118.5050]

def rsi(data,period):  
    length = len(data) - 1
    current_price = 0 
    previous_price = 0
    avg_up = 0
    n_up = 0
    avg_down = 0
    n_down = 0

    for i in range(length-period,length):
        if data[i] > data[i-1]:
            avg_up += data[i] - data[i-1]
            n_up += 1
        else:
            avg_down += data[i-1] - data[i]
            n_down += 1

    # Calculate average gain and loss
    avg_up = avg_up/n_up
    avg_down = avg_down/n_down
    # Calculate relative strength
    rs = avg_up/avg_down
    # Calculate rsi
    return 100. - 100./(1+rs)

print(rsi(data=close_AAPL, period=14))

推荐阅读