【FX】RCIをPythonで計算してみる

どうも、たぬきねこです。

今回は前回の記事で紹介したRCIをPythonで実装してみます。

ちなみに本記事では、OANDA APIを使いますので、APIのアクセストークンを取得できるようにしてください。

RCIとは

まずは、RCIを簡単に復習しておきます。

RCIは、時間値動き相関関係を調べるための分析ツールです。

ちなみにRCIはRank Correlation Indexの略で、日本語で言うと順位相関指数と言います。

なぜ、「順位」という単語が出るかというと、時間の順位(時間が経つにつれて高くなる)、値の順位(単純に高いか低いか)との相関を求めているからです。

少し具体例を見てみます。まずは、上昇トレンドの時です。極端に直線の例ですが、値の順位と時間の順位というのは以下のようなことをいいます。

逆に下降トレンドの場合は以下のようになります。順位に負の相関がある時RCIは低くなります。

名前は複雑ですけど、調べていることは簡単ですね!

RCIの計算式

RCIは以下の式で計算します。

一見複雑そうに見えるんですけど、基本的には順位の差\(d^2\)の意味がわかれば大体わかります。この順位の差が大きくなればRCIは小さくなるし、差が小さくなればRCIは大きくなります。

RCIを実装してみる

では、RCIを実装してみましょう。
RCIのコードはGitHubにあげておきました。

では、実装していきます。

まず、必要なモジュールをインポートしておきます。(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のグラフが出力されます。

出力されるRCI

終わりに

今回は、PythonでRCIのグラフを作成する方法を紹介しました。

talibが使えれば良かったのですが、なかったので、自分で実装してしまいました。

正直、ただ、数式をコーディングしただけなので、間違っているかも知れません。

もし、間違いを見つけたら教えていただければと思います。

では、

コメント

タイトルとURLをコピーしました