投資ネタといえば最近はインデックス投資の話ばかりだった。
別にインデックス投資だけにコダワッている訳ではないので、久しぶりにシステムトレードを実践で使っている人達のブログを整理してみた(テクニカル指標をベースとしたストラテジ公開者、年次結果公開者)。
ツール名 | コメント | 利用者名 |
---|---|---|
イザナミ | 日本では最もポピュラーなツール。ユーザも多い | 大内崇(開発者)、koz-kay、ニッパー、hamhamseven、アイアン鉄(引退)、Sand、シスヤ、トレシズ、スカイダイヤ、trademam、じんぱち、cosisin、パブロフ、頃奈、FC2USER568512AKL・・多数 |
システムトレードの達人 | 斎藤正章が製作。機能は一番豊富 | 西村剛(代表)、田村祐一(社員)、斎藤正章(社員)、夢幻(年利104%)、紫苑、ゆうし、中原良太、スカイダイヤ、押田SSラボ |
シストレ魂 | 中村義和が製作。ブラウザで動作し完全自動化。 | ゆう、Mariku |
iTRADE | 重鎮 野川徹が製作。運営交代(保田望の相棒?)で悪名高く・・・ | 押田庄次郎、スカイダイヤ |
OmegaChart | 岡嶋大介が製作。後に第1回カブロボ・コンテストで野村総研特別賞受賞 | 5ちゃんねらー |
Protra | Daisuke Araiが作成。panacoranがメンテナンス | かぶみ、なるぞう、グコウ、materakado |
パイロン(終了) | 小次郎とN(中村との噂)。後のシストレ魂との噂 | Hiro、 |
Tactico (タクティコ) | 岡嶋大介が製作。「OmegaChart」の後継。最近はストップ? | ? |
検証くん(終了) | 保田望が製作。管理会社のせいで悪名高くなった | ? |
トレードステーション(終了) | マネックス証券で利用できる。海外で主流。全銘柄を対象にできない | テスタ、 |
QuantX Factory | Pythonで開発するアルゴトレードのプラットフォーム。現在は法人向けとなった | インターン生 |
独自ツール | PythonやらExcelを使った独自ツール | Ina、KK、dogwood008、名雲一輝、AROT |
鳴り物入りで登場したQuantX Factoryは数年で法人向けにビジネスモデルを変更したようだ。
そして、アイアン鉄氏を始め多くのシステムトレーダーもインデックス投資や高配当投資にかじを切り始めてた。
6月の始め、久しぶりに順張りを仕掛けてみたのですが、2日で15万勝って、翌日-20万を食らって突然やる気を失いました。
日本株の高配当投資は爆益で一時+105%、金額にして+1,400万近くの含み益。配当も90万/年越えで順調です。
今後は王道の高配当投資とインデックス投資で、地道にやっていこうと思います。
今回はシステムトレードの達人の田村祐一氏と西村剛氏の対談ネタを使ってバックテストしてみる。
システムトレードの達人の田村祐一氏と西村剛氏の対談
フェアトレード株式会社のマスターズ講師である田村祐一氏が西村剛氏と対談しているビデオが公開されていた。
ビデオの中身をリスト化しておく。
【日経平均が上がったが利益は追従していない】
- 昨年のウクライナ侵攻の時と比べると今年は安定している
- 日経平均が26000円から32000円まで上がったが、利益は思ったほど上がってない
- 超大型株は上昇したが個人投資家が対象としている新興株や上場企業でも中小企業はそんなに上がってない
- マザーズ指数はほぼ横ばいで、個人投資家はほとんど利益が出ていない
- 8月末で+15%は稼げている
田村祐一氏は大型株よりマザーズ市場や中小企業をターゲットにしてるように見受けられる発言。
【今年は押し目買いが有効】
- 日経平均が上がったタイミングでトレードが発生して一番稼げたのは順張り。
- 今みたいに一旦日経平均が下がったタイミングで押し目買いをした時に稼げている。
- 移動平均線を使った手法もそこそこ利益を出しているが、移動平均線を使わない押し目買いや順張りが結構利益を出している。
逆張り、順張り、押し目買いそれぞれのストラテジーを持ってるようだ。
【固定値トレードではないストラテもを考えよう】
- 移動平均線はいわゆる固定値の動き。株価が何%下落したという幅で見る。
- 一方で、移動平均のように固定値でトレードする戦略は、それなりに大きく下がってくれないとトレードが発生しないデメリットがある。
- 今のように緩やかに上下を繰り返している相場は、値動きが比較的小さいので、押し目買いのチャンス。
- このため、固定値で大きく下落しているような指標より、少し「売られすぎているね」という指標を使ったほうが利益が出やすい。
売られすぎかを判断するための指標として「オシレーター系テクニカル指標」がある。
具体的には
- サイコロジカル・ライン
- RSI
- ストキャスティクス
などがある。
【マルチストラテジーは複数持て】
- マルチストラテジーは2つ以上(複数持つこと)を持つことを推奨している。
- 一つのマルチストラテジーはしっかり利益を出すストラテジー(例:移動平均線と終値の乖離値)
- もう一つは、それを補完するような移動平均線を利用しない(固定値がハマらない相場向け)ストラテジーを用意する
- わざわざマルチストラテジーを2つ用意するということは、王道の移動平均線とトレードする銘柄のタイミングが被らないようにする(補完が目的)。
これは既出で、よく知ってる。
【普段使ってないテクニカル指標にも目を向けろ】
- システムトレードというのは検証すればするほど、利益が得られる投資手法
- 普段自分が使い慣れているテクニカル指標(「移動平均線」や「移動平均線と終値の乖離値」)ばかり使うのはやめてみよう。
- 他にもBB、RSI、サイコロジカルラインのようなあまりシステムトレードで使われてない指標はすごく有効で時とタイミングでは移動平均線より利益を出す方法も幾つかある。
これ……当たり前な気がするが、シス達のトレーダーは、移動平均線ばかりなのか……。
このブログ記事では複雑なストラテジーを作り過ぎたね。
西村剛氏が「移動平均線」ばかり質問しているので「移動平均線以外の指標に目を向けよう」と語りたい田村祐一氏の説明が中途半端に終わってしまった感があるが、紫苑氏がブログで次のようにフォローしていた。
特に重要なのは9分28秒あたりからです。
「固定値ではないBB、RSI、サイコロジカルライン(を使って別のマルチを作る)」(´゚д゚`)
これ、無料の動画ですよね。
サービス良すぎませんか。
むしろシス達ユーザーは、この程度の情報を得るのに金を払うのか……。
と驚いたが、それはさておき「RSI」「サイコロジカルライン」を使ってストラテジーを作ってみよう。
単に相対値のパラメータを使ってみましょうといういうことではなく、相対値をメインのパラメータにしても有効な(≒固定値と同レベルの)ストラテジーが書けるという事実が、(私にとっては)「有料級」という意味で書きました。
と紫苑氏のブログに記載あり。
サイコロジカルライン&RSI&BBの組み合わせ期待値検証
サイコロジカルラインは過去一度しか使ったことがない。
どう組み合わせるのか?の情報が一切ないので、基本値を使ってみた。
【銘柄抽出】
- 売買代金1千万円以上&終値200円以上の全銘柄
【仕掛けのルール】
- 1) サイコロジカルライン(12日)が25%以下
- 2) RSI(14日)が25%以下
- 3) ボリンジャーバンド(20日)が-2σにレートが達した時、+2σにレートがはみ出した時
【手仕舞いのルール】
終値が次の場合に手仕舞いとする。
- 1) 利食い:5%以上の含み益が出た場合
- 2) 損切り:5%以上の含み損が出た場合
- 3) 損切り:10日以上持っていた場合
なおネットサーフィン中に「サイコロジカルライン組み合わせ相性ランキング」を見つけた。
テクニカル指標 | 利益 |
---|---|
対ボリンジャーバンド(逆張り) | +4089円 |
単独使用 | +3538円 |
対移動平均線 | +2291円 |
対ストキャスティクス | +2030円 |
対RSI | +1392円 |
対MACD | -841円 |
対ボリンジャーバンド(順張り) | -1102円 |
対ブレイクアウト | -1247円 |
対ブレイクダウン | -1508円 |
対一目均衡表 | -2204円 |
これ12年前のFXのブログだけどよく調べてあって凄い。
バックテスト結果
全銘柄対象で計算時間は約2時間。
バックテスト結果は次のとおり。
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 |
株価データ: 日足 銘柄リスト: 全銘柄 2000/01/06~2023/08/30における成績です。 ---------------------------------------- 全トレード数 5696 勝ちトレード数(勝率) 2884(50.63%) 負けトレード数(負率) 2812(49.37%) 全トレード平均利率 0.62% 勝ちトレード平均利率 5.50% 負けトレード平均損率 -4.38% 勝ちトレード最大利率 114.63% 負けトレード最大損率 -79.31% 全トレード平均期間 7.56 勝ちトレード平均期間 7.57 負けトレード平均期間 7.55 ---------------------------------------- 必要資金 ¥2,748,900 最大ポジション(簿価) ¥2,999,200 最大ポジション(時価) ¥3,558,620 純利益 ¥16,715,020 勝ちトレード総利益 ¥72,520,980 負けトレード総損失 -¥55,805,960 全トレード平均利益 ¥2,935 勝ちトレード平均利益 ¥25,146 負けトレード平均損失 -¥19,846 勝ちトレード最大利益 ¥559,300 負けトレード最大損失 -¥395,600 プロフィットファクター 1.30 最大ドローダウン(簿価) -¥3,537,492 最大ドローダウン(時価) -¥3,543,182 ---------------------------------------- 現在進行中のトレード数 7 ---------------------------------------- 平均年利 25.34% 平均年利(直近5年) 15.08% 最大連勝 11回 最大連敗 14回 ---------------------------------------- [年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2023年 127回 ¥561,619円 20.43% 56.69% 1.78倍 -10.10% 2022年 206回 ¥320,810円 11.67% 59.22% 1.24倍 -14.55% 2021年 229回 ¥1,392,362円 50.65% 58.95% 2.01倍 -12.08% 2020年 216回 -¥354,548円 -12.90% 49.54% 0.88倍 -79.31% 2019年 210回 ¥152,575円 5.55% 50.48% 1.10倍 -37.43% 2018年 237回 -¥389,662円 -14.18% 46.41% 0.81倍 -17.51% 2017年 219回 ¥472,950円 17.21% 53.42% 1.37倍 -10.63% 2016年 225回 ¥664,126円 24.16% 56.44% 1.41倍 -15.60% 2015年 223回 ¥24,711円 0.90% 52.02% 1.01倍 -23.20% 2014年 212回 ¥774,100円 28.16% 59.91% 1.52倍 -27.03% 2013年 202回 ¥1,696,350円 61.71% 59.41% 2.09倍 -24.29% 2012年 226回 ¥46,966円 1.71% 51.33% 1.02倍 -16.11% 2011年 230回 ¥1,108,788円 40.34% 53.91% 1.48倍 -33.40% 2010年 243回 ¥1,440,260円 52.39% 61.73% 1.66倍 -31.69% 2009年 257回 ¥603,230円 21.94% 55.64% 1.19倍 -30.30% 2008年 295回 -¥1,455,966円 -52.97% 45.08% 0.76倍 -53.85% 2007年 278回 -¥637,400円 -23.19% 48.20% 0.83倍 -29.36% 2006年 257回 -¥442,276円 -16.09% 46.69% 0.87倍 -33.70% 2005年 243回 ¥1,611,950円 58.64% 64.20% 2.09倍 -15.19% 2004年 244回 ¥787,680円 28.65% 61.48% 1.38倍 -18.70% 2003年 268回 ¥2,741,900円 99.75% 63.06% 2.27倍 -14.87% 2002年 292回 ¥1,554,390円 56.55% 58.22% 1.49倍 -21.15% 2001年 285回 ¥1,312,300円 47.74% 54.04% 1.38倍 -25.00% 2000年 272回 ¥2,727,800円 99.23% 59.19% 2.13倍 -35.48% |
利益曲線は次のとおり。
リーマンショック時期の落ち具合がエグいが全体的にはプラスなグラフとなった。
カスタマイズすれば全体的にプラスなグラフになる可能性はあるだろう。
おわりに
ビデオが紹介していたように移動平均線のテクニカル指標を使わずストラテジーを作ってみた。
このようにストラテジーを増やして、マルチストラテジーで安定運用することで利益追求をしているのかな?
ただ平均年利は10%、直近5年は5%未満。
世界株のインデックス投資の方が儲かりそうだ。
ソースコード
バックテストには無料OSSの「Protra」を利用した。
TIlib、Utility、TrendCheck、TOPIXライブラリはGitHubに置いている。
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 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 |
# loop-type: date-only //============================== require "TIlib" require "Utility" require "TrendCheck" // ====================================== // サイコロジカル+ボリンジャーバンド+RSI手法 // ====================================== // //【仕掛けのルール】 // 1) サイコロジカルラインが25%以下 // 2) RSI(14日)が25%以下 // 3) ボリンジャーバンドが-2σにレートが達した時、+2σにレートがはみ出した時 // //【手仕舞いのルール】 // 1) 利食い:5%以上の含み益が出た場合 // 2) 損切り:5%以上の含み損が出た場合 // 3) 損切り:10日以上持っていた場合 codes = CodeList if ($code_num && $code_num != Length(codes)) Print("前回と異なる銘柄リストでは実行できません。") Dummy end $code_num = Length(codes) //グローバル変数を初期化 if (!$__INIT__) $budgetIni = 3000000 $buyUnit = 500000 // 1回の購入資金 (50万円) $MaxHoldDay = 7 // 最大保有日数 $shortSelling = 0 // 空売り戦略 Yes(1)/No(0) $Interest = 1 // 無制限(0) / 単利(1) / 複利(2) $reverse = 0 // 購入順序 昇順(0) / 降順(1) $udcount = 0 // 騰落レシオ利用数 Init() //------------------------------------------------ $PSY = [$code_num] $RSI = [$code_num] $BB = [$code_num] //------------------------------------------------ InitDone() // 騰落レシオ初期化 $__INIT__ = 1 end def Main(i) //================================================== // 条件(買条件, 売条件共通部分) //================================================== //まだ上場していない銘柄は株価データがないためnullが返る if (Index == null) return end if ($order[(int)Code] == -1) $order[(int)Code] = i end if ! ($PSY[i]) // 銘柄ごとのグローバル変数を初期化する $PSY[i] = Psycho_new(12) $RSI[i] = RSI_new(14, 0) $BB[i] = BB_new(20) $hold[i] = 0 return end //指標の計算を1日進める Psycho_next($PSY[i]) RSI_next($RSI[i]) BB_next($BB[i]) //================================================== // 保有してない→購入 //================================================== if (! $hold[i]) psy = Psycho_value($PSY[i]) rsi = RSI_value($RSI[i]) bb_v = BB_value($BB[i]) bb_d = BB_deviation($BB[i]) if ! (psy && rsi && bb_v && bb_d && Close) return end //================================================== // 売買(買い) //================================================== // 1) サイコロジカルラインが25%以下 flag1 = psy <= 25 if ! (flag1) return end // 2) RSI(14日)が25%以下 flag2 = rsi <= 25 if ! (flag2) return end // 3) ボリンジャーバンドが-2σにレートが達した時、+2σにレートがはみ出した時 flag3 = (Close >= bb_v + 2 * bb_d || bb_v - 2 * bb_d >= Close) if ! (flag3) return end if (1) $buyflag[i][0] = 1 $buyflag[i][1] = rsi $buyflag[i][2] = 1 $buyCnt = $buyCnt + 1 end //================================================== // 保有している→売却 //================================================== elsif ($hold[i]) if ($set[i] < 1) $set[i] = 1 return end $set[i] = $set[i] + 1 //================================================== // 売買(売り) //================================================== // 1) 利食い:5%以上の含み益が出た場合 if (Close >= 1.05 * $buy[i]) PrintLog("利食い") $sellflag[i] = 1 $set[i] = 0 // 3) 損切り:5%以上の含み損が出た場合 elsif (Close <= 0.95 * $buy[i]) PrintLog("損切り") $sellflag[i] = 1 $set[i] = 0 // 4) 損切り:10日以上持っていた場合 elsif ($set[i] >= $MaxHoldDay) PrintLog("損切り") $sellflag[i] = 1 $set[i] = 0 end end end //==================== // 買い処理 //==================== def SortBuy() if ! (HasPricedata({1}Open)) return end $long = 0 $long = Num($buyUnit, Close) codeset = $order[(int)Code] Buying(codeset) end //==================== // 売り処理 //==================== def Sell_(i) if ($sellflag[i]) Selling(i) $sellflag[i] = 0 $buyflag[i][2] = 0 end // 使用した$buyflag 配列を初期化 if ($buyflag[i][0]) $buyflag[i][0] = 0 $buyflag[i][1] = 0 end end //==================== // 銘柄コードを変えながらMain関数,BuySell関数を実行 //==================== Print("-------------------------------------------------") Print("日付 = "+ Year + "/" + Month + "/" + Day) $buyCnt = 0 // 購入数初期化 i = -1 while (i + 1 < $code_num) i = i + 1 {codes[i]}Main(i) end i = 0 if ($buyCnt) sortList = SelectionSort(10, 0) cnt = $buyCnt if ($buyCnt > 10) cnt = 10 end while i < cnt {sortList[i]}SortBuy() i = i + 1 end end //---------------------------------------------- i = -1 while (i + 1 < $code_num) i = i + 1 {codes[i]}Sell_(i) end |