その1,その2に引き続き、トレンド判定を盛り込んでいきます。
・投資予算に制限を加える
・共通コードを関数化して可読性を向上させる その2
・共通コードを関数化して可読性を向上させる その3
・本ブログの内容において、正当性を保証するものではありません。
・本ブログを利用して損失を被った場合でも一切の責任を負いません。
・最終的な決定は、ご自身の判断(自己責任)でお願い致します。
移動平均線の動き
今回のトレンド判定には、移動平均線の動きを用います。
例えば、「当日の〇〇日移動平均線が、××日前より大きい場合、現在その株価は上昇トレンドにある」と判断します。
実装
当日の〇〇日移動平均線値との比較のため、××日前の移動平均線の値を保存する必要があります。これは2次元配列に [企業の番号(=i)]と[xx日]を入れれば実装できそうです。
上場から現在までの全日数(20年なら約4,000日)を保存する配列を、全ての銘柄に準備するでも良いのですが、メモリの節約のため xx日分の配列しか準備しないことにします。
そこで上場からの日数を返す組み込み関数 Indexと、mod関数を使います。イメージは以下の通り。75日間の推移を見ると仮定した場合です。
完成したのが以下のコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
#================================================== # x日前の移動平均線と比較 #================================================== def CompareMAwithXdayAgo(i) if ! $__INITMAVCOMP__ $logDate = 75 Print("$codenum:" + $code_num +" / logDate:" + $logDate ) $MVAVG = [$code_num] $MAlog = [$logDate*$code_num] j=0 while j < $code_num $MAlog[j] = [$logDate] j = j+1 end $__INITMAVCOMP__ = 1 end if ! $MVAVG[i] #Tilibのオブジェクト生成 mvavgDay = 75 $MVAVG[i] = MA_new(mvavgDay) return 0 end #指標の計算を1日進める MA_next($MVAVG[i]) mvavg = MA_value($MVAVG[i]) if !mvavg || $logDate > Index return 0 end #移動平均データを記録しておく j = Index % $logDate if !$MAlog[i][j] $MAlog[i][j] = 99999 end xdayAgoMA = $MAlog[i][j] $MAlog[i][j] = mvavg # 当日の移動平均線が、x日前より大きければ1を返す return mvavg > xdayAgoMA end |
この例では、75日移動平均線を用いて、75日間の推移を見るようにしていま。mvavgDay
が移動平均線の日数、$logDate
が記録日数、$MAlog
が移動平均線値を記録する配列です。
35行目:2次元配列の指数j
をmod関数で計算しています。
36行目:最初は配列がnullのため、初期化しています。
39行目:75日前のデータをxdayAgoMA
に渡し、
40行目:当日の値に配列を更新しています。
効果の検証
◆買い:以下を満たしたとき、翌日の始値が買う
・終値と移動平均(5日)との乖離率が-7%以下
◆売り:以下のいずれかを満たしたとき、翌日の始値で売る
・終値と移動平均(5日)との乖離率が0%以上
・購入から10日経過
●予算無制限、対象銘柄:売上上位500銘柄
はじめに、トレンド判定なし。
続いて、「当日の75日移動平均線値が、75日前の75日移動平均線値より大きい場合、上昇トレンドと判断」を盛り込んだ場合です。
改善したものの、まだ ところどころ大きなドローダウンがありますね。
これは検証に使用した条件、「当日の75日移動平均線値が、75日前の75日移動平均線値より大きい場合、上昇トレンドと判断」は以下ように、実際は上昇トレンドでない場合も考えられるためです。
そこで、「当日の75日移動平均線値が、75日前の75日移動平均線値より大きい かつ 当日の25日移動平均線値が、25日前の25日移動平均線値より大きい場合、上昇トレンドと判断」と、条件を追加してみまよう。中期,長期的双方ともにトレンドが上昇傾向にある場合にのみINするわけです。
多少改善しましたが、2011年の大きなドローダウンは依然 取りこぼしていますね。大地震時のような急落は、中長期の移動平均線に反映されにくいためでしょう。その点が その1,その2のように、実際の株価を使用しているトレンド判定とは異なるところです。
比較期間は もっと短期間、例えば25日前の75日移動平均線と比較したり、5日移動平均線を使用し、短期的なトレンドを組み合わせても良いですね。
是非いろいろ検証してみてください!