
簡単シストレ自作#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つです。
前日まで中期移動平均線が短期移動平均線を上回っている
(medium_term_ma_prev > short_term_ma_prev)今日、中期移動平均線が短期移動平均線を下回った
(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関数」の説明は以下となります。