SlideShare a Scribd company logo
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

More Related Content

PDF
RのffでGLMしてみたけど...
Kazuya Wada
 
PDF
DeployR使ってみた話
Kazuya Wada
 
PDF
RのffとbigmemoryとRevoScaleRとを比較してみた
Kazuya Wada
 
PDF
Granger因果による 時系列データの因果推定(因果フェス2015)
Takashi J OZAKI
 
PDF
Deep Learningと他の分類器をRで比べてみよう in Japan.R 2014
Takashi J OZAKI
 
PDF
Rあんなときこんなとき(tokyo r#12)
Shintaro Fukushima
 
PDF
20140920 tokyo r43
Takashi Kitano
 
PDF
10分で分かるr言語入門ver2.9 14 0920
Nobuaki Oshiro
 
RのffでGLMしてみたけど...
Kazuya Wada
 
DeployR使ってみた話
Kazuya Wada
 
RのffとbigmemoryとRevoScaleRとを比較してみた
Kazuya Wada
 
Granger因果による 時系列データの因果推定(因果フェス2015)
Takashi J OZAKI
 
Deep Learningと他の分類器をRで比べてみよう in Japan.R 2014
Takashi J OZAKI
 
Rあんなときこんなとき(tokyo r#12)
Shintaro Fukushima
 
20140920 tokyo r43
Takashi Kitano
 
10分で分かるr言語入門ver2.9 14 0920
Nobuaki Oshiro
 

What's hot (19)

PPTX
Feature Selection with R / in JP
Sercan Ahi
 
PDF
Rユーザのためのspark入門
Shintaro Fukushima
 
PDF
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
Nagi Teramo
 
PDF
Rのデータ構造とメモリ管理
Takeshi Arabiki
 
PDF
Rで学ぶデータマイニングI 第8章〜第13章
Prunus 1350
 
PDF
mmapパッケージを使ってお手軽オブジェクト管理
Shintaro Fukushima
 
PDF
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
Shintaro Fukushima
 
PDF
Rの高速化
弘毅 露崎
 
PPTX
巨大な表を高速に扱うData.table について
Haruka Ozaki
 
PPTX
R高速化
Monta Yashi
 
PDF
Rで計量時系列分析~CRANパッケージ総ざらい~
Takashi J OZAKI
 
PDF
Why dont you_create_new_spark_jl
Shintaro Fukushima
 
PDF
Gorinphp0729
akitsukada
 
PDF
色々なダイクストラ高速化
yosupo
 
PDF
R-hpc-1 TokyoR#11
Shintaro Fukushima
 
PDF
Juliaで並列計算
Shintaro Fukushima
 
PDF
textsearch_jaで全文検索
Akio Ishida
 
PDF
R3.0.0 is relased
Shintaro Fukushima
 
PDF
Tokyor23 doradora09
Nobuaki Oshiro
 
Feature Selection with R / in JP
Sercan Ahi
 
Rユーザのためのspark入門
Shintaro Fukushima
 
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
Nagi Teramo
 
Rのデータ構造とメモリ管理
Takeshi Arabiki
 
Rで学ぶデータマイニングI 第8章〜第13章
Prunus 1350
 
mmapパッケージを使ってお手軽オブジェクト管理
Shintaro Fukushima
 
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
Shintaro Fukushima
 
Rの高速化
弘毅 露崎
 
巨大な表を高速に扱うData.table について
Haruka Ozaki
 
R高速化
Monta Yashi
 
Rで計量時系列分析~CRANパッケージ総ざらい~
Takashi J OZAKI
 
Why dont you_create_new_spark_jl
Shintaro Fukushima
 
Gorinphp0729
akitsukada
 
色々なダイクストラ高速化
yosupo
 
R-hpc-1 TokyoR#11
Shintaro Fukushima
 
Juliaで並列計算
Shintaro Fukushima
 
textsearch_jaで全文検索
Akio Ishida
 
R3.0.0 is relased
Shintaro Fukushima
 
Tokyor23 doradora09
Nobuaki Oshiro
 
Ad

Viewers also liked (20)

PDF
Rで学ぶ回帰分析と単位根検定
Nagi Teramo
 
PDF
養成読本と私
Kimikazu Kato
 
PDF
Rubyによるデータ解析
Shugo Maeda
 
PDF
マーケティングサイエンス徹底入門と実践Part2
宏喜 佐野
 
PPTX
主成分分析(Pca)
Shushi Namba
 
PDF
Rによる主成分分析 入門
Hiro47
 
PDF
フリーソフトウェアを通じた多変量解析講習
h_yama2396
 
PDF
R言語で始めよう、データサイエンス(ハンズオン勉強会) 〜機会学習・データビジュアライゼーション事始め〜
Yasuyuki Sugai
 
PDF
[データマイニング+WEB勉強会][R勉強会] R言語によるクラスター分析 - 活用編
Koichi Hamada
 
PDF
[データマイニング+WEB勉強会][R勉強会] はじめてでもわかる R言語によるクラスター分析 - 似ているものをグループ化する-
Koichi Hamada
 
PPTX
主成分分析 (pca)
Ji Wang
 
PDF
[R勉強会][データマイニング] R言語による時系列分析
Koichi Hamada
 
PDF
Taste of Wine vs. Data Science
Takashi J OZAKI
 
PDF
指数分布とポアソン分布のいけない関係
Nagi Teramo
 
PDF
ベイジアンモデリングによるマーケティングサイエンス〜状態空間モデルを用いたモデリング
宏喜 佐野
 
PDF
直感的な単変量モデルでは予測できない「ワインの味」を多変量モデルで予測する
Takashi J OZAKI
 
PDF
10分でわかる主成分分析(PCA)
Takanori Ogata
 
PDF
はじめよう多変量解析~主成分分析編~
宏喜 佐野
 
PDF
「スキルなし・実績なし」 32歳窓際エンジニアがシリコンバレーで働くようになるまで
Shuichi Tsutsumi
 
PDF
はじめての「R」
Masahiro Hayashi
 
Rで学ぶ回帰分析と単位根検定
Nagi Teramo
 
養成読本と私
Kimikazu Kato
 
Rubyによるデータ解析
Shugo Maeda
 
マーケティングサイエンス徹底入門と実践Part2
宏喜 佐野
 
主成分分析(Pca)
Shushi Namba
 
Rによる主成分分析 入門
Hiro47
 
フリーソフトウェアを通じた多変量解析講習
h_yama2396
 
R言語で始めよう、データサイエンス(ハンズオン勉強会) 〜機会学習・データビジュアライゼーション事始め〜
Yasuyuki Sugai
 
[データマイニング+WEB勉強会][R勉強会] R言語によるクラスター分析 - 活用編
Koichi Hamada
 
[データマイニング+WEB勉強会][R勉強会] はじめてでもわかる R言語によるクラスター分析 - 似ているものをグループ化する-
Koichi Hamada
 
主成分分析 (pca)
Ji Wang
 
[R勉強会][データマイニング] R言語による時系列分析
Koichi Hamada
 
Taste of Wine vs. Data Science
Takashi J OZAKI
 
指数分布とポアソン分布のいけない関係
Nagi Teramo
 
ベイジアンモデリングによるマーケティングサイエンス〜状態空間モデルを用いたモデリング
宏喜 佐野
 
直感的な単変量モデルでは予測できない「ワインの味」を多変量モデルで予測する
Takashi J OZAKI
 
10分でわかる主成分分析(PCA)
Takanori Ogata
 
はじめよう多変量解析~主成分分析編~
宏喜 佐野
 
「スキルなし・実績なし」 32歳窓際エンジニアがシリコンバレーで働くようになるまで
Shuichi Tsutsumi
 
はじめての「R」
Masahiro Hayashi
 
Ad

Similar to Rで触れる日本経済~RでVAR編~ (20)

PPT
Code iq×japanr 公開用
Nobuaki Oshiro
 
PPT
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
Haruka Ozaki
 
PDF
Yamadai.R チュートリアルセッション
考司 小杉
 
PDF
第1回R勉強会@東京
Yohei Sato
 
PDF
Rでウォーリを探してみた
Kazuya Wada
 
PDF
10min r study_tokyor25
Nobuaki Oshiro
 
PDF
10min r study_tokyor25
Nobuaki Oshiro
 
PDF
10分で分かるr言語入門ver2.10 14 1101
Nobuaki Oshiro
 
PDF
初心者講習会資料(Osaka.r#6)
Masahiro Hayashi
 
PDF
Introduction to R
Yukihiro NAKAJIMA
 
PDF
[データマイニング+WEB勉強会][R勉強会] はじめてでもわかる 統計解析・データマイニング R言語入門
Koichi Hamada
 
PDF
Rデータ処理入門
Hiroki K
 
PDF
経済学のための実践的データ分析2. python, R, Jupyter notebook 事始め/統計ソフトちゃんちゃかちゃん
Yasushi Hara
 
PDF
Sendai r01 beginnerssession1
kotora_0507
 
PPTX
xtsパッケージで時系列解析
Nagi Teramo
 
PDF
Rのオブジェクト
Itoshi Nikaido
 
PDF
初心者講習会資料(Osaka.R#5)
Masahiro Hayashi
 
PDF
初心者講習会資料(Osaka.R#7)
Masahiro Hayashi
 
PDF
第9回 大規模データを用いたデータフレーム操作実習(3)
Wataru Shito
 
PDF
Tokyor60 r data_science_part1
Yohei Sato
 
Code iq×japanr 公開用
Nobuaki Oshiro
 
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
Haruka Ozaki
 
Yamadai.R チュートリアルセッション
考司 小杉
 
第1回R勉強会@東京
Yohei Sato
 
Rでウォーリを探してみた
Kazuya Wada
 
10min r study_tokyor25
Nobuaki Oshiro
 
10min r study_tokyor25
Nobuaki Oshiro
 
10分で分かるr言語入門ver2.10 14 1101
Nobuaki Oshiro
 
初心者講習会資料(Osaka.r#6)
Masahiro Hayashi
 
Introduction to R
Yukihiro NAKAJIMA
 
[データマイニング+WEB勉強会][R勉強会] はじめてでもわかる 統計解析・データマイニング R言語入門
Koichi Hamada
 
Rデータ処理入門
Hiroki K
 
経済学のための実践的データ分析2. python, R, Jupyter notebook 事始め/統計ソフトちゃんちゃかちゃん
Yasushi Hara
 
Sendai r01 beginnerssession1
kotora_0507
 
xtsパッケージで時系列解析
Nagi Teramo
 
Rのオブジェクト
Itoshi Nikaido
 
初心者講習会資料(Osaka.R#5)
Masahiro Hayashi
 
初心者講習会資料(Osaka.R#7)
Masahiro Hayashi
 
第9回 大規模データを用いたデータフレーム操作実習(3)
Wataru Shito
 
Tokyor60 r data_science_part1
Yohei Sato
 

More from Kazuya Wada (13)

PDF
オンラインTVサービスの分析事例
Kazuya Wada
 
PDF
道玄坂Lt#2 wdkz
Kazuya Wada
 
PDF
ハイレゾの話
Kazuya Wada
 
PDF
Shiny-Serverあれこれ
Kazuya Wada
 
PDF
データサイエンティストカジュアルトーク by wdkz
Kazuya Wada
 
PDF
R-3.0.0でGLM
Kazuya Wada
 
PDF
はじめてのShiny
Kazuya Wada
 
PDF
JuliaでGLM
Kazuya Wada
 
PDF
そろそろRStudioの話
Kazuya Wada
 
PDF
RでつくるWebアプリ~rApache編~
Kazuya Wada
 
PDF
Rが苦手な人にもRを使って頂くために~RcommanderとRook~
Kazuya Wada
 
PDF
RでGPU使ってみた
Kazuya Wada
 
PDF
Tokyo.R#16 wdkz
Kazuya Wada
 
オンラインTVサービスの分析事例
Kazuya Wada
 
道玄坂Lt#2 wdkz
Kazuya Wada
 
ハイレゾの話
Kazuya Wada
 
Shiny-Serverあれこれ
Kazuya Wada
 
データサイエンティストカジュアルトーク by wdkz
Kazuya Wada
 
R-3.0.0でGLM
Kazuya Wada
 
はじめてのShiny
Kazuya Wada
 
JuliaでGLM
Kazuya Wada
 
そろそろRStudioの話
Kazuya Wada
 
RでつくるWebアプリ~rApache編~
Kazuya Wada
 
Rが苦手な人にもRを使って頂くために~RcommanderとRook~
Kazuya Wada
 
RでGPU使ってみた
Kazuya Wada
 
Tokyo.R#16 wdkz
Kazuya Wada
 

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