単純移動平均(Simple Moving Average)

    

概要
図1 単純移動平均線(SMA)

単純移動平均線(SMA)は相場のトレンドをつかむ方法として長年使われている最も知名度の高いテクニカル指標の一つです。多くの投資家が利用しているだけでなく、他のテクニカル指標による分析・計算のベースとなっているので、移動平均線を正しく理解することは相場分析を行う上で必須です。

移動平均とは時系列データを平滑化するための統計的な手法です。一定期間をデータ区間として設定し、その区間に含まれる数値から平均値を計算します。全データで平均を取るのではなく、平均を取るデータ区間の幅が指定されていることにより、平均を取る区間の移動に伴って計算された平均値も移動するため移動平均と呼びます。

データ区間を移動させながら計算された移動平均をつなぎ合わせたものが移動平均線です。 データ区間が短い移動平均線は実際の値動きに近づき、データを 使用する区間が長いほど元のデータに比べて細かい変動がなくなった滑らかな曲線が得られます 。

平均の定義にも様々なものがありますが(例えば相加平均、相乗平均や重み付き平均など)、区間内のデータを足し合わせ、データの数で割るだけという最も単純な方法で移動平均をとったものをSimple Moving Average (SMA) と呼びます。

図1ではデータ区間の異なる3本のSMAを書いています。データ区間が短いSMA(5)は、平均線の上下どちら側にレートがあるかを見ることで、今の時点で買いが優勢なのか売りが優勢なのかを知ることが出来ます。一方、データ区間の長いSMA(75)は小さな価格変動の影響を受けずにゆっくりと値動きの傾向を追いかけて行くので、相場のトレンドを知ることが出来ます。相場が長期の上昇トレンドだったとしても短期間には下落する期間が必ずあり、売買判断を行う必要があります。区間(期間)の長いSMAが上昇トレンドを示していれば、現在のデータや短い区間(期間)のSMAで価格が多少上下しても慌てずに売買の判断をすることが出来るようになります。

n区間に対するSMAの計算方法(5日分のデータからSMAを計算する場合)

5日間の終値(価格)のデータを使ってSMA(5)を計算してみます。例を見てください。計算するために1日目から5日目までの終値を足して行きます。 (4日目以前はデータが5日分ないので計算しません)

$$ \rm{} SMA(5) =\frac{1}{5}(1日目の終値+2日目の終値+3日目の終値 \\ +4日目の終値+5日目の終値) \\ $$

例を使って実際に計算してみます。

5日間の終値を足し合わせた後、5で割ることで平均値を出します。この操作を10日目まで繰り返して計算すると、10日分のデータに対するSMA(5)を書くことが出来ます。

日数     終値   計算                移動平均
1日目1.00
2日目5.00
3日目9.00
4日目3.00
5日目7.00(1.00+5.00+9.00+3.00+7.00)/55.00
6日目10.00(5.00+9.00+3.00+7.00+10.00)/56.80
7日目2.00(9.00+3.00+7.00+10.00+2.00)/56.20
8日目8.00(3.00+7.00+10.00+2.00+8.00)/56.00
9日目4.00(7.00+10.00+2.00+8.00+4.00)/56.20
10日目(最新)6.00  (10.00+2.00+8.00+4.00+6.00)/5   6.00

5日間のデータからSMA(5)を計算する場合を使って式は以下のように書くことが出来ます。i日目の終値をViとして一般化してみましょう。

$$ \rm{} \begin{eqnarray} \rm{} SMA(5) &=& \rm{\frac{1}{5}(1日目の終値(V_1)+2日目の終値(V_2)+3日目の終値(V_3)} \\ &+& \rm{4日目の終値(V_4)+5日目の終値(V_5))} \\ &=& \rm{\frac{(\sum_i^5 V_i )}{5}} \\ \end{eqnarray} \\ V_i:i番目の終値 $$

5日間以外の任意の区間nの価格に対しては次のように書くことが出来ます。

$$ \rm{} SMA(n) =\frac{(\sum_i^n V_i )}{n} \\ V_i:i番目の価格 $$

区間nの選び方は使い方や取引スタイルなどで変化します。よく使われているnを紹介します。

    5、6、10、13、20、25、26、75など

    13、26、52など

    3、6、12、24など

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()

SMAを計算します

df_sma_5  = df['Close'].rolling(5).mean()
df_sma_25 = df['Close'].rolling(25).mean()
df_sma_75 = df['Close'].rolling(75).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 = 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_5.values[n_data:] , color='darkorange', ls='-', label='SMA(5)')
ax.plot(range(len(data)), df_sma_25.values[n_data:] , color='darkgreen', ls='-', label='SMA(25)')
ax.plot(range(len(data)), df_sma_75.values[n_data:] , color='magenta', ls='-', label='SMA(75)')
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, 9950), 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_5.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('Sma.png')

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

リンクはこちら。

SMAのシグナルを使って売買を予想する

SMAで最も簡単な予想方法は、SMAが上向きの時は上昇局面、下向きの時は下落局面、横ばいなら方向感のない相場と考えるというものです。SMAの傾き、現在値からの位置関係を売買シグナルに結び付けたものとしてグランビルの法則があります。図2ではSMA(5)を例に買いシグナルについて説明しています。

グランビルの法則
図2 グランビルの法則 SMA(5)を使った買いシグナルの例
複数のSMAのシグナルを使って売買を予想する

1本だけではなく複数のSMAを組み合わせると、SMAの間の位置関係からも売買のシグナルを判断することが出来ます。図1では日足短期(5日)、中期(25日)、長期(75日)などの組み合わせが使用されていますが、短期のSMAとより長期のSMAとの位置関係から次のような売買のシグナルを読み取れるとされています。

ゴールデンクロス

図3のように短期のSMAがより長期のSMAを下から上抜きした場合で、売りトレンドから買いトレンドへ転換の兆しと捉えて買いを入れるシグナルと考えることが出来ます。

図3 ゴールデンクロス
デッドクロス

図4のように短期のSMAがより長期のSMAを上から下抜きした場合で、買いトレンドから売りトレンドへ転換の兆しと捉えて売りを入れるシグナルと考えることが出来ます。

図4 デッドクロス
実際の使用例

日足チャートで短期のSMA(5)と中期のSMA(25)の2本を使って、売買のシグナルとトレンド予想を当てはめてみたものが図5となります。

図5 SMA(5)とSMA(25)を使った例
注意点

SMAを使った指標の持つ共通の特徴として、過去のデータから移動平均の計算を行っているため、リアルタイム(現在)の値が指標へ反映されるのが遅いという欠点があり、急な相場の値動きには対応できません。 現在の値への比重を高めることで、 この点を若干改善した指標として指数平滑化移動平均(EMA)があります。


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


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