首页 > 解决方案 > 为什么我的 RSI 值与 Yahoo Finance 不同

问题描述

我尝试使用以下代码在 SMA 和 EMA 方法中计算 RSI。

def rsi(data, period = 14, column = 'Close'):
  delta = data[column].diff()
  delta = delta[1:]
  up = delta.clip(lower=0)
  down = delta.clip(upper=0)
  up[ up < 0 ] = 0
  down[down > 0] = 0
  data['UP'] = up
  data['DOWN'] = down
  
  # Calculate the EWMA
  roll_up1 = up.ewm(span=period).mean()
  roll_down1 = down.abs().ewm(span=period).mean()

  # Calculate the RSI based on EWMA
  RS1 = roll_up1 / roll_down1
  RSI1 = 100.0 - (100.0 / (1.0 + RS1))

  # Calculate the SMA
  roll_up2 = up.rolling(period).mean()
  roll_down2 = down.abs().rolling(period).mean()

  # Calculate the RSI based on SMA
  RS2 = roll_up2 / roll_down2
  RSI2 = 100.0 - (100.0 / (1.0 + RS2))

  data['RSI1'] = RSI1
  data['RSI2'] = RSI2


  return data

然后我尝试计算 AAPL 股票的 RSI

df = yf.download('AAPL', period="3d", interval = '1h')
rsi(df)
df = df.dropna()
df

结果如下,

                            Close       RSI1        RSI2
2021-06-18 09:30:00-04:00   131.050003  46.782703   53.072098
2021-06-18 10:30:00-04:00   130.327499  37.694286   48.587796
2021-06-18 11:30:00-04:00   130.990005  48.317262   55.852004
2021-06-18 12:30:00-04:00   130.809998  45.865629   53.151575
2021-06-18 13:30:00-04:00   130.960007  48.383954   61.052606
2021-06-18 14:30:00-04:00   130.904999  47.449990   55.294624
2021-06-18 15:30:00-04:00   130.399994  39.394643   51.816916

但是当我查看雅虎财经图表时,

RSI 值接近 SMA 方法。但还是不一样的。

                            Close       RSI
2021-06-18 13:30:00-04:00   130.960007  49.04
2021-06-18 14:30:00-04:00   130.904999  48.35
2021-06-18 15:30:00-04:00   130.399994  42.46

我究竟做错了什么?

标签: pythonpandasnumpyyahoo-financequantitative-finance

解决方案


您发布的所有代码都是正确的,除了您需要 EWMA。

您需要更改的是以下行:

 # Calculate the EWMA
 adjust: bool = False
 ignore_na: bool = True

roll_up1 = up.ewm(alpha=(1.0 / period), adjust=adjust, ignore_na=ignore_na, min_periods=period).mean()
roll_down1 = down.abs().ewm(alpha=(1.0 / period), adjust=adjust, ignore_na=ignore_na, min_periods=period).mean()

最后,RSI 计算如下:

 RSI = 100.0 * roll_up1 / (roll_down1 + roll_down1 )

推荐阅读