概要
np.maximum()によって上昇と下落を切り分け、それぞれについてewm(span=5, adjust=False).mean()によって指数平滑移動平均を求めることで、pandasでRSIを計算することができる。
(注:ewm()は、EMAを計算するときに初期値としてSMAではなく最初の値を使うので、最初の数個の計算値は一般的なRSIと大きく異なる場合がある。)
コード
import pandas as pd
import numpy as np
df = pd.DataFrame([109.83, 110.35, 110.73, 110.61, 110.70, 110.18, 109.73, 109.84, 109.63], columns=["close"])
df["up_ema"] = np.maximum(df["close"]-df["close"].shift(1), 0).ewm(span=5, adjust=False).mean()
df["down_ema"] = np.maximum(df["close"].shift(1)-df["close"], 0).ewm(span=5, adjust=False).mean()
df["RSI"] = df["up_ema"]/(df["up_ema"]+df["down_ema"])*100
print(df)
結果
close up_ema down_ema RSI 0 109.83 NaN NaN NaN 1 110.35 0.520000 0.000000 100.000000 2 110.73 0.473333 0.000000 100.000000 3 110.61 0.315556 0.040000 88.750000 4 110.70 0.240370 0.026667 90.013870 5 110.18 0.160247 0.191111 45.607871 6 109.73 0.106831 0.277407 27.803363 7 109.84 0.107888 0.184938 36.843585 8 109.63 0.071925 0.193292 27.119287