【Protra】市場トレンドを売買ルールに入れる

「売買ルールにトレンド判定を使用する その」では、 銘柄自身が上昇or下降トレンドにあるかを売買ルールに盛り込みました。

今回は、市場全体が上昇トレンドor下降トレンドにあるかを、売買ルール判定に取り入れてみます。

本記事で使用しているコードは、別記事での内容を踏まえたものとなっており、そちらを事前に ご覧になられることをお勧めします。
投資予算に制限を加える
共通コードを関数化して可読性を向上させる その2
共通コードを関数化して可読性を向上させる その3
【免責事項】
・本ブログの内容において、正当性を保証するものではありません。
・本ブログを利用して損失を被った場合でも一切の責任を負いません。
・最終的な決定は、ご自身の判断(自己責任)でお願い致します。

値上がり銘柄をカウントする

やり方は こうです。

昨日より値上がった名柄が〇〇以上になったとき 市場全体として上昇傾向にある。

・・・

Protraにこのルールを取り込む場合、コードの構造を変える必要があります。

Protraでは基本的に銘柄ごとにルールの判定を行います。他の銘柄がどうなっているか、は考慮しません(※ String型@作用素を使用すれば、一応は考慮可能です)。

そのため、ルールを記述した関数 と 実際に売買を行う関数は独立させる必要があります。

実装

動作内容は単純で、売買を行う処理用に、関数とループを追加するだけです。こんな感じになりました。


順番に見ていきます。

最初に新しいグローバル変数を準備します。それぞれ、買条件・売条件を満たした銘柄の記録と、今回の肝である値上がり銘柄のカウントに使用します。

当日の終値が、昨日の終値より高い場合、$cntを+1しています。

買い条件を満たしたとき、Main()関数のループの中では買いません。その代り、銘柄ごとに「条件を満たした」フラグを入れています。売りも同様です。

実際に売買を行っているのは、こちらの関数になります。$buyflg[j]が1で、$cntが全銘柄数の60%を超える場合に、買いを行っています。60%は適当に設定しました。

$buyflg[j]$sellflg[j]を0に戻すを忘れずに。

最後、ループさせているwhile関数です。Main()に加え、売買を扱うBuySell()を追加しています。

最後に$cntを0に戻し、次の日に進みます。

効果の検証

いつものように、以下の逆張りルールを用います。

◆買い:以下を満たしたとき、翌日の始値が買う
・終値と移動平均(5日)との乖離率が-7%以下

◆売り:以下のいずれかを満たしたとき、翌日の始値で売る
・終値と移動平均(5日)との乖離率が0%以上
・購入から10日経過

予算無制限、対象銘柄:売上上位500銘柄

はじめに、トレンド判定なし。

続いて、「昨日より値上がりした銘柄が、全体の75%以上の場合、市場全体が上昇トレンドにあると判断」を盛り込んだ場合です。

割と直線的に右肩上がりだったのが、階段状になりました。「昨日より値上がりした銘柄が、全体の75%以上」は中々発生しないからですね。

こういった市場のトレンドは、どちらかというと順張り系のルールで効果が出ます。色々検証してみてください。

応用

今回利用した、ルールと売買の関数を独立させる方法を用いると、以下のようなルールを作ることができます。


売買ルールそのものを満たした銘柄が、〇〇以上のときに売買する

順張りで効果的です。買い条件を満たすような強いトレンドが発生していることを示しています。

売買ルールを満たした銘柄の内、優先順位をつけて売買する

売買ルールを満たしたルールの内、株価が高い順,出来高が大きい順,RSIが小さい順 などをルールに組み込めます。

少しコードが複雑になりますが、予算が限定されているときに、どの銘柄を優先的に買うかを決めることができます。