Pythonの「Plotly」ライブラリで「ゴールデンクロス」「デッドクロス」を可視化する「Python」×「株価データ」で学ぶデータ分析のいろは(4)(2/2 ページ)

» 2021年10月19日 05時00分 公開
前のページへ 1|2       

グラフ上にゴールデンクロスとデッドクロスを表示する準備

 データフレームからゴールデンクロスとデッドクロスを表示するために必要な作業を割り出します。ゴールデンクロスとデッドクロスが起きるのは1日なので、グラフ上には点として表示します。ゴールデンクロスの発生日には5日移動平均の値、デッドクロスの発生日に25日移動平均の値をデータとして持つ必要があります。この処理は次の3つに分けて考えることができます。

  • 5日移動平均と25日移動平均の値を比較
  • 比較した結果が入れ替わった日がゴールデンクロスまたはデッドクロスの発生日
  • ゴールデンクロスの発生日に5日移動平均の値、デッドクロスの発生日に25日移動平均の値を保存

 最後の手順で保存した値をグラフ上に点で表示します。上記の3つのステップに分けて、処理を行います。

5日移動平均と25日移動平均を比較する

 最初に5日移動平均と25日移動平均を比較して、5日移動平均>25日移動平均ならTrue、5日移動平均<25日移動平均ならFalseというシリーズを作成します。

import numpy as np
ma5, ma25 = df['ma5'], df['ma25']
cross  = ma5 > ma25
5日移動平均と25日移動平均を比較(Ch4.ipynb抜粋)

 サンプルの処理では、次の図のように5日移動平均と25日移動平均を比較したシリーズを作成しています。

5日移動平均と25日移動平均を比較したシリーズ 5日移動平均と25日移動平均を比較したシリーズ

 シリーズ同士を比較した結果として新しいシリーズを得ることができます。

ゴールデンクロスとデッドクロスが起きた日付を検出する

 前項で作成したシリーズ「cross」で、連続するTrueの最初がゴールでクロスが起きた日です。連続するFalseの最初がデッドクロスの起きた日です。

ゴールデンクロス、デッドクロスの発生日 ゴールデンクロス、デッドクロスの発生日

 これらを踏まえて、ゴールデンクロスが起きた日、デッドクロスが起きた日を検出する処理を作成します。

cross_shift = cross.shift(1)
temp_gc = (cross != cross_shift) & (cross == True)
temp_dc  = (cross != cross_shift) & (cross == False)
ゴールデンクロス、デッドクロスの発生日を検出(Ch4.ipynb抜粋)

 cross内で連続するTrueの最初とFalseの最初は、crossの値を1つずらしたシリーズと比較することで検出できます。値をnずらしたシリーズは、shiftメソッドの引数にnを渡すことで作成できます。2つのシリーズを比較することで、値が違った日付のcrossの値がTrueであればゴールデンクロスの発生日、Falseであればデッドクロスの発生日だと判断できます。この処理のイメージは次の通りです。

ゴールデンクロス、デッドクロスの発生日を検出してシリーズを作成 ゴールデンクロス、デッドクロスの発生日を検出してシリーズを作成

 ゴールデンクロス、デッドクロスの発生日を得る処理では、処理の前半はシリーズ同士の比較、後半はシリーズの各値とTrueまたはFalseを比較しています。前項と同様にシリーズを比較することで、ゴールデンクロスが起きた日、デッドクロスが起きた日をTrueとするシリーズを作成します。

ゴールデンクロスとデッドクロスのカラムを作成する

 グラフ上にゴールデンクロスとデッドクロスを表示するために、ゴールデンクロスの発生日には5日移動平均の値、デッドクロスの発生日には25日移動平均線の値を持つカラムを作成します。ここで行う処理のイメージは次の図の通りです。

ゴールデンクロス発生日と5日移動平均の値、デッドクロス発生日と25日移動平均の値を取得 ゴールデンクロス発生日と5日移動平均の値、デッドクロス発生日と25日移動平均の値を取得
ゴールデンクロスとデッドクロスのカラムを作成(Ch4.ipynb抜粋)
gc = [m if g == True else np.nan for g, m in zip(temp_gc, ma5)]
dc = [m if d == True else np.nan for d, m in zip(temp_dc, ma25)]
df["gc"], df["dc"] = gc, dc

 前項で作成したゴールデンクロスの発生日のシリーズtemp_gcと5日移動平均のシリーズma5をzip関数でひとまとめにしてfor-in文でそれぞれの値を取り出します。temp_gcの値がTrueであればゴールデンクロスの発生日なので、ma5の値を返します。そうでない場合は、空の値であるnumpyライブラリのnanを返します。このようにしてゴールデンクロスの発生日には5日移動平均の値を持つリストを作成します。デッドロスも同様の処理でリストを作成します。

 作成した2つのリストはそれぞれgc、dcのカラム名でデータフレームに格納します。

この処理で、ゴールデンクロスの発生日には5日移動平均の値、デッドクロスの発生日には25日移動平均線の値を持つカラムをデータフレームに作成できました。

ゴールデンクロスとデッドクロスをチャートに表示する

 前節まででゴールデンクロスとデッドクロスのカラムを作成できました。移動平均線、ゴールデンクロス、デッドクロスをまとめてチャートに表示してみます。

移動平均線を表示する

 Plotlyで作成したローソク足チャートに5日移動平均線、25日移動平均線を描画させてみます。グラフに表示するデータの配列に、5日移動平均線と25日移動平均線のデータを追加することで各移動平均線を表示できます。

data =  [
    go.Candlestick(x = pdf.index, open=pdf['Open'], high=pdf['High'], low=pdf['Low'], close=pdf['Close'], 
                   name=''", increasing_line_color= '#00ada9', decreasing_line_color= '#a0a0a0'), 
    go.Scatter(x=pdf.index, y=pdf["ma5"], name= 'MA5',line=dict(color="#ff007f" ,width=1.2)),
    go.Scatter(x=pdf.index, y=pdf["ma25"], name= 'MA25',line=dict(color='#7fbfff' ,width=1.2))
]
fig = go.Figure(data = data, layout = go.Layout(layout))
fig.show()
移動平均線の表示(Ch4.ipynb抜粋)

 移動平均線のデータは、plotly.graph_objsのScatterメソッドで作成します。Scatterメソッドの引数は次の通りです。

名前 概要
x インデックス
y Y軸に表示するカラム
name 線の名前
line 線の属性のハッシュ
line.color
line.width 線の太さ
Scatterメソッドの引数

 サンプルでは、5日移動平均線を赤、25日移動平均線を青で表示しています。

ローソク足と移動平均線の表示 ローソク足と移動平均線の表示

 表示する対象が複数になると、右側に概要が表示されます。ここにname属性で指定した名前が表示されていることを確認してください。

ゴールデンクロス、デッドクロスを表示する

 移動平均線に加えて、ゴールデンクロスとデッドクロスを表示してみます。前回と同様に表示するデータの配列にゴールデンクロスとデッドクロスのデータを追加します。線ではなく、グラフ上のマーカーとして表示します。

data =  [
    go.Candlestick(name="chart", x = pdf.index, open=df['Open'], high=df['High'], low=df['Low'], close=df['Close'], 
                   name='', increasing_line_color= '#00ada9', decreasing_line_color= '#a0a0a0'), 
    go.Scatter(x=pdf.index, y=df["ma5"], name= 'MA5',line=dict(color="#ff007f" ,width=1.2)),
    go.Scatter(x=pdf.index, y=df["ma25"], name= 'MA25',line=dict(color='#7fbfff' ,width=1.2)),
    go.Scatter(x=pdf.index, y=df["gc"], name="Golden Cross", mode='markers', marker=dict(size = 12, color='blueviolet')),
    go.Scatter(x=pdf.index, y=df["dc"], name="Dead Cross", mode='markers', marker=dict(size = 12, color='black', symbol = 'x'))   
]
fig = go.Figure(data = data, layout = go.Layout(layout))
fig.show()
移動平均線の表示(Ch4.ipynb抜粋)

 表示するマーカーは、plotly.graph_objsのScatterメソッドで作成します。このときに引数のmodeでマーカーであることとマーカーの属性を指定します。マーカーとして表示する際のScatterメソッドの引数は次の通りです。

名前 概要
mode 形状(既定はline)
marker マーカーの属性
marker.size サイズ
marker.color
marker.symbol マーカーの円(既定は円)
Scatterメソッドの引数

 マーカーを表示する際の属性は非常に種類が多いので公式ドキュメントも参照してみてください。サンプルでは、ゴールデンクロスを紫の○、デッドクロスを黒のXで表示しています。

ゴールデンクロスとデッドクロスの表示 ゴールデンクロスとデッドクロスの表示

 サンプルを実行すると、5日移動平均線と25日移動平均線のゴールデンクロスとデッドクロスがマーカーで表示されます。

まとめ

 今回はゴールデンクロスとデッドクロスを例にデータの抽出や加工と可視化を紹介しました。サンプルのようなデータフレームの全行に対する処理において、for文のブロック処理などを記述することなく、数行のコードで処理を終えることができ、Pythonの便利さを実感できたと思います。

 次回は連載の最後として、これまでに算出した各オシレーターをPlotlyで1つのグラフで表示する方法と、今後の株価の動きを予想するライブラリを紹介します。

前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

4AI by @IT - AIを作り、動かし、守り、生かす
Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。