プログラムで株価のゴールデンクロスとデッドクロスを検出

日経平均の日足データからゴールデンクロスとデッドクロスを検出してみました。
プログラムは python で、pandas の DataFrame にほぼおまかせです。

検出

手順は単純で

  • ① csv の 日足データを DataFrame に読み込み
  • ② 短期と長期の移動平均を求め
  • ③ 両者がクロスするポイントを探す

だけです。

入力は csv

日足の csv ファイルはこんな感じです。

プログラム

移動平均の日数(短期と長期)を冒頭で指定します。複数のパターンを指定でき、下記の例では、5日と25日25日と75日13日と26日の 3 つを指定しました。

実行すると

カラムが追加され、ゴールデンクロスが出れば 1、デッドクロスが出れば -1、それ以外は 0 がセットされます。

チャートで確認

チャート上にプロットしてみます。

cross_5_25_a
cross_25_75_a
cross_13_26_a

ちょっと改善

上昇、下降をバタバタ繰り返す日が続くと、ゴールデンクロスとデッドクロスが短期間に連続して出てしまいます。たとえば上の図を見ると、7/25 にデッドクロス、翌営業日の 7/28 にゴールデンクロスが出ています。
プログラム上、短期と長期の移動平均を比較し、値の大小が逆転すればすぐにサインを出しているのが原因です。

cross_gd

これだと、方向が曖昧なままあわててサインを出すことになり、指標としてイマイチです。

そこで対策として、3 日分の推移を見て、多数決を取ることにします。どういうことかというと、当日をふくめて過去 3日を確認し、2 日以上の状態を優先するように変更します。

cross_mj

チャート描画も含めたコーディングはこうなります。

結果

チャートはこうなります。
7月後半の小刻みな出力は消えています。

cross_5_25_b
cross_25_75_b
cross_13_26_b

メリット、デメリット

こちらの方法だと曖昧なサインを出すことはなくなりますが、1日ないし 2日、サインが遅れます。

スポンサーリンク
その他の記事
  1. > golden = (over_s_l != over_s_l.shift(1)) & (over_s_l == True)

    これはいったい何をやっているのでしょうか?
    説明いただけないでしょうか。。。

    • とおるさん、こんにちわ。

      over_s_l は短期移動平均が長期移動平均を上回るかどうかを示します。
      over_s_l.shift(1) は前日の状態です。

      over_s_l != over_s_l.shift(1)
      前日と当日で変化があるか?

      over_s_l == True
      短期移動平均が長期移動平均を上回るか?

      つまり、前日から当日にかけて短期移動平均が長期移動平均を追い抜いたかどうかを判定しています。

  2. df[col_name] = np.append(np.array([0] * (long_day+1)), df[col_name][long_day+1:])

    この部分ですが、どういった処理を行っているのかわかりません。
    特に 
    np.array([0] * (long_day+1))
    の部分が何を表しているのか教えていただけますでしょうか?

  3. はっちゃん says:

    ここでエラーが出るんですが。。。。どこを直したらよいでしょうか?

    ValueError Traceback (most recent call last)
    in
    60
    61 for i in range(len(golden_x)):
    —> 62 plt.text(golden_x[i], golden_y[i]+500, '{0}-{1}'.format(int(golden_day[i][-5:-3]),int(golden_day[i][-2:])), ha = 'center', va = 'bottom')
    63
    64 for i in range(len(dead_x)):

    ValueError: invalid literal for int() with base 10: '0/'

コメントはお気軽に