2023年3月26日日曜日

【Python】株価データの移動平均線からゴールデンクロスの場所を探す

 前回(【Python】株価データに移動平均を付ける)、移動平均線を引いてみたところやはりゴールデンクロス以降は株価が上昇していることがわかりましたので、ゴールデンクロスが発生したタイミングをデータの中から抽出してみたいと思います。


■プログラム

import pandas as pd

df=pd.read_csv('9432.csv',encoding='shift-jis', index_col=0)

df.index=pd.to_datetime(df.index)

df['25MA']=df['Close'].rolling(25).mean()
df['75MA']=df['Close'].rolling(75).mean()

#shiftで縦方向に1つ行をずらす。
#1日前の値が欲しければ下(正方向)に1行ずらせば同じ行内で前日の値が取得できる
df['1日前_25MA']=df['25MA'].shift(1)
df['1日前_75MA']=df['75MA'].shift(1)

#関数:ゴールデンクロス判定
def goldenX(row):
    if row["1日前_75MA"] > row["1日前_25MA"] and row["25MA"] > row["75MA"] :
        row["goldenX"] = 1
    else:
        row["goldenX"] = 0

    return row

#関数「goldenX(ゴールデンクロス判定)」を各行に追加
df = df.apply(goldenX, axis=1)

#ゴールデンクロスが発生したタイミングを抽出
df2=df[df['goldenX']==1]


■解説

for文を使用してもできるのですが、データ量が多いとかなり時間がかかると思うので、なるべくfor文以外の方法でやってみました。

1.データを1日分ずらして別カラムに格納する

ゴールデンクロスは長期移動平均>短期移動平均から短期移動平均>長期移動平均となる日を指すので前日は長期移動平均(75MA)が短期移動平均(25MA)よりも高く、当日は短期移動平均(25MA)が長期移動平均(75MA)よりも高くなります。

そこで

df['25MA'].shift(1)

でデータを1段下げることで、前日のデータを当日のレコードに入れます。

#shiftで縦方向に1つ行をずらす。
#1日前の値が欲しければ下(正方向)に1行ずらせば同じ行内で前日の値が取得できる
df['1日前_25MA']=df['25MA'].shift(1)
df['1日前_75MA']=df['75MA'].shift(1)


こうすることで1レコードの中で前日のデータがわかるようになります。

shiftを使用してデータを1段ずらして格納することで1レコードの中で前日との比較ができる

2.applyで各レコードに関数の結果を追加する

1レコードの中で前日のデータがわかるようになったので、各レコードにゴールデンクロス判定を行う関数を追加します。

まず、このようなIf文で関数を作成します。

#関数:ゴールデンクロス判定
def goldenX(row):
    if row["1日前_75MA"] > row["1日前_25MA"] and row["25MA"] > row["75MA"] :
        row["goldenX"] = 1
    else:
        row["goldenX"] = 0

    return row


次にこの関数をapplyで各レコードに追加します。

#関数「goldenX(ゴールデンクロス判定)」を各行に追加
df = df.apply(goldenX, axis=1)


最後にゴールデンクロス判定が1(True)のものを抽出します。

#ゴールデンクロスが発生したタイミングを抽出
df2=df[df['goldenX']==1]


データを見てみると、2018年1月1日~2023年3月23日の間で12回ゴールデンクロスを迎えていたことがわかりました。

ゴールデンクロス時のデータ

↓よろしければクリックをお願いします!


■関連情報


0 件のコメント:

コメントを投稿