エンベロープ(Envelope)

 

概要
図1 エンベロープの表示例

移動平均線から乖離する割合をバンドで示したトレンド系のテクニカル指標です。レートは移動平均線を中心に推移し、中央の移動平均線から一定の割合で乖離するような価格を付けても反転するという考えの元でトレンド転換が起きる目安として使用します。

中央値にはSMAを使用します。SMAの上下両側に一定の乖離率の上限値を定義すると図1のようにバンドが定まります。これをエンベロープ(封筒)とよびます。このエンベロープの中をレートが動くと考えます。このエンベロープから外に飛び出した時は異常な値と考え、いずれ元のエンベロープ内に戻ってくると考えます。つまり、値上がりによりエンベロープから上へ外れたら次は下げ、値下がりして下へ外れたら次は上げと予想します。エンベロープの幅は適用するレートに合わせて、そのレートの標準的な変動幅から決めることになります (乖離率の設定の目安は2~3%と言われています。 ) 。移動平均線から乖離率というと同様のテクニカル指標にボリンジャーバンドがありますが、ボリンジャーバンドは標準偏差を使ってバンドを決めており、価格変動に従ってバンド幅が変動しますが、エンベロープには変動がなく中央のSMAに平行する線を上下に引いたものになります。

計算方法(日足の場合)

中心線をSMAとしたうえで乖離率と乖離率の上限を2%(例)とした上下のバンドを定義します。

$$ \rm{} 乖離率=\{現在のレート-SMA(n)\}/SMA(n) \times 100 (\%) \\ 上バンド=(1+0.02) \times SMA(n) \\ 下バンド=(1-0.02) \times SMA(n) $$

中心線の両側にこれら乖離率のバンドを書いたものがエンベロープとなります。下は乖離率の計算例を表としたものです。分かりやすい例とするため大きな乖離率となっています。

日数価格  SMA(5)  乖離率(%)  
1日目1.001.000.0
2日目5.003.0066.7
3日目9.005.0075.0
4日目3.004.50-33.0
5日目7.005.0040.0
6日目10.006.8047.1
7日目2.006.2070.0
8日目8.006.0033.0
9日目4.006.2035.5
10日目(最新)6.00  6.000.0

以下がnとして慣用的に使われる値の例です。

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_sma = df['Close'].rolling(20).mean()
ratio = 0.02 #乖離率

df_band_up = df_sma * (1 + ratio)
df_band_down = df_sma * (1 - ratio)

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 = plt.figure(figsize=(12, 8))
fig.patch.set_facecolor(canvas_color)

ax = fig.add_subplot(1, 1, 1)
ax.patch.set_facecolor(canvas_color)
mpl_finance.candlestick_ohlc(ax, ohlc, width=0.5, alpha=1, colorup=colorup, colordown=colordown)
ax.plot(range(len(data)), df_sma.values[n_data:], color='black', ls='-', label='SMA(20)')
ax.plot(range(len(data)), df_band_up.values[n_data:], color='darkorange', ls='-', label='band($\pm2\%$)')
ax.plot(range(len(data)), df_band_down.values[n_data:], color='darkorange', ls='-')
ax.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 = ax
im_sabo = AnnotationBbox(imagebox, (0, 9850), xybox=(0, 10000), xycoords="data", boxcoords="data", pad=0.3, frameon=False)

l1,l2 = ax.get_legend_handles_labels()
ax.legend(l1,l2, loc='upper right', fontsize=14, edgecolor='none', facecolor=canvas_color)

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

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

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

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

ax.set_axisbelow(True)

plt.savefig('Envelope.png')

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

リンクはこちら

エンベロープの基本的な使い方

値上がりによりエンベロープの上側乖離率のラインからローソク足が飛び出せば、次は下げに転じると考え、値下がりでローソク足がエンベロープ下側乖離率のラインを割り込めば次は上げに転じると考えて、逆張りによるエントリーを行うことになります。 つまり、図2のようにエントリーポイントを決定することが出来ます。

図2 エンベロープによる予想
注意点

相場にトレンドがある場合、エンベロープの上下の乖離率のラインに接近しても、上昇なら上側ラインに、下落なら下側ラインにローソク足がラインを越えずに張り付いてしまう場合があります。この場合、有効な予想をすることは出来ません。乖離率の設定を変えるか別な指標を使うことを考える必要があります。


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


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