Engineering Note

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

ゴールデンクロスとデッドクロス (Pythonによるファイナンス)

moving average

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

今回は、前回学んだ移動平均を利用したトレンドの見方としてゴールデンクロス(Golden Cross)とデッドクロス(Dead Cross)について学んでいきます。

 

 

Pandasとは

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

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

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

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

 

 

ゴールデンクロスとは

前回では移動平均について学びました。

 

 

移動平均では通常、短期と長期の2つを使用してトレンドの発生などを確認します。

特に短期の移動平均線が長期の移動平均線を下から上に突き抜けることをゴールデンクロス(Golden Cross)と言います。

これにより、トレンドが上昇に転じたかどうかを判断します。

 

デッドクロスとは

上記のゴールデンクロスとは反対に、短期の移動平均線が長期の移動平均線を上から下に突き抜けることをデッドクロス(Dead Cross)と言います。

これにより、トレンドが下降に転じたかどうかを判断します。

 

Pythonゴールデンクロスデッドクロスを描いてみる

それでは、Pythonゴールデンクロスデッドクロスをチャートに描いてみます。

前回使用した移動平均スクリプトに追記しています。

 

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

def show_golden_and_dead_cross(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

    diff = ma_1 - ma_2
    golden = ma_1[(diff.shift(1) < 0) & (diff > 0)]
    dead = ma_1[(diff.shift(1) > 0) & (diff < 0)]

    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.scatter(golden.index, golden, label="Golden Cross", s=100, c="red", alpha=0.7)
    plt.scatter(dead.index, dead, label="Dead Cross", s=100, c="black", alpha=0.7)
    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_golden_and_dead_cross(n225)

 

動作確認

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

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

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

fig1. ゴールデンクロスとデッドクロス

fig1. ゴールデンクロスデッドクロス

上記の赤丸部分がゴールデンクロスで、黒丸部分がデッドクロスになります。

トレンドの転換点が分かりやすく描画されている一方、だましも見受けられるので、決して絶対的なものではありません。

 

参考書籍

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

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

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