copipe Python | pandasでRSIを計算する。

概要

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