前回(【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レコードの中で前日のデータがわかるようになります。
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回ゴールデンクロスを迎えていたことがわかりました。