システムトレードで11年間で10勝1敗の実績をあげている私の投資手法

  • このエントリーをはてなブックマークに追加

システムトレーダーの斉藤正章です。私は、会社員時代に元手30万円から株式投資を始めました。その後、システムトレードという手法に出会い、現在は主にシステムトレードで得られる収益で生活しています。

システムトレードとは、簡単にいうと、予め決めた売買ルールで機械的に取引を繰り返して利益を積み重ねるトレード手法です。

この記事を読むことで、次のノウハウを得ることができます。

  • システムトレードが将来に渡っても再現性が高い理由
  • 私が実践している3つの売買戦略
  • システムトレードの具体的な実践方法

一度マスターすれば継続して利益をあげられる手法ですので、この記事を参考にして、ぜひ取り組んでみて下さい。

1.私のシステムトレードの実績

まず始めに、私のシステムトレードの実績をお伝えします。

下のグラフをご覧下さい。これは、私が今の形でシステムトレードを行うようになった2007年から現在までの、過去11年間の利回りの推移を表したものです。

2018-06-07_18h55_17

その年によって利回りにバラツキがありますが、安定的に資産を増やすことができています。

この成績を出すために日々行っていることは、朝の8時台にシステムが出してくれるシグナルを確認して、証券会社のツールで発注しているだけです。その後はずっとパソコンの前にいる必要はなく、趣味のマラソンの練習をしたり、自宅のリフォームなどをして過ごしています。

注文に費やしている時間は1日20分から30分程度なので、ほとんど時間をかけずに利益を生み出すことができています。お金を増やすことはもちろん大切ですが、それ以上に自由な時間というのは何ものにも代えがたいものです。

この章では、数ある投資手法の中で、私がどのような経緯でシステムトレードに辿り着いたのかを説明します。

1.1.システムトレードを始めたきっかけ

私は元々プログラマーやシステムエンジニアの仕事をしており、主に大企業向けのシステム設計や開発をしていました。株とは全く関係のない仕事でしたので、世の中の出来事や経済の動きにも全く無頓着で、ごく平凡なサラリーマンでした。

では、私がなぜ株式投資に興味を持ったのかというと、損害保険会社に派遣された時に、有価証券の管理のシステム開発を任されたことがきっかけでした。その会社で、勉強のために株式や債券に関する本を渡され、面白そうだと思いました。

当時はあまり収入が多いほうではなく、給料の20万円を超える分は全て貯金に回して節約しながら生活をしていました。そのような事情もあり、興味を持ったとしても株式投資に回せるお金はあまりなく、なんとか30万円を貯めて売買を始めました。

しかし、明確なルールを決めずに自分の勘で売買をしていたため、安定した成績を残すことはできませんでした。

1.2.システム改良前のトレード成績

もっと損益を安定させる必要があると思い、仕事で培ったシステム開発のスキルを活かして、売買ルールをシステム化できないかと考えました。そして、色々と試行錯誤していくうちに、システムトレードの原型が出来上がりました。

このような経緯を経て、ようやくシステムトレードで売買を開始できたのは、株式市場が好調な2003年でした。

ここで、2003年から2006年までのトレード成績をご覧いただきたいと思います。ちなみに、小数点以下は切り捨てで、年末時点でまだ決済していない銘柄は、年末の株価で計算しています。

  • 2003年:140% ←システムトレード開始
  • 2004年:385%
  • 2005年:397%
  • 2006年 :▲42% ←ライブドアショック

2005年までは相場の波に上手く乗れたことが大きく、正直なところ出来過ぎといえる成績でした。しかし、2006年にライブドアショックが起こって株式市場全体が急落し、一時は50倍以上に膨らんだ運用資産をピークから40%以上も減らしてしまいました。

1.3.システム改良後のトレード成績

2006年のライブドアショックでは-42%の損失を出してしまいましたが、今思えば、この時の損失が良い教訓になりました。なぜなら、その後は利益率だけでなく、安定性も考慮して売買システムの改良を行い、2016年までは年間ベースで負けることなく安定的に利益あげられるようになったからです。

今度は、システム改良後の2007年以降のトレード成績をご覧下さい。

  • 2007年:+45%
  • 2008年:+11% ←リーマンショック
  • 2009年:+40%
  • 2010年:+105%
  • 2011年:+84% ←東日本大震災
  • 2012年:+16%
  • 2013年:+66% ←アベノミクス開始
  • 2014年:+24%
  • 2015年:+9%
  • 2016年:+42%
  • 2017年:▲1%

2017年に初めてマイナスになってしまったのですが、これは、日銀の大規模な買い入れにより株式市場全体が人工的な値動きになってしまったことが影響していると分析しています。しかし、それでもマイナス1%の最小限の損失に抑えることができました。

年ごとの成績を振り返ると、2008年のリーマンショックの時には+11%でさすがに苦戦を強いらました。しかし、2011年の東日本大震災の年も+84%の結果を残すことができ、システム改良後の2007年から2017年の11年間の平均利回りは40%となっています。

このように、システムトレードのお陰で年間ベースで安定したトレード成績を残していますが、私自身は現状に満足することなく、現在も運用を継続しながら新たな売買ルールの研究を続けています。

以上が、私の自己紹介とシステムトレードの実績です。

次からは、システムトレードとはどういう投資手法なのかをわかりやすく解説していきます。

2.システムトレードとは

この章では、いよいよシステムトレードについて具体的に説明します。

繰り返しになりますが、 システムトレードは、一定のルールに基づいて機械的に売買を繰り返すことで継続的に利益を積み上げていく投資手法です。

この投資手法では、過去の株価データを基にしてバックテストという検証を行い、統計的に優位な売買ルールを探し出します。そのため、将来も継続的に勝てる確率が高い投資手法であるといえます。

実際に私は、システムトレードで10年以上に渡って利益をあげ続け、専業トレーダーとして生計を立てています。まずは、このシステムトレードのメリットを知ることから始めましょう。

2.1システムトレードのメリット

私が実感しているシステムトレードのメリットはたくさんあるのですが、ここでは3つお伝えします。

2.1.1.機械的に売買でき、判断に迷うことがない

システムトレードでは、予め設定した売買ルールに従って、機械的に売買を行います。そのため、人間の判断を入れる必要がありません。人間の判断に基づくトレードを裁量トレードといいますが、様々な判断要素が絡んでくるため、大きな労力が必要になります。

しかし、システムトレードは、システムが出すシグナルに従って売買するだけなので、このような労力は不要になります。

2.1.2.過去のデータから統計的に優位性のある売買をするため、収益が安定する

システムトレードでは、過去のデータを検証して、利益になる確率が高いルールで取引します。優位性が確認できた売買ルールを使用しますので、繰り返し売買することで将来に渡っても再現性が高くなり、収益が安定します。

2.1.3.予め設定した売買シグナルに従うだけなので、時間がかからない

システムトレードでは、売買シグナルという形で条件に当てはまった銘柄を抽出してくれます。そのため、裁量トレードのように銘柄分析をしたり、チャート分析をする必要がないので、ほとんど時間がかかりません。

2.2.システムトレードデメリット

続いて、システムトレードのデメリットについても説明します。しっかり把握しておきましょう。

2.2.1.システムに従い続けるためには、強い意思が必要

システムトレードはシステムが売買シグナルを出してくれますが、このシグナルに従い続けるためには、強い意思が必要です。

例えば、市場が暴落した時にシステムが買いのシグナルを出したとします。そのような時に、ここで買って更に下落したらどうしよう、という恐怖心でシグナル通りに売買するのをためらってしまう方もいます。

また、シグナル通りに売買して負けが続くと、「自分の判断のほうが正しいのではないか」と考えて、自分の裁量を入れてしまうケースも考えられます。

しかし、システムトレードでは、このような判断を一切入れてはいけません。ある時はシステムトレードを行い、別の時は裁量トレードをしていたら、システムトレードをやる意味がありません。

2.2.2.同じルールで取引する人が増えると、利益が減る可能性がある

システムトレードは、全く同じルールを使う人が多くなると、みんなが同じタイミングで売買しますので、利益が減ってしまいます。

例えば、買いシグナルが出た時に同じシステムを使っているシステムトレーダーが一斉に買い注文を出すと、その注文で株価を釣り上げてしまい、バックテスト通りの利益にならないことがあります。

したがって、これに対処するためには、ベースとなるルールは同じでも、細かい数値までは他の人と完全に同じにならないように調整する必要があります。

2.2.3.過去の特性と違う相場状況になると、機能しづらくなる

繰り返しになりますが、システムトレードは、過去のデータに基づいて優位性がある売買ルールを使用します。そのため、過去になかった相場状況に直面した場合、機能しづらくなる可能性があります。

しかし、そのような状況になったとしても、いずれは正常な相場に戻るはずですので、ルールを変えずに継続してトレードを繰り返したほうが良い結果につながると考えています。

2.3.メリットとデメリットはどちらのほうが大きいか

システムトレードには、メリットもあればデメリットもあることをお分かりいただけたと思います。

しかし、私は、デメリットを差し引いてもメリットのほうが断然大きいと思っていますので、今後もシステムトレードを続けていくつもりです。

それでは、次の章から、私のシステムトレードの代表的な3つの戦略を具体的にご紹介します。なお、ここでご紹介するトレード戦略は、私が使用している売買ルールに限りなく近いものですが、実際に運用で使用しているものとは異なることをご了承下さい。

3.「順張り買い」戦略

最初にご紹介するのは、株価のブレイクアウトを利用して収益をあげる「順張り買い」戦略です。まず、この戦略で運用した場合の資産推移をご覧下さい。

2018-06-12_18h40_57資産曲線を見てわかるように、右肩上がりで資産が増えていることがおわかりいただけると思います。

ちなみに、順張りとは、株価のトレンドに沿って、上昇していたら買い、下落していたら売る投資方法です。また、ブレイクアウトとは、株価が一定のレンジ(もみ合い)を抜けると、その方向に株価が動いていく傾向を利用して売買する手法をいいます。次のチャートでイメージをつかんで下さい。

●ブレイクアウトのチャート

2018-01-12_16h52_24

この順張り買いの前提条件を説明すると、初期運用資金は300万円で、利益は再投資していません。また、売買手数料は往復1,000円として検証しています。

資産推移グラフをご覧いただくと、300万円でスタートした運用資金は、2018年6月時点で1,200万円以上になっていることがわかります。しかも、その間に大きな損失は発生しておらず、安定的に資産が増加しています。

この戦略の成績は、勝率は46.45%とあまり良くありません。しかし、平均利益は47,690円に対して、平均損失はマイナス12,515円となっています。利益が損失を上回っているので、繰り返し売買することで、トータルではプラスになります。

この状態のことを、投資では「損小利大」といい、「大きく勝って小さく負ける」ことを意味します。この損小利大は、株式投資で成功しているほとんどの人が意識しているほど重要な概念なので、しっかり覚えておいて下さい。

それでは、具体的なルールを確認してみましょう。

3.1.エントリーのルール

私が実践している順張り買い戦略の最初のルールは、次の2つです。

  • 過去500日間のボラティリティがX%以上
  • 過去100日間のボラティリティがY%より小さい

ここで、X%、Y%と明確な数値は開示していません。これはシステムトレードのデメリットのところでも書いたとおり、多くの人が全く同じ数値で取引すると利回りが低下してしまうためです。

目安として、X%の部分は10%~20%、Y%の部分は1%~9%の数値と考え、各自で調整して最適な数値を見つけてみて下さい。

ちなみに、ボラティリティとは、株価の値動きの大きさを表すものとお考え下さい。この2つの条件で、「もともと値動きがあった銘柄が、直近2~3ヶ月間は値動きが乏しく、もみ合いの状態が続いている」銘柄を探すことができます 。

次に、レンジを上抜けした銘柄を選ぶために、次の条件を加えます。

  • 終値が過去50日間の最高値を更新

この3つの条件を設定することで、「売りと買いが拮抗して狭いレンジで行ったり来たりを繰り返していたが、ある日均衡が破れて直近の高値を更新する銘柄」を抽出することができます。

ただし、3つの条件に当てはまったらすぐに買い付けるのではなく、さらに一定の状況になった場合にだけ買い付けます。その一定の状況とは、

  • 終値が過去50日間の終値の最高値を更新した銘柄が、市場全体で50銘柄以上ある場合

です。この4つ目の条件を加えることで、市場全体の状況が良い場合に限定することになり、統計的に成績が良くなります。ちなみに、私はこのような市場全体の状況を捉えるための条件を「シグナル数フィルター」と呼んでいます。

このように、順張り買い戦略では、この4つの条件を満たした銘柄を指値注文で買い付けます。

3.2.決済のルール

順張り買い戦略で買い付けた銘柄は、次のどちらかの条件に当てはまった場合に売却して決済します。

  • 利食い:終値と3日移動平均乖離率が+15%以上になった場合
  • 損切り:終値が過去20日間の終値の最安値を更新した場合

利食いの場合は、「株価がブレイクアウトした後に思惑通りに株価が上昇した場合」の決済条件です。また、損切りの場合は、「株価がブレイクアウトしたものの、その後失速して損切りになった場合」の決済条件です。

このどちらかの条件に当てはまった場合、翌日の9時の寄り付きで成行き注文で売却します。

順張り買い戦略は、以上のような売買を淡々と繰り返すことで、理論上は300万円の資金を1,200万円以上に増やすことが可能です。

このように、システムトレードは、過去のデータを基に統計的に優位性があるパターンを見つけ出し、あとはそれを地道に繰り返すだけです。相場観やトレード技術に頼ることがないので、誰でも同じように利益をあげ続けることができます。

そして、慣れてくれば、「多少リスクを取っても高い利回りを追求するシステム」や「多少の利回りは犠牲にしても安全性を最優先したシステム」など、自由自在に取引ルールを作り出すことができます。

3.3.サンプルソースコード

以上、順張り買い戦略についてご紹介しましたが、実際にどのようにプログラミングしているのか、気になる方も多いと思います。そこで、ソースコードの一部をサンプルとして載せますので、ご参考下さい。

  /*
        *   ボラティリティ(標準偏差)
        *   ボラティリティ●日が●%「以上、以下、より大きい、より小さい、と等しい」
        *
        *   @param  days            移動平均●日
        *   @param  per             ●%
        *   @param  comp            <判定条件>参照
        *   @param  date            対象の日付(例:20150901)
        *   return  なし
        *
        *   取得できる追加キー(本関数を複数コールした場合は、下記の後ろに「_2」や「_3」など番号が付与される)
        *       volatility
        *
        *       e.g.) addkeystr = "" の場合
        *           1回目コール時:volatility
        *           2回目コール時:volatility_2
        *
        *       e.g.) addkeystr = "2" の場合
        *           1回目コール時:volatility2
        *           2回目コール時:volatility2_2
        */
        public function SetWhereVolatility($days, $per, $comp, $date, $addkeystr = "")
        {
            set_error_handler(function($errno, $errstr, $errfile, $errline) {  
                    throw new Exception($errstr, $errno);  
                });

            try{
                // 指定日前の市場営業日を取得
                $dbCalcUtil = new DBCalcUtil();
                $stdate_str = $dbCalcUtil->GetStockPriceOpenDate($days, $date);

                // 取得対象日の情報を作成
                $target_dt = new DateTime($date);
                $target_dt->setTimeZone(new DateTimeZone('Asia/Tokyo'));

                // サブクエリの使用を宣言する
                $key = 'stdvol';
                $reg = $this->SetSubQueryTableName('get_subsql_standard_volatility_per', $key, array($target_dt->format('Ymd'), $stdate_str));
                if($reg){
                    $subsql = $dbCalcUtil->get_subsql_standard_volatility_per($target_dt->format('Ymd'), $stdate_str, $key);
                    $this->SetJoinWithInner($subsql);
                }

                // 本関数の呼びもとから指定された条件で検索
                $this->SetSelectField("truncate(" . $key . ".volatility, 2)", "volatility" . $addkeystr);
                $this->SetWhereWithAnd("(" . $key . ".dat_date_min = ? AND t1.dat_date = ? AND " . $key . ".volatility " . $comp . " ?)");
                $this->prms[] = $stdate_str;
                $this->prms[] = $target_dt->format('Ymd');
                $this->prms[] = $per;
            }
            catch(Exception $err){
                LogIF::GetInstance()->ErrorLog(__FUNCTION__ . ":" . __LINE__, $err->getMessage(), basename(__FILE__));
            }

            restore_error_handler();
        }

        /*
        *   ボラティリティ(標準偏差)
        *   ボラティリティ●日の情報
        *
        *   @param  days            移動平均●日
        *   @param  date            対象の日付(例:20150901)
        *   return  なし
        *
        *   取得できる追加キー(本関数を複数コールした場合は、下記の後ろに「_2」や「_3」など番号が付与される)
        *       volatility_info
        *
        *       e.g.) addkeystr = "" の場合
        *           1回目コール時:volatility_info
        *           2回目コール時:volatility_info_2
        *
        *       e.g.) addkeystr = "2" の場合
        *           1回目コール時:volatility_info2
        *           2回目コール時:volatility_info2_2
        */
        public function SetInfoFieldVolatility($days, $date, $addkeystr = "")
        {
            set_error_handler(function($errno, $errstr, $errfile, $errline) {  
                    throw new Exception($errstr, $errno);  
                });

            try{
                // 指定日前の市場営業日を取得
                $dbCalcUtil = new DBCalcUtil();
                $stdate_str = $dbCalcUtil->GetStockPriceOpenDate($days, $date);

                // 取得対象日の情報を作成
                $target_dt = new DateTime($date);
                $target_dt->setTimeZone(new DateTimeZone('Asia/Tokyo'));

                // サブクエリの使用を宣言する
                $key = 'stdvol';
                $reg = $this->SetSubQueryTableName('get_subsql_standard_volatility_per', $key, array($target_dt->format('Ymd'), $stdate_str));
                if($reg){
                    $subsql = $dbCalcUtil->get_subsql_standard_volatility_per($target_dt->format('Ymd'), $stdate_str, $key);
                    $this->SetJoinWithInner($subsql);
                }

                // 本関数の呼びもとから指定された条件で検索
                $this->SetSelectField("truncate(" . $key . ".volatility, 2)", "volatility_info" . $addkeystr);
            }
            catch(Exception $err){
                LogIF::GetInstance()->ErrorLog(__FUNCTION__ . ":" . __LINE__, $err->getMessage(), basename(__FILE__));
            }

            restore_error_handler();
        }

4.「空売りデイトレ」戦略

次にご紹介する「空売りデイトレ」戦略は、「一時的に株価が急騰した銘柄が、短期的に反落するのを狙って空売りを仕掛ける」戦略です。条件に合致した銘柄に予め指値注文を出しておき、当日の15時の大引けで決済するので、1日で売買が完結するデイトレード系の戦略となります。

まず、この戦略で運用した場合の資産推移をご覧下さい。

2018-06-12_19h11_15

最初の順張り買い戦略以上に、右肩上がりで資産が増えていることがおわかりいただけると思います。

それでは、具体的なルールを確認してみましょう。

4.1.エントリーのルール

まず、空売りデイトレ戦略では、対象銘柄を「東証1部の貸借銘柄」に絞ります。なぜなら、上場されている全ての銘柄が空売りができるわけではなく、貸借銘柄に指定されているものだけだからです。

そして、私が実践している空売りのルールは、次の通りです。

  • 終値が前日比で一定以上高くなっていて当日が陽線

この条件で、「一時的に株価が吹き上がっている銘柄」を抽出します。

そして、株価がやや横ばいか上昇傾向にある銘柄を空売りの対象としたほうが成績が良いと判明したので、「株価位置」という指標を加えてトレンド判定します。次の条件です。

  • 株価位置が40%以上の銘柄

株価位置を詳しく説明すると、過去一定期間の水準と比べて株価がどのくらいの水準にあるかを判定するための指標のことです。私は、株価位置が50%を以上だと上昇トレンド、50%以下だと下降トレンドだと判断して使っています。

また、過去約15年間のデータを検証した結果、このデイトレ戦略は金曜日だけ成績が良くないことが判明したので、金曜日以外の平日にだけ取引を行う条件を加えました。

  • 金曜日以外の平日

そして、さらに利回りを高めるために、株価位置に絡んだ次のルールを追加しました。

  • 終値基準の200日株価位置が100%より小さい場合:「50日間の株価変動率が30%以上 」
  • 終値基準の200日株価位置が100%と等しい場合:「50日間の株価変動率が40%以上で終値が500円以下 」

この2つの条件は多少わかりにくいかもしれませんが、簡単にいうと、高値を更新している場合は株価500円以下の銘柄に絞りましょう、ということです。過去の検証の結果、この2つの条件を加えたほうがパフォーマンスが良かったので追加しました。

以上の条件に合致する銘柄が抽出されたら、翌日に空売りでエントリーします。

4.2.決済のルール

空売り戦略はデイトレ戦略なので、その日の「引け成り」で買い決済します。ちなみに、引け成りとは、その日の取引が終了する15時に、成行で売買する注文方法です。決済の条件を記載しておきます。

  • 「当日に引け成り買い」

空売りデイトレ戦略は、以上のような売買を淡々と繰り返すことで、理論上は300万円の資金を2,500万円近くまで増やすことが可能です。

また、先ほどの資産曲線をもう一度ご覧いただくと、滑らかな右肩上がりの曲線が描けて、資産が着実に増えていることがわかります。さらに、この戦略は損失の発生が少ないので、比較的安心して運用できる点もメリットです。

デイトレ系の戦略は、1日で売買が完結するので資金効率がよく、利回りも高くなる傾向があります。ぜひ、チャレンジしてみて下さい。

4.3.サンプルソースコード

最後に、空売りデイトレ戦略のサンプルソースコードを載せますので、ご参考下さい。

 
                     if( ($breakout['date_num'] == 40) && ($breakout['criteria'] == 1) && !empty($breakout['first_update_num']) ) {
                        // 直近○日間で初めての更新
                        $this->sdi->SetWhereNothing40BreakOutLow($breakout['first_update_num']);
                    }
                }
                
                // 株価位置(ザラバ基準)
                if( isset($sp_position['check']) ) {
                    $this->sdi->SetWhereStockPricePosition($sp_position['date_num'], $sp_position['val_num'], $sp_position['comp']);
                }
                
                // 株価位置(終値基準)
                if( isset($sp_position_cp['check']) ) {
                    $this->sdi->SetWhereStockPricePositionWithEndPrice($sp_position_cp['date_num'], $sp_position_cp['val_num'], $sp_position_cp['comp']);
                }
                
                // ローソク足
                if( isset($yinyang['check']) ) {
                    $this->sdi->SetWhereCandleStickType($yinyang['val']);
                }
                
                // 陰線・陽線前日比
                if( isset($yinyang_ratio['check']) ) {
                    $this->sdi->SetWhereCandleStick($yinyang_ratio['yinyang'], $yinyang_ratio['val_num'], $yinyang_ratio['comp'], $screening_date);
                }
                
                // 平均売買代金
                if( isset($trading_value['check']) ) {
                    $this->sdi->SetWhereTradingValueAvg($trading_value['date_num'], $trading_value['val_num'], $trading_value['comp'], $screening_date);
                }
                
                // 移動平均値比較
                if( isset($ave_comp['check']) ) {
                    $this->sdi->SetWhereMovingAvg($ave_comp['date_num'], $ave_comp['comp']);
                }
                
                // 60日移動平均値比較
                if( isset($ave60_comp['check']) ) {
                    $this->sdi->SetWhereMovingAvg60PrevXDays($ave60_comp['date_num'], $ave60_comp['comp']);
                }
                
                // 移動平均乖離率
                if( isset($deviation_rate['check']) ) {
                    if( !empty($deviation_rate['date_num']) &&  !empty($deviation_rate['start_val']) && !empty($deviation_rate['end_val']) ) {
                        $this->sdi->SetWhereMovingAvgDivergence($deviation_rate['date_num'], $deviation_rate['start_val'], $deviation_rate['end_val'], $screening_date);
                    }
                }
                
                // 移動平均乖離率2
                if( isset($deviation_rate2['check']) && ($deviation_rate2['check'] == "on") ) {
                    if( !empty($deviation_rate2['date_num']) &&  !empty($deviation_rate2['start_val']) && !empty($deviation_rate2['end_val']) ) {
                        $this->sdi->SetWhereMovingAvgDivergence2($deviation_rate2['date_num'], $deviation_rate2['start_val'], $deviation_rate2['end_val'], $screening_date);
                    }
                }
                
                
                // 株価変動率
                if( isset($change_rate['check']) ) {
                    if( !empty($change_rate['date_num']) &&  !empty($change_rate['val_num']) && !empty($change_rate['comp']) ) {
                        $this->sdi->SetWhereMovingRaito($change_rate['date_num'], $change_rate['val_num'], $change_rate['comp'], $screening_date);
                    }
                }
                
                // 株価変動率2
                if( isset($change_rate2['check']) && ($change_rate2['check'] == "on") ) {
                    if( !empty($change_rate2['date_num']) &&  !empty($change_rate2['val_num']) && !empty($change_rate2['comp']) ) {
                        $this->sdi->SetWhereMovingRaito2($change_rate2['date_num'], $change_rate2['val_num'], $change_rate2['comp'], $screening_date);
                    }
                }
                
                // 株価変動率3
                if( isset($change_rate3['check']) && ($change_rate3['check'] == "on") ) {
                    if( !empty($change_rate3['date_num']) &&  !empty($change_rate3['val_num']) && !empty($change_rate3['comp']) ) {
                        $this->sdi->SetWhereMovingRaito3($change_rate3['date_num'], $change_rate3['val_num'], $change_rate3['comp'], $screening_date);
                    }
                }
                
                // ボラティリティ
                if( isset($volatility['check']) ) {
                    if( !empty($volatility['date_num']) &&  !empty($volatility['val_num']) && !empty($volatility['comp']) ) {
                        $this->sdi->SetWhereVolatility($volatility['date_num'], $volatility['val_num'], $volatility['comp'], $screening_date);
                    }
                }
                
                // ボラティリティ2
                if( isset($volatility2['check']) && ($volatility2['check'] == "on") ) {
                    if( !empty($volatility2['date_num']) &&  !empty($volatility2['val_num']) && !empty($volatility2['comp']) ) {
                        $this->sdi->SetWhereVolatility2($volatility2['date_num'], $volatility2['val_num'], $volatility2['comp'], $screening_date);
                    }
                }
                
                // 曜日
                if( isset($week['check']) ) {
                    $weekends = array();
                    for($i = 1; $i <= 7; $i++){
                        $wkey = "val" . $i;
                        if( isset($week[$wkey]) ){
                            $weekends[] = $i;
                        }
                    }
                    
                    $this->sdi->SetWhereWeekends($weekends);
                }

5.「逆張り」戦略

3つ目の戦略は、「逆張り」戦略です。この戦略は、私がメインとして使用しているもので、投資収益に大きく貢献しています。ちなみに、逆張りとは、株価のトレンドに逆らって、下落していたら反発を狙って買い、上昇していたら下落を狙って空売りする投資方法です。

まず、この戦略で運用した場合の資産推移をご覧下さい。

2018-06-12_19h30_48ご覧のように、この戦略も右肩上がりで資産が増えています。

それでは、具体的なルールを確認してみましょう。

5.1.エントリーのルール

逆張り戦略で、どのような判断基準でエントリーしているのかというと、私は「移動平均乖離率」という指標を使っています。この移動平均乖離率とは、ある移動平均線(設定した期間の終値の平均株価を線で結んだもの)と終値がどの程度離れているかをパーセント(%)で表したものです。

この移動平均乖離率がマイナスが大きいほど、直近の株価より大きく下落していることを表し、反発を期待した買いのチャンスになります。また、プラスが大きいほど、直近の株価より大きく上昇していることを表し、反落を期待した空売りのチャンスになります。

私の逆張り戦略は、この移動平均乖離率がカギとなり、その他に株価位置やシグナル数フィルターなどを組み合わせてルール化しています。

私が実践している逆張り戦略の基本ルールは、次の通りです。

  • 当日の株価の終値が、25日移動平均線から25%以上下落、かつ、5日移動平均線から10%以上下落した銘柄
  • 翌日の成行で買い

しかし、この2つのルールは個別銘柄の値動きにしか注目していないので、もっとパフォーマンスを良くするために市場全体の値動きを把握する条件を加える必要があります。

そこで登場するのが、「動的シグナル数フィルター」です。

動的シグナル数フィルターは、簡単にいうと、「急落している銘柄の数が、過去の平均と比べて極端に多くなった時にだけ買い付ける」ための指標です。

具体的な数字で説明すると、次の条件になります。

  • 急落している銘柄数が、過去100営業日の平均と比べて7倍以上

これだけ見てもわかりにくいと思いますので、例を使って説明します。

例1:過去100営業日で、急落している銘柄数が1日平均2銘柄の場合は、2銘柄×7倍=14銘柄が急落した日の翌日に逆張りで買う。

例2:過去100営業日で、急落している銘柄数が1日平均10銘柄の場合は、10銘柄×7倍=70銘柄以上が急落した日の翌日に逆張りで買う。

逆にいうと、急落した銘柄数が普段の7倍以上にならない限りは、逆張りで買いません。要は、暴落時して急落銘柄数が多くなった時がチャンスですよ、ということです。

この動的シグナル数フィルターを加えることで、リーマンショックなどの荒れている相場では、暴落が終わりそうになるまでは買わないという選択も可能になります。

一般的に、逆張りは怖いと言われがちですが、システムトレードにこのような工夫を加えることで、慎重に運用することができます。

5.2.決済のルール

逆張り戦略でエントリーした銘柄は、次のどちらかの条件に当てはまった場合に成行で売却します。

  • 含み益が10%以上
  • エントリーした日から60日以上経過

これは比較的分かりやすいですよね。

さて、先ほどのが逆張り資産曲線をもう一度ご覧いただくと、きれいな右肩上がりになっていることがわかります。そして、理論上は300万円の資産を1,200万円まで増やすことができました。

注目すべきは、途中で大きく資産を減らしていないことです。途中でマイナスが発生して資産曲線が下に曲がることを「ドローダウン」というのですが、このドローダウンが少ないことが、逆張り戦略が優れた戦略だということを表しています。

5.3.サンプルソースコード

最後に、逆張り戦略のサンプルソースコードを載せますので、ぜひご参考下さい。

 
 // 移動平均乖離率
 //------------------------------------------------------------------------------------------------------------------
 if( isset($data['static_filter']['deviation_rate']['check']) ) {
     
     if( $data['static_filter']['deviation_rate']['date'] == "" ) {
         $this->error++;
         $this->error_messages['static_filter_deviation_rate'] = "日数を入力してください。";
     }
     
     if( ($data['static_filter']['deviation_rate']['start']['val'] == "") && ($data['static_filter']['deviation_rate']['end']['val'] == "") ) {
         $this->error++;
         $this->error_messages['static_filter_deviation_rate'] = "乖離率を入力してください。(どちらか一方のみ可)";
     }
     
     if( !isset($this->error_messages['static_filter_deviation_rate']) ) {
         // エラーがない
         if( $data['static_filter']['deviation_rate']['start']['val'] != "" ) {
             $data['static_filter']['deviation_rate']['start_val'] = ($data['static_filter']['deviation_rate']['start']['plusminus'] == "minus") ? floatval(str_replace(",","",$data['static_filter']['deviation_rate']['start']['val']))*-1 : floatval(str_replace(",","",$data['static_filter']['deviation_rate']['start']['val']));
             if( ($data['static_filter']['deviation_rate']['start_val'] < -99.99) || ($data['static_filter']['deviation_rate']['start_val'] > 999.99)) {
                 $this->error++;
                 $this->error_messages['static_filter_deviation_rate'] = "乖離率は-99%~999%で入力してください。";
             }
         } else {
             $data['static_filter']['deviation_rate']['start_val'] = -99.99;
         }
         
         if( $data['static_filter']['deviation_rate']['end']['val'] != "" ) {
             $data['static_filter']['deviation_rate']['end_val'] = ($data['static_filter']['deviation_rate']['end']['plusminus'] == "minus") ? floatval(str_replace(",","",$data['static_filter']['deviation_rate']['end']['val']))*-1 : floatval(str_replace(",","",$data['static_filter']['deviation_rate']['end']['val']));
             if( ($data['static_filter']['deviation_rate']['end_val'] < -99.99) || ($data['static_filter']['deviation_rate']['end_val'] > 999.99)) {
                 $this->error++;
                 $this->error_messages['static_filter_deviation_rate'] = "乖離率は-99%~999%で入力してください。";
             }
         } else {
             $data['static_filter']['deviation_rate']['end_val'] = 999.99;
         }
         
         if( !isset($this->error_messages['static_filter_deviation_rate']) && ($data['static_filter']['deviation_rate']['start_val'] > $data['static_filter']['deviation_rate']['end_val']) ) {
             $this->error++;
             $this->error_messages['static_filter_deviation_rate'] = "乖離率の上限値よりも下限値の方が大きな値が入力されています。";
         }
         
         $data['static_filter']['deviation_rate']['date_num'] = intval(str_replace(",","",$data['static_filter']['deviation_rate']['date']));
         
         if( ($data['static_filter']['deviation_rate']['date_num'] > 500) || ($data['static_filter']['deviation_rate']['date_num'] < 1) ) {
             $this->error++;
             $this->error_messages['static_filter_deviation_rate'] = "日数は1日間~500日間で入力してください。";
         }
         
     }
     
 }

まとめ

私は、システムトレードのお陰で時間や金銭的な余裕ができ、ストレスのない生活を送ることができています。

また、何よりシステムトレードを続けることで毎日様々な発見があったりと、システムトレードが私のライフワークになっています。そして、システムトレードそのものが私の日々の生活に充実感を与えてくれています。

一度マスターすれば、ストレスも少なく継続的に利益をあげることも可能ですので、ぜひ、チャレンジしてみて下さい。

 

  • このエントリーをはてなブックマークに追加
The following two tabs change content below.
斉藤 正章

斉藤 正章

システム開発会社で勤務しながら2001年に元手30万円で株式投資を開始。2年9ヶ月で1億1千万円にした個人投資家として注目を集めたトレーダー。はじめは全く利益をあげられなかったが、2003年1月に独自のシステムを開発してから一気に常勝トレーダーになる。勝率80%の逆張りシステムを中心に数種類のシステムを使い分ける。著書4万部、多くの個人投資家に師事されているシステムトレーダー。

無料EBook: 効率的に投資情報を集めるための14の具体的方法

ebook_スイングあなたの投資成績を大幅に改善する良質な投資情報を集める方法を知りたくありませんか?


・デイトレでその日に5%から10%あがる銘柄を知りたい。
・明日狙い目の銘柄を一発で知る情報を知りたい。
・株価に影響をあたえる情報を効率的に集める方法を知りたい。
・こういう情報には要注意!
・経済指標を重要度別に仕入れてトレードに使用したい。


多くの人が、投資情報サイトを選ぶ際に迷ってしまうそうです。初心者なら尚更です。


無料EBOOKでは、初心者が最初に道を間違えないよう、良質なサイトを厳選して、そのサイトの見るべき場所を具体的に提示しています。ぜひダウンロードして、今後のトレードにお役立てください。



無料Ebookを今すぐダウンロードする

投資の教科書の購読はfacebookが便利です。

Twitter・RSSでも購読できます。

コメントを残す

*