オシレーター系の代表格「ストキャスティクス」をPythonを使って書いてみた。ストキャスの使い方、計算方法のまとめ。
こんばんは、新米データサイエンティスト(@algon_fx)です。今日もしっかりジムで8km走ってきました。ただ…昨日お酒を飲んだ後、一人で博多ラーメンを食してしまった。夜中のラーメンはやばい。
さて、昨日は例の色々と過去為替レートのソースを探していたのですが、あまり良いソースが見つからなかった。やっぱり有料のデータを買ったほうが良いのか…。もしくはどうにかMT4と連携して、あっちでバックテストをやるべきか?もう少し調べて検討が必要です。
と言うことで、今日はいつものPythonでテクニカル指標シリーズとして、オシレーター系の代表格とも言える「ストキャスティクス(Stochastics)」の使い方と計算方法、さらにPythonを使ってドル円データから処理をしてみました。
ストキャスティクスの兄弟分でもあるウィリアムズ%Rは楽をしてTa-Libで処理をしましたが、今回はちゃんとスクラッチで作りました(笑)
【人気記事】
ストキャスティクスとは?
オシレーター系の代表格で、初心者から上級者まで使っている人が多いかと思います。ストキャスですが、なんと考案されたのは1950年代。もうこのテクニカル指標も年季入りすぎでしょ。
ストキャスティクスですが、現在の相場に対して一定期間の変動幅に基づいて、売られすぎているのか・買われすぎているのかを判断するための指標となっています。
またストキャスティクスとウィリアムズ%Rは兄弟分と話をしましたが、それにも理由があります。ウィリアムズ%Rは高値を基に算出しましたが、ストキャスティクスは「安値」を使います。
では、次にストキャスティクスの計算方法をみてみましょう。
ストキャスティクスの計算方法
ストキャスティクスですが、算出する値として「%K」「%D」「%SD」の3種類を算出します。計算方法は特に難しくなく、とても簡単でした。
では、まず一番主軸となる%Kを見て見ましょう。
特に難しい処理はなく、言葉で表すと下記のような処理を行います。
(今日の終値-過去n日間の最安値)/(過去n日間の最高値-過去n日間の最安値)
次にこの%Kの期間3の移動単純平均を%Dとして算出します。(参考:Pythonで単純移動平均(SMA))ちなみに、この%Dですが別の呼び名もありまして、「ファスト・ストキャスティクス」とも呼ばれます。
ファストがあるのであれば、スローがあるはずと予感したあなた!さすがです。ファスト・ストキャスティクス(%D)のさらに期間3の単純移動平均を%SD(スロー・ストキャスティクス)と呼ばれます。
まぁ思ったよりも計算方法は簡単ですね。ちなみにOANDAのウェブ版だと、スローストキャスが対応していないという。少し残念。どうやらデスクトップアプリバージョンのfxTraderでは対応している様子。
Pythonでストキャスティクスを書いてみる
本題のストキャスティクスをPythonとPandasを使って処理してみましょう。計算方法で示した通り、%K、%D、%SDの三種類を計算します。
まずはライブラリーのインポートから。
1 2 3 4 5 6 7 8 9 |
#ストキャスティクスを計算するためのライブラリー import pandas as pd import time import matplotlib.pyplot as plt import datetime %matplotlib qt |
今回使うデータセットですが、ビットコインの過去価格をスクレイピングしたものを使いましょう。ドル円の過去レートは欠損値が多いので、次の練習データを見つけるまでは封印かな。
1 2 3 4 5 6 |
# コインマーケットキャップからデータをスクレイピング bitcoin = pd.read_html("https://coinmarketcap.com/currencies/bitcoin/historical-data/?start=20180101&end="+time.strftime("%Y%m%d"))[0] bitcoin = bitcoin.assign(Date=pd.to_datetime(bitcoin['Date'])) bitcoin['Volume'] = bitcoin['Volume'].astype('int64') |
スクレイピング先のURLを見てもらえればわかりますが、時期は2018年1月1日から本日までとしました。こちらのサイトですが、非常に使えるサイトではあるんですが、残念ながら過去レートは日足のみです。これでTickがあれば、最高なのに。
では、いよいよストキャスティクスの3つの指標を計算してあげましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# ストキャスの%Kを計算 def STOK(close, low, high, n): STOK = ((close - low.rolling(window=n, center=False).min()) / ( high.rolling(window=n,center=False).max() - low.rolling(window=n,center=False).min())) * 100 return STOK # ストキャスの%Dを計算(%Kの3日SMA) def STOD(close, low, high, n): STOK = ((close - low.rolling(window=n, center=False).min()) / (high.rolling(window=n, center=False).max() - low.rolling(window=n, center=False).min())) * 100 STOD = STOK.rolling(window=3,center=False).mean() return STOD # ストキャスの%SDを計算(%Dの3日SMA) def STOSD(close, low, high, n): STOK = ((close - low.rolling(window=n, center=False).min()) / (high.rolling(window=n, center=False).max() - low.rolling(window=n, center=False).min())) * 100 STOD = STOK.rolling(window=3,center=False).mean() STOSD = STOD.rolling(window=3, center=False).mean() return STOSD |
あまりエレガントなコードではないですが、ご了承を(笑)。さてこれでストキャスの各指標を計算するファンクションが出来たので、スクレイピングしたレートを処理して、新しいデータフレームを作ってあげます。
1 2 3 4 5 6 7 8 |
# ストキャスティクスを計算 stck = pd.DataFrame() stck['date'] = bitcoin['Date'] stck['%K'] = STOK(bitcoin['Close'], bitcoin['Low'], bitcoin['High'], 14) stck['%D'] = STOD(bitcoin['Close'], bitcoin['Low'], bitcoin['High'], 14) stck['%SD'] = STOSD(bitcoin['Close'], bitcoin['Low'], bitcoin['High'], 14) |
計算式通り、%Kは14日の期間となっています。ストキャスティクスを格納した stck の14行〜20行を試しに表示させて見ましょう。
1 2 3 4 |
# ストキャスティクスが計算できているか確認 stck[14:20] |
おっけーそうですね。ではお決まりの流れになりましたが、最後にMatplotlibで終値と、ストキャスティクス(%K、%D、%SD)のチャートを描いてみます。
1 2 3 4 5 6 7 8 9 10 11 |
# ストキャスティクスをMatplotlibを使ってチャート描写 fig, (ax1, ax2) = plt.subplots(2,1, gridspec_kw = {'height_ratios':[3, 1]}) ax1.plot(bitcoin['Date'], bitcoin['Close']) ax2.plot(stck['date'], stck['%K']) ax2.plot(stck['date'], stck['%D']) ax2.plot(stck['date'], stck['%SD']) plt.legend() fig.tight_layout() plt.show() |
大丈夫そうですね!今回はTa-libを使わず、個別にやって見ました。まぁ計算自体は難しくありませんので、さほど時間はかかりませんでしたが。
まとめと次の課題
さて、今回のPythonテクニカル指標シリーズでは、オシレーター系の代表格とも言える「ストキャスティクス」の3つの指標をPythonとPandasを使って計算してみました。
使い方は、今回は省略をしましたが、基本的に動きが敏感になるファスト・ストキャスティクス(%D)よりも、スロー・ストキャスティクス(%SD)と%Kを合わせて使うことが多いようです。
以上です!勉強にお付き合い頂いてありがとうございます!コメントやTwitterで絡んでもらえると嬉しいです!
ディスカッション
コメント一覧
まだ、コメントがありません