ストキャスティクス(Stochastic Oscillator)

 

概要
図1 ストキャスティクスの描画例

1950年代にアメリカのアナリスト、ジョージ・レーン氏によって考案された指標です。RSIと同様に相場の売られ過ぎ買われ過ぎに注目したオシレーター系のテクニカル指標です。図1が表示例ですが、動きの速い(値動きに速く追従する)%Kと%D、動きの緩やかなSLOW%Dがあります。

%Kは一定期間内(n)における最高値から最安値までの範囲の中で直近の終値がどの位置にあるかを見る指標で、%Dはm区間分の%Kを計算し足し合わせて平均した値がn期間内の最高値から最安値までの範囲の中でどの位置にあるかを見る指標です。一方、SLOW%Dは%Dのk区間分のSMA(k)を計算したものです。パラメータが3つあるのでストキャスティクスはStochastic(n, m, k)のように書かれます。

標準的に使われるn、m、kの値は、9、3、3です。nの値を変えることは良く行われていますが、 mとkに関しては教科書的な値として3が使われているようです。 慣用的に良く使われるnの値は以下の通りです。

他の指標と同様に投資のスタイルに応じて期間を変えてみてください。

計算方法(日足、n=9、m=3、k=3の場合)

一般的な場合について計算法を解説します。まず%Kですが、 直近の終値とn日間の間の最安値と最高値を使って計算します。 式は

$$ \rm{} \%K=\{(直近の終値)-(過去n日間の最安値)\}/ \\ \{(過去n日間の最高値)-(過去n日間の最安値)\} \times 100 (\%) $$

となります。

次に%Dは過去m日間の%Kを使って以下のように書くことが出来ます。

$$ \rm{} \%D=(過去m日間の\%Kの合計)/m (\%) $$

最後にSLOW%Dです。%DのSMAをk日の期間で計算します。

$$ \rm{} SLOW\%D=SMA(\%D, k) (\%) $$

以上となりますが、一般式では分かりにくいので直近の終値を15日目の終値、n=9、m=3、k=3とした場合を具体的に考えてみましょう。

まずは%Kですが、15日目の終値と7日目から15日目までの9日間の中での最高値と最安値から計算します。

$$ \rm{} \%K=\{(15日目の終値)-(7日目~15日目の間の最安値)\}/ \\ \{(7日目~15日目の間の最高値)-(7日目~15日目の間の最安値)\} \times 100 (\%) \\ $$

次に%Dですが、3日分の和を取るので、起点となる直近終値の日を一日ずつずらし15日目、14日目、13日目を考えて%Kと同様に起点から9日間の最高値と最安値を使って計算します。図2が%Kと%Dの表示例です。

$$ \rm{} \%K1=\{(15日目の終値)-(7日目~15日目の間の最安値)\} / \\ \{(7日目~15日目の間の最高値)-(7日目~15日目の間の最安値)\} \\ \%K2=\{(14日目の終値)-(6日目~14日目の間の最安値)\} / \\ \{(6日目~14日目の間の最高値)-(6日目~14日目の間の最安値)\} \\ \%K3=\{(13日目の終値)-(5日目~13日目の間の最安値)\} / \\ \{(5日目~13日目の間の最高値)-(5日目~13日目の間の最安値)\} \\ \\ \%D=(\%K1+\%K2+\%K3) / 3=SMA(\%K, 3) (\%) \\ $$

最後のSLOW%Dは計算区間の3をkに代入するだけです。

$$ \rm{} SLOW\%D=SMA(\%D, 3) (\%) $$
図2 ストキャスティクス(SLOW%Dなし)
Pythonによる実装

必要なライブラリを読み込みます

!pip install mpl_finance #Collaboratoryに入っていないライブラリを読み込みます
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
import mpl_finance
import sys
import numpy as np
from datetime import datetime
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
import requests
import io

データをcsvファイルから読み込みます

#ファイルの読み込み
URL = "https://neulab.co.jp/wp-content/uploads/pseudo_data.csv" #csvファイルのURL

datafile = requests.get(URL)#ファイルの読み込み

#データフレームの作成
df_temp = pd.read_csv(io.BytesIO(datafile.content), header=0, index_col=0, parse_dates=True, encoding="UTF-8")

df = df_temp.loc[:,['Open','High','Low','Close']]
df.head()

ストキャスティクスを計算します

df_close_rate = df['Close']
df_lowest_rate = df['Low'].rolling(9).min()
df_highest_rate = df['High'].rolling(9).max()

df_chart_K = (df_close_rate - df_lowest_rate)/(df_highest_rate - df_lowest_rate)*100
df_chart_D = df_chart_K.rolling(3).mean()
df_chart_SlowD = df_chart_D.rolling(3).mean()

チャートへの描画と保存例です

canvas_color = '#fffafa'
line_color = '#c8ced1'
font_color = '#171510'
colorup = '#bf0000'
colordown = '#006fbf'

n_data = -100
data = df[n_data:]
ohlc = np.vstack((range(len(data)), data.T)).T

fig, (ax1, ax2) = plt.subplots(2, 1, gridspec_kw={'height_ratios': [10, 6]}, sharex=True, figsize=(12,9))
fig.patch.set_facecolor(canvas_color)
ax1.patch.set_facecolor(canvas_color)
mpl_finance.candlestick_ohlc(ax1, ohlc, width=0.5, alpha=1, colorup=colorup, colordown=colordown)
ax2.patch.set_facecolor(canvas_color)
ax2.plot(range(len(data)), df_chart_D.values[n_data:], color='red', ls='-', label='%D')
ax2.plot(range(len(data)), df_chart_K.values[n_data:], color='blue', ls='-', label='%K')
ax2.plot(range(len(data)), df_chart_SlowD.values[n_data:], color='black', ls='-', label='SLOW%D')
ax1.grid()
ax2.grid()

#ロゴ読み込み
logoURL = "https://neulab.co.jp/wp-content/uploads/logo.png" #ロゴファイルのURL
img_c = plt.imread(logoURL)
imagebox = OffsetImage(img_c, zoom=0.020) #画像をimageboxにいれる。
imagebox.image.axes = ax1
im_sabo = AnnotationBbox(imagebox, (0, 9850), xybox=(0, 9900), xycoords="data", boxcoords="data", pad=0.3, frameon=False)

l1,l2 = ax2.get_legend_handles_labels()
ax2.legend(l1,l2, fontsize=14, edgecolor='none', facecolor=canvas_color)

ax1.add_artist(im_sabo)
ax1.set_ylabel("Price of Something", fontsize=22)
ax1.set_ylim(9000., 10000.)
ax1.set_xlim(-5., 105.)
ax1.yaxis.tick_right()
ax1.yaxis.set_label_coords(0, 0.5)
ax1.tick_params(labelsize=24, labelcolor=font_color, color=line_color)

ax1.spines['left'].set_linewidth(0)
ax1.spines['right'].set_linewidth(0)
ax1.spines['top'].set_linewidth(0)
ax1.spines['bottom'].set_linewidth(0)

ax2.yaxis.tick_right()
ax2.set_ylim([-0,100])
ax2.tick_params(labelsize=22, labelcolor=font_color, color=line_color)

ax2.spines['left'].set_color(line_color)
ax2.spines['right'].set_color(line_color)
ax2.spines['top'].set_color(line_color)
ax2.spines['bottom'].set_color(line_color)

xtick0 = 2
plt.xticks(range(xtick0,len(data),12), [x.strftime('%m/%d') for x in df_chart_K.index][xtick0::12])

plt.subplots_adjust(left=0.05, right=0.89, bottom=0.1, top=0.99)
plt.grid(which='major',color=line_color,linestyle='-')
plt.grid(which='minor',color=line_color,linestyle='-')

ax2.grid(linestyle='--', lw=1)
ax1.set_axisbelow(True)

#上下のバンド描画
bandx = [-5,-5,105,105]
banddown = [20,0,0,20]
bandup = [80,100,100,80]
ax2.fill(bandx,bandup,color="b",alpha=0.1)
ax2.fill(bandx,banddown,color="b",alpha=0.1)

fig.savefig('Stochastics.png', facecolor=fig.get_facecolor(), edgecolor='none')

以上のコードをGoogle社の提供しているColaboratory上で公開しており、実際に動作させることができます。

リンクはこちら

予想

ストキャスティクスの売買のサインは以下の通りです。

以上が基本的な使い方ですが、3本目としてSLOW%Dを使う方法もあります。SLOW%Dを使う場合は、%Dが買われ過ぎや売られ過ぎの領域にあることを前提として使用します。

図3 ストキャスティクスを使った予想
注意点

ストキャスティクスはRSIと比べて上下の動きが激しいという違いがありますが、RSIと同様に単調な上昇相場や下落相場では0%付近や100%付近に張り付いてしまう現象が見られます。この場合、指標としての信頼度が低下するので、他の指標を使って補う必要があります。


※このHPページで紹介しているテクニカル指標を使った取引ルールや売買シグナルの見方は一般的な考え方に基づくものであり、利益の増加や損失の減少を保証するものではありません。ご自身の判断にてお取引いただきますようお願いいたします。


現在、ニューラボでは人工知能による取引アルゴリズムを開発中です。11月にリリース予定。乞うご期待!
自動取引にご興味を持たれましたら お問い合わせページよりお気軽にお問合せください。