少し複雑な投資手法のバックテストにチャレンジしてみます。
MM法
増田正美氏が考案した株式投資法です。
4つのテクニカル指標を用いて、ある条件を満たした時に「 底である 」、あるいは「 底である可能性が高い 」と判断するようです。
その後、株価が反転しはじめたのを確認してから、買いで参入して利益を得ます。
【買いルール】
次のMM条件が4つともすべて満足して初めて 「買い銘柄候補」 となります。
※ボリンジャーバンドとADXの組み合わせだけでも「六十にして株を知る(増田正美、毎日新聞社)」で紹介されています。
- 終値がボリンジャーバンド(SMA,20日,-2.0σ)以下
- RSI(14日)が25%以下
- ADX(14,14日)が75%以上
- MACD(12,26日)がシグナル(SMA,9日)以下
【決済ルール】
- 含み益が20%以上(利確)
- 仕掛けから暦日で60日経過(期限切れ)
要するに、ボリンジャーバンドとRSIで売られすぎ買われすぎを見て、ADXとMACDでトレンド方向を見る手法です。
・・・・。
全く意味が分かりません・・・・
用語を調べて簡単にまとめました。
ボリンジャーバンド(Bollinger Bands)
移動平均線の上下に2本づつ線を引いた、帯(バンド)のようになっている指標です。
移動平均線からの乖離が大きくなり、行き過ぎた状態の時に、高い場合は売り、安い場合は買いという逆張り投資に利用します。
+2σと-2σの間に95.5%が含まれます。
単純移動平均(SMA)
指定した期間の平均値を結んでできた線です。
標準偏差の2倍の値である“+2σ”及び“-2σ”を移動平均線から上下に乖離させて表示するのがボリンジャーバンドです。
指数平滑移動平均(EMA)
テクニカル分析に移動平均線を用いる際には、SMAよりもトレンドの転換点をいち早く知らせてくれるEMAを用いた方がよいとされます。
相対力指数(RSI)
「行き過ぎた売られすぎ」「行き過ぎた買われすぎ」を表す指標です。
2種類存在します。
- J.W.ワイルダーの指数移動平均を使ったRSI(Wilder’s RSI)
- ワイルダーの指数移動平均を単純移動平均に置き換えたRSI(Cutler’s RSI)
平均方向性指数(ADX = Wilder DMI)
ラインが「上昇中」または「一定数値(例えば14日で計算したADXの数値が30)以上」の場合には、「トレンドがある」と判断されます。
逆にADXラインが下降を開始したり、低い数値で推移している場合には「トレンドが無い」と判断されます。
移動平均収束発散法(MACD)
シグナルを下から突き抜けたら(ゴールデンクロスしたら)買い、シグナルを上から突き抜けたら(デッドクロスしたら)売りと言われる。
ソースコード
API一覧は「Protra\lib\TIlib.pt」を見れば分かります。
グラフ描写用のptなどを参考にしながら作れそうです。
RSI_new(14, 1)、DMI_new(14, 14, 1)の最後の引数はWilderの計算法を表していると思ってましたが、グラフを見る限り引数0が正しそうです。一日無駄にした・・。
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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
require "TIlib" // Bollinger Bands(20日) if ! $BB $BB = BB_new(20) else BB_next($BB) end // RSI(14日) if ! $RSI $RSI = RSI_new(14, 0) else RSI_next($RSI) end // ADX(14,14日) if !$DMI $DMI = DMI_new(14, 14, 0) else DMI_next($DMI) end // MACD(12,26日) シグナル(9日) if !$MACD $MACD = MACD_new(12, 26, 9) else MACD_next($MACD) end def BuyCond //買い条件 if ! Close return end ma = BB_value($BB) // MA(BBの中心) sigma = BB_deviation($BB) rsi = RSI_value($RSI) adx = DMI_adx($DMI) macd = MACD_signal($MACD) if ! (ma && sigma && rsi && adx && macd) return end // 終値がBB(SMA,20日,-2.0σ)以下 bb = ma - 2.0 * sigma // MACD(12,26)が0以下 return Close <= bb && rsi <= 25 && 75 <= adx && macd <= 0 end def SellCond //売り条件 if ! Close return end if Close >= 1.2*$buy // 20%以上の含み益(利確) return 1 elsif $set <= 0 //0以下でも売り条件(期限切れ) return 1 end $set = $set - 1 //1日1回カウンタ減らしておく end // 1000株の倍数か100株の倍数として買う株数を計算 def Num(price) num = 1000000/price // 軍資金 100 万円で何株? if num >= 1000 num = (num/1000)*1000 elsif num >= 100 num = (num/100)*100 elsif num == 0 num = 1 end return num end if ! $wait // 同日の売買禁止フラグ //持ってないとき、かつBuyCondのとき、買う if ! $hold && BuyCond if {1}Open //翌日の始値で $hold = Num({1}Open) if $hold >= 1 $buy = {1}Open //買う {1}Buy(Open, $hold) $set = 41 end elsif Close //翌日の始値がないとき $hold = Num(Close) if $hold >= 1 $buy = Close //便宜上終値で買う Buy(Close, $hold) $set = 41 end end //持っているとき、かつSellCondのとき、売る elsif $hold && SellCond if {1}Open //翌日の始値で //翌日 {1}Sell(Open, $hold) //売る else //始値なし Sell(Close, $hold) //便宜上終値で売る end $hold = 0 //持分を0にリセット $wait = 1 end else $wait = $wait - 1 end |
バックテスト
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 |
ファイル: MM.pt 株価データ: 日足 銘柄リスト: 日経平均構成銘柄 10/01/05~29/05/02における成績です。 ---------------------------------------- 全トレード数 52 勝ちトレード数(勝率) 33(63.46%) 負けトレード数(負率) 19(36.54%) 全トレード平均利率 3.61% 勝ちトレード平均利率 12.67% 負けトレード平均損率 -12.12% 勝ちトレード最大利率 33.13% 負けトレード最大損率 -30.71% 全トレード平均期間 53.73 勝ちトレード平均期間 48.79 負けトレード平均期間 62.32 ---------------------------------------- 必要資金 ¥4,082,300 最大ポジション(簿価) ¥4,792,100 最大ポジション(時価) ¥5,182,540 純利益 ¥1,380,620 勝ちトレード総利益 ¥3,287,920 負けトレード総損失 -¥1,907,300 全トレード平均利益 ¥26,550 勝ちトレード平均利益 ¥99,634 負けトレード平均損失 -¥100,384 勝ちトレード最大利益 ¥310,000 負けトレード最大損失 -¥261,000 プロフィットファクター 1.72 最大ドローダウン(簿価) -¥528,300 最大ドローダウン(時価) -¥941,300 ---------------------------------------- 現在進行中のトレード数 2 |
20年で52回しか取り引きしてないです。
少なすぎでしょう・・・。
取り引き数が少ないのは、各指標の論理積なのが理由です。
なお、RSI_new(14, 1)、DMI_new(14, 14, 1)の間違いをデバッグするために、各指標を別々に算出して調査しました。
せっかくなので、結果を載せておきます。
ボリンジャーバンド(Bollinger Bands)の利益結果
1 2 3 4 5 6 |
全トレード数 12345 全トレード平均利率 1.78% 勝ちトレード最大利率 932.56% 負けトレード最大損率 -70.88% 全トレード平均期間 57.74 プロフィットファクター 1.36 |
2007年(平成19年)~2013年(平成25年)がマイナスなので日経平均株価そのものです。
相対力指数(RSI)の利益結果
1 2 3 4 5 6 |
全トレード数 9616 全トレード平均利率 2.40% 勝ちトレード最大利率 989.16% 負けトレード最大損率 -68.71% 全トレード平均期間 57.60 プロフィットファクター 1.52 |
平均方向性指数(ADX = Wilder DMI)の利益結果
1 2 3 4 5 6 |
全トレード数 1214 全トレード平均利率 3.66% 勝ちトレード最大利率 118.32% 負けトレード最大損率 -59.00% 全トレード平均期間 56.35 プロフィットファクター 1.88 |
2007年(平成19年)~2013年(平成25年)がマイナスなので日経平均株価そのものです。
移動平均収束発散法(MACD)の利益結果
MACDMACD(12,26)のシグナル(9日)が0以上としてバックテストを実施しました。
1 2 3 4 5 6 |
全トレード数 15406 全トレード平均利率 1.72% 勝ちトレード最大利率 948.82% 負けトレード最大損率 -67.96% 全トレード平均期間 58.13 プロフィットファクター 1.36 |