Engineering Note

プログラミングなどの技術的なメモ

移動平均 (Pythonによるファイナンス)

moving average

本記事は、PythonのPandasを用いてファイナンスの基本的な理論などについて学んでいきます。

今回は、テクニカル分析の分野で昔から広く利用されている移動平均(Moving Average)について学んでいきます。

 

 

Pandasとは

Pandasとは、データ分析や操作をまとめたPythonのライブラリです。

特にPanel、DataFrameおよびSeriesと呼ばれるデータ構造は使いやすく、また統計量を求めるための様々なメソッドが組み込まれています。

なお、Pandasの由来はPanel Dataから来ているそうです。

以下が公式のドキュメントになります。

 

 

移動平均とは

移動平均(Moving Average)とは、ある期間におけるデータの平均を求め、時系列データを平滑化することを言います。

例えば株価の10日移動平均を求める場合、9日前までの株価をすべて足し合わせ10で割り平均値を出します。

上記は単純移動平均(Simple Moving Average)と呼ばれるもので、一般的にはこちらがよく使われています。

単純移動平均以外では、加重移動平均(Weighted Moving Average)指数移動平均(Exponential Moving Average)などもよく用いられます。

例えば前述の10日移動平均ではすべての株価に10%の平等な重みを持っています。

しかし、1日前と9日前の株価では1日前のほうが、現在の株価の状況を反映していると考えられるため、直近の株価により大きな重みを持たせ最終的には0にするのが加重移動平均になります。

指数移動平均については、加重移動平均と同じく直近のデータほどより大きな重みを持つ点は同じですが、その重みを指数関数的に減少させていくため、最終的に重みが0にならず、過去の株価すべてを含みます。

 

また、移動平均については、通常2つを使用して株価のトレンドを確認します。

主に5日と20日、10日と50日がよく使われる組み合わせのようです。

なお、今回は単純移動平均について実装していきます。

 

Python移動平均線を描いてみる

それでは、Python移動平均を求め、それをチャート化してみます。

 

import pickle
import pandas as pd
import matplotlib.pyplot as plt

def show_machart(df, ma1=5, ma2=25, start=False, end=False):
    ma_1 = pd.Series.rolling(df.close, window=ma1).mean()
    ma_2 = pd.Series.rolling(df.close, window=ma2).mean()

    xdate = [x for x in df.index]

    plt.figure(figsize=(15,5))
    plt.style.use('ggplot')

    close = df.close

    if start:
        xmin = start
    else:
        xmin = df.index[0]
    if end:
        xmax = end
    else:
        xmax = df.index[-1]

    ymin = close.loc[xmin:xmax].min() - 50
    ymax = close.loc[xmin:xmax].max() + 50

    plt.plot(xdate, close ,color="b",lw=1,linestyle="dotted",label="Close")
    plt.plot(xdate, ma_1, label="Moving Average {} days".format(ma1))
    plt.plot(xdate, ma_2, label="Moving Average {} days".format(ma2))
    plt.legend(loc='best')
    plt.ylim(ymin, ymax)
    plt.xlim(xmin, xmax)
    plt.show()

with open('n225.pkl', 'rb') as f:
    n225 = pickle.load(f)

show_machart(n225)

 

pandasで移動平均を求めるにはrollingメソッドを使うことで簡単に計算することができます。

show_machart()では、チャートを描画したら完了ですが、計算した移動平均をリターンするようにすれば、システムトレードなどにも応用することができます。

 

動作確認

それでは、上記で作成したスクリプトを実行してみます。

事前に2017年1月~2019年2月までの日経平均株価のDataFrameをpickleとして保存しておき、それをロードして使用しています。

今回は5日と25日の組み合わせで描画させています。

 

fig1. 単純移動平均線

fig1. 単純移動平均

移動平均の期間を長くとることで、移動平均線が滑らかになっているのが確認できます。

 

参考書籍

Python3ではじめるシステムトレード ──環境構築と売買戦略 (Modern alchemists series)

マーケットのテクニカル分析 ――トレード手法と売買指標の完全総合ガイド

PythonユーザのためのJupyter[実践]入門