Pythonで単純移動平均(Simple Moving Average、略:SMA)を算出する
単純移動平均(Simple Moving Average、略:SMA)とは
単純移動平均とは、最新の値を含めた指定期間の単純平均を時系列に算出した値です。
単純移動平均は期間における平均値のため、投資においてはその期間で取引した人の損益分岐点と考えることもできます。
単純移動平均の向きの上下は、算出期間から外れる値と最新の値の高安を表します。
すなわち、
算出期間から外れる値<最新の値 なら上向き
算出期間から外れる値>最新の値 なら下向き
ということです。
メリットとしては、次のような点があります。
多くの人が参考にする値のため、上限や下限の目処になりやすい。
デメリットとしては、次のような点があります。
過去の値も直近の値も同等に扱うため、直近の値動きの変化に対する反応が遅くなります。
算出期間が長いほど直近の値の寄与が小さくなり反応が遅くなります。
投資においては、期間が異なる複数の単純移動平均の交差はゴールデンクロスやデッドクロスと呼ばれます。
これらの交差を売買シグナルとして実用するにはデメリットを考慮する必要があります。
ソースコードと実行結果
単純移動平均を算出するための関数のソースコードです。
def calcSMA(**kwargs):
"""単純移動平均(Simple Moving Average)を算出する
Args:
data (pandas.Series): 算出する対象の値
period (int): 算出する期間
Returns:
pandas.Series: 単純移動平均
"""
DATA = kwargs['data']
period = kwargs['period']
return DATA.rolling(window=period).mean()
出力用のソースコードも記載しておきます。
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
def plotChart(**kwargs):
OHLCV = kwargs['ohlcv']
start = kwargs['start']
end = kwargs['end']
label = kwargs['label']
file = kwargs['file']
fig = plt.figure(figsize=(8, 6))
ax = fig.add_axes([0, 0, 1, 1])
ax.plot(OHLCV['Close'][start:end], color='black', marker='.')
ax.plot(calcSMA(data=OHLCV['Close'], period=5)[start:end], color='red')
ax.plot(calcSMA(data=OHLCV['Close'], period=20)[start:end], color='green')
ax.tick_params(labelright=True)
ax.grid(True)
ax.set_ylabel(label)
ax.set_xticks(OHLCV[start:end].index)
ax.set_xticklabels(ax.get_xticks(), rotation=90, horizontalalignment='center', fontsize='small')
ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d'))
fig.savefig(file, format='png', bbox_inches='tight')
次のようにplotChart関数を呼び出して実行してください。
plotChart(ohlcv=OHLCV_N225, start='20221001', end=None, label='Nikkei225', file=filename)
すると、次のようなチャート画像が出力されます。
Matplotlibでのチャート描画について、詳しくはこちらの記事をご覧ください。
ソースコードの解説
単純移動平均の算出にはrolling関数を使用します。
rolling関数の引数windowに算出期間を指定します。
rolling関数にさらにmean関数を適用して平均化します。
rolling関数は数値分析によく用いられる関数です。
meanの他に合計値ならsum・最小値ならmin・最大値ならmax・中央値ならmedian・・・など、組み合わせによって多様な分析を行うことができます。
参考
pandas.Series.rollingのリファレンス
https://pandas.pydata.org/docs/reference/api/pandas.Series.rolling.html
この記事が気に入ったらサポートをしてみませんか?