Pythonの「Plotly」ライブラリで「ゴールデンクロス」「デッドクロス」を可視化する:「Python」×「株価データ」で学ぶデータ分析のいろは(4)(2/2 ページ)
日々変動する株価データを題材にPythonにおけるデータ分析のいろはを学んでいく本連載。第4回は株価の上昇、下落を示すゴールデンクロスとデッドクロスを描画させる方法を紹介します。
グラフ上にゴールデンクロスとデッドクロスを表示する準備
データフレームからゴールデンクロスとデッドクロスを表示するために必要な作業を割り出します。ゴールデンクロスとデッドクロスが起きるのは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日移動平均を比較したシリーズを作成しています。
シリーズ同士を比較した結果として新しいシリーズを得ることができます。
ゴールデンクロスとデッドクロスが起きた日付を検出する
前項で作成したシリーズ「cross」で、連続するTrueの最初がゴールでクロスが起きた日です。連続するFalseの最初がデッドクロスの起きた日です。
これらを踏まえて、ゴールデンクロスが起きた日、デッドクロスが起きた日を検出する処理を作成します。
cross_shift = cross.shift(1) temp_gc = (cross != cross_shift) & (cross == True) temp_dc = (cross != cross_shift) & (cross == False)
cross内で連続するTrueの最初とFalseの最初は、crossの値を1つずらしたシリーズと比較することで検出できます。値をnずらしたシリーズは、shiftメソッドの引数にnを渡すことで作成できます。2つのシリーズを比較することで、値が違った日付のcrossの値がTrueであればゴールデンクロスの発生日、Falseであればデッドクロスの発生日だと判断できます。この処理のイメージは次の通りです。
ゴールデンクロス、デッドクロスの発生日を得る処理では、処理の前半はシリーズ同士の比較、後半はシリーズの各値とTrueまたはFalseを比較しています。前項と同様にシリーズを比較することで、ゴールデンクロスが起きた日、デッドクロスが起きた日をTrueとするシリーズを作成します。
ゴールデンクロスとデッドクロスのカラムを作成する
グラフ上にゴールデンクロスとデッドクロスを表示するために、ゴールデンクロスの発生日には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()
移動平均線のデータは、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()
表示するマーカーは、plotly.graph_objsのScatterメソッドで作成します。このときに引数のmodeでマーカーであることとマーカーの属性を指定します。マーカーとして表示する際のScatterメソッドの引数は次の通りです。
名前 | 概要 |
---|---|
mode | 形状(既定はline) |
marker | マーカーの属性 |
marker.size | サイズ |
marker.color | 色 |
marker.symbol | マーカーの円(既定は円) |
Scatterメソッドの引数 |
マーカーを表示する際の属性は非常に種類が多いので公式ドキュメントも参照してみてください。サンプルでは、ゴールデンクロスを紫の○、デッドクロスを黒のXで表示しています。
サンプルを実行すると、5日移動平均線と25日移動平均線のゴールデンクロスとデッドクロスがマーカーで表示されます。
まとめ
今回はゴールデンクロスとデッドクロスを例にデータの抽出や加工と可視化を紹介しました。サンプルのようなデータフレームの全行に対する処理において、for文のブロック処理などを記述することなく、数行のコードで処理を終えることができ、Pythonの便利さを実感できたと思います。
次回は連載の最後として、これまでに算出した各オシレーターをPlotlyで1つのグラフで表示する方法と、今後の株価の動きを予想するライブラリを紹介します。
Copyright © ITmedia, Inc. All Rights Reserved.