LoginSignup
6

More than 5 years have passed since last update.

社会の問題をデータ分析でーインベスターZに出てきたロスカットルールを日経平均で試すー

Posted at

社会の実際の問題にデータ分析を適用してみるシリーズ。

TV東京『インベスターZ』を観ていたら第2回にロスカットルールが出て来た。これが正しいのかどうか日経平均で試してみました。

ちなみに私は『全面改訂 ほったらかし投資術

をはじめとする、インデックスを長期に保持、するのが正統な方法と思っておりますので、ロスカットルールには否定的ですし、インベスターZを2回目まで見た範囲では「それは『投資』ではなく『投機』だろと」と突っ込みたくなる。というスタンスです。

データと検証内容

どのデータでもよくTOPIXでやろうかと思ったのだけれどすぐ見つからずN225にして見た
(つかわたし自身この「社会の問題を」シリーズで前回は「社会の問題をデータ分析でー株価と正規分布ー」にてTOPIXを使っていたのを今気づいた、他意はないお許しを)

R

  • ダウンロードしたファイル '^N225.csv' (日経平均日次)の終値を用いる。
    • ザックリ過去20年。乱高下はあるが最終的に値上がりしているのでそれほど厳しい条件では無い。
  • 売買手数料は無視
    • これも売買を繰り返すのにかなり有利な条件
  • 初期所持金が少ないとすぐ破産するので1,000万円とした。
    • この時点でもうロスカットルールと言えども売買を繰り返すのが無理だけどね。
  • 議論の簡単のため
    • 買い
      • 追加の買いはなし。で売り待ち。売った後ならまた買える。
      • 買うタイミングはロスカットルール に直接関係ないので今回はランダム。
    • 売り
      • ロスカットルールにて
      • 比較の為に売りもランダムを試す
  • 1000回繰り返してリターンの平均値を取る。
  • パラメタを切り替えて色々試す
    • ロスカットルールのパーセンテージ
    • 買い、売りのタイミング(ランダムの閾値)
N225<-read.csv('^N225.csv')
val<-as.numeric(as.character(N225$Close))
val<-na.omit(val)
plot(val, type = 'l')

SELL.RATE.1<-10    # ロスカットルール 
SELL.RATE.2<--5    # ロスカットルール

set.seed(1)
sum.money<-0
sum.flg<-0
for (i in 1:1000) {
  flg<-''
  money<-10000000
  buy<-val[1]
  money<-money - buy
  cnt.buy<-1
  cnt.win<-0
  cnt.loose<-0
  #set.seed(1)
  for (j in 2:length(val)) {
    if (buy > 0) {
      current<-(val[j] - buy) / buy * 100
      # 売り
      ## ロスカットルールとランダムを切り替え
      if (current >= SELL.RATE.1 || current <= SELL.RATE.2) {
      #if (runif(1, 0, 1) <= 0.1) {
        money<-money + val[j] - buy
        buy<-0
        if (current > 0) {
          cnt.win<-cnt.win + 1
        } else {
          cnt.loose<-cnt.loose + 1
        }
      }
    } else {
      # 買い ランダム
      if (runif(1, 0, 1) <= 0.1) {
        buy<-val[j]
        money<-money - buy
        cnt.buy<-cnt.buy + 1
      }
    }
    if (money <= 0) {
      flg<-'crash!!'
      sum.flg<-sum.flg + 1
      break
    }
  }
  money<-money + buy
  sum.money<-sum.money + money
  print(paste(i, j, flg, money, cnt.buy, cnt.win, cnt.loose))
}
print(sum.flg)
print(sum.money / 1000)

結果

  • 買いのタイミング
    • 株価は無視して、0.1であれば10%の確率で買い。
ロスカットルール 買いのタイミング 最終的な金額 10,000,000円を投資してのリターン
10%, -5% 0.8 8,024,947
0.5 8,120,050
0.4 8,157,224
0.3 8,227,019
0.2 8,332,130
0.1 8,559,864
0.01 9,506,765
0.001 9,922,825
0.0001 9,980,558

負け、単純に買いを減らす=取り引き回数を減らした方がマシという結果。

念のためロスカットルールのパーセンテージを変えてみた。初心者は10%, -5%だが上級者は20%, -10%となっているらしい。

ロスカットルール 買いのタイミング 最終的な金額 10,000,000円を投資してのリターン
20%, -10% 0.8 9,374,945
0.5 9,415,226
0.1 9,469,031
0.01 9,708,350
0.001 9,929,399
0.0001 9,977,889

負け、単純に買いを減らす=取り引き回数を減らした方がマシという結果。

ザックリだが、ちがうパーセンテージも試してみた。

ロスカットルール 買いのタイミング 最終的な金額 10,000,000円を投資してのリターン
10%, -20% 0.5 9,432,318
0.1 9,494,275
10%, -10% 0.5 8,916,907
0.1 9,089,608

だめ。

売りのタイミングもロスカットルールではなく、単純にランダムとしてみた。

売りのタイミング 買いのタイミング 最終的な金額 10,000,000円を投資してのリターン
0.5 0.5 途中で資金切れ破たん
0.1 0.1 6,490,592
0.01 0.01 9,654,214
0.001 0.001 9,963,579
0.0001 0.0001 9,993,850

確かにランダムで頻繁に売買をくり返すよりはマシなのかも知れない、ロスカットルール は。ただリターンがマイナスでは、、、最初に買ってずっと持ったままの方がマシ。

ということで、ほったらかし投資の便法のひとつ、ドルコスト平均法を試す

  • 当初資金は上記と同じ1,000万円だが、月々5万円ずつ投資するイメージで
  • 正確に1ヵ月ではないが、N225でデータの得られたスパンにて30置きで購入
  • 最後に売る
money<-10000000
spend<-0
sum.stocks<-0
for (j in seq(1, length(val), 30)) {
  if (j %% 30 == 1) {
    num.buy<-as.integer(50000 / val[1])
    money<-money - val[1] * num.buy
    spend<-spend + val[1] * num.buy
    sum.stocks<-sum.stocks + num.buy
  }
  if (money <= 0) {
    flg<-'crash!!'
    sum.flg<-sum.flg + 1
    break
  }
}
money<-money + sum.stocks * val[length(val)]
print(paste(money, spend))

リターン 13,924,707
しかも総投資額1,000万円ではなく 7,583,117 だからもっと効率いいね。
(補足、検証期間の最後で株価が上がっている例。ドルコスト平均法への批判として、下がり続けていたら負けが混むについてはここでは検証の範囲外ですし、ドルコスト平均法全面推しではないので念のため)

結論

「ロスカットルールだから大丈夫などと素人は信じない方が良さそう」

かなりラフな検証なのでツッコミどころは多々あるかと思いますが、
ロスカットルールで頻繁に売買を繰り返す側にかなり有利なルールとしても勝ててない
買いのタイミングや銘柄選択もあるだろう
というツッコミも有り得ますが、それはロスカットルールとは関係ないですしね

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6