Rで触れる日本の経済
                  ~RでVAR編~

         2012/10/20
         Tokyo.R#27
           和田 計也

サイバー系
サイバー系


     はじめに



     ※この発表は個人の
     見解であり、所属す
     る組織の公式見解で
     はありません。

2012/10/20               1
サイバー系


     自己紹介

  和田 計也(@wdkz)
         静岡県袋井市出身




  サイバー系企業でデータマイニングエンジニア職
         最近は奥華子ばっか聴いてます



  前職はバイオベンチャー
         バイオマーカ探索してた
         学生時代は枯草菌の研究




2012/10/20                          2
サイバー系


     最近の株価と為替相場

    企業のグローバル化(仮)に伴って、円高(為替)が株価に与える
     影響が大きい昨今なんじゃないかと思ってみたり




2012/10/20                               3
サイバー系


     今日のお話

    企業の株価はYFinaceYJパッケージで取得
                Tokyo.R主催者作


    ドル⇔円の為替相場はYahoo! Japanからとってくる
                自作


    VAR(ベクトル自己回帰モデル)でモデル化
                米ドル⇔円の為替相場に影響されてる株はどれかな?




2012/10/20                                          4
サイバー系


     RFinanceFJパッケージで株価取得


        library(RFinanceYJ)
        dna <- quoteStockTsData(‘2432.t’, since=‘2012-01-01’)   #SNS
        mizuho <- quoteStockTsData(‘8411.t’, since=‘2012-01-01’) #金融
        sony <- quoteStockTsData(‘6758.t’, since=‘2012-01-01’)    #電機
        toyota <- quoteStockTsData(‘7203.t’, since=‘2012-01-01’) #自動車
        takeda <- quoteStockTsData(‘4502.t’, since=‘2012-01-01’) #製薬

        head(dna) #↓以下のようなdata.frame型でデータ取得できる
                   date open height low close volume adj_close
        198 2012-01-04 2321 2325 2285 2292 2077200       2292
        197 2012-01-05 2288 2290 2217 2222 2882400       2222
        196 2012-01-06 2235 2238 2111 2117 5601200       2117
        195 2012-01-10 2092 2099 2000 2027 5049000       2027
        194 2012-01-11 2005 2060 1891 1899 9326000       1899
        193 2012-01-12 1922 1973 1883 1946 11128900      1946




2012/10/20                                                                      5
サイバー系


     自作関数で為替情報取得


        #米ドル
        dollar <- getCurrencyEx(start.dt=‘2012-01-01’, end.dt=Sys.Date()-1)

        head(dollar) #↓以下のようなdata.frame型でデータ取得できる
                     date open   height    low  close
        207 2012-01-02 76.9300 77.1200 76.8399 76.8600
        206 2012-01-03 76.8799 76.9599 76.5899 76.6200
        205 2012-01-04 76.6900 76.8199 76.5800 76.6699
        204 2012-01-05 76.6999 77.2300 76.6500 77.1699
        203 2012-01-06 77.1200 77.3199 76.9499 76.9800
        202 2012-01-09 76.8899 77.0000 76.7500 76.8300




2012/10/20                                                                            6
サイバー系


     (参考)getCurrencyEx関数_1
getCurrencyEx <- function(start.dt=as.Date(“2012-01-01”), end.dt=(Sys.Date()-1),
                               type=c("d", "w", "m"), currency.from="USD", currency.to="JPY"){
   url.str <- paste("http://info.finance.yahoo.co.jp/history/?code=", currency.from, currency.to,
                     "%3DX&sy=", as.POSIXlt(start.dt)$year+1900, "&sm=",
                      as.POSIXlt(start.dt)$mon+1, "&sd=", as.POSIXlt(start.dt)$mday, "&ey=",
                      as.POSIXlt(end.dt)$year+1900, "&em=",
                      as.POSIXlt(end.dt)$mon+1, "&ed=",
                      as.POSIXlt(end.dt)$mday, "&tm=", type[1], sep="")
 #内部関数_必要データのリンク(ベクトル)を取得
  getLinks <- function(url.str){
   res.html <- RCurl::getURL(url.str)
   res.htmlv <- unlist(strsplit(res.html, "¥n"))
   s.idx <- which(res.htmlv %in% "<!--時系列-->")
   e.idx <- which(res.htmlv %in% "<!--アフィニティ-->")
   res.htmlv2 <- res.htmlv[s.idx:e.idx]
   ts.data <- res.htmlv2[grep("^</tr><tr><td>.*", res.htmlv2)]
   links <- res.htmlv2[grep("<!--ページング-->", res.htmlv2)]
  links2 <- unlist(strsplit(links, "[</a>|</span>]<a href=¥¥¥""))
   links3 <- links2[grep("^http://.*p=¥¥d¥¥¥" title=", links2)]




2012/10/20                                                                                          7
サイバー系


     (参考)getCurrencyEx関数_2
 if(length(links3)==0){
       return(url.str)
     }else{
       return(c(url.str, unlist(lapply(strsplit(links3, "¥¥¥" title="), function(x){x[1]}))))
     }
  }
url.links <- getLinks(url.str)
#内部関数_urlから必要データ取得
  get.tbl <- function(url.str1){
     res.html <- RCurl::getURL(url.str1)
    res.htmlv <- unlist(strsplit(res.html, "¥n"))
     s.idx <- which(res.htmlv %in% "<!--時系列-->")
     e.idx <- which(res.htmlv %in% "<!--アフィニティ-->")
     res.htmlv2 <- res.htmlv[s.idx:e.idx]
     ts.data <- res.htmlv2[grep("^</tr><tr><td>.*", res.htmlv2)]
     ts.data2 <- unlist(strsplit(ts.data, "</tr><tr><td>"))
     ts.data3 <- matrix(unlist(strsplit(ts.data2, "</td><td>")), ncol=5, byrow=TRUE)




2012/10/20                                                                                              8
サイバー系


     (参考)getCurrencyEx関数_3
  ts.data3[grep("¥¥d+</td>", ts.data3[,5]),5] <- gsub("[</td>|</td></tr><table>]","",
ts.data3[grep("¥¥d+</td>", ts.data3[,5]),5])
     ts.data3 <- as.data.frame(ts.data3, stringsAsFactors=FALSE)
     ts.data3[,2] <- as.numeric(ts.data3[,2]);          ts.data3[,3] <- as.numeric(ts.data3[,3])
     ts.data3[,4] <- as.numeric(ts.data3[,4]);          ts.data3[,5] <- as.numeric(ts.data3[,5])
     ts.data3[,1] <- as.Date(gsub("日", "", gsub("[年|月]", "-", ts.data3[,1])))
     colnames(ts.data3) <- c("date", "open", "height", "low", "close")
     return(ts.data3)
   }
   for(i in 1:length(url.links)){
     if(i==1){
       ret.tbl <- get.tbl(url.links[i])
     }else{
       ret.tbl <- rbind(ret.tbl, get.tbl(url.links[i]))
     }
   }
   return(ret.tbl[nrow(ret.tbl):1, ])
}




2012/10/20                                                                                                 9
サイバー系


     VARについて

 VAR(ベクトル自己回帰モデル)

             𝑦 𝑡 = 𝑐 + 𝐴1 𝑦 𝑡−1 + 𝐴2 𝑦 𝑡−2 + ・・・ + 𝐴 𝑝 𝑦 𝑡−𝑝 + 𝑒 𝑡
  まああれだ、ARの多変量版


                                p個前の過去データでモデリング

       これが1x kのベクトルになってて
       多変量になってる


                              壊れるほど愛
                              しても1/3も伝
                              わらないって
                              本当かい!?



2012/10/20                                                               10
サイバー系


     前述の関数を使って、データを取得してdata.frameに
  #2432;     ディー・エヌ・エー
  #4502;     武田薬品工業                                           とりあえず2012年
  #6758;     ソニー                                              のデータを取得
  #7203;     トヨタ自動車
  #8411;     みずほフィナンシャルグループ
  res.list <- list(
                      dollar=getCurrencyEx(start.dt="2012-01-01", end.dt=Sys.Date()-1),
                      dna=quoteStockTsData('2432.t', since='2012-01-01'),
                      takeda=quoteStockTsData('4502.t', since='2012-01-01'),
                      sony=quoteStockTsData('6758.t', since='2012-01-01'),
                      toyota=quoteStockTsData('7203.t', since='2012-01-01'),
                      mizuho=quoteStockTsData('8411.t', since='2012-01-01')
              )

  #data.frameにするために、必要な項目だけ抽出
  res.list2 <- lapply(res.list, function(x){
                       y <- as.data.frame(matrix(c(as.character(x$date),
                                                    (x$height+x$low)/2), ncol=2),
                                             stringsAsFactors=FALSE);
                       colnames(y) <- c("date", "price");
                       y$date <- as.Date(y$date);
                       y$price <- as.numeric(y$price); return(y)})


2012/10/20                                                                            11
サイバー系


     前述の関数を使って、データを取得してdata.frameに
   #為替相場と株価情報とで共通に存在する日を抽出
   for(i in 2:length(res.list2)){
     if(i==2){
       all.day <- intersect(as.character(res.list2[[i-1]]$date),
                             as.character(res.list2[[i]]$date))
     }else{
       all.day <- intersect(all.day, as.character(res.list2[[i]]$date))
     }
   }
   res.list3 <- lapply(res.list2, function(x){x[as.character(x$date) %in% all.day,]})

   #listをdata.frameに変換
   res.df <- as.data.frame(do.call(cbind, res.list3))
   rownames(res.df) <- res.df[,grep(".*¥¥.date", colnames(res.df))[1]]
   res.df <- res.df[,-grep(".*¥¥.date", colnames(res.df))]




2012/10/20                                                                              12
サイバー系


     こんな感じのdata.frame
   head(res.df)
                 dollar.price dna.price takeda.price   sony.price mizuho.price toyota.price
   2012-01-04    76.69995      2305.0       3407.5       1405.5        106.5       2627.0
   2012-01-05    76.94000      2253.5       3390.0       1379.0        108.0       2646.0
   2012-01-06    77.13490      2174.5       3347.5       1347.5        107.0       2631.5
   2012-01-10    76.82000      2049.5       3340.0       1354.0        108.0       2635.0
   2012-01-11    76.90995      1975.5       3287.5       1352.5        109.0       2624.0
   2012-01-12    76.80995      1928.0       3247.5       1331.0        109.0       2604.5

    plot(ts(res.df))




2012/10/20                                                                                    13
サイバー系


     米ドル・株価を増減率に
   レンジを揃えるために前日からの増減率(-1 ~ 1)に変換
   res.diff <- apply(res.df, 2, diff) #前日との差分
   res.per <- res.diff/res.df[-1,]    #前日からの増減差分
   head(res.per)
                dollar.price     dna.price takeda.price   sony.price mizuho.price toyota.price
   2012-01-05    3.12e-03      -0.022853     -0.00516     -0.01922      0.01389      0.00718
   2012-01-06    2.53e-03      -0.036330     -0.01270     -0.02338     -0.00935     -0.00551
   2012-01-10   -4.10e-03      -0.060990     -0.00225      0.00480      0.00926      0.00133
   2012-01-11    1.17e-03      -0.037459     -0.01597     -0.00111      0.00917     -0.00419
   2012-01-12   -1.30e-03      -0.024637     -0.01232     -0.01615      0.00000     -0.00749
   2012-01-13    6.51e-05      -0.000779     -0.00776      -0.00301     0.00000      0.01026
    plot(ts(res.per))




2012/10/20                                                                                       14
サイバー系


     VARするちょい手前

   tseries::adf.test(res.per[,1]) #単位根検定でランダムウォークじゃないことを確認して
   Augmented Dickey-Fuller Test
   data: res.diff[, 1] Dickey-Fuller = -9.06, Lag order = 1, p-value = 0.01
   alternative hypothesis: stationary
    警告メッセージ:
   In tseries::adf.test(res.diff[, 1], k = 1) :
   p-value smaller than printed p-value

    vars::VARselect(res.per, lag.max=7, type=“const”) #AICを基準に次数決め
   $selection
   AIC(n) HQ(n) SC(n) FPE(n)
                                    AICにより次数1が最適。
        1     1      1         1    つまり1日前のデータから当日のデータを説明するのがベストってこと
   $criteria
                 1        2           3          4         5           6          7
   AIC(n) 2.64e+01 2.64e+01    2.66e+01   2.68e+01   2.69e+01   2.70e+01   2.71e+01
   HQ(n) 2.67e+01 2.69e+01     2.74e+01   2.78e+01   2.82e+01   2.85e+01   2.89e+01
   SC(n) 2.71e+01 2.77e+01     2.85e+01   2.93e+01   3.01e+01   3.08e+01   3.15e+01
   FPE(n) 2.87e+11 2.90e+11    3.47e+11   4.20e+11   4.99e+11   5.56e+11   6.30e+11




2012/10/20                                                                            15
サイバー系


     VARする
   var.result <- vars::VAR(res.per, p=1, type=“const”) #次数1ってことでp=1
   summary(var.result)      #サマる
   Estimation results for equation dollar.price:
   =============================================
   sony.price = dollar.price.l1 + dna.price.l1 + takeda.price.l1 + sony.price.l1
                            + mizuho.price.l1 + toyota.price.l1 + const

                      Estimate Std. Error t value Pr(>|t|)
   dollar.price.l1   1.63397 0.47930         3.41 0.0008 ***
   dna.price.l1       0.03380 0.04337        0.78 0.4368
   takeda.price.l1    0.31132 0.20048        1.55 0.1221
   sony.price.l1     0.02458 0.09488         0.26 0.7958
   mizuho.price.l1    0.18670 0.16119        1.16 0.2482
   toyota.price.l1   -0.20480 0.16619       -1.23 0.2194
   const             -0.00233 0.00153       -1.52 0.1303




 明日のソニー株価価格の増減割合 = 1.6*今日の1ドルの円価格増減割合 + 0.034*今日のDeNA株価の価格増減割合
                + 0.31*今日の武田薬品株価の価格増減割合 + 0.024*今日のSony株価の価格増減割合
                + 0.19*今日のみずほ株価の価格増減割合 - 0.204*今日のトヨタ株価の価格増減割合
                 - 0.002




2012/10/20                                                                             16
サイバー系


     VARする_サマる続き
   Estimation results for equation dollar.price:
   =============================================
   dollar.price = dollar.price.l1 + dna.price.l1 + takeda.price.l1 + sony.price.l1 +
                           mizuho.price.l1 + toyota.price.l1 + const

                       Estimate Std. Error t value Pr(>|t|)
   dollar.price.l1    2.99e-01 8.14e-02      3.68 0.00031 ***
   dna.price.l1        4.42e-03 7.37e-03     0.60 0.54932
   takeda.price.l1     2.78e-02 3.40e-02     0.82 0.41602
   sony.price.l1     -3.51e-03 1.61e-02 -0.22 0.82780
   mizuho.price.l1   -1.29e-02 2.74e-02 -0.47 0.63704
   toyota.price.l1    -9.32e-03 2.82e-02 -0.33 0.74149
   const               7.82e-05 2.60e-04     0.30 0.76416

   Estimation results for equation dna.price:
   ==========================================
   dna.price = dollar.price.l1 + dna.price.l1 + takeda.price.l1 + sony.price.l1 +
                          mizuho.price.l1 + toyota.price.l1 + const

                       Estimate Std. Error t value        Pr(>|t|)
   dollar.price.l1   -6.47e-01   7.99e-01   -0.81         0.4190
   dna.price.l1        2.32e-01  7.23e-02     3.21        0.0015 **
   takeda.price.l1     4.20e-01  3.34e-01     1.26        0.2099
   sony.price.l1      1.36e-03   1.58e-01     0.01         0.9932
   mizuho.price.l1     4.77e-01  2.69e-01     1.78         0.0774 .
   toyota.price.l1    -3.28e-01  2.77e-01    -1.18        0.2380
   const              -3.74e-05  2.55e-03    -0.01        0.9883
2012/10/20                                                                                 17
サイバー系


     VARする_サマる続き2
   Estimation results for equation takeda.price:
   =============================================
   takeda.price = dollar.price.l1 + dna.price.l1 + takeda.price.l1 + sony.price.l1
                  + mizuho.price.l1 + toyota.price.l1 + const

                      Estimate      Std. Error t value    Pr(>|t|)
   dollar.price.l1  0.265242       0.186653      1.42     0.1570
   dna.price.l1     0.014896       0.016888       0.88    0.3789
   takeda.price.l1 0.212129        0.078074       2.72    0.0072 **
   sony.price.l1   -0.001617       0.036948     -0.04     0.9651
   mizuho.price.l1 0.010935        0.062772       0.17    0.8619
   toyota.price.l1 -0.063850       0.064720      -0.99    0.3251
   const            0.000231       0.000597       0.39    0.6998

   Estimation results for equation sony.price:
   ===========================================
   mizuho.price = dollar.price.l1 + dna.price.l1 + takeda.price.l1 + sony.price.l1
                   + mizuho.price.l1 + toyota.price.l1 + const

                     Estimate      Std. Error t value     Pr(>|t|)
   dollar.price.l1 0.899054       0.309867      2.90      0.0042 **
   dna.price.l1     0.012549      0.028036       0.45     0.6549
   takeda.price.l1 0.283463       0.129612      2.19      0.0300 *
   sony.price.l1   -0.069961      0.061338     -1.14      0.2555
   mizuho.price.l1 0.240696       0.104209      2.31      0.0220 *
   toyota.price.l1 -0.212064       0.107443 -1.97         0.0499 *
   const            0.000314       0.000991     0.32      0.7520
2012/10/20                                                                               18
サイバー系


     VARする_サマる続き3
   Estimation results for equation takeda.price:
   =============================================
   toyota.price = dollar.price.l1 + dna.price.l1 + takeda.price.l1 + sony.price.l1
                  + mizuho.price.l1 + toyota.price.l1 + const

                         Estimate      Std. Error    t value       Pr(>|t|)
   dollar.price.l1    1.058859        0.316993          3.34       0.001 **
   dna.price.l1        0.024938       0.028681          0.87        0.386
   takeda.price.l1     0.195947       0.132593          1.48        0.141
   sony.price.l1     -0.091743        0.062748        -1.46         0.145
   mizuho.price.l1     0.107951       0.106606          1.01        0.313
   toyota.price.l1    -0.005723       0.109914         -0.05        0.959
   const               0.000186       0.001014          0.18        0.855
   ---
   Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1




2012/10/20                                                                               19
サイバー系


     Grangerの因果検定
   変数Xが変数Yの予測に効いてるかどうか
    MSBVAR::granger.test(res.per, p=1)

                               F-statistic  p-value                                       F-statistic      p-value
 dna.price     -> dollar.price 1.64e-01 0.686204      dollar.price    -> sony.price      1.25e+01       0.000513
 takeda.price -> dollar.price  2.61e-01 0.610062      dna.price       -> sony.price      4.53e-01       0.501593
 sony.price    -> dollar.price 2.04e-01 0.652294      takeda.price    -> sony.price      3.93e+00       0.048861
 mizuho.price -> dollar.price  4.32e-01 0.512008      mizuho.price   -> sony.price       3.49e+00       0.063165
 toyota.price -> dollar.price   4.47e-01 0.504583     toyota.price     -> sony.price     4.24e-01       0.515750
 dollar.price -> dna.price     2.23e-01 0.637393      dollar.price    -> mizuho.price    4.63e+00       0.032723
 takeda.price -> dna.price      2.95e+00 0.087417     dna.price       -> mizuho.price    1.38e-04       0.990638
 sony.price    -> dna.price    2.30e-01 0.632001      takeda.price    -> mizuho.price    4.16e+00       0.042698
 mizuho.price -> dna.price      2.35e+00 0.127008     sony.price      -> mizuho.price    9.26e-01       0.337161
 toyota.price -> dna.price     1.42e-03 0.969947      toyota.price     -> mizuho.price   2.56e+00       0.111562
 dollar.price -> takeda.price 1.18e+00 0.278734       dollar.price    -> toyota.price    1.11e+01       0.001057
 dna.price     -> takeda.price 5.30e-01 0.467283      dna.price       -> toyota.price    4.21e-01       0.517454
 sony.price    -> takeda.price 1.89e-04 0.989043      takeda.price    -> toyota.price    2.92e+00       0.089006
 mizuho.price -> takeda.price  1.79e-04 0.989350      sony.price      -> toyota.price     8.21e-02       0.774766
 toyota.price -> takeda.price 1.61e-01 0.688693       mizuho.price   -> toyota.price     2.24e+00       0.136206




  ホントは多重検定問題によるfalse positive上昇とか注意しないといけないですよ


2012/10/20                                                                                                           20
サイバー系


     インパルス応答関数
   変数Xが変数Yの予測に効いてるかどうか(±どっちに効いてるか)
    plot(irf(var.result, impulse="dollar.price",
        response=c("dna.price", "sony.price", "toyota.price", "takeda.price",
                       "mizuho.price"), boot=TRUE))




      米ドル為替相場がS○ny, T○Y○TA, (若干Miz○h○も)の
      株価に与える影響は無視できん感じ
2012/10/20                                                                          21
サイバー系


     VARのモデリングをMCMCで行う
  MCMCでVARモデリングして何の意味があるの?とか言わない
  sink("mcmc.jags")
  cat("
  model{
   for(t in p+1:T){
     Dol[t] ~ dnorm(Dol.mu[t], Dol.tau); Dna[t] ~ dnorm(Dna.mu[t], Dna.tau)
     Tak[t] ~ dnorm(Tak.mu[t], Tak.tau); Sny[t] ~ dnorm(Sny.mu[t], Sny.tau)
     Miz[t] ~ dnorm(Miz.mu[t], Miz.tau); Toy[t] ~ dnorm(Toy.mu[t], Toy.tau)

      Dol.mu[t] <- alp.Dol + beta.Dol2Dol[1]*Dol[t-1] + beta.Dna2Dol[1]*Dna[t-1] + beta.Tak2Dol[1]*Tak[t-1]
                             + beta.Sny2Dol[1]*Sny[t-1] + beta.Toy2Dol[1]*Toy[t-1] + beta.Miz2Dol[1]*Miz[t-1]
      Dna.mu[t] <- alp.Dna + beta.Dna2Dna[1]*Dna[t-1] + beta.Dol2Dna[1]*Dol[t-1] + beta.Tak2Dna[1]*Tak[t-1]
                               + beta.Sny2Dna[1]*Sny[t-1] + beta.Toy2Dna[1]*Toy[t-1] + beta.Miz2Dna[1]*Miz[t-1]
      Tak.mu[t] <- alp.Tak + beta.Tak2Tak[1]*Tak[t-1] + beta.Dol2Tak[1]*Dol[t-1] + beta.Dna2Tak[1]*Dna[t-1]
                             + beta.Sny2Tak[1]*Sny[t-1] + beta.Toy2Tak[1]*Toy[t-1] + beta.Miz2Tak[1]*Miz[t-1]
      Sny.mu[t] <- alp.Sny + beta.Sny2Sny[1]*Sny[t-1] + beta.Dol2Sny[1]*Dol[t-1] + beta.Dna2Sny[1]*Dna[t-1]
                              + beta.Tak2Sny[1]*Tak[t-1] + beta.Toy2Sny[1]*Toy[t-1] + beta.Miz2Sny[1]*Miz[t-1]
      Toy.mu[t] <- alp.Toy + beta.Toy2Toy[1]*Toy[t-1] + beta.Dol2Toy[1]*Dol[t-1] + beta.Dna2Toy[1]*Dna[t-1]
                             + beta.Tak2Toy[1]*Tak[t-1]+ beta.Sny2Toy[1]*Sny[t-1] + beta.Miz2Toy[1]*Miz[t-1]
      Miz.mu[t] <- alp.Miz + beta.Miz2Miz[1]*Miz[t-1] + beta.Dol2Miz[1]*Dol[t-1] + beta.Dna2Miz[1]*Dna[t-1]
                             + beta.Tak2Miz[1]*Tak[t-1] + beta.Sny2Miz[1]*Sny[t-1] + beta.Toy2Miz[1]*Toy[t-1]
    }
    alp.Dol ~ dnorm(0, 0.001); alp.Sny ~ dnorm(0, 0.001)
    alp.Toy ~ dnorm(0, 0.001); alp.Dna ~ dnorm(0, 0.001)
    alp.Tak ~ dnorm(0, 0.001); alp.Miz ~ dnorm(0, 0.001)




2012/10/20                                                                                                  22
サイバー系


     VARのモデリングをMCMCで行う_2
for(m in 1:p){ #mは次数で今回は1
   beta.Dol2Dol[m] ~ dnorm(0,0.001); beta.Sny2Sny[m] ~ dnorm(0,0.001); beta.Toy2Toy[m] ~ dnorm(0,0.001)
   beta.Dna2Dna[m] ~ dnorm(0,0.001); beta.Tak2Tak[m] ~ dnorm(0,0.001); beta.Miz2Miz[m] ~ dnorm(0,0.001)
   beta.Sny2Dol[m] ~ dnorm(0,0.001); beta.Sny2Toy[m] ~ dnorm(0,0.001); beta.Sny2Yah[m] ~ dnorm(0,0.001)
   beta.Sny2Dna[m] ~ dnorm(0,0.001); beta.Sny2Tak[m] ~ dnorm(0,0.001); beta.Sny2Pan[m] ~ dnorm(0,0.001)
   beta.Sny2Miz[m] ~ dnorm(0,0.001); beta.Sny2Unq[m] ~ dnorm(0,0.001); beta.Dol2Sny[m] ~ dnorm(0,0.001)
   beta.Dol2Toy[m] ~ dnorm(0,0.001); beta.Dol2Yah[m] ~ dnorm(0,0.001); beta.Dol2Dna[m] ~ dnorm(0,0.001)
   beta.Dol2Tak[m] ~ dnorm(0,0.001); beta.Dol2Pan[m] ~ dnorm(0,0.001); beta.Dol2Miz[m] ~ dnorm(0,0.001)
   beta.Dol2Unq[m] ~ dnorm(0,0.001); beta.Toy2Dol[m] ~ dnorm(0,0.001); beta.Toy2Sny[m] ~ dnorm(0,0.001)
   beta.Toy2Yah[m] ~ dnorm(0,0.001); beta.Toy2Dna[m] ~ dnorm(0,0.001); beta.Toy2Tak[m] ~ dnorm(0,0.001)
   beta.Toy2Pan[m] ~ dnorm(0,0.001); beta.Toy2Miz[m] ~ dnorm(0,0.001); beta.Toy2Unq[m] ~ dnorm(0,0.001)
   beta.Dna2Dol[m] ~ dnorm(0,0.001); beta.Dna2Sny[m] ~ dnorm(0,0.001); beta.Dna2Yah[m] ~ dnorm(0,0.001)
   beta.Dna2Toy[m] ~ dnorm(0,0.001); beta.Dna2Tak[m] ~ dnorm(0,0.001); beta.Dna2Pan[m] ~ dnorm(0,0.001)
   beta.Dna2Miz[m] ~ dnorm(0,0.001); beta.Dna2Unq[m] ~ dnorm(0,0.001); beta.Tak2Dol[m] ~ dnorm(0,0.001)
   beta.Tak2Sny[m] ~ dnorm(0,0.001); beta.Tak2Yah[m] ~ dnorm(0,0.001); beta.Tak2Dna[m] ~ dnorm(0,0.001)
   beta.Tak2Toy[m] ~ dnorm(0,0.001); beta.Tak2Pan[m] ~ dnorm(0,0.001); beta.Tak2Miz[m] ~ dnorm(0,0.001)
   beta.Tak2Unq[m] ~ dnorm(0,0.001); beta.Miz2Dol[m] ~ dnorm(0,0.001); beta.Miz2Sny[m] ~ dnorm(0,0.001)
   beta.Miz2Dna[m] ~ dnorm(0,0.001); beta.Miz2Tak[m] ~ dnorm(0,0.001); beta.Miz2Toy[m] ~ dnorm(0,0.001)
 }
 Dol.tau ~ dgamma(0.001, 0.001); Sny.tau ~ dgamma(0.001, 0.001); Toy.tau ~ dgamma(0.001, 0.001)
 Dna.tau ~ dgamma(0.001, 0.001); Tak.tau ~ dgamma(0.001, 0.001); Miz.tau ~ dgamma(0.001, 0.001)
}
", fill=TRUE)
sink()




 *betaは二次元配列にすればスッキリ書けるが、結果の見やすさのために冗長に記述した

2012/10/20                                                                                           23
サイバー系


     VARのモデリングをMCMCで行う_3
  res.per <- as.data.frame(res.per)
  mc2.res <- jags.model("mcmc.jags", data=list('T'=nrow(res.per), 'Dol'=res.per$dollar.price,
                                                       'Sny'=res.per$sony.price, 'Toy'=res.per$toyota.price,
                                                       'Dna'=res.per$dna.price, 'Tak'=res.per$takeda.price,
                                                       'Miz'=res.per$mizuho.price, 'p'=1),
                                             n.chain=3, n.adapt=5000)
  #次後分布の結果は抜粋
  posterior <- coda.samples(mc2.res,
                    c("Sny.tau", "alp.Sny", "beta.Sny2Sny[1]", "beta.Dol2Sny[1]",
                      "beta.Toy2Sny[1]", "beta.Dna2Sny[1]", "beta.Tak2Dna[1]",
                      "beta.Miz2Sny[1]"), 50000)
  summary(posterior)




1. Empirical mean and standard deviation for each variable,
  plus standard error of the mean:

                        Mean         SD      Naive SE Time-series SE
Sny.tau             2.21e+03    2.27e+02      5.85e-01   5.86e-01               さっきの計算結果
alp.Sny            -2.33e-03    1.56e-03     4.03e-06    4.11e-06                           Estimate Std. Error t value Pr(>|t|)
beta.Dna2Sny[1]     3.37e-02    4.43e-02     1.14e-04    1.30e-04       const              -0.00233   0.00153 -1.52 0.1303
                                                                        dna.price.l1       0.03380   0.04337       0.78 0.4368
beta.Dol2Sny[1]     1.64e+00    4.87e-01     1.26e-03    1.41e-03       dollar.price.l1    1.63397   0.47930       3.41 0.0008
beta.Miz2Sny[1]     1.87e-01    1.63e-01     4.22e-04    7.40e-04       mizuho.price.l1   0.18670    0.16119      1.16 0.2482
                                                                        sony.price.l1      0.02458   0.09488       0.26 0.7958
beta.Sny2Sny[1]     2.48e-02    9.64e-02     2.49e-04    3.76e-04       takeda.price.l1    0.31132   0.20048       1.55 0.1221
beta.Tak2Dna[1]     4.22e-01    3.37e-01     8.71e-04    1.00e-03       toyota.price.l1   -0.20480    0.16619     -1.23 0.2194

beta.Toy2Sny[1]   -2.05e-01     1.70e-01     4.38e-04    8.13e-04




2012/10/20                                                                                                                         24
サイバー系


     まとめ


 1. @yokkunさん作成のRFinanceYJ使って株価データ取得
    して
 2. 自作の関数使って米ドル⇔円の為替情報取得して
 3. VARでモデル化してみました
 4. VARはmcmcでモデル化することもできます




2012/10/20                             25

Rで触れる日本経済~RでVAR編~

  • 1.
    Rで触れる日本の経済 ~RでVAR編~ 2012/10/20 Tokyo.R#27 和田 計也 サイバー系
  • 2.
    サイバー系 はじめに ※この発表は個人の 見解であり、所属す る組織の公式見解で はありません。 2012/10/20 1
  • 3.
    サイバー系 自己紹介  和田 計也(@wdkz)  静岡県袋井市出身  サイバー系企業でデータマイニングエンジニア職  最近は奥華子ばっか聴いてます  前職はバイオベンチャー  バイオマーカ探索してた  学生時代は枯草菌の研究 2012/10/20 2
  • 4.
    サイバー系 最近の株価と為替相場  企業のグローバル化(仮)に伴って、円高(為替)が株価に与える 影響が大きい昨今なんじゃないかと思ってみたり 2012/10/20 3
  • 5.
    サイバー系 今日のお話  企業の株価はYFinaceYJパッケージで取得  Tokyo.R主催者作  ドル⇔円の為替相場はYahoo! Japanからとってくる  自作  VAR(ベクトル自己回帰モデル)でモデル化  米ドル⇔円の為替相場に影響されてる株はどれかな? 2012/10/20 4
  • 6.
    サイバー系 RFinanceFJパッケージで株価取得 library(RFinanceYJ) dna <- quoteStockTsData(‘2432.t’, since=‘2012-01-01’) #SNS mizuho <- quoteStockTsData(‘8411.t’, since=‘2012-01-01’) #金融 sony <- quoteStockTsData(‘6758.t’, since=‘2012-01-01’) #電機 toyota <- quoteStockTsData(‘7203.t’, since=‘2012-01-01’) #自動車 takeda <- quoteStockTsData(‘4502.t’, since=‘2012-01-01’) #製薬 head(dna) #↓以下のようなdata.frame型でデータ取得できる date open height low close volume adj_close 198 2012-01-04 2321 2325 2285 2292 2077200 2292 197 2012-01-05 2288 2290 2217 2222 2882400 2222 196 2012-01-06 2235 2238 2111 2117 5601200 2117 195 2012-01-10 2092 2099 2000 2027 5049000 2027 194 2012-01-11 2005 2060 1891 1899 9326000 1899 193 2012-01-12 1922 1973 1883 1946 11128900 1946 2012/10/20 5
  • 7.
    サイバー系 自作関数で為替情報取得 #米ドル dollar <- getCurrencyEx(start.dt=‘2012-01-01’, end.dt=Sys.Date()-1) head(dollar) #↓以下のようなdata.frame型でデータ取得できる date open height low close 207 2012-01-02 76.9300 77.1200 76.8399 76.8600 206 2012-01-03 76.8799 76.9599 76.5899 76.6200 205 2012-01-04 76.6900 76.8199 76.5800 76.6699 204 2012-01-05 76.6999 77.2300 76.6500 77.1699 203 2012-01-06 77.1200 77.3199 76.9499 76.9800 202 2012-01-09 76.8899 77.0000 76.7500 76.8300 2012/10/20 6
  • 8.
    サイバー系 (参考)getCurrencyEx関数_1 getCurrencyEx <- function(start.dt=as.Date(“2012-01-01”), end.dt=(Sys.Date()-1), type=c("d", "w", "m"), currency.from="USD", currency.to="JPY"){ url.str <- paste("http://info.finance.yahoo.co.jp/history/?code=", currency.from, currency.to, "%3DX&sy=", as.POSIXlt(start.dt)$year+1900, "&sm=", as.POSIXlt(start.dt)$mon+1, "&sd=", as.POSIXlt(start.dt)$mday, "&ey=", as.POSIXlt(end.dt)$year+1900, "&em=", as.POSIXlt(end.dt)$mon+1, "&ed=", as.POSIXlt(end.dt)$mday, "&tm=", type[1], sep="") #内部関数_必要データのリンク(ベクトル)を取得 getLinks <- function(url.str){ res.html <- RCurl::getURL(url.str) res.htmlv <- unlist(strsplit(res.html, "¥n")) s.idx <- which(res.htmlv %in% "<!--時系列-->") e.idx <- which(res.htmlv %in% "<!--アフィニティ-->") res.htmlv2 <- res.htmlv[s.idx:e.idx] ts.data <- res.htmlv2[grep("^</tr><tr><td>.*", res.htmlv2)] links <- res.htmlv2[grep("<!--ページング-->", res.htmlv2)] links2 <- unlist(strsplit(links, "[</a>|</span>]<a href=¥¥¥"")) links3 <- links2[grep("^http://.*p=¥¥d¥¥¥" title=", links2)] 2012/10/20 7
  • 9.
    サイバー系 (参考)getCurrencyEx関数_2 if(length(links3)==0){ return(url.str) }else{ return(c(url.str, unlist(lapply(strsplit(links3, "¥¥¥" title="), function(x){x[1]})))) } } url.links <- getLinks(url.str) #内部関数_urlから必要データ取得 get.tbl <- function(url.str1){ res.html <- RCurl::getURL(url.str1) res.htmlv <- unlist(strsplit(res.html, "¥n")) s.idx <- which(res.htmlv %in% "<!--時系列-->") e.idx <- which(res.htmlv %in% "<!--アフィニティ-->") res.htmlv2 <- res.htmlv[s.idx:e.idx] ts.data <- res.htmlv2[grep("^</tr><tr><td>.*", res.htmlv2)] ts.data2 <- unlist(strsplit(ts.data, "</tr><tr><td>")) ts.data3 <- matrix(unlist(strsplit(ts.data2, "</td><td>")), ncol=5, byrow=TRUE) 2012/10/20 8
  • 10.
    サイバー系 (参考)getCurrencyEx関数_3 ts.data3[grep("¥¥d+</td>", ts.data3[,5]),5] <- gsub("[</td>|</td></tr><table>]","", ts.data3[grep("¥¥d+</td>", ts.data3[,5]),5]) ts.data3 <- as.data.frame(ts.data3, stringsAsFactors=FALSE) ts.data3[,2] <- as.numeric(ts.data3[,2]); ts.data3[,3] <- as.numeric(ts.data3[,3]) ts.data3[,4] <- as.numeric(ts.data3[,4]); ts.data3[,5] <- as.numeric(ts.data3[,5]) ts.data3[,1] <- as.Date(gsub("日", "", gsub("[年|月]", "-", ts.data3[,1]))) colnames(ts.data3) <- c("date", "open", "height", "low", "close") return(ts.data3) } for(i in 1:length(url.links)){ if(i==1){ ret.tbl <- get.tbl(url.links[i]) }else{ ret.tbl <- rbind(ret.tbl, get.tbl(url.links[i])) } } return(ret.tbl[nrow(ret.tbl):1, ]) } 2012/10/20 9
  • 11.
    サイバー系 VARについて  VAR(ベクトル自己回帰モデル) 𝑦 𝑡 = 𝑐 + 𝐴1 𝑦 𝑡−1 + 𝐴2 𝑦 𝑡−2 + ・・・ + 𝐴 𝑝 𝑦 𝑡−𝑝 + 𝑒 𝑡  まああれだ、ARの多変量版 p個前の過去データでモデリング これが1x kのベクトルになってて 多変量になってる 壊れるほど愛 しても1/3も伝 わらないって 本当かい!? 2012/10/20 10
  • 12.
    サイバー系 前述の関数を使って、データを取得してdata.frameに #2432; ディー・エヌ・エー #4502; 武田薬品工業 とりあえず2012年 #6758; ソニー のデータを取得 #7203; トヨタ自動車 #8411; みずほフィナンシャルグループ res.list <- list( dollar=getCurrencyEx(start.dt="2012-01-01", end.dt=Sys.Date()-1), dna=quoteStockTsData('2432.t', since='2012-01-01'), takeda=quoteStockTsData('4502.t', since='2012-01-01'), sony=quoteStockTsData('6758.t', since='2012-01-01'), toyota=quoteStockTsData('7203.t', since='2012-01-01'), mizuho=quoteStockTsData('8411.t', since='2012-01-01') ) #data.frameにするために、必要な項目だけ抽出 res.list2 <- lapply(res.list, function(x){ y <- as.data.frame(matrix(c(as.character(x$date), (x$height+x$low)/2), ncol=2), stringsAsFactors=FALSE); colnames(y) <- c("date", "price"); y$date <- as.Date(y$date); y$price <- as.numeric(y$price); return(y)}) 2012/10/20 11
  • 13.
    サイバー系 前述の関数を使って、データを取得してdata.frameに #為替相場と株価情報とで共通に存在する日を抽出 for(i in 2:length(res.list2)){ if(i==2){ all.day <- intersect(as.character(res.list2[[i-1]]$date), as.character(res.list2[[i]]$date)) }else{ all.day <- intersect(all.day, as.character(res.list2[[i]]$date)) } } res.list3 <- lapply(res.list2, function(x){x[as.character(x$date) %in% all.day,]}) #listをdata.frameに変換 res.df <- as.data.frame(do.call(cbind, res.list3)) rownames(res.df) <- res.df[,grep(".*¥¥.date", colnames(res.df))[1]] res.df <- res.df[,-grep(".*¥¥.date", colnames(res.df))] 2012/10/20 12
  • 14.
    サイバー系 こんな感じのdata.frame head(res.df) dollar.price dna.price takeda.price sony.price mizuho.price toyota.price 2012-01-04 76.69995 2305.0 3407.5 1405.5 106.5 2627.0 2012-01-05 76.94000 2253.5 3390.0 1379.0 108.0 2646.0 2012-01-06 77.13490 2174.5 3347.5 1347.5 107.0 2631.5 2012-01-10 76.82000 2049.5 3340.0 1354.0 108.0 2635.0 2012-01-11 76.90995 1975.5 3287.5 1352.5 109.0 2624.0 2012-01-12 76.80995 1928.0 3247.5 1331.0 109.0 2604.5  plot(ts(res.df)) 2012/10/20 13
  • 15.
    サイバー系 米ドル・株価を増減率に レンジを揃えるために前日からの増減率(-1 ~ 1)に変換 res.diff <- apply(res.df, 2, diff) #前日との差分 res.per <- res.diff/res.df[-1,] #前日からの増減差分 head(res.per) dollar.price dna.price takeda.price sony.price mizuho.price toyota.price 2012-01-05 3.12e-03 -0.022853 -0.00516 -0.01922 0.01389 0.00718 2012-01-06 2.53e-03 -0.036330 -0.01270 -0.02338 -0.00935 -0.00551 2012-01-10 -4.10e-03 -0.060990 -0.00225 0.00480 0.00926 0.00133 2012-01-11 1.17e-03 -0.037459 -0.01597 -0.00111 0.00917 -0.00419 2012-01-12 -1.30e-03 -0.024637 -0.01232 -0.01615 0.00000 -0.00749 2012-01-13 6.51e-05 -0.000779 -0.00776 -0.00301 0.00000 0.01026  plot(ts(res.per)) 2012/10/20 14
  • 16.
    サイバー系 VARするちょい手前 tseries::adf.test(res.per[,1]) #単位根検定でランダムウォークじゃないことを確認して Augmented Dickey-Fuller Test data: res.diff[, 1] Dickey-Fuller = -9.06, Lag order = 1, p-value = 0.01 alternative hypothesis: stationary 警告メッセージ: In tseries::adf.test(res.diff[, 1], k = 1) : p-value smaller than printed p-value  vars::VARselect(res.per, lag.max=7, type=“const”) #AICを基準に次数決め $selection AIC(n) HQ(n) SC(n) FPE(n) AICにより次数1が最適。 1 1 1 1 つまり1日前のデータから当日のデータを説明するのがベストってこと $criteria 1 2 3 4 5 6 7 AIC(n) 2.64e+01 2.64e+01 2.66e+01 2.68e+01 2.69e+01 2.70e+01 2.71e+01 HQ(n) 2.67e+01 2.69e+01 2.74e+01 2.78e+01 2.82e+01 2.85e+01 2.89e+01 SC(n) 2.71e+01 2.77e+01 2.85e+01 2.93e+01 3.01e+01 3.08e+01 3.15e+01 FPE(n) 2.87e+11 2.90e+11 3.47e+11 4.20e+11 4.99e+11 5.56e+11 6.30e+11 2012/10/20 15
  • 17.
    サイバー系 VARする var.result <- vars::VAR(res.per, p=1, type=“const”) #次数1ってことでp=1 summary(var.result) #サマる Estimation results for equation dollar.price: ============================================= sony.price = dollar.price.l1 + dna.price.l1 + takeda.price.l1 + sony.price.l1 + mizuho.price.l1 + toyota.price.l1 + const Estimate Std. Error t value Pr(>|t|) dollar.price.l1 1.63397 0.47930 3.41 0.0008 *** dna.price.l1 0.03380 0.04337 0.78 0.4368 takeda.price.l1 0.31132 0.20048 1.55 0.1221 sony.price.l1 0.02458 0.09488 0.26 0.7958 mizuho.price.l1 0.18670 0.16119 1.16 0.2482 toyota.price.l1 -0.20480 0.16619 -1.23 0.2194 const -0.00233 0.00153 -1.52 0.1303 明日のソニー株価価格の増減割合 = 1.6*今日の1ドルの円価格増減割合 + 0.034*今日のDeNA株価の価格増減割合 + 0.31*今日の武田薬品株価の価格増減割合 + 0.024*今日のSony株価の価格増減割合 + 0.19*今日のみずほ株価の価格増減割合 - 0.204*今日のトヨタ株価の価格増減割合 - 0.002 2012/10/20 16
  • 18.
    サイバー系 VARする_サマる続き Estimation results for equation dollar.price: ============================================= dollar.price = dollar.price.l1 + dna.price.l1 + takeda.price.l1 + sony.price.l1 + mizuho.price.l1 + toyota.price.l1 + const Estimate Std. Error t value Pr(>|t|) dollar.price.l1 2.99e-01 8.14e-02 3.68 0.00031 *** dna.price.l1 4.42e-03 7.37e-03 0.60 0.54932 takeda.price.l1 2.78e-02 3.40e-02 0.82 0.41602 sony.price.l1 -3.51e-03 1.61e-02 -0.22 0.82780 mizuho.price.l1 -1.29e-02 2.74e-02 -0.47 0.63704 toyota.price.l1 -9.32e-03 2.82e-02 -0.33 0.74149 const 7.82e-05 2.60e-04 0.30 0.76416 Estimation results for equation dna.price: ========================================== dna.price = dollar.price.l1 + dna.price.l1 + takeda.price.l1 + sony.price.l1 + mizuho.price.l1 + toyota.price.l1 + const Estimate Std. Error t value Pr(>|t|) dollar.price.l1 -6.47e-01 7.99e-01 -0.81 0.4190 dna.price.l1 2.32e-01 7.23e-02 3.21 0.0015 ** takeda.price.l1 4.20e-01 3.34e-01 1.26 0.2099 sony.price.l1 1.36e-03 1.58e-01 0.01 0.9932 mizuho.price.l1 4.77e-01 2.69e-01 1.78 0.0774 . toyota.price.l1 -3.28e-01 2.77e-01 -1.18 0.2380 const -3.74e-05 2.55e-03 -0.01 0.9883 2012/10/20 17
  • 19.
    サイバー系 VARする_サマる続き2 Estimation results for equation takeda.price: ============================================= takeda.price = dollar.price.l1 + dna.price.l1 + takeda.price.l1 + sony.price.l1 + mizuho.price.l1 + toyota.price.l1 + const Estimate Std. Error t value Pr(>|t|) dollar.price.l1 0.265242 0.186653 1.42 0.1570 dna.price.l1 0.014896 0.016888 0.88 0.3789 takeda.price.l1 0.212129 0.078074 2.72 0.0072 ** sony.price.l1 -0.001617 0.036948 -0.04 0.9651 mizuho.price.l1 0.010935 0.062772 0.17 0.8619 toyota.price.l1 -0.063850 0.064720 -0.99 0.3251 const 0.000231 0.000597 0.39 0.6998 Estimation results for equation sony.price: =========================================== mizuho.price = dollar.price.l1 + dna.price.l1 + takeda.price.l1 + sony.price.l1 + mizuho.price.l1 + toyota.price.l1 + const Estimate Std. Error t value Pr(>|t|) dollar.price.l1 0.899054 0.309867 2.90 0.0042 ** dna.price.l1 0.012549 0.028036 0.45 0.6549 takeda.price.l1 0.283463 0.129612 2.19 0.0300 * sony.price.l1 -0.069961 0.061338 -1.14 0.2555 mizuho.price.l1 0.240696 0.104209 2.31 0.0220 * toyota.price.l1 -0.212064 0.107443 -1.97 0.0499 * const 0.000314 0.000991 0.32 0.7520 2012/10/20 18
  • 20.
    サイバー系 VARする_サマる続き3 Estimation results for equation takeda.price: ============================================= toyota.price = dollar.price.l1 + dna.price.l1 + takeda.price.l1 + sony.price.l1 + mizuho.price.l1 + toyota.price.l1 + const Estimate Std. Error t value Pr(>|t|) dollar.price.l1 1.058859 0.316993 3.34 0.001 ** dna.price.l1 0.024938 0.028681 0.87 0.386 takeda.price.l1 0.195947 0.132593 1.48 0.141 sony.price.l1 -0.091743 0.062748 -1.46 0.145 mizuho.price.l1 0.107951 0.106606 1.01 0.313 toyota.price.l1 -0.005723 0.109914 -0.05 0.959 const 0.000186 0.001014 0.18 0.855 --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 2012/10/20 19
  • 21.
    サイバー系 Grangerの因果検定 変数Xが変数Yの予測に効いてるかどうか  MSBVAR::granger.test(res.per, p=1) F-statistic p-value F-statistic p-value dna.price -> dollar.price 1.64e-01 0.686204 dollar.price -> sony.price 1.25e+01 0.000513 takeda.price -> dollar.price 2.61e-01 0.610062 dna.price -> sony.price 4.53e-01 0.501593 sony.price -> dollar.price 2.04e-01 0.652294 takeda.price -> sony.price 3.93e+00 0.048861 mizuho.price -> dollar.price 4.32e-01 0.512008 mizuho.price -> sony.price 3.49e+00 0.063165 toyota.price -> dollar.price 4.47e-01 0.504583 toyota.price -> sony.price 4.24e-01 0.515750 dollar.price -> dna.price 2.23e-01 0.637393 dollar.price -> mizuho.price 4.63e+00 0.032723 takeda.price -> dna.price 2.95e+00 0.087417 dna.price -> mizuho.price 1.38e-04 0.990638 sony.price -> dna.price 2.30e-01 0.632001 takeda.price -> mizuho.price 4.16e+00 0.042698 mizuho.price -> dna.price 2.35e+00 0.127008 sony.price -> mizuho.price 9.26e-01 0.337161 toyota.price -> dna.price 1.42e-03 0.969947 toyota.price -> mizuho.price 2.56e+00 0.111562 dollar.price -> takeda.price 1.18e+00 0.278734 dollar.price -> toyota.price 1.11e+01 0.001057 dna.price -> takeda.price 5.30e-01 0.467283 dna.price -> toyota.price 4.21e-01 0.517454 sony.price -> takeda.price 1.89e-04 0.989043 takeda.price -> toyota.price 2.92e+00 0.089006 mizuho.price -> takeda.price 1.79e-04 0.989350 sony.price -> toyota.price 8.21e-02 0.774766 toyota.price -> takeda.price 1.61e-01 0.688693 mizuho.price -> toyota.price 2.24e+00 0.136206 ホントは多重検定問題によるfalse positive上昇とか注意しないといけないですよ 2012/10/20 20
  • 22.
    サイバー系 インパルス応答関数 変数Xが変数Yの予測に効いてるかどうか(±どっちに効いてるか)  plot(irf(var.result, impulse="dollar.price", response=c("dna.price", "sony.price", "toyota.price", "takeda.price", "mizuho.price"), boot=TRUE)) 米ドル為替相場がS○ny, T○Y○TA, (若干Miz○h○も)の 株価に与える影響は無視できん感じ 2012/10/20 21
  • 23.
    サイバー系 VARのモデリングをMCMCで行う MCMCでVARモデリングして何の意味があるの?とか言わない sink("mcmc.jags") cat(" model{ for(t in p+1:T){ Dol[t] ~ dnorm(Dol.mu[t], Dol.tau); Dna[t] ~ dnorm(Dna.mu[t], Dna.tau) Tak[t] ~ dnorm(Tak.mu[t], Tak.tau); Sny[t] ~ dnorm(Sny.mu[t], Sny.tau) Miz[t] ~ dnorm(Miz.mu[t], Miz.tau); Toy[t] ~ dnorm(Toy.mu[t], Toy.tau) Dol.mu[t] <- alp.Dol + beta.Dol2Dol[1]*Dol[t-1] + beta.Dna2Dol[1]*Dna[t-1] + beta.Tak2Dol[1]*Tak[t-1] + beta.Sny2Dol[1]*Sny[t-1] + beta.Toy2Dol[1]*Toy[t-1] + beta.Miz2Dol[1]*Miz[t-1] Dna.mu[t] <- alp.Dna + beta.Dna2Dna[1]*Dna[t-1] + beta.Dol2Dna[1]*Dol[t-1] + beta.Tak2Dna[1]*Tak[t-1] + beta.Sny2Dna[1]*Sny[t-1] + beta.Toy2Dna[1]*Toy[t-1] + beta.Miz2Dna[1]*Miz[t-1] Tak.mu[t] <- alp.Tak + beta.Tak2Tak[1]*Tak[t-1] + beta.Dol2Tak[1]*Dol[t-1] + beta.Dna2Tak[1]*Dna[t-1] + beta.Sny2Tak[1]*Sny[t-1] + beta.Toy2Tak[1]*Toy[t-1] + beta.Miz2Tak[1]*Miz[t-1] Sny.mu[t] <- alp.Sny + beta.Sny2Sny[1]*Sny[t-1] + beta.Dol2Sny[1]*Dol[t-1] + beta.Dna2Sny[1]*Dna[t-1] + beta.Tak2Sny[1]*Tak[t-1] + beta.Toy2Sny[1]*Toy[t-1] + beta.Miz2Sny[1]*Miz[t-1] Toy.mu[t] <- alp.Toy + beta.Toy2Toy[1]*Toy[t-1] + beta.Dol2Toy[1]*Dol[t-1] + beta.Dna2Toy[1]*Dna[t-1] + beta.Tak2Toy[1]*Tak[t-1]+ beta.Sny2Toy[1]*Sny[t-1] + beta.Miz2Toy[1]*Miz[t-1] Miz.mu[t] <- alp.Miz + beta.Miz2Miz[1]*Miz[t-1] + beta.Dol2Miz[1]*Dol[t-1] + beta.Dna2Miz[1]*Dna[t-1] + beta.Tak2Miz[1]*Tak[t-1] + beta.Sny2Miz[1]*Sny[t-1] + beta.Toy2Miz[1]*Toy[t-1] } alp.Dol ~ dnorm(0, 0.001); alp.Sny ~ dnorm(0, 0.001) alp.Toy ~ dnorm(0, 0.001); alp.Dna ~ dnorm(0, 0.001) alp.Tak ~ dnorm(0, 0.001); alp.Miz ~ dnorm(0, 0.001) 2012/10/20 22
  • 24.
    サイバー系 VARのモデリングをMCMCで行う_2 for(m in 1:p){ #mは次数で今回は1 beta.Dol2Dol[m] ~ dnorm(0,0.001); beta.Sny2Sny[m] ~ dnorm(0,0.001); beta.Toy2Toy[m] ~ dnorm(0,0.001) beta.Dna2Dna[m] ~ dnorm(0,0.001); beta.Tak2Tak[m] ~ dnorm(0,0.001); beta.Miz2Miz[m] ~ dnorm(0,0.001) beta.Sny2Dol[m] ~ dnorm(0,0.001); beta.Sny2Toy[m] ~ dnorm(0,0.001); beta.Sny2Yah[m] ~ dnorm(0,0.001) beta.Sny2Dna[m] ~ dnorm(0,0.001); beta.Sny2Tak[m] ~ dnorm(0,0.001); beta.Sny2Pan[m] ~ dnorm(0,0.001) beta.Sny2Miz[m] ~ dnorm(0,0.001); beta.Sny2Unq[m] ~ dnorm(0,0.001); beta.Dol2Sny[m] ~ dnorm(0,0.001) beta.Dol2Toy[m] ~ dnorm(0,0.001); beta.Dol2Yah[m] ~ dnorm(0,0.001); beta.Dol2Dna[m] ~ dnorm(0,0.001) beta.Dol2Tak[m] ~ dnorm(0,0.001); beta.Dol2Pan[m] ~ dnorm(0,0.001); beta.Dol2Miz[m] ~ dnorm(0,0.001) beta.Dol2Unq[m] ~ dnorm(0,0.001); beta.Toy2Dol[m] ~ dnorm(0,0.001); beta.Toy2Sny[m] ~ dnorm(0,0.001) beta.Toy2Yah[m] ~ dnorm(0,0.001); beta.Toy2Dna[m] ~ dnorm(0,0.001); beta.Toy2Tak[m] ~ dnorm(0,0.001) beta.Toy2Pan[m] ~ dnorm(0,0.001); beta.Toy2Miz[m] ~ dnorm(0,0.001); beta.Toy2Unq[m] ~ dnorm(0,0.001) beta.Dna2Dol[m] ~ dnorm(0,0.001); beta.Dna2Sny[m] ~ dnorm(0,0.001); beta.Dna2Yah[m] ~ dnorm(0,0.001) beta.Dna2Toy[m] ~ dnorm(0,0.001); beta.Dna2Tak[m] ~ dnorm(0,0.001); beta.Dna2Pan[m] ~ dnorm(0,0.001) beta.Dna2Miz[m] ~ dnorm(0,0.001); beta.Dna2Unq[m] ~ dnorm(0,0.001); beta.Tak2Dol[m] ~ dnorm(0,0.001) beta.Tak2Sny[m] ~ dnorm(0,0.001); beta.Tak2Yah[m] ~ dnorm(0,0.001); beta.Tak2Dna[m] ~ dnorm(0,0.001) beta.Tak2Toy[m] ~ dnorm(0,0.001); beta.Tak2Pan[m] ~ dnorm(0,0.001); beta.Tak2Miz[m] ~ dnorm(0,0.001) beta.Tak2Unq[m] ~ dnorm(0,0.001); beta.Miz2Dol[m] ~ dnorm(0,0.001); beta.Miz2Sny[m] ~ dnorm(0,0.001) beta.Miz2Dna[m] ~ dnorm(0,0.001); beta.Miz2Tak[m] ~ dnorm(0,0.001); beta.Miz2Toy[m] ~ dnorm(0,0.001) } Dol.tau ~ dgamma(0.001, 0.001); Sny.tau ~ dgamma(0.001, 0.001); Toy.tau ~ dgamma(0.001, 0.001) Dna.tau ~ dgamma(0.001, 0.001); Tak.tau ~ dgamma(0.001, 0.001); Miz.tau ~ dgamma(0.001, 0.001) } ", fill=TRUE) sink() *betaは二次元配列にすればスッキリ書けるが、結果の見やすさのために冗長に記述した 2012/10/20 23
  • 25.
    サイバー系 VARのモデリングをMCMCで行う_3 res.per <- as.data.frame(res.per) mc2.res <- jags.model("mcmc.jags", data=list('T'=nrow(res.per), 'Dol'=res.per$dollar.price, 'Sny'=res.per$sony.price, 'Toy'=res.per$toyota.price, 'Dna'=res.per$dna.price, 'Tak'=res.per$takeda.price, 'Miz'=res.per$mizuho.price, 'p'=1), n.chain=3, n.adapt=5000) #次後分布の結果は抜粋 posterior <- coda.samples(mc2.res, c("Sny.tau", "alp.Sny", "beta.Sny2Sny[1]", "beta.Dol2Sny[1]", "beta.Toy2Sny[1]", "beta.Dna2Sny[1]", "beta.Tak2Dna[1]", "beta.Miz2Sny[1]"), 50000) summary(posterior) 1. Empirical mean and standard deviation for each variable, plus standard error of the mean: Mean SD Naive SE Time-series SE Sny.tau 2.21e+03 2.27e+02 5.85e-01 5.86e-01 さっきの計算結果 alp.Sny -2.33e-03 1.56e-03 4.03e-06 4.11e-06 Estimate Std. Error t value Pr(>|t|) beta.Dna2Sny[1] 3.37e-02 4.43e-02 1.14e-04 1.30e-04 const -0.00233 0.00153 -1.52 0.1303 dna.price.l1 0.03380 0.04337 0.78 0.4368 beta.Dol2Sny[1] 1.64e+00 4.87e-01 1.26e-03 1.41e-03 dollar.price.l1 1.63397 0.47930 3.41 0.0008 beta.Miz2Sny[1] 1.87e-01 1.63e-01 4.22e-04 7.40e-04 mizuho.price.l1 0.18670 0.16119 1.16 0.2482 sony.price.l1 0.02458 0.09488 0.26 0.7958 beta.Sny2Sny[1] 2.48e-02 9.64e-02 2.49e-04 3.76e-04 takeda.price.l1 0.31132 0.20048 1.55 0.1221 beta.Tak2Dna[1] 4.22e-01 3.37e-01 8.71e-04 1.00e-03 toyota.price.l1 -0.20480 0.16619 -1.23 0.2194 beta.Toy2Sny[1] -2.05e-01 1.70e-01 4.38e-04 8.13e-04 2012/10/20 24
  • 26.
    サイバー系 まとめ 1. @yokkunさん作成のRFinanceYJ使って株価データ取得 して 2. 自作の関数使って米ドル⇔円の為替情報取得して 3. VARでモデル化してみました 4. VARはmcmcでモデル化することもできます 2012/10/20 25