以前までの記事でyfinance matplotlibを使って株価取得、グラフに表示するコードを書いてきました
今回は株取引のポイントとなる移動平均線のゴールデンクロス、デッドクロスを取得するコードを書いていきます
前回までのコードはこちらの記事を参考にしてください
・環境
windows 11
yfinance 0.2.51
matplotlib 3.10.0
・コード
前回までの記事のコードの、グラフにプロットするコードの直前に、以下のコードを追加します
# ゴールデンクロスの判定
data["Signal"] = 0
data.loc[data["MA25"] > data["MA75"], "Signal"] = 1
data["Crossover"] = data["Signal"].diff()
# ゴールデンクロスの日付を抽出
golden_cross_dates = data[data["Crossover"] == 1].index
print("ゴールデンクロスの日付:")
print(golden_cross_dates)
# デッドクロスの日付を抽出
dead_cross_dates = data[data["Crossover"] == -1].index
print("デッドクロスの日付:")
print(dead_cross_dates)
・解説
この追加したコードによって、25日移動平均線 (MA25) が75日移動平均線 (MA75) を超えた日付を取得しています
data[“Signal”] = 0
株価データフレームにSignal という新しい列を作成し、初期値をすべて 0 に設定しま。
この列は、25日移動平均線が75日移動平均線より上にあるかどうかを判定する値になります
data.loc[data[“MA25”] > data[“MA75”], “Signal”] = 1
条件:(data[“MA25”] > data[“MA75″)を満たす行だけを指定して、列 Signal に 1 を代入します
このコードによって、25日移動平均線 (MA25) が75日移動平均線 (MA75) より大きい場合のみ、Signal = 1 となります
Signal = 0 の時は、25日移動平均線 (MA25) が75日移動平均線 (MA75) より小さい場合になります
data[“Crossover”] = data[“Signal”].diff()
.diff() は指定した行の値と、その直前の行の値を差を計算するメソッドです
新しい列 Crossover を作成して、Signal 列の差分を計算して格納します
golden_cross_dates = data[data[“Crossover”] == 1].index
data[“Crossover”] == 1の時の日付(.index)を取得して、ゴールデンクロスが起きた日付を取得しています
Crossoverが1:
0 → 1 に変化した行となり、25日移動平均線 (MA25) が75日移動平均線 (MA75) を上回った日です
Crossover = -1::
1 → 0 に変化した行となり、75日移動平均線 (MA25) が25日移動平均線 (MA75) を上回った日です
Crossover = 0:
変化のない日です
同じようにデッドクロスの日付の値も取得します
ゴールデンクロス、デッドクロスをグラフにプロットします
# グラフにゴールデンクロス、デッドクロスをプロット
plt.scatter(golden_cross_dates, data.loc[golden_cross_dates, "Close"], label="ゴールデンクロス", color="gold", marker="o", zorder=5)
plt.scatter(dead_cross_dates, data.loc[dead_cross_dates, "Close"], label="デッドクロス", color="red", marker="x", zorder=5)
plt.scatter()
plt.scatter は、散布図をプロットするための関数です
引数に指定したデータポイントをマーカー (点) でプロットします。
今回はゴールデンクロス、デッドクロスが発生した日付における株価を点で示します。
golden_cross_dates
ゴールデンクロスが発生した日付のリスト形式の値です
これを x 軸 (日付軸) にプロットします
data.loc[golden_cross_dates, “Close”]
ゴールデンクロスが発生した日付における株価 (Close 列)になります
これを y 軸 (株価軸) にプロットします
data.loc[] を使うことで、golden_cross_dates に該当する行の “Close” 列を抽出しています
label=”ゴールデンクロス”
凡例に表示するラベルとして “ゴールデンクロス” を設定します
color=”gold”
点の色を金色に設定にします
marker=”o”
マーカー (点) の形を円 (o) に設定します
zorder=5
このプロットの z-order (重なり順) を 5 に設定します
値が高いほど、折れ線などの他のプロットの上に表示されます
全体のコードは以下のようになります
import yfinance as yf
import matplotlib.pyplot as plt
from matplotlib import rcParams
from datetime import datetime, timedelta
# 銘柄コード
ticker = "6920.T"
# 昨日の日付を取得
today = datetime.now()
start_date = today - timedelta(days=3*365) # 平年換算で計算
# 日付をフォーマット
start_date = start_date.strftime('%Y-%m-%d')
# データを取得
data = yf.download(ticker, start=start_date)
# 移動平均線を計算
data['MA25'] = data['Close'].rolling(window=25).mean()
data['MA75'] = data['Close'].rolling(window=75).mean()
# ゴールデンクロス、デッドクロスの判定
data["Signal"] = 0
data.loc[data["MA25"] > data["MA75"], "Signal"] = 1
data["Crossover"] = data["Signal"].diff()
# ゴールデンクロスの日付を取得
golden_cross_dates = data[data["Crossover"] == 1].index
print("ゴールデンクロスの日付:")
print(golden_cross_dates)
# デッドクロスの日付を取得
dead_cross_dates = data[data["Crossover"] == -1].index
print("デッドクロスの日付:")
print(dead_cross_dates)
# 日本語フォントを指定
rcParams['font.family'] = 'Meiryo'
# グラフをプロット
plt.figure(figsize=(12, 6))
plt.plot(data.index, data['Close'], label="株価", color="blue")
plt.plot(data.index, data['MA25'], label="25日移動平均線", color="orange")
plt.plot(data.index, data['MA75'], label="75日移動平均線", color="green")
plt.scatter(golden_cross_dates, data.loc[golden_cross_dates, "Close"], label="ゴールデンクロス", color="gold", marker="o", zorder=5)
plt.scatter(dead_cross_dates, data.loc[dead_cross_dates, "Close"], label="デッドクロス", color="red", marker="x", zorder=5)
# グラフの詳細設定
plt.title("レーザーテックの3年間の株価と移動平均線")
plt.xlabel("日付")
plt.ylabel("株価(円)")
plt.legend()
plt.grid()
plt.tight_layout()
plt.savefig('Lasertec.png', dpi=100, bbox_inches='tight', facecolor='w'9
以下のようなグラフを作成することができました
コメント