見出し画像

簡単シストレ自作#3:Pythonでゴールデンクロスを使ったエントリーロジックを作成

システムトレードでは、エントリータイミングを見極めるための「シグナル」が非常に重要です。
今回の記事では、移動平均線を用いてゴールデンクロスを判定し、売買シグナルを生成する「generate_signal」関数を詳しく解説していきます。

本記事は以前の記事の続きになりますので、以下記事から読んでもらった方が良いです。


1. 関数の目的

generate_signal関数は、以下の役割を持っています。

  • 株価データを基に売買シグナルを生成

  • ゴールデンクロス(短期移動平均線が中期移動平均線を上抜けするポイント)を検出

これにより、適切なエントリーポイントを特定し、シミュレータに売買の指示を送ることが可能になります。


2. コードの全体像

以下はgenerate_signal関数のコードです。

def generate_signal(price_data):
    signal_triggered = False

    # データが十分でない場合はシグナルを生成しない
    if len(price_data) <= MEDIUM_TERM_MA_WINDOW: 
        return signal_triggered

    close_prices = price_data[:, CLOSE]  # 終値だけを抽出

    # 移動平均線を計算
    short_term_ma = np.convolve(close_prices, np.ones(SHORT_TERM_MA_WINDOW) / SHORT_TERM_MA_WINDOW, mode='valid')[-1]
    medium_term_ma = np.convolve(close_prices, np.ones(MEDIUM_TERM_MA_WINDOW) / MEDIUM_TERM_MA_WINDOW, mode='valid')[-1]
    short_term_ma_prev = np.convolve(close_prices[:-1], np.ones(SHORT_TERM_MA_WINDOW) / SHORT_TERM_MA_WINDOW, mode='valid')[-1]
    medium_term_ma_prev = np.convolve(close_prices[:-1], np.ones(MEDIUM_TERM_MA_WINDOW) / MEDIUM_TERM_MA_WINDOW, mode='valid')[-1]

    # ゴールデンクロス判定
    if medium_term_ma_prev > short_term_ma_prev and medium_term_ma <= short_term_ma:
        signal_triggered = True

    return signal_triggered

3. 各部分の解説

3.1 データのチェック

if len(price_data) <= MEDIUM_TERM_MA_WINDOW: 
    return signal_triggered

price_dataのデータ量が中期移動平均線の計算に必要な最小値(MEDIUM_TERM_MA_WINDOW)以下の場合、十分なデータがないと判断してシグナルを生成せずに終了します。

3.2 終値の抽出

close_prices = price_data[:, CLOSE]  # 終値だけを抽出

株価データから終値のみを抽出します。この終値データを基に移動平均線を計算します。

3.3 移動平均線の計算

short_term_ma = np.convolve(close_prices, np.ones(SHORT_TERM_MA_WINDOW) / SHORT_TERM_MA_WINDOW, mode='valid')[-1]
medium_term_ma = np.convolve(close_prices, np.ones(MEDIUM_TERM_MA_WINDOW) / MEDIUM_TERM_MA_WINDOW, mode='valid')[-1]

短期移動平均線(SHORT_TERM_MA_WINDOW)と中期移動平均線(MEDIUM_TERM_MA_WINDOW)をそれぞれ計算します。
ここでnp.convolveを使い、単純移動平均(SMA)を効率的に計算しています。

また、1日前の移動平均線も以下のように計算しています。

short_term_ma_prev = np.convolve(close_prices[:-1], np.ones(SHORT_TERM_MA_WINDOW) / SHORT_TERM_MA_WINDOW, mode='valid')[-1]
medium_term_ma_prev = np.convolve(close_prices[:-1], np.ones(MEDIUM_TERM_MA_WINDOW) / MEDIUM_TERM_MA_WINDOW, mode='valid')[-1]

これにより、現在の移動平均と過去の移動平均を比較できるようになります。

3.4 ゴールデンクロスの判定

if medium_term_ma_prev > short_term_ma_prev and medium_term_ma <= short_term_ma:
    signal_triggered = True

ゴールデンクロスの条件は以下の2つです。

  1. 前日まで中期移動平均線が短期移動平均線を上回っている
    (medium_term_ma_prev > short_term_ma_prev)

  2. 今日、中期移動平均線が短期移動平均線を下回った
    (medium_term_ma <= short_term_ma)

これらの条件を満たす場合、signal_triggeredをTrueにして売買シグナルを生成します。

3.5 シグナルの返却

return signal_triggered

ゴールデンクロスが発生した場合はTrueを、発生していない場合はFalseを返します。


4. まとめ

システムトレードの基礎である「generate_signal関数」の仕組みを解説しました。移動平均線を用いたゴールデンクロスの判定ロジックを中心に、売買シグナルの生成方法を具体的に説明しています。このロジックを活用することで、効率的なトレード戦略を構築する第一歩を踏み出せます!

次回は、generate_signal関数によって生成されたシグナルを基に、exit_position関数を使って利益確定のロジックを実装します。

追記

「exit_position関数」の説明は以下となります。


いいなと思ったら応援しよう!