【R】株主優待銘柄の市場アノマリー検証

今回は, 最近読んだ `ロボット運用のプロが分析してわかった 最強の株式投資法` の第5章に出てくる 株主優待銘柄のアノマリーの検証 を R でやってみた。

市場アノマリー

アノマリーというと異常検知などの話を思い浮かべたりするが, 金融市場におけるアノマリー (market anomaly) は Wikipedia によると, 効率的市場仮説と矛盾するような金融市場の価格およびリターンのねじれ現象を指すらしい。例えば, Sell in May は米国で有名なアノマリーとして知られ, 5月に売って9月に買えという意味。

実際に株主優待銘柄は権利確定日まで株価が上がり, 権利落ち日に大きく下がることは目にすることがある。
市場アノマリーが経験則に近い現象であるとすると, 過去のデータから検証することができる。

検証の準備

今回は株主優待銘柄における市場アノマリーの検証を行うが, 優待権利日や配当による影響は考えずに単純にキャピタルゲインにのみ注目する。

書籍の中では, TradeStation の機能を用いて検証を行なっているが, R で試してみた。
また, 銘柄は書籍と同様に代表的な株主優待銘柄の ANA (9202) で検証してみる。

データは YahooFinance から日足を取得した。

9202-chart

1/1を起点として, n 日後 (n=1,2…365) に買い, その m 日後 (n=1,2…365) に決済する投資戦略とした場合に, いつ買っていつ売るのが成績が良いかを探す。年間の平日日数は 245日 前後らしいが, 平日判定はせずにレコードがなければ次の日を探すようにした。

n, m を固定し毎年取引を繰り返すバックテスト(2000/1/1 ~ 2011/12/31) を行い, 累積収益が最大になった時の n, m を最適なパラメータとする。評価は, 他にもPF, 平均対数収益率で合っても良いと思う。

いずれの指標にしても最大値となる場合だけで n, m が最適として良いかは疑問も残るが, 権利落ち日を除いて数日ずれても時系列データのため大きく結果は変わらないようにも思えるので大雑把でやってみる。

Rでシミュレーション

買う日 n と売る日 n + m のレコードを抽出し, date で sort し trade() に渡す。

simulate_back <- function(df, i, j){
  head_year <- head(df, n = 1)$year
  start <- as.Date(paste(head_year, "/1/1", sep="")) + i

  entry <- select(df, start, 2011) %>% mutate(type = "entry")
  exit <- select(df, start + j, 2011) %>% mutate(type = "exit")
  ret <- trade(rbind(entry, exit) %>% arrange(date))

  return(data.frame(x = i, y = j, z = tail(ret, n = 1)$ret.cumsum))
}

trade() は, 収益, 対数収益率, 累積収益を計算する。売買手数料は 0.05% とする。

trade <- function(df) {
  r <- df %>% mutate(
      ret = (close - lag(close, n = 1)) * unit - (close * unit * 0.0005),
      ret.log = (log(close/lag(close, n = 1)))) %>%
    filter(type == "exit") %>%
    mutate(ret.cumsum = cumsum(ret))
}

しらみつぶしに探索するだけなので面白みはあまりない。メモリや計算効率は気にせずな感じ…

sim.back <- lapply(seq(1,360), function(i) lapply(seq(1,360), function(j) simulate_back(price.back, i, j)))

パラメータと累積収益の関係。赤が収益がプラス, 青がマイナスの領域。n=320, m=110 辺りが良さそう。

9202-tile

シミュレーション結果

得られたパラメータを使って, フォワード期間を含む全期間でシミュレーションを行う。
これで直近の成績が悪かったら, アノマリーが通用しなくなった可能性もある。

ANA (9202) の結果。

  • 買: 11/21
  • 売: 03/24
  • PF: 23.56
  • 勝率: 0.93
  • 累積収益: 680024

決済ごとの資産推移。

9202-cumsum

伊藤園 (2593) でも試してみた。

  • 買: 03/15
  • 売: 04/04
  • PF: 196.81
  • 勝率: 0.938
  • 累積収益: 632374

2000年以降, 株価は下落傾向にあるのでマイナスの領域が広く, 100日以上保有するとほぼマイナスとなった。

決済ごとの資産推移。

2593-cumsum

ANAや伊藤園は2016年時点でも依然として, この投資戦略は有効のようだ。

おわりに

保有期間が長いとボラティリティ, VaR などが高くなるので, 投資効率を考慮して 合計収益 / 保有日数 を評価指標にしても良いと思った。保有期間を絞れば m を小さくできるので計算時間も短くできる点も良い。

権利確定日を跨ぐ場合は, 配当+優待利回りが高い銘柄は収益に加えると結果が変わるかもしれないが, 今回はここまで。

宣伝になりますが, 配当+優待利回り をチェックできる 株主優待サーチ(iOS) を作りました。

最近の金融と機械学習に関する話のガイドとしては `人工知能が金融を支配する日` がわかりやすかったので, より機械学習的なアプローチに興味がある場合は一読しておくと良さそう。