強弱レシオ(Shinohara Intensity Ratio)

 

概要
図1 強弱レシオの表示例

日本の篠原正治氏が考案したテクニカル指標で篠原レシオとも呼ばれます。レートの値幅を「エネルギー」や「人気」とし、エネルギーから算出するAレシオと、人気から算出するBレシオを使ってレート水準を判断します。また、AレシオとBレシオを補完するものとして、前日中値を基準に当日の高値と安値から算出するCレシオが用いられる場合もあります。

当日始値を基準に上げ幅を強気エネルギー、下げ幅を弱気エネルギーとします。強気エネルギーを弱気エネルギーで割って算出したものがAレシオです。一方でBレシオは前日終値を基準にした上げ幅を強人気、下げ幅を弱人気として、強人気を弱人気で割って算出します。CレシオはAレシオ,Bレシオの補完的に位置づけですが全く独立のものでレシオと4本のベルトからなる指標です。

計算方法(日足の場合)

それではAレシオ、Bレシオ、Cレシオの順に計算方法を見ていきましょう。

まずAレシオです。強気エネルギーを当日始値と当日高値から、弱気エネルギーを当日始値と当日安値から計算します。両方のエネルギーをn区間分足し合わせたうえで強気エネルギーを弱気エネルギーで割ります。

$$ \rm{} 強気エネルギー = \sum^n_i (当日高値_i – 当日始値_i) \\ 弱気エネルギー = \sum^n_i (当日始値_i – 当日安値_i) \\ Aレシオ:A = 強気エネルギー/弱気エネルギー $$

次にBレシオです。Aレシオと同様に強人気を前日終値と当日高値から、弱人気を前日終値と当日安値から計算します。両方の人気をn区間 分足し合わせたうえで強人気を弱人気で割ります。

$$ \rm{} 強人気 = \sum^n_i (当日高値_i – 前日終値_i) \\ 弱人気 = \sum^n_i (前日終値_i – 当日安値_i) \\ Bレシオ:B = 強人気/弱人気 $$

最後にCレシオを計算します。Cレシオはプラスエネルギーを当日高値と前日中値からマイナスエネルギーを当日安値と前日中値から計算し、それぞれn区間分足し合わせます、プラスエネルギーをマイナスエネルギーで割ったものです。Aレシオ、Bレシオ、Cレシオ本体を足し合わせる期間は日足の場合は26日が良く使われるようです。

他に主ベルト2本(主ベルト1,主ベルト2)と副ベルト2本(副ベルト1、副ベルト2)からなっています。主ベルトと副ベルトはそれぞれレシオC本体とは違った期間で当日高値と当日安値を足し合わせることで計算され、Cレシオより異なった期間で先行するラインです。

$$ \rm{} 前日中値 = (前日高値+前日安値)/2 \\ プラスエネルギー = \sum^n_i (当日高値_i – 前日中値_i) \\ マイナスエネルギー = \sum^n_i (中値終値_i – 当日安値_i) \\ Cレシオ:C = プラスエネルギー/マイナスエネルギー $$ $$ \rm{} 主ベルト1(nは40日) = \sum^n_i (当日高値_i – 当日安値_i) \\ Cレシオより17日分先行 \\ 主ベルト2(nは52日) = \sum^n_i (当日高値_i – 当日安値_i) \\ Cレシオより26日分先行 \\ 副ベルト1(nは10日) = \sum^n_i (当日高値_i – 当日安値_i) \\ Cレシオより5日分先行 \\ 副ベルト2(nは20日) = \sum^n_i (当日高値_i – 当日安値_i) \\ Cレシオより5日分先行 $$
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

疑似データを読み込みます

#ファイルの読み込み
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()

強弱レシオを計算します

#A ratio
df_A = (df['High']-df['Open']).rolling(26).sum()/(df['Open']-df['Low']).rolling(26).sum() * 100
#B ratio
df_B = (df['High']-df['Close'].shift(1)).rolling(26).sum()/(df['Close'].shift(1)-df['Low']).rolling(26).sum() * 100

#C ratio
df['Medium'] = (df['High']+df['Low'])/2
df['pPower'] = df['High']-df['Medium'].shift(1)
df['mPower'] = df['Medium'].shift(1)-df['Low']
df_C = df['pPower'].rolling(26).sum()/df['mPower'].rolling(26).sum() * 100

#band用の計算
df_main1 = df['pPower'].rolling(40).sum()/df['mPower'].rolling(40).sum() * 100
df_main2 = df['pPower'].rolling(52).sum()/df['mPower'].rolling(52).sum() * 100
df_sub1 = df['pPower'].rolling(10).sum()/df['mPower'].rolling(10).sum() * 100
df_sub2 = df['pPower'].rolling(20).sum()/df['mPower'].rolling(20).sum() * 100

#band
df_mainbelt1 = df_main1.shift(17)
df_mainbelt2 = df_main2.shift(26)
df_subbelt1 = df_sub1.shift(5)
df_subbelt2 = df_sub2.shift(5)

matplotを使用した描画例です

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, ax3) = plt.subplots(3, 1, gridspec_kw={'height_ratios': [10, 6, 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_A.values[n_data:], color='red', ls='-', label='A ratio')
ax2.plot(range(len(data)), df_B.values[n_data:], color='blue', ls='-', label='B ratio')
ax3.patch.set_facecolor(canvas_color)
ax3.plot(range(len(data)), df_C.values[n_data:], color='black', ls='-', label='C ratio')
ax3.plot(range(len(data)), df_mainbelt1.values[n_data:], color='darkorange', ls='-', label='main belt1', alpha=0.4)
ax3.plot(range(len(data)), df_mainbelt2.values[n_data:], color='red', ls='-', label='main belt2', alpha=0.4)
ax3.plot(range(len(data)), df_subbelt1.values[n_data:], color='darkblue', ls='-', label='sub belt1', alpha=0.4)
ax3.plot(range(len(data)), df_subbelt2.values[n_data:], color='blue', ls='-', label='sub belt2', alpha=0.4)
ax1.grid()
ax2.grid()
ax3.grid()

#ロゴ読み込み
logoURL = "https://neulab.co.jp/wp-content/uploads/logo.png" #logoファイルの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, 9950), 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)
l1,l2 = ax3.get_legend_handles_labels()
ax3.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.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,200])
ax2.tick_params(labelsize=22, labelcolor=font_color, color=line_color)
#ax2.set_yticks(np.linspace(0,100,6))

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)

ax3.yaxis.tick_right()
ax3.set_ylim([-5,605])
ax3.tick_params(labelsize=22, labelcolor=font_color, color=line_color)
#ax3.set_yticks(np.linspace(0,100,6))

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

xtick0 = 2
plt.xticks(range(xtick0,len(data),12), [x.strftime('%m/%d') for x in df_C.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='-')

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

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

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

リンク先はこちら

強弱レシオを使った予想

Aレシオは40~60%を底値圏、150%以上を高値圏とするのが一般的です。Bレシオは30~70%を底値圏、300%以上を高値圏とする見方が一般的です。AレシオとBレシオは併用して予想を行います。(図2ではAレシオの高値圏と底値圏を赤のバンドで、Bレシオの高値圏と安値圏を青のバンドで表示しています)

次にCレシオを使った予想の基本的なやり方です。

図2が強弱レシオのA、B、Cの各レシオを使った予想例となります。

図2 強弱レシオの予想例

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


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