どうも、たぬきねこです。
今回は前回の記事で紹介したRCIをPythonで実装してみます。
ちなみに本記事では、OANDA APIを使いますので、APIのアクセストークンを取得できるようにしてください。
RCIとは
まずは、RCIを簡単に復習しておきます。
RCIは、時間と値動きの相関関係を調べるための分析ツールです。
ちなみにRCIはRank Correlation Indexの略で、日本語で言うと順位相関指数と言います。
なぜ、「順位」という単語が出るかというと、時間の順位(時間が経つにつれて高くなる)、値の順位(単純に高いか低いか)との相関を求めているからです。
少し具体例を見てみます。まずは、上昇トレンドの時です。極端に直線の例ですが、値の順位と時間の順位というのは以下のようなことをいいます。
逆に下降トレンドの場合は以下のようになります。順位に負の相関がある時RCIは低くなります。
名前は複雑ですけど、調べていることは簡単ですね!
RCIの計算式
RCIは以下の式で計算します。
一見複雑そうに見えるんですけど、基本的には順位の差\(d^2\)の意味がわかれば大体わかります。この順位の差が大きくなればRCIは小さくなるし、差が小さくなればRCIは大きくなります。
RCIを実装してみる
では、RCIを実装してみましょう。
RCIのソースコードは以下のgithubにもあげてあります。
https://github.com/tocom242242/aifx_blog_codes/blob/master/fx/rci.ipynb
では、実装していきます。
まず、必要なモジュールをインポートしておきます。(oandapyV20等必要なモジュールはpip等でインストールしておいてください)
import matplotlib.pyplot as plt
import numpy as np
from oandapyV20 import API
import oandapyV20.endpoints.instruments as instruments
from scipy.stats import rankdata
次に、為替の終値を取得する関数を作成します。。
def get_close_list(instrument="USD_JPY"):
"""
終値の取得
"""
api = API(
access_token="************************",
environment="live") # live, もしくは、practice
params = {
"granularity": "M5",
"count": 200,
"price": "B",
}
instruments_candles = instruments.InstrumentsCandles(
instrument=instrument, params=params)
api.request(instruments_candles)
response = instruments_candles.response
close_list = np.array([x["bid"]["c"] for x in response["candles"]])
close_list = close_list.astype(np.float64)
return close_list
access_tokenはご自身のtokenをお使いください。最初にも出しましたが、access_tokenの取得の仕方は以下の記事を参照してください。
この関数では基本的に、OANDA APIにリクエストして、終値を取得するだけです。今回はドル円の5分足のデータを取得しています。
次にRCIを計算する関数を作成します。
def compute_rci(close_list, interval=14):
"""
rciの計算
"""
rci_list = [None for _ in range(interval)]
nb_close = len(close_list)
for idx in range(nb_close):
if (idx + interval > nb_close):
break
y = close_list[idx:idx + interval]
x_rank = np.arange(len(y))
y_rank = rankdata(y, method='ordinal') - 1
sum_diff = sum((x_rank - y_rank)**2)
rci = (1 - ((6 * sum_diff) / (interval**3 - interval))) * 100
rci_list.append(rci)
return rci_list
終値のリストとRCIの期間を引数として与えてあげます。
ひたすら、区間毎に先程紹介したRCIを計算していくだけです。数式はややこしいですが、ソースコードはこんなもんで済みます。
close_list = get_close_list() # 終値の取得
nb_display = 100 # 表示する期間
# rciを計算する(期間はてきとう)
rci6 = compute_rci(close_list, interval=6)[-nb_display:] # 短期
rci9 = compute_rci(close_list, interval=9)[-nb_display:] # 中期
rci27 = compute_rci(close_list, interval=27)[-nb_display:] # 長期
# rciを表示する
fig, ax = plt.subplots()
x = np.arange(len(rci6))
ax.plot(x, rci6, label="6")
ax.plot(x, rci9, label="9")
ax.plot(x, rci27, label="27")
ax.legend()
plt.savefig("rci.png")
plt.show()
後は、ここまでで作成した関数を使ってRCIを計算してプロットします。
ここまでのコードを実行すると以下のようなRCIのグラフが出力されます。
終わりに
今回は、PythonでRCIのグラフを作成する方法を紹介しました。
talibが使えれば良かったのですが、なかったので、自分で実装してしまいました。
正直、ただ、数式をコーディングしただけなので、間違っているかも知れません。
もし、間違いを見つけたら教えていただければと思います。
では、
コメント